/
trilirium
/
Pacman
Обзор
Документация
Войти
/
trilirium
/
Pacman
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
OrangeGhost.cpp
98 строк
3 KB
Trilirium
first commit
19 июн 2026, 11:07
19 июн 2026, 11:07
d44591e
Код
Авторство
О чём код?
// OrangeGhost.cpp // ///////////////////////////////////////////////////////////////////////////// #include "OrangeGhost.h" #include "Pacman.h" #include "Path.h" #include "Game.h" #include "GameState.h" #include "GhostMoveAtHomeActions.h" #include "GhostMoveWhenKilledActions.h" using namespace Puckman; ///////////////////////////////////////////////////////////////////////////// // initialization and cleanup ///////////////////////////////////////////////////////////////////////////// OrangeGhost::OrangeGhost() : Ghost(ORANGE) { resetState(); // fills the actions arrays moveAtHomeAction = new GhostAction*[4]; moveAtHomeAction[0] = new GhostMoveUpAndDownAction(); moveAtHomeAction[1] = new GhostNopAction(); moveAtHomeAction[2] = new GhostExitHomeAction(); moveAtHomeAction[3] = new GhostMoveFromRightToCenterAction(); moveWhenKilledAction = new GhostAction*[4]; moveWhenKilledAction[0] = new GhostNopAction(); moveWhenKilledAction[1] = new GhostGoHomeAction(); moveWhenKilledAction[2] = new GhostGoHomeAndContinueAction(); moveWhenKilledAction[3] = new GhostMoveToRightHomeSideAction(); } OrangeGhost::~OrangeGhost() { // deallocates the actions arrays for (int i = 0; i < 4; i++){ delete moveAtHomeAction[i]; delete moveWhenKilledAction[i]; } delete[] moveAtHomeAction; delete[] moveWhenKilledAction; } void OrangeGhost::initState(bool special) { Ghost::initState(special); if (!special){ posX = 0x70; posY = 0x7c; tilePosX = actualTilePosX = 0x2c; tilePosY = actualTilePosY = 0x2f; movOffsX = prevMovOffsX = 0; movOffsY = prevMovOffsY = -1; orientation = prevOrientation = UP; } } ///////////////////////////////////////////////////////////////////////////// // orange ghost AI ///////////////////////////////////////////////////////////////////////////// void OrangeGhost::moveInNormalState() { // calculates current distance to pacman int distance2 = Path::distance2(tilePosX, tilePosY, theGame->pacman->tilePosX, theGame->pacman->tilePosY); // in odd orientation changes indexes, if distance >= 8 tiles, // or if we are in demo mode, try to go to pacman position if (((theGame->indexOrientationChanges & 0x01) == 0x01) || (theGame->states[PLAYING]->substate != 3)){ if ((distance2 >= 8*8)){ // tries to go for pacman destTilePosX = theGame->pacman->tilePosX; destTilePosY = theGame->pacman->tilePosY; Path::calcPath(tilePosX, tilePosY, orientation, destTilePosX, destTilePosY, movOffsX, movOffsY, orientation); } else { // goes to the lower left corner destTilePosX = 0x3b; destTilePosY = 0x40; Path::calcPath(tilePosX, tilePosY, orientation, 0x3b, 0x40, movOffsX, movOffsY, orientation); } } else { // searchs the best direction to choose to go to the lower left corner destTilePosX = 0x3b; destTilePosY = 0x40; Path::calcPath(tilePosX, tilePosY, orientation, 0x3b, 0x40, movOffsX, movOffsY, orientation); } }