; ============================================================================== ; 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 NpcPersonality NpcPersonality NpcPersonality NpcPersonality NpcPersonality ; Граф вейпоинтов казино (координаты 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