This is a documentation for Board Game Arena: play board games online !

Маин гаме логиц: yоургаменаме.гаме.пхп

Извор: Board Game Arena
Пређи на навигацију Пређи на претрагу

Тхис ис тхе маин филе фор yоур гаме логиц. Хере yоу инитиализе тхе гаме, персист дата, имплемент тхе рулес анд нотифy тхе цлиент интерфаце оф цхангес.

Филе Струцтуре

Тхе детаилс оф хоw тхе филе ис струцтуред аре десцрибед дирецтлy wитх цомментс ин тхе цоде скелетон провидед то yоу.

Хере ис тхе басиц струцтуре:

  • ЕмптyГаме (цонструцтор): wхере yоу дефине глобал вариаблес.
  • сетупНеwГаме: инитиал сетуп оф тхе гаме.
  • гетАллДатас: wхере yоу ретриеве алл гаме дата дуринг а цомплете релоад оф тхе гаме.
  • гетГамеПрогрессион: wхере yоу цомпуте тхе гаме прогрессион индицатор.
  • Утилитy фунцтионс: yоур утилитy фунцтионс.
  • Плаyер ацтионс: тхе ентрy поинтс фор плаyерс ацтионс.
  • Гаме стате аргументс: метходс то ретурн аддитионал дата он специфиц гаме статес (море инфо хере).
  • Гаме стате ацтионс: тхе логиц то рун wхен ентеринг а неw гаме стате (море инфо хере).
  • зомбиеТурн: wхат то до ит'с тхе турн оф а зомбие плаyер.

Аццессинг плаyер информатион

гетПлаyерсНумбер()
Ретурнс тхе нумбер оф плаyерс плаyинг ат тхе табле
Ноте: доесн'т wорк ин сетупНеwГаме со усе цоунт($плаyерс) инстеад
гетАцтивеПлаyерИд()
Гет тхе "ацтиве_плаyер", wхатевер wхат ис тхе цуррент стате тyпе.
Ноте: ит доес НОТ меан тхат тхис плаyер ис ацтиве ригхт ноw, бецаусе стате тyпе цоулд бе "гаме" ор "мултиплаyер"
Ноте: авоид усинг тхис метход ин а "мултиплаyер" стате бецаусе ит доес нот меан анyтхинг.
гетАцтивеПлаyерНаме()
Гет тхе "ацтиве_плаyер" наме
Ноте: авоид усинг тхис метход ин а "мултиплаyер" стате бецаусе ит доес нот меан анyтхинг.
лоадПлаyерсБасицИнфос()
Гет ан ассоциативе арраy wитх генериц дата абоут плаyерс (ие: нот гаме специфиц дата).
Тхе кеy оф тхе ассоциативе арраy ис тхе плаyер ид. Тхе ретурнед табле ис цацхед, со ок то цалл мултипле тимес wитхоут перформанце цонцернс.
Тхе цонтент оф еацх валуе ис:
* плаyер_наме - тхе наме оф тхе плаyер
* плаyер_цолор (еx: фф0000) - тхе цолор цоде оф тхе плаyер
* плаyер_но - тхе поситион оф тхе плаyер ат тхе старт оф тхе гаме ин натурал табле ордер, и.е. 1,2,3
гетЦуррентПлаyерИд()
Гет тхе "цуррент_плаyер". Тхе цуррент плаyер ис тхе оне фром wхицх тхе ацтион оригинатед (тхе оне wхо сенд тхе реqуест).
Бе царефул: Ит ис нот алwаyс тхе ацтиве плаyер.
Ин генерал, yоу схоулдн'т усе тхис метход, унлесс yоу аре ин "мултиплаyер" стате.
гетЦуррентПлаyерНаме()
Гет тхе "цуррент_плаyер" наме
Бе царефул усинг тхис метход (сее абове).
гетЦуррентПлаyерЦолор()
Гет тхе "цуррент_плаyер" цолор
Бе царефул усинг тхис метход (сее абове).
исЦуррентПлаyерЗомбие()
Цхецк тхе "цуррент_плаyер" зомбие статус. Иф труе, плаyер ис зомбие, и.е. лефт ор wас кицкед оут оф тхе гаме.

Аццессинг тхе датабасе

Тхе маин гаме логиц схоулд бе тхе онлy поинт фром wхицх yоу схоулд аццесс тхе гаме датабасе. Yоу аццесс yоур датабасе усинг СQЛ qуериес wитх тхе метходс белоw.

ИМПОРТАНТ

БГА усес датабасе трансацтионс. Тхис меанс тхат yоур датабасе цхангес WОН'Т БЕ АППЛИЕД то тхе датабасе унтил yоур реqуест ендс нормаллy. Усинг трансацтионс ис ин фацт верy усефул фор yоу; ат анy тиме, иф yоур гаме логиц детецтс тхат сометхинг ис wронг (еxампле: а дисаллоwед мове), yоу јуст хаве то тхроw ан еxцептион анд алл цхангес то тхе гаме ситуатион wилл бе ремовед.

ДбQуерy( $сqл )
Тхис ис тхе генериц метход то аццесс тхе датабасе.
Ит цан еxецуте анy тyпе оф СЕЛЕЦТ/УПДАТЕ/ДЕЛЕТЕ/РЕПЛАЦЕ qуерy он тхе датабасе.
Yоу схоулд усе ит фор УПДАТЕ/ДЕЛЕТЕ/РЕПЛАЦЕ qуериес. Фор СЕЛЕЦТ qуериес, тхе специализед метходс белоw аре муцх беттер.
гетУниqуеВалуеФромДБ( $сqл )
Ретурнс а униqуе валуе фром ДБ ор нулл иф но валуе ис фоунд.
$сqл муст бе а СЕЛЕЦТ qуерy.
Раисе ан еxцептион иф море тхан 1 роw ис ретурнед.
гетЦоллецтионФромДБ( $сqл, $бСинглеВалуе=фалсе )
Ретурнс ан ассоциативе арраy оф роwс фор а сqл СЕЛЕЦТ qуерy.
Тхе кеy оф тхе ресултинг ассоциативе арраy ис тхе фирст фиелд специфиед ин тхе СЕЛЕЦТ qуерy.
Тхе валуе оф тхе ресултинг ассоциативе арраy иф ан ассоциативе арраy wитх алл тхе фиелд специфиед ин тхе СЕЛЕЦТ qуерy анд ассоциатед валуес.
Фирст цолумн муст бе а примарy ор алтернате кеy.
Тхе ресултинг цоллецтион цан бе емптy.
Иф yоу специфиед $бСинглеВалуе=труе анд иф yоур СQЛ qуерy реqуест 2 фиелдс А анд Б, тхе метход ретурнс ан ассоциативе арраy "А=>Б"

Еxампле 1:

self::getCollectionFromDB( "SELECT player_id id, player_name name, player_score score FROM player" );

Result:
array(
 1234 => array( 'id'=>1234, 'name'=>'myuser0', 'score'=>1 ),
 1235 => array( 'id'=>1235, 'name'=>'myuser1', 'score'=>0 )
)

Еxампле 2:

self::getCollectionFromDB( "SELECT player_id id, player_name name FROM player", true );

Result:
array(
 1234 => 'myuser0',
 1235 => 'myuser1'
)

гетНонЕмптyЦоллецтионФромДБ( $сqл )
Идем тхан превиоус оне, бут раисе ан еxцептион иф тхе цоллецтион ис емптy
гетОбјецтФромДБ( $сqл )
Ретурнс оне роw фор тхе сqл СЕЛЕЦТ qуерy ас ан ассоциативе арраy ор нулл иф тхере ис но ресулт
Раисе ан еxцептион иф тхе qуерy ретурн море тхан оне роw

Еxампле:

self::getObjectFromDB( "SELECT player_id id, player_name name, player_score score FROM player WHERE player_id='$player_id'" );

Result:
array(
  'id'=>1234, 'name'=>'myuser0', 'score'=>1 
)
гетНонЕмптyОбјецтФромДБ( $сqл )
Идем тхан превиоус оне, бут раисе ан еxцептион иф но роw ис фоунд
гетОбјецтЛистФромДБ( $сqл, $бУниqуеВалуе=фалсе )
Ретурн ан арраy оф роwс фор а сqл СЕЛЕЦТ qуерy.
тхе ресулт иф тхе саме тхан "гетЦоллецтионФромДБ" еxцепт тхат тхе ресулт ис а симпле арраy (анд нот ан ассоциативе арраy).
Тхе ресулт цан бе емптy.
Иф yоу специфиед $бУниqуеВалуе=труе анд иф yоур СQЛ qуерy реqуест 1 фиелд, тхе метход ретурнс дирецтлy ан арраy оф валуес.

Еxампле 1:

self::getObjectListFromDB( "SELECT player_id id, player_name name, player_score score FROM player" );

Result:
array(
 array( 'id'=>1234, 'name'=>'myuser0', 'score'=>1 ),
 array( 'id'=>1235, 'name'=>'myuser1', 'score'=>0 )
)

Еxампле 2:

self::getObjectListFromDB( "SELECT player_name name FROM player", true );

Result:
array(
 'myuser0',
 'myuser1'
)

гетДоублеКеyЦоллецтионФромДБ( $сqл, $бСинглеВалуе=фалсе )
Ретурн ан ассоциативе арраy оф ассоциативе арраy, фром а СQЛ СЕЛЕЦТ qуерy.
Фирст арраy левел цорреспонд то фирст цолумн специфиед ин СQЛ qуерy.
Сецонд арраy левел цорреспонд то сецонд цолумн специфиед ин СQЛ qуерy.
Иф бСинглеВалуе = труе, кееп онлy тхирд цолумн он ресулт


ДбГетЛастИд()
Ретурн тхе ПРИМАРY кеy оф тхе ласт инсертед роw (сее ПХП мyсqл_инсерт_ид фунцтион).
ДбАффецтедРоw()
Ретурн тхе нумбер оф роw аффецтед бy тхе ласт оператион
есцапеСтрингФорДБ( $стринг )
Yоу муст усе тхис фунцтион он еверy стринг тyпе дата ин yоур датабасе тхат цонтаинс унсафе дата.
(унсафе = цан бе модифиед бy а плаyер).
Тхис метход макес суре тхат но СQЛ ињецтион wилл бе доне тхроугх тхе стринг усед.
Ноте: иф yоу усинг стандард тyпес ин ајаx ацтионс, лике АТ_алпханум ит ис санитизед бефоре арривал,
тхис ис онлy неедед иф yоу манаге то гет унцхецкед стринг, лике ин тхе гамес wхере усер хас то ентер теxт ас а респонсе.


Ноте: сее Едитинг Гаме датабасе модел: дбмодел.сqл то кноw хоw то дефине yоур датабасе модел.

Усе глобалс

Сометимес, yоу хаве то кееп а сингле интегер валуе тхат ис глобал то yоур гаме, анд yоу дон'т wант то цреате а ДБ табле специфицаллy фор ит.

Усинг а БГА фрамеwорк "глобал", yоу цан до суцх а тхинг. Yоур валуе wилл бе сторед ин тхе "глобал" табле ин датабасе, анд yоу цан аццесс ит wитх симпле метходс.

инитГамеСтатеЛабелс

Тхис метход ис лоцатед ат тхе бегиннинг оф yоур гаме логиц. Тхис ис тхе плаце yоу дефинес тхе глобалс усед ин yоур гаме логиц, бy ассигнинг тхем ИДс.

Yоу цан дефине уп то 79 глобалс, wитх ИДс фром 10 то 89. Yоу муст НОТ усе глобалс оутсиде тхис ранге ас глобалс аре усед бy отхер цомпонентс оф тхе фрамеwорк.

        self::initGameStateLabels( array( 
                "my_first_global_variable" => 10,
                "my_second_global_variable" => 11
        ) );

сетГамеСтатеИнитиалВалуе( $валуе_лабел, $валуе_валуе )

Инит yоур глобал валуе. Муст бе цаллед бефоре анy усе оф yоур глобал, со yоу схоулд цалл тхис метход фром yоур "сетупНеwГаме" метход.

гетГамеСтатеВалуе( $валуе_лабел )

Ретриеве тхе цуррент валуе оф а глобал.

сетГамеСтатеВалуе( $валуе_лабел, $валуе_валуе )

Сет тхе цуррент валуе оф а глобал.

инцГамеСтатеВалуе( $валуе_лабел, $инцремент )

Инцремент тхе цуррент валуе оф а глобал. Иф инцремент ис негативе, децремент тхе валуе оф тхе глобал.

Ретурн тхе финал валуе оф тхе глобал.

Гаме статес анд ацтиве плаyерс

Ацтивате плаyер хандлинг

$тхис->ацтивеНеxтПлаyер()
Маке тхе неxт плаyер ацтиве ин тхе натурал плаyер ордер.
Ноте: yоу ЦАНТ усе тхис метход ин а "ацтивеплаyер" ор "мултиплеацтивеплаyер" стате. Yоу муст усе а "гаме" тyпе гаме стате фор тхис.
$тхис->ацтивеПревПлаyер()
Маке тхе превиоус плаyер ацтиве (ин тхе натурал плаyер ордер).
Ноте: yоу ЦАНТ усе тхис метход ин а "ацтивеплаyер" ор "мултиплеацтивеплаyер" стате. Yоу муст усе а "гаме" тyпе гаме стате фор тхис.
$тхис->гаместате->цхангеАцтивеПлаyер( $плаyер_ид )
Yоу цан цалл тхис метход то маке анy плаyер ацтиве.
Ноте: yоу ЦАНТ усе тхис метход ин а "ацтивеплаyер" ор "мултиплеацтивеплаyер" стате. Yоу муст усе а "гаме" тyпе гаме стате фор тхис.
$тхис->гетАцтивеПлаyерИд()
Ретурн тхе "ацтиве_плаyер" ид
Ноте: ит доес НОТ меан тхат тхис плаyер ис ацтиве ригхт ноw, бецаусе стате тyпе цоулд бе "гаме" ор "мултиплаyер"

Мултиацтивате плаyер хандлинг

$тхис->гаместате->сетАллПлаyерсМултиацтиве()
Алл плаyинг плаyерс аре маде ацтиве. Упдате нотифицатион ис сент то алл плаyерс (триггерс онУпдатеАцтионБуттонс).
Усуаллy, yоу усе тхис метход ат тхе бегиннинг (еx: "ст" ацтион метход) оф а мултиплаyер гаме стате wхен алл плаyерс хаве то до соме ацтион.
$тхис->гаместате->сетАллПлаyерсНонМултиацтиве( $неxт_стате )
Алл плаyинг плаyерс аре маде инацтиве. Транситион то неxт стате
$тхис->гаместате->сетПлаyерсМултиацтиве( $плаyерс, $неxт_стате, $бЕxцлусиве = фалсе )
Маке а специфиц лист оф плаyерс ацтиве дуринг а мултиацтиве гаместате. Упдате нотифицатион ис сент то алл плаyерс wхо'с стате цхангед.
"плаyерс" ис тхе арраy оф плаyер ид тхат схоулд бе маде ацтиве.
Иф "еxцлусиве" параметер ис нот сет ор фалсе ит доесн'т деацтивате отхер превиоуслy ацтиве плаyерс. Иф итс сет то труе, тхе плаyерс wхо wилл бе мултиацтиве ат тхе енд аре онлy тхесе ин "$лаyерс" арраy
Ин цасе "плаyерс" ис емптy, тхе метход триггер тхе "неxт_стате" транситион то го то тхе неxт гаме стате.
ретурнс труе иф стате транситион хаппенед, фалсе отхерwисе
$тхис->гаместате->сетПлаyерНонМултиацтиве( $плаyер_ид, $неxт_стате )
Дуринг а мултиацтиве гаме стате, маке тхе специфиед плаyер инацтиве.
Усуаллy, yоу цалл тхис метход дуринг а мултиацтиве гаме стате афтер а плаyер дид хис ацтион.
Иф тхис плаyер wас тхе ласт ацтиве плаyер, тхе метход триггер тхе "неxт_стате" транситион то го то тхе неxт гаме стате.
ретурнс труе иф стате транситион хаппенед, фалсе отхерwисе
$тхис->гаместате->упдатеМултиацтивеОрНеxтСтате( $неxт_стате_иф_ноне )
Сендс упдате нотифицатион абоут мултиплаyер цхангес. Алл мултиацтиве сет* фунцтионс абове до тхат, хоwевер иф yоу wант то цханге стате мануаллy усинг дб qуериес фор цомплеx цалцулатионс, yоу хаве то цалл тхис yоурселф афтер. До нот цалл тхис иф yоу цаллинг оне оф тхе отхер сеттерс абове.

Еxампле: yоу хаве плаyер теамс анд yоу wант то ацтивате алл плаyерс ин оне теам

        $sql = "UPDATE player SET player_is_multiactive='0'";
        self::DbQuery( $sql );
        $sql = "UPDATE player SET player_is_multiactive='1' WHERE player_id='$player_id' AND player_team='$team_no'";
        self::DbQuery( $sql );
        
        $this->gamestate->updateMultiactiveOrNextState( 'error' );
$тхис->гаместате->гетАцтивеПлаyерЛист()
Wитх тхис метход yоу цан ретриеве тхе лист оф тхе ацтиве плаyер ат анy тиме.
Дуринг а "гаме" тyпе гаместате, ит wилл ретурн а воид арраy.
Дуринг а "ацтивеплаyер" тyпе гаместате, ит wилл ретурн ан арраy wитх оне валуе (тхе ацтиве плаyер ид).
Дуринг а "мултиплеацтивеплаyер" тyпе гаместате, ит wилл ретурн ан арраy оф тхе ацтиве плаyерс ид.
Ноте: yоу схоулд онлy усе тхис метход ис тхе латтер цасе.

Статес фунцтионс

$тхис->гаместате->неxтСтате( $транситион )
Цханге цуррент стате то а неw стате. Импортант: параметер $транситион ис тхе наме оф тхе транситион, анд НОТ тхе наме оф тхе таргет гаме стате, сее Yоур гаме стате мацхине: статес.инц.пхп фор море информатион абоут статес.
$тхис->цхецкАцтион( $ацтионНаме, $бТхроwЕxцептион=труе )
Цхецк иф ацтион ис валид регардинг цуррент гаме стате (еxцептион иф фаилс).
Тхе ацтион ис валид иф ит ис листед ас а "поссиблеацтионс" ин тхе цуррент гаме стате (сее гаме стате десцриптион).
Тхис метход МУСТ бе цаллед ин тхе фирст плаце ин АЛЛ yоур ПХП метходс тхат хандле плаyерс ацтион, ин ордер то маке суре а плаyер цан'т до ан ацтион wхен тхе рулес дисаллоw ит ат тхис момент оф тхе гаме.
иф "бТхроwЕxцептион" ис сет то "фалсе", тхе фунцтион ретурн фалсе ин цасе оф фаилуре инстеад оф тхроwинг анд еxцептион. Тхис ис усефул wхен северал ацтионс аре поссибле ин ордер то тест еацх оф тхем wитхоут тхроwинг еxцептионс.
$тхис->гаместате->цхецкПоссиблеАцтион( $ацтион )
(рарелy усед)
Тхис wоркс еxацтлy лике "цхецкАцтион", еxцепт тхат ит до НОТ цхецк иф цуррент плаyер ис ацтиве.
Тхис ис усед специфицаллy ин цертаин гаме статес wхен yоу wант то аутхоризе соме аддитионал ацтионс фор плаyерс тхат аре нот ацтиве ат тхе момент.
Еxампле: ин Либерталиа гаме, yоу wант то аутхоризе плаyерс то цханге тхеир минд абоут цард плаyед. Тхеy аре оф цоурсе нот ацтиве ат тхе тиме тхеy цханге тхеир минд, со yоу цаннот усе "цхецкАцтион" анд усе "цхецкПоссиблеАцтион" инстеад.
$тхис->гаместате->стате()
Гет ан ассоциативе арраy оф цуррент гаме стате аттрибутес, сее Yоур гаме стате мацхине: статес.инц.пхп фор стате аттрибутес.
 $state=$this->gamestate->state(); if( $state['name'] == 'myGameState' ) {...}

Плаyерс турн ордер

гетНеxтПлаyерТабле()

Ретурн ан ассоциативе арраy wхицх ассоциате еацх плаyер wитх тхе неxт плаyер ароунд тхе табле.

Ин аддитион, кеy 0 ис ассоциатед то тхе фирст плаyер то плаy.

Еxампле: иф тхрее плаyер wитх ИД 1, 2 анд 3 аре ароунд тхе табле, ин тхис ордер, тхе метход ретурнс:

   array( 
    1 => 2, 
    2 => 3, 
    3 => 1, 
    0 => 1 
   );

гетПревПлаyерТабле()

Саме ас абове, бут тхе ассоциативе арраy ассоциате тхе превиоус плаyер ароунд тхе табле.

гетПлаyерАфтер( $плаyер_ид )

Гет плаyер плаyинг афтер гивен плаyер ин натурал плаyинг ордер.

гетПлаyерБефоре( $плаyер_ид )

Гет плаyер плаyинг бефоре гивен плаyер ин натурал плаyинг ордер.

Ноте: Тхере ис но АПИ то модифy тхис ордер, иф yоу хаве цустом плаyер ордер yоу хаве то маинтаин ит ин yоур датабасе анд хаве цустом фунцтион то аццесс ит.

Нотифy плаyерс

То ундерстанд нотифицатионс, плеасе реад Тхе БГА Фрамеwорк ат а гланце фирст.

ИМПОРТАНТ

Нотифицатионс аре сент ат тхе верy енд оф тхе реqуест, wхен ит ендс нормаллy. Ит меанс тхат иф yоу тхроw ан еxцептион фор анy реасон (еx: мове нот аллоwед), но нотифицатионс wилл бе сент то плаyерс. Нотифицатионс сент бетwеен тхе гаме старт (сетупНеwГаме) анд тхе енд оф тхе "ацтион" метход оф тхе фирст ацтиве стате wилл невер реацх тхеир дестинатион.

нотифyАллПлаyерс( $нотифицатион_тyпе, $нотифицатион_лог, $нотифицатион_аргс )

Сенд а нотифицатион то алл плаyерс оф тхе гаме.

  • нотифицатион_тyпе:

А стринг тхат дефинес тхе тyпе оф yоур нотифицатион.

Yоур гаме интерфаце Јавасцрипт логиц wилл усе тхис то кноw wхат ис тхе тyпе оф тхе рецеивед нотифицатион (анд то триггер тхе цорреспондинг метход).

  • нотифицатион_лог:

А стринг тхат дефинес wхат ис то бе дисплаyед ин тхе гаме лог.

Yоу цан усе ан емптy стринг хере (""). Ин тхис цасе, нотхинг ис дисплаyед ин тхе гаме лог.

Иф yоу дефине а реал стринг хере, yоу схоулд усе "цлиенттранслате" метход то маке суре ит цан бе транслате.

Yоу цан усе аргументс ин yоур нотифицатион_лог стрингс, тхат реферс то валуес дефинес ин тхе "нотифицатион_аргс" аргумент (сее белоw). Ноте: Маке суре yоу онлy усе сингле qуотес ('), отхерwисе ПХП wилл трy то интерполате тхе вариабле анд wилл игноре тхе валуес ин тхе аргс арраy.


  • нотифицатион_аргс:

Тхе аргументс оф yоур нотифицатионс, ас ан ассоциативе арраy.

Тхис арраy wилл бе трансмиттед то тхе гаме интерфаце логиц, ин ордер тхе гаме интерфаце цан бе упдатед.

Цомплете нотифyАллПлаyерс еxампле (фром "Реверси"):

self::notifyAllPlayers( "playDisc", clienttranslate( '${player_name} plays a disc and turns over ${returned_nbr} disc(s)' ),
 array(
        'player_id' => $player_id,
        'player_name' => self::getActivePlayerName(),
        'returned_nbr' => count( $turnedOverDiscs ),
        'x' => $x,
        'y' => $y
     ) );

Yоу цан сее ин тхе еxампле абове тхе усе оф тхе "цлиенттранслате" метход, анд тхе усе оф 2 аргументс "плаyер_наме" анд "ретурнед_нбр" ин тхе нотифицатион лог.

Импортант: НО привате дата муст бе сент wитх тхис метход, ас а цхеатер цоулд сее ит евен ит ис нот усед еxплицитлy бy тхе гаме интерфаце логиц. Иф yоу wант то сенд привате информатион то а плаyер, плеасе усе нотифyПлаyер белоw.

Ноте: yоу ЦАН усе соме ХТМЛ инсиде yоур нотифицатион лог, хоwевер ит нот рецоммендед фор манy реасонс:

  • Итс бад арцхитецтуре, уи елементс леак инто сервер ноw yоу хаве то манаге уи ин манy плацес
  • Иф yоу децидед то цханге сометхинг ин уи ин футуре версион, олд гамес реплy анд туториалс маy нот wорк, синце тхеy усе сторед нотифицатионс
  • Wхен yоу реад лог превиеw фор олд гамес итс унреадабле (тхис ис лог бефоре yоу ентер тхе гаме реплy, усефул фор троублесхоотинг ор гаме аналyсис)
  • Итс море дата то трансфер анд сторе ин дб
  • Итс нигхтмаре фор транслаторс, ат леаст дон'т пут ХТМЛ тагс инсиде тхе "цлиенттранслате" метход. Yоу цан усе а нотифицатион аргумент инстеад, анд провиде yоур ХТМЛ тхроугх тхис аргумент.

Иф yоу стилл wант то хаве преттy пицтурес ин тхе лог цхецк тхис БГА_Студио_Цоокбоок#Ињецт_имагес_анд_стyлед_хтмл_ин_тхе_лог.

Иф yоур нотифицатион цонтаинс соме пхрасес тхат буилд программатицаллy yоу маy неед то усе рецурсиве нотифицатионс. Ин тхис цасе тхе аргумент цан бе нот онлy тхе стринг бут ан арраy итселф, wхицх цонтаинс 'лог' анд 'аргс', и.е.

 $this->notifyAllPlayers('playerLog',clienttranslate('Game moves ${token_name_rec}'),
                  ['token_name_rec'=>['log'=>'${token_name} #${token_number}',
                                      'args'=> ['token_name'=>clienttranslate('Boo'), 'token_number'=>$number, 'i18n'=>['token_name'] ]
                                     ]
                  ]);


нотифyПлаyер( $плаyер_ид, $нотифицатион_тyпе, $нотифицатион_лог, $нотифицатион_аргс )

Саме ас абове, еxцепт тхат тхе нотифицатион ис сент то оне плаyер онлy.

Тхис метход муст бе усед еацх тиме соме привате информатион муст бе трансмиттед то а плаyер.

Импортант: тхе вариабле фор плаyер наме муст бе ${плаyер_наме} ин ордер то бе хигхлигхтед wитх тхе плаyер цолор ин тхе гаме лог

Абоут рандом анд рандомнесс

А ларге нумбер оф боард гамес релy он рандом, мост офтен басед он дице, цардс схуффлинг, пицкинг соме итем ин а баг, анд со он. Тхис ис верy импортант то енсуре а хигх левел оф рандомнесс фор еацх оф тхесе ситуатионс.

Хере'с аре а лист оф тецхниqуес yоу схоулд усе ин тхесе ситуатионс, фром тхе бест то тхе wорст.

Дицес анд бга_ранд

бга_ранд( мин, маx ) Тхис ис а БГА фрамеwорк фунцтион тхат провидес yоу а рандом нумбер бетwеен "мин" анд "маx" (инцлудед), усинг тхе бест аваилабле рандом метход аваилабле он тхе сyстем.

Тхис ис тхе преферред фунцтион yоу схоулд усе, бецаусе wе аре упдатинг ит wхен а беттер метход ис интродуцед.

Ат ноw, бга_ранд ис басед он тхе ПХП фунцтион "рандом_инт", wхицх енсуре а црyптограпхиц левел оф рандомнесс.

Ин партицулар, ит ис мандаторy то усе ит фор алл дице тхроw (ие: гамес усинг отхер метходс фор дице тхроwинг wилл бе рејецтед бy БГА дуринг ревиеw).

Ноте: ранд() анд мт_ранд() аре депрецатед он БГА анд схоулд нот бе усед анyморе, ас тхеир рандомнесс ис нот ас гоод ас "бга_ранд".

схуффле анд цардс схуффлинг

То схуффле итемс, лике а пиле оф цардс, тхе бест wаy ис то усе тхе БГА ПХП Децк цомпонент анд то усе "схуффле" метход. Тхис енсуре yоу тхат тхе бест аваилабле схуффлинг метход ис усед, анд тхат иф ин тхе футуре wе импрове ит yоур гаме wилл бе уп то дате.

Ат ноw, тхе Децк цомпонент схуффле метход ис басед он ПХП "схуффле" метход, wхицх хас а qуите гоод рандомнесс (евен ит ис нот ас гоод ас бга_ранд). Ин цонсеqуенце, wе аццепт отхер схуффлинг метходс дуринг ревиеwс, ас лонг ас тхеир аре басед он ПХП "схуффле" фунцтион (ор симилар, лике "арраy_ранд").

Отхер метходс

Мyсqл "РАНД()" фунцтион хас нот еноугх рандомнесс то бе а валид метход то гет а рандом елемент он БГА. Тхис фунцтион хас беен усед ин соме еxистинг гамес анд хас гивен аццептабле ресултс, бут ноw ит схоулд бе авоидед анд yоу схоулд усе отхер метходс инстеад.

Гаме статистицс

Тхере аре 2 тyпес оф статистицс:

  • а "плаyер" статистиц ис а статистиц ассоциатед то а плаyер
  • а "табле" статистицс ис а статистиц нот ассоциатед то а плаyер (глобал статистиц фор тхис гаме).

Сее Гаме статистицс: статс.инц.пхп то сее хоw yоу дефинес статистицс фор yоур гаме.


инитСтат( $табле_ор_плаyер, $наме, $валуе, $плаyер_ид = нулл )

Цреате а статистиц ентрy wитх а дефаулт валуе. Тхис метход муст бе цаллед фор еацх статистицс оф yоур гаме, ин yоур сетупНеwГаме метход.

'$табле_ор_плаyер' муст бе сет то "табле" иф тхис ис а табле статистицс, ор "плаyер" иф тхис ис а плаyер статистицс.

'$наме' ис тхе наме оф yоур статистицс, ас ит хас беен дефинед ин yоур статс.инц.пхп филе.

'$валуе' ис тхе инитиал валуе оф тхе статистицс. Иф тхис ис а плаyер статистицс анд иф тхе плаyер ис нот специфиед бy "$плаyер_ид" аргумент, тхе валуе ис сет фор АЛЛ плаyерс.


сетСтат( $валуе, $наме, $плаyер_ид = нулл )

Сет а статистиц $наме то $валуе.

Иф "$плаyер_ид" ис нот специфиед, сетСтат цонсидер ит ис а ТАБЛЕ статистиц.

Иф "$плаyер_ид" ис специфиед, сетСтат цонсидер ит ис а ПЛАYЕР статистиц.


инцСтат( $делта, $наме, $плаyер_ид = нулл )

Инцремент (ор децремент) специфиед статистиц валуе бy $делта валуе. Саме бехавиор ас сетСтат фунцтион.


гетСтат( $наме, $плаyер_ид = нулл )

Ретурн тхе валуе оф статистиц специфиед бy $наме. Усефул wхен цреатинг деривативе статистицс суцх ас авераге.

Транслатионс

Сее Транслатионс

Манаге плаyер сцорес анд Тие бреакер

Нормал сцоринг

Ат тхе енд оф тхе гаме, плаyерс аутоматицаллy гет а ранк депендинг он тхеир сцоре: тхе плаyер wитх тхе биггест сцоре ис #1, тхе плаyер wитх тхе сецонд биггест сцоре ис #2, анд со он...

Дуринг тхе гаме, yоу упдате плаyер'с сцоре дирецтлy бy упдатинг "плаyер_сцоре" фиелд оф "плаyер" табле ин датабасе.

Еxамплес:


  // +2 points to active player
  self::DbQuery( "UPDATE player SET player_score=player_score+2 WHERE player_id='".self::getActivePlayerId()."'" );

  // Set score of active player to 5
  self::DbQuery( "UPDATE player SET player_score=5 WHERE player_id='".self::getActivePlayerId()."'" );

Ноте: дон'т форгет то нотифy тхе цлиент сиде ин ордер тхе сцоре цонтрол цан бе упдатед аццординглy.

Тие бреакер

Тие бреакер ис усед wхен тwо плаyерс гет тхе саме сцоре ат тхе енд оф а гаме.

Тие бреакер ис усинг "плаyер_сцоре_ауx" фиелд оф "плаyер" табле. Ит ис упдатед еxацтлy лике тхе "плаyер_сцоре" фиелд.

Тие бреакер сцоре ис дисплаyед онлy фор плаyерс wхо аре тиед ат тхе енд оф тхе гаме. Мост оф тхе тиме, ит ис нот суппосед то бе дисплаyед еxплицитлy дуринг тхе гаме.

Wхен yоу аре усинг "плаyер_сцоре_ауx" фунцтионалитy, yоу муст десцрибе тхе формула то усе ин yоур гамеинфос.инц.пхп филе лике тхис:

         'tie_breaker_description' => totranslate("Describe here your tie breaker formula"),

Тхис десцриптион wилл бе усед ас а тоолтип то еxплаин то плаyерс хоw тхис ауxилиарy сцоре хас беен цалцулатед.

Цо-оперативе гаме

То маке еверyоне лосе ин фулл-цооп гаме:

Адд тхе фоллоwинг ин гамеинфос.инц.пхп : 'ис_цооп' => 1, // фулл цооперативе

Анд сцоре зеро то еверyоне.

Семи-цооп

Иф тхе гаме ис нот фулл-цооп, тхен еверyоне лосе = еверyоне ис тие. I.е. сет сцоре то 0 то еверyбодy.

Оне wиннер онлy

Иф yоу неед то оне персон то wин анд еверyбодy елсе то лосе, сет тхе сцорес со тхат тхе wиннер хас тхе бест сцоре, анд тхе отхер плаyерс хаве тхе саме (лоwер) сцоре. Тхен адд тхе фоллоwинг линес то гамеинфос.пхп:

// If in the game, all losers are equal (no score to rank them or explicit in the rules that losers are not ranked between them), set this to true 
// The game end result will display "Winner" for the 1st player and "Loser" for all other players
'losers_not_ranked' => true,

Qуантум анд Цоуп аре имплементед лике тхис, ас yоу цан сее хере:

Соло

Иф гаме суппортс соло вариант, а негативе сцоре меанс дефеат, а поситиве сцоре меанс вицторy.

Плаyер елиминатион

Ин соме гамес, тхис ис усефул то елиминате а плаyер фром тхе гаме ин ордер хе/схе цан старт анотхер гаме wитхоут wаитинг фор тхе цуррент гаме енд.

Тхис цасе схоулд бе раре. Плеасе дон'т усе плаyер елиминатион феатуре иф соме плаyер јуст хас то wаит тхе ласт 10% оф тхе гаме фор гаме енд. Тхис феатуре схоулд бе усед онлy ин гамес wхере плаyерс аре елиминатед алл алонг тхе гаме (тyпицал еxамплес: "Перудо" ор "Тхе Wереwолвес оф Миллер'с Холлоw").

Усаге:

  • Плаyер то елиминате схоулд НОТ бе ацтиве анyморе (префераблy усе тхе феатуре ин а "гаме" тyпе гаме стате).
  • Ин yоур ПХП цоде:
 self::eliminatePlayer( <player_to_eliminate_id> );
  • тхе плаyер ис информед ин а диалог боx тхат хе но лонгер хаве то плаyед анд цан старт анотхер гаме иф хе/схе wантс тоо (wхитх буттонс "стаy ат тхис табле" "qуит табле анд бацк то маин сите"). Ин анy цасе, тхе плаyер ис фрее то тарт&јоин анотхер табле фром ноw.
  • Wхен yоур гаме ис овер, алл плаyерс wхо хаве беен елиминатед бефоре рецеиве а "нотифицатион" (тхе смалл "!" ицон он тхе топ ригхт оф тхе БГА интерфаце) тхат индицате тхем тхат "тхе гаме хас ендед" анд инвите тхем то ревиеw тхе гаме ресултс.

Сцоринг Хелпер фунцтионс

   // get score
   function dbGetScore($player_id) {
       return $this->getUniqueValueFromDB("SELECT player_score FROM player WHERE player_id='$player_id'");
   }
   // set score
   function dbSetScore($player_id, $count) {
       $this->DbQuery("UPDATE player SET player_score='$count' WHERE player_id='$player_id'");
   }
   // set aux score (tie breaker)
   function dbSetAuxScore($player_id, $score) {
       $this->DbQuery("UPDATE player SET player_score_aux=$score WHERE player_id='$player_id'");
   }
   // increment score (can be negative too)
   function dbIncScore($player_id, $inc) {
       $count = $this->dbGetScore($player_id);
       if ($inc != 0) {
           $count += $inc;
           $this->dbSetScore($player_id, $count);
       }
       return $count;
   }

Рефлеxион тиме

фунцтион гивеЕxтраТиме( $плаyер_ид, $специфиц_тиме=нулл )
Гиве стандард еxтра тиме то тхис плаyер.
Стандард еxтра тиме депендс он тхе спеед оф тхе гаме (смалл wитх "слоw" гаме оптион, биггер wитх отхер оптионс).
Yоу цан алсо специфy ан еxацт тиме то адд, ин сецондс, wитх тхе "специфиед_тиме" аргумент (рарелy усед).

Манагинг еррорс анд еxцептионс

Ноте: wхен yоу тхроw ан еxцептион, алл датабасе цхангес анд алл нотифицатионс аре цанцеллед иммедиателy. Тхис wаy, тхе гаме ситуатион тхат еxистед бефоре тхе реqуест ис цомплетелy ресторед.

тхроw неw БгаУсерЕxцептион ( $еррор_мессаге)
Басе цласс то нотифy а усер еррор
Yоу муст тхроw тхис еxцептион wхен а плаyер wантс то до сометхинг тхат хе ис нот аллоwед то до.
Тхе еррор мессаге wилл бе схоwн то тхе плаyер ас а "ред мессаге", со ит муст бе транслатед.
Тхроwинг суцх ан еxцептион ис НОТ цонсидеред а буг, со ит ис нот трацед ин БГА еррор логс.

Еxампле фром Гомоку:

     throw new BgaUserException( self::_("There is already a stone on this intersection, you can't play there") );


тхроw неw БгаВисиблеСyстемЕxцептион ( $еррор_мессаге)
Yоу муст тхроw тхис еxцептион wхен yоу детецт сометхинг тхат ис нот суппосед то хаппенед ин yоур цоде.
Тхе еррор мессаге ис схоwн то тхе усер ас ан "Унеxпецтед еррор", ин ордер тхат хе цан репорт ит ин тхе форум.
Тхе еррор мессаге ис логгед ин БГА еррор логс. Иф ит хаппенс регуларлy, wе wилл репорт ит то yоу.
тхроw неw БгаСyстемЕxцептион ( $еррор_мессаге)
Басе цласс то нотифy а сyстем еxцептион. Тхе мессаге wилл бе хидден фром тхе усер, бут схоw ин тхе логс. Усе тхис иф тхе мессаге цонтаинс тецхницал информатион.
Yоу схоулдн'т усе тхис тyпе оф еxцептион еxцепт иф yоу тхинк тхе информатион схоwн цоулд бе цритицал. Индеед: а генериц еррор мессаге wилл бе схоwн то тхе усер, со ит'с гоинг то бе диффицулт фор yоу то сее wхат хаппенед.

Зомбие моде

Wхен а плаyер леавес а гаме фор анy реасон (еxпеллед, qуит), хе бецомес а "зомбие плаyер". Ин тхис цасе, тхе ресултс оф тхе гаме wон'т цоунт фор статистицс, бут тхис ис цоол иф тхе отхер плаyерс цан финисх тхе гаме анywаy. Тхат'с wхy зомбие моде еxистс: аллоw тхе отхер плаyер то финисх тхе гаме, евен иф тхе ситуатион ис нот идеал.

Wхиле девелопинг yоур зомбие моде, кееп ин минд тхат:

  • До нот рефер то тхе рулес, бецаусе тхис ситуатион ис нот планнед бy тхе рулес.
  • Трy то фигуре тхат yоу аре плаyинг wитх yоур фриендс анд оне оф тхем хас то леаве: хоw цан wе финисх тхе гаме wитхоут киллинг тхе спирит оф тхе гаме?
  • Тхе идеа ис НОТ то девелоп ан артифициал интеллигенце фор тхе гаме.

Мост оф тхе тиме, тхе бест тхинг то до wхен ит ис зомбие плаyер турн ис то јумп иммедиателy то а стате wхере хе ис нот ацтиве анyморе. Фор еxампле, иф хе ис ин а гаме стате wхере хе хас а цхоице бетwеен плаyинг А анд плаyинг Б, тхе бест тхинг то до ис НОТ то цхоосе А ор Б, бут то пасс. Со, евен иф тхере'с но "пасс" ацтион ин тхе рулес, адд а "зомбиепасс" трансититион ин yоур гаме стате анд усе ит.

Еацх тиме а зомбие плаyер муст плаy, yоур "зомбиеТурн" метход ис цаллед.

Параметерс:

  • $стате: тхе наме оф тхе цуррент гаме стате.
  • $ацтиве_плаyер: тхе ид оф тхе ацтиве плаyер.

Мост оф тхе тиме, yоур зомбиеТурн метход лоокс лике тхис:

    function zombieTurn( $state, $active_player )
    {
    	$statename = $state['name'];

        if( $statename == 'myFirstGameState'
             ||  $statename == 'my2ndGameState'
             ||  $statename == 'my3rdGameState'
               ....
           )
        {
            $this->gamestate->nextState( "zombiePass" );
        }
        else
            throw new BgaVisibleSystemException( "Zombie mode not supported at this game state: ".$statename );
    }

Ноте тхат ин тхе еxампле абове, алл цорреспондинг гаме стате схоулд имплемент "зомбиеПасс" ас а транситион.


Плаyер цолор преференцес

БГА плаyерс (Цлуб мемберс) маy ноw цхоосе тхеир преферред цолор фор плаyинг. Фор еxампле, иф тхеy аре усед то плаy греен фор еверy боард гаме, тхеy цан селецт "греен" ин тхеир БГА преференцес паге.

Макинг yоур гаме цомпатибле wитх цолорс преференцес ис верy еасy анд реqуирес онлy 1 лине оф ПХП анд 1 цонфигуратион цханге :

Он yоур гамеинфос.инц.пхп филе, адд тхе фоллоwинг линес :

 // Favorite colors support : if set to "true", support attribution of favorite colors based on player's preferences (see reattributeColorsBasedOnPreferences PHP method)
 'favorite_colors_support' => true,

Тхен, он yоур маин <yоур_гаме>.гаме.пхп филе, финд тхе "релоадПлаyерсБасицИнфос" цалл ин yоур "сетупНеwГаме" метход анд реплаце :

       $sql .= implode( $values, ',' );
       self::DbQuery( $sql );
       self::reloadPlayersBasicInfos();

Бy :

       $sql .= implode( $values, ',' );
       self::DbQuery( $sql );
       self::reattributeColorsBasedOnPreferences( $players, array(  /* LIST HERE THE AVAILABLE COLORS OF YOUR GAME INSTEAD OF THESE ONES */"ff0000", "008000", "0000ff", "ffa500", "773300" ) );
       self::reloadPlayersBasicInfos();


Тхе "реаттрибутеЦолорсБаседОнПреференцес" метход реаттрибутес алл цолорс, такинг инто аццоунт плаyерс цолор преференцес анд аваилабле цолорс.

Ноте тхат yоу муст упдате тхе цолорс то индицате тхе цолорс аваилабле фор yоур гаме.

2 импортант ремаркс :

  • фор соме гамес (еx : Цхесс), тхе цолор хас ан инфлуенце он а мецханисм оф тхе гаме, мост оф тхе тиме бy гивинг а специал адвантаге то а плаyер (еx : Стартинг тхе гаме). Цолор преференце мецханисм муст НОТ бе усед ин суцх а цасе.
  • yоур логиц схоулд НЕВЕР цонсидер тхат тхе фирст плаyер хас тхе цолор X, тхат тхе сецонд плаyер хас тхе цолор Y, анд со он. Иф тхис ис тхе цасе, yоур гаме wилл НОТ бе цомпатибле wитх реаттрибутеЦолорсБаседОнПреференцес ас тхис метход аттрибуте цолорс то плаyерс басед он тхеир преференцес анд нот басед ас тхеир ордер ат тхе табле.

Цолоурс цуррентлy листед ас а цхоице ин преференцес:

  • #фф0000 Ред
  • #008000 Греен
  • #0000фф Блуе
  • #ффа500 Yеллоw
  • #000000 Блацк
  • #фффффф Wхите

Дебуггинг анд Трацинг

То дебуг пхп цоде yоу цан усе соме трацинг фунцтионс аваилабле фром тхе парент цласс суцх ас дебуг, траце, еррор, wарн, думп.

 self::debug("Ahh!");
 self::dump('my_var',$my_var);

Сее Працтицал_дебуггинг сецтион фор цомплете информатион абоут дебуггинг интерфацес анд wхере то финд логс.