Implement 32x32 BFS visitor navigation and daily contracts system with companion .npc journals; add native assembly scenes for Clover slots, Pyramid cards, Blackjack Party and Russian Party; package animation and sprite packs; add comprehensive offline test suites and rebuild shipping binaries.
258 lines
12 KiB
PHP
258 lines
12 KiB
PHP
; ==============================================================================
|
|
; NPC MIND DATA - MASM32 / CP1251
|
|
; Multi-agent AI: Open-space Navigation, Personalities & Multi-seat Poker
|
|
; ==============================================================================
|
|
|
|
NPCAI_ARCHETYPE_SHARK equ 0 ; Àêóëà (Tight-Aggressive)
|
|
NPCAI_ARCHETYPE_MANIAC equ 1 ; Ëóäîìàí (Loose-Aggressive)
|
|
NPCAI_ARCHETYPE_ROCK equ 2 ; Ñêàëà (Tight-Passive)
|
|
NPCAI_ARCHETYPE_CALLING_STATION equ 3 ; Àâòîîòâåò÷èê (Loose-Passive)
|
|
NPCAI_ARCHETYPE_WHALE equ 4 ; Ìàæîð (Âûñîêèé áàíêðîëë, õàîñ)
|
|
NPCAI_ARCHETYPE_ROOKIE equ 5 ; Íîâè÷îê (Îøèáêè, íåóâåðåííîñòü)
|
|
|
|
NPCAI_STATE_IDLE equ 0 ; Ñòîèò, îñìàòðèâàåòñÿ
|
|
NPCAI_STATE_WALK equ 1 ; Èäåò ïî âåéïîèíòàì
|
|
NPCAI_STATE_GAMBLE equ 2 ; Èãðàåò çà ñòîëîì
|
|
NPCAI_STATE_BAR equ 3 ; Ó áàðà
|
|
NPCAI_STATE_ATM equ 4 ; Ó áàíêîìàòà
|
|
NPCAI_STATE_STAGE equ 5 ; Ñìîòðèò øîó
|
|
|
|
MPK_SEAT_EMPTY equ 0
|
|
MPK_SEAT_ACTIVE equ 1
|
|
MPK_SEAT_FOLDED equ 2
|
|
MPK_SEAT_ALLIN equ 3
|
|
MPK_SEAT_BUST equ 4
|
|
|
|
MPK_ACT_NONE equ 0
|
|
MPK_ACT_FOLD equ 1
|
|
MPK_ACT_CHECK equ 2
|
|
MPK_ACT_CALL equ 3
|
|
MPK_ACT_RAISE equ 4
|
|
MPK_ACT_ALLIN equ 5
|
|
|
|
MPK_STAGE_PREFLOP equ 0
|
|
MPK_STAGE_FLOP equ 1
|
|
MPK_STAGE_TURN equ 2
|
|
MPK_STAGE_RIVER equ 3
|
|
MPK_STAGE_SHOWDOWN equ 4
|
|
|
|
NPCAI_MAX_NPCS equ 6
|
|
MPK_MAX_SEATS equ 4
|
|
NPCAI_WAYPOINT_COUNT equ 16
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Ñòðóêòóðû äàííûõ
|
|
; ------------------------------------------------------------------------------
|
|
|
|
NpcPersonality STRUCT
|
|
namePtr dd ?
|
|
titlePtr dd ?
|
|
archetypeId dd ?
|
|
baseAggression dd ? ; 0..100
|
|
baseTightness dd ? ; 0..100
|
|
baseBluffRate dd ? ; 0..100
|
|
baseCourage dd ? ; 0..100
|
|
tiltSens dd ? ; 0..100
|
|
defaultBank dd ?
|
|
phraseWinPtr dd ?
|
|
phraseLosePtr dd ?
|
|
phraseBluffPtr dd ?
|
|
phraseBustPtr dd ?
|
|
NpcPersonality ENDS
|
|
|
|
NpcMindEntity STRUCT
|
|
posX dd ? ; 16.16 FP
|
|
posY dd ? ; 16.16 FP
|
|
dirX dd ? ; 16.16 FP
|
|
dirY dd ? ; 16.16 FP
|
|
speed dd ? ; 16.16 FP
|
|
state dd ? ; NPCAI_STATE_*
|
|
stateTimer dd ?
|
|
currentNode dd ?
|
|
targetNode dd ?
|
|
profileId dd ?
|
|
currentChips dd ?
|
|
currentTilt dd ? ; 0..100
|
|
thoughtPtr dd ?
|
|
reactionPtr dd ?
|
|
NpcMindEntity ENDS
|
|
|
|
MpkSeat STRUCT
|
|
isHuman dd ? ; 1=Player, 0=NPC
|
|
profileId dd ? ; Èíäåêñ NpcPersonality (0..5)
|
|
chips dd ?
|
|
roundBet dd ?
|
|
totalBet dd ?
|
|
card1 dd ?
|
|
card2 dd ?
|
|
evalScore dd ?
|
|
seatStatus dd ? ; MPK_SEAT_*
|
|
lastAction dd ? ; MPK_ACT_*
|
|
lastRaiseAmount dd ?
|
|
thoughtPtr dd ?
|
|
reactionPtr dd ?
|
|
MpkSeat ENDS
|
|
|
|
MultiPokerTable STRUCT
|
|
seats MpkSeat MPK_MAX_SEATS dup(<>)
|
|
commCards dd 5 dup(?)
|
|
commCount dd ?
|
|
mainPot dd ?
|
|
currentHighBet dd ?
|
|
minRaise dd ?
|
|
dealerButton dd ?
|
|
currentTurn dd ?
|
|
activeSeats dd ?
|
|
smallBlind dd ?
|
|
bigBlind dd ?
|
|
stage dd ?
|
|
MultiPokerTable ENDS
|
|
|
|
NpcWaypoint STRUCT
|
|
posX dd ? ; 16.16 FP
|
|
posY dd ? ; 16.16 FP
|
|
neighbor0 dd ?
|
|
neighbor1 dd ?
|
|
neighbor2 dd ?
|
|
neighbor3 dd ?
|
|
zoneType dd ?
|
|
NpcWaypoint ENDS
|
|
|
|
; ------------------------------------------------------------------------------
|
|
; Ñòðîêîâûå êîíñòàíòû è îïèñàíèÿ (CP1251)
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.data
|
|
|
|
; Èìåíà è òèòóëû 6 óíèêàëüíûõ ïåðñîíàæåé
|
|
npcName0 db "Âèêòîð «Àêóëà»",0
|
|
npcTitle0 db "Ïðîôåññèîíàë (Tight-Aggressive)",0
|
|
|
|
npcName1 db "Ñåðãåé «Ëóäîìàí»",0
|
|
npcTitle1 db "Ìàíüÿê (Loose-Aggressive, ÒÈËÜÒ)",0
|
|
|
|
npcName2 db "Äÿäÿ Òîëÿ «Ñêàëà»",0
|
|
npcTitle2 db "Âåòåðàí (Tight-Passive)",0
|
|
|
|
npcName3 db "Ñòåïàí «Àâòîîòâåò÷èê»",0
|
|
npcTitle3 db "Ëþáèòåëü (Calling Station)",0
|
|
|
|
npcName4 db "Ìàæîð Àðò¸ì",0
|
|
npcTitle4 db "Õàéðîëëåð (Whale, Áåçóìíûå ñòàâêè)",0
|
|
|
|
npcName5 db "Âëàä «Íîâè÷îê»",0
|
|
npcTitle5 db "Ñòóäåíò (Rookie, Íåîïûòíûé)",0
|
|
|
|
; Ôðàçû ïîáåäû
|
|
npcWin0 db "«Õîëîäíûé ðàñ÷åò è íèêàêîé ìàãèè. Áàíê ìîé.»",0
|
|
npcWin1 db "«ÕÀ-ÕÀ! Êòî òóò êîðîëü êàçèíî?! Âñå ôèøêè ñþäà!»",0
|
|
npcWin2 db "«Òèøå åäåøü — äàëüøå áóäåøü, ìîëîäåæü.»",0
|
|
npcWin3 db "«Îïà, çàêðûëñÿ ñòðèò! À âû íå âåðèëè!»",0
|
|
npcWin4 db "«Îôèöèàíò, âñåì øàìïàíñêîãî çà ìîé ñ÷åò!»",0
|
|
npcWin5 db "«Îãî! Íåóæåëè ÿ ïðàâäà ïîáåäèë?! Âîò ýòî äà!»",0
|
|
|
|
; Ôðàçû ïîðàæåíèÿ / áýäáèòà
|
|
npcLose0 db "«Áûâàåò. Ìàòåìàòè÷åñêàÿ äèñïåðñèÿ íà äèñòàíöèè âåðíåò âñ¸.»",0
|
|
npcLose1 db "«ÄÀ ÊÀÊ ÒÀÊ-ÒÎ?! Îïÿòü ðèâåðîì ïåðååõàëè, ñóêà!»",0
|
|
npcLose2 db "«Çíàë âåäü, ÷òî íàäî áûëî ñáðàñûâàòü åùå íà ôëîïå...»",0
|
|
npcLose3 db "«Ýõ, ÷óòêà íå õâàòèëî äî ôëåøà... â ñëåäóþùèé ðàç ïîâåçåò.»",0
|
|
npcLose4 db "«Ïô-ô, êîïåéêè. Ñåé÷àñ ñíèìó åùå ïà÷êó â áàíêîìàòå.»",0
|
|
npcLose5 db "«ß òàê è çíàë... Íàäî áûëî âíèìàòåëüíåå ÷èòàòü ïðàâèëà.»",0
|
|
|
|
; Ôðàçû áëåôà / ðåéçà
|
|
npcBluff0 db "«Òâîÿ ðóêà ñëàáåå. Ñýêîíîìü ôèøêè è ïàñóé.»",0
|
|
npcBluff1 db "«Ñëàáàêè! Âàì íå ïî êàðìàíó ýòîò áàíê, äâèãàéòå ïàñ!»",0
|
|
npcBluff2 db "«Ó ìåíÿ îòëè÷íàÿ êàðòà. Íå ñîâåòóþ ëåçòü ïîä êîëåñà.»",0
|
|
npcBluff3 db "«À ÿ ïðîñòî õî÷ó ïîñìîòðåòü ñëåäóþùóþ êàðòó!»",0
|
|
npcBluff4 db "«Âû ñòàâèòå êîïåéêè! Äàâàéòå èãðàòü ïî-âçðîñëîìó!»",0
|
|
npcBluff5 db "«Ý-ý... êàæåòñÿ, ÿ ïîäíèìàþ ñòàâêó. Âû ñî ìíîé?»",0
|
|
|
|
; Ôðàçû áàíêðîòñòâà
|
|
npcBust0 db "«Ëèìèò íà ñåãîäíÿ èñ÷åðïàí. Ïîðà äåëàòü ïàóçó.»",0
|
|
npcBust1 db "«Âñ¸ â íîëü! Áåãó ê áàíêîìàòó, ÿ îáÿçàí îòûãðàòüñÿ!»",0
|
|
npcBust2 db "«Ïåíñèÿ êîí÷èëàñü... Ïîéäó ïîäûøó íà ñâåæåì âîçäóõå.»",0
|
|
npcBust3 db "«Îé, ôèøêè êîí÷èëèñü... Ïîéäó â áàð çà ïèâîì.»",0
|
|
npcBust4 db "«Îïÿòü îáíóëèëñÿ? Åðóíäà, ñåé÷àñ ñíèìó åùå $50,000.»",0
|
|
npcBust5 db "«Êàæåòñÿ, íà ìåòðî ìíå óæå íå õâàòàåò...»",0
|
|
|
|
; Ìûñëè â ñâîáîäíîì ïåðåìåùåíèè ïî êàçèíî
|
|
thWalkWander db "Îñìàòðèâàåò èãðîâîé çàë â ïîèñêàõ èíòåðåñíîé èãðû",0
|
|
thWalkTable db "Íàïðàâëÿåòñÿ ê ïîêåðíîìó ñòîëó èñïûòàòü óäà÷ó",0
|
|
thWalkBar db "Ðåøèë çàãëÿíóòü â áàð çà íàïèòêîì",0
|
|
thWalkAtm db "Çàêîí÷èëèñü ôèøêè, íàïðàâëÿåòñÿ ê áàíêîìàòó",0
|
|
thWalkStage db "Ïîäõîäèò ê ñöåíå ïîñìîòðåòü íà òàíöîâùèö",0
|
|
thIdleBored db "Ñòîèò ó êîëîííû, ïîäñ÷èòûâàåò îñòàâøèåñÿ äåíüãè",0
|
|
|
|
; Ìûñëè çà ïîêåðíûì ñòîëîì
|
|
thEvalStrong db "×óâñòâóåò íàòñ! Ãîòîâèò ëîâóøêó äëÿ îïïîíåíòîâ.",0
|
|
thEvalGood db "Ðóêà ñèëüíàÿ, îòëè÷íûå øàíñû çàáðàòü ýòîò áàíê.",0
|
|
thEvalDraw db "Ñ÷èòàåò àóòû: øàíñû áàíêà âûãîäíû äëÿ êîëëà.",0
|
|
thEvalTrash db "Êàðòû — ìóñîð. Ñìûñëà ðèñêîâàòü ôèøêàìè íåò.",0
|
|
thEvalTilted db "[ÒÈËÜÒ!] Çëèòñÿ ïîñëå ïðîèãðûøà è èäåò íà òàðàí!",0
|
|
thEvalBluffing db "ÁËÅÔ! Èçîáðàæàåò ìîíñòðà è äàâèò ñòàâêîé!",0
|
|
|
|
; Îïèñàíèÿ äåéñòâèé
|
|
thActFold db "Ñáðàñûâàåò êàðòû â ïàñ",0
|
|
thActCheck db "×åêàåò, ïðîïóñêàÿ õîä",0
|
|
thActCall db "Êîëëèðóåò (óðàâíèâàåò) òåêóùóþ ñòàâêó",0
|
|
thActRaise db "Ïîâûøàåò ñòàâêó (ðåéç!)",0
|
|
thActAllIn db "Äâèãàåò âñå ôèøêè âïåðåä — ÂÀ-ÁÀÍÊ (ÎËË-ÈÍ)!",0
|
|
|
|
; Íàçâàíèÿ óëèö ïîêåðà
|
|
strStagePreflop db "Ïðåôëîï (Êàðìàííûå êàðòû)",0
|
|
strStageFlop db "Ôëîï (3 êàðòû ñòîëà)",0
|
|
strStageTurn db "Òåðí (4 êàðòû ñòîëà)",0
|
|
strStageRiver db "Ðèâåð (5 êàðò ñòîëà)",0
|
|
strStageShow db "Âñêðûòèå êàðò (Showdown)",0
|
|
|
|
; Òåêñòû èíòåðôåéñà ìóëüòè-ïîêåðà
|
|
mpkTitleStr db "=== ÒÅÕÀÑÑÊÈÉ ÕÎËÄÅÌ: ÑÒÎË ÍÀ 4 ÈÃÐÎÊÀ ===",13,10,0
|
|
mpkPotStr db "Áàíê ñòîëà: $",0
|
|
mpkStreetStr db " | Ðàóíä: ",0
|
|
mpkCommCardsStr db "Îáùèå êàðòû íà ñòîëå: ",0
|
|
mpkPromptStr db "Âàø õîä: [1] ×åê/Êîëë | [2] Ðåéç | [0] Ïàñ -> ",0
|
|
mpkWaitNextStr db 13,10,"[Íàæìèòå ëþáóþ êëàâèøó äëÿ ñëåäóþùåé ðàçäà÷è, 0 äëÿ âûõîäà]...",0
|
|
mpkChipsPrefix db " Ñòåê: $",0
|
|
mpkThoughtPrefix db " [Ìûñëè]: ",0
|
|
mpkGameOverStr db 13,10,"Ðàçäà÷à îêîí÷åíà. Ïîáåäèòåëü: ",0
|
|
mpkWinChipsStr db " âûèãðàë áàíê $",0
|
|
|
|
ALIGN 4
|
|
|
|
; Áàçà ïðîôèëåé 6 óíèêàëüíûõ ëè÷íîñòåé
|
|
casinoNpcProfiles NpcPersonality <OFFSET npcName0, OFFSET npcTitle0, NPCAI_ARCHETYPE_SHARK, 75, 85, 20, 85, 15, 5000, OFFSET npcWin0, OFFSET npcLose0, OFFSET npcBluff0, OFFSET npcBust0>
|
|
NpcPersonality <OFFSET npcName1, OFFSET npcTitle1, NPCAI_ARCHETYPE_MANIAC, 95, 20, 80, 90, 85, 3500, OFFSET npcWin1, OFFSET npcLose1, OFFSET npcBluff1, OFFSET npcBust1>
|
|
NpcPersonality <OFFSET npcName2, OFFSET npcTitle2, NPCAI_ARCHETYPE_ROCK, 25, 90, 5, 30, 20, 4000, OFFSET npcWin2, OFFSET npcLose2, OFFSET npcBluff2, OFFSET npcBust2>
|
|
NpcPersonality <OFFSET npcName3, OFFSET npcTitle3, NPCAI_ARCHETYPE_CALLING_STATION, 15, 30, 10, 75, 40, 3000, OFFSET npcWin3, OFFSET npcLose3, OFFSET npcBluff3, OFFSET npcBust3>
|
|
NpcPersonality <OFFSET npcName4, OFFSET npcTitle4, NPCAI_ARCHETYPE_WHALE, 70, 45, 55, 70, 50, 10000, OFFSET npcWin4, OFFSET npcLose4, OFFSET npcBluff4, OFFSET npcBust4>
|
|
NpcPersonality <OFFSET npcName5, OFFSET npcTitle5, NPCAI_ARCHETYPE_ROOKIE, 40, 50, 25, 40, 60, 2000, OFFSET npcWin5, OFFSET npcLose5, OFFSET npcBluff5, OFFSET npcBust5>
|
|
|
|
; Ãðàô âåéïîèíòîâ êàçèíî (êîîðäèíàòû 16.16 FP è ñâÿçè)
|
|
casinoWaypoints3D NpcWaypoint <16*FP_1, 28*FP_1, 1, 4, 8, 0, 0> ; 0: Âõîä â êàçèíî
|
|
NpcWaypoint <16*FP_1, 20*FP_1, 0, 2, 4, 8, 0> ; 1: Öåíòð õîëëà (þã)
|
|
NpcWaypoint <16*FP_1, 14*FP_1, 1, 3, 10, 12, 0> ; 2: Öåíòð õîëëà (ñåâåð)
|
|
NpcWaypoint <16*FP_1, 6*FP_1, 2, 10, 12, 3, 7> ; 3: Ïåðåä ñöåíîé òàíöîâùèö
|
|
NpcWaypoint < 8*FP_1, 20*FP_1, 0, 1, 5, 7, 0> ; 4: Çàïàäíûé êîðèäîð
|
|
NpcWaypoint < 6*FP_1, 14*FP_1, 4, 6, 2, 5, 4> ; 5: Àâòîìàòû 777
|
|
NpcWaypoint < 6*FP_1, 9*FP_1, 5, 10, 2, 6, 4> ; 6: Àâòîìàòû CloverPit
|
|
NpcWaypoint < 4*FP_1, 25*FP_1, 4, 0, 7, 7, 5> ; 7: Áàðíàÿ ñòîéêà
|
|
NpcWaypoint <24*FP_1, 20*FP_1, 0, 1, 9, 14, 0> ; 8: Âîñòî÷íûé êîðèäîð
|
|
NpcWaypoint <26*FP_1, 25*FP_1, 8, 0, 9, 9, 0> ; 9: Çîíà îòäûõà VIP
|
|
NpcWaypoint <12*FP_1, 9*FP_1, 2, 3, 6, 11, 2> ; 10: Ñòîë Áëýêäæåêà
|
|
NpcWaypoint <16*FP_1, 11*FP_1, 2, 10, 12, 11, 3> ; 11: Ñòîë Ðóëåòêè
|
|
NpcWaypoint <20*FP_1, 9*FP_1, 2, 3, 11, 13, 1> ; 12: Ñòîë Ïîêåðà (Õîëäåì)
|
|
NpcWaypoint <24*FP_1, 9*FP_1, 12, 8, 14, 13, 1> ; 13: Ñòîë Äóðàêà
|
|
NpcWaypoint <26*FP_1, 15*FP_1, 8, 13, 14, 14, 6> ; 14: Áàíêîìàò (ATM)
|
|
NpcWaypoint <10*FP_1, 15*FP_1, 2, 4, 5, 10, 0> ; 15: Çîíà êîñòåé/÷åðåïîâ
|
|
|
|
; 6 àêòèâíûõ ïåðñîíàæåé, ãóëÿþùèõ ïî çàëó êàçèíî
|
|
casinoNpcs3D NpcMindEntity NPCAI_MAX_NPCS dup(<>)
|
|
|
|
; Ýêçåìïëÿð ñòîëà ìóëüòè-ïîêåðà
|
|
multiPokerTable MultiPokerTable <>
|
|
|
|
; Êîëîäà è ðàáî÷èé áóôåð äëÿ ìóëüòè-ïîêåðà
|
|
multiDeck dd 52 dup(0)
|
|
multiDeckIndex dd 0
|
|
multiEvalHand dd 7 dup(0)
|
|
multiActionWait dd 0
|