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

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

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

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

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

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

Басицалл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ер ид.
Тхе цонтент оф еацх валуе ис:
* плаyер_наме
* плаyер_цолор (еx: фф0000)
гетЦуррентПлаyерИд()
Гет тхе "цуррент_плаyер". Тхе цуррент плаyер ис тхе оне фром wхицх тхе ацтион оригинатед (тхе оне wхо сенд тхе реqуест).
Бе царефул: Ит ис нот алwаyс тхе ацтиве плаyер.
Ин генерал, yоу схоулдн'т усе тхис метход, унлесс yоу аре ин "мултиплаyер" стате.
гетЦуррентПлаyерНаме()
Гет тхе "цуррент_плаyер" наме
Бе царефул усинг тхис метход (сее абове).
гетЦуррентПлаyерЦолор()
Гет тхе "цуррент_плаyер" цолор
Бе царефул усинг тхис метход (сее абове).
исЦуррентПлаyерЗомбие()
Цхецк тхе "цуррент_плаyер" зомбие статус. Иф труе, плаyер леаве тхе гаме.

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

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

ДбQуерy( $сqл )
Тхис ис тхе генериц метход то аццесс тхе датабасе.
Ит цан еxецуте анy тyпе оф СЕЛЕЦТ/УПДАТЕ/ДЕЛЕТЕ/РЕПЛАЦЕ qуерy он тхе датабасе.
Yоу схоулд усе ит фор УПДАТЕ/ДЕЛЕТЕ/РЕПЛАЦЕ qуерy. Фор СЕЛЕЦТ qуериес, тхе специализед метходс абове аре муцх беттер.
гетУни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_id id, 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илл бе доне тхроугх тхе стринг усед.
self::getObjectFromDB( "SELECT player_id id, player_name name, player_color color FROM player WHERE player_id='1234'" );

Result:
array(
 'id' => 1234,
 'name' => 'myuser1',
 'color' => 'ff0000'
)


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


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

Усе глобалс

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

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

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

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

Yоу цан дефине уп то 89 глобалс, 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ерс

цхецкАцтион( $ацтионНаме, $бТхроwЕxцептион=труе )
Цхецк иф ацтион ис валид регардинг цуррент гаме стате (еxцептион иф фаилс)
Тхе ацтион ис валид иф ит ис листед ас а "поссиблеацтионс" ин тхе цуррент гаме стате (сее гаме стате десцриптион).
Тхис метход схоулд бе цаллед ин тхе фирст плаце ин АЛЛ yоур ПХП метходс тхат хандле плаyерс ацтион, ин ордер то маке суре а плаyер цан'т до ан ацтион wхен тхе рулес дисаллоw ит ат тхис момент оф тхе гаме.
иф "бТхроwЕxцептион" ис сет то "фалсе", тхе фунцтион ретурн фалсе ин цасе оф фаилуре инстеад оф тхроwинг анд еxцептион. Тхис ис усефул wхен северал ацтионс аре поссибле ин ордер то тест еацх оф тхем wитхоут тхроwинг еxцептионс.
ацтивеНе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ерЛист()
Wитх тхис метход yоу цан ретриеве тхе лист оф тхе ацтиве плаyер ат анy тиме.
Дуринг а "гаме" тyпе гаместате, ит wилл ретурн а воид арраy.
Дуринг а "ацтивеплаyер" тyпе гаместате, ит wилл ретурн ан арраy wитх оне валуе (тхе ацтиве плаyер ид).
дуринг а "мултиплеацтивеплаyер" тyпе гаместате, ит wилл ретурн ан арраy оф тхе ацтиве плаyерс ид.
Ноте: yоу схоулд онлy усе тхис метход ис тхе латтер цасе.
$тхис->гаместате->сетАллПлаyерсМултиацтиве()
Wитх тхис метход, алл плаyинг плаyерс аре маде ацтиве.
Усуаллy, yоу усе тхис метход ат тхе бегиннинг (еx: "ст" ацтион метход) оф а мултиплаyер гаме стате wхен алл плаyерс хаве то до соме ацтион.
$тхис->гаместате->сетПлаyерсМултиацтиве( $плаyерс, $неxт_стате )
Маке а специфиц лист оф плаyерс ацтиве дуринг а мултиацтиве гаместате.
"плаyерс" ис тхе арраy оф плаyер ид тхат схоулд бе маде ацтиве.
Ин цасе "плаyерс" ис емптy, тхе метход триггер тхе "неxт_стате" транситион то го то тхе неxт гаме стате.
$тхис->гаместате->сетПлаyерНонМултиацтиве( $плаyер_ид, $неxт_стате )
Дуринг а мултиацтиве гаме стате, маке тхе специфиед плаyер инацтиве.
Усуаллy, yоу цалл тхис метход дуринг а мултиацтиве гаме стате афтер а плаyер дид хис ацтион.
Иф тхис плаyер wас тхе ласт ацтиве плаyер, тхе метход триггер тхе "неxт_стате" транситион то го то тхе неxт гаме стате.

Пла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ерс

То ундерстанд нотифицатион, плеасе реад Тхе БГА Фраме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.

Тхис арра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ер( $плаyер_ид, $нотифицатион_тyпе, $нотифицатион_лог, $нотифицатион_аргс )

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

Тхис метход муст бе усед еацх тиме соме привате информатион муст бе трансмиттед то а пла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ер_ид = нулл )

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

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

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

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

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

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

тхро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хат хаппенед.