30#include "ResourceManager.h"
31#include "MazeDynamic.h"
32#include "MazeStatic.h"
33#include "BrainsFactory.h"
34#include "MapSearchAStar.h"
36#include "ObjectsPacMan.h"
37#include "ObjectsGhost.h"
41GameField::GameField(GlobalStatus* GS)
45 iMazeReady = iNumPellets = iNumEatenPellets = 0;
47 iGetReadyTime = PME_GETREADY_TIME;
48 iMazePixelX = iMazePixelY = 0;
49 iFieldArray =
nullptr;
51 iRenderGraphicsStatus = -1;
52 iSpecialTextCounter = -1;
53 sSpecialMessageCounter.clear();
54 sSpecialMessage.clear();
55 bDebug = bDebugDisableObjectRender = -1;
60 pMapSearch =
new(std::nothrow) MapSearchAStar(
this);
67 Main::Instance().ILogMgr().get()->msg(LML_LOW,
" [Gamefield] Info: Object initialized.\n");
72GameField::~GameField()
75 if(pMapSearch !=
nullptr)
delete pMapSearch;
82 Main::Instance().ILogMgr().get()->msg(LML_LOW,
" [Gamefield] Info: Object closed.\n");
87Sint32 GameField::init()
89 Actor* pActor =
nullptr;
90 Sint32 iPacManBrain, iGhostRedBrain, iGhostPinkBrain, iGhostBlueBrain, iGhostOrangeBrain;
92 if(iMazeReady != 0)
return PME_BREAK;
95 if(pGlobalStatus->iGameType == PME_GAME_WORKBENCH)
97 iPacManBrain = pGlobalStatus->workBench.iPacManBrain;
98 iGhostRedBrain = pGlobalStatus->workBench.iGhostRedBrain;
99 iGhostPinkBrain = pGlobalStatus->workBench.iGhostPinkBrain;
100 iGhostBlueBrain = pGlobalStatus->workBench.iGhostBlueBrain;
101 iGhostOrangeBrain = pGlobalStatus->workBench.iGhostOrangeBrain;
103 ResourceManager::Instance().setPacManDeathAnim(0);
109 iPacManBrain = PME_BRAIN_TYPE_HUMAN;
111 if(pGlobalStatus->iGameType == PME_GAME_STANDARD) iGhostRedBrain = iGhostPinkBrain = iGhostBlueBrain = iGhostOrangeBrain = PME_BRAIN_TYPE_FIXED;
113 else iGhostRedBrain = iGhostPinkBrain = iGhostBlueBrain = iGhostOrangeBrain = PME_BRAIN_TYPE_EVOLVED;
114 iGetReadyTime = PME_GETREADY_TIME;
115 ResourceManager::Instance().setPacManDeathAnim(1);
119 if(iFieldArray ==
nullptr) iFieldArray = create2DArray<sField>(MAZE_HEIGHT, MAZE_WIDTH);
122 pActor =
new(std::nothrow) PacMan(14, 23,
this);
123 pActor->setBrain(iPacManBrain | PME_OBJECT_PACMAN);
124 vObjects.push_back(pActor);
127 if(iGhostRedBrain != PME_OBJECT_NULL)
129 pActor =
new(std::nothrow) Ghost(PME_OBJECT_GHOST_RED, 12, 14,
this);
130 pActor->setBrain(iGhostRedBrain | PME_OBJECT_GHOST_RED);
131 vObjects.push_back(pActor);
135 if(iGhostPinkBrain != PME_OBJECT_NULL)
137 pActor =
new(std::nothrow) Ghost(PME_OBJECT_GHOST_PINK, 13, 14,
this);
138 pActor->setBrain(iGhostPinkBrain | PME_OBJECT_GHOST_PINK);
139 vObjects.push_back(pActor);
143 if(iGhostBlueBrain != PME_OBJECT_NULL)
145 pActor =
new(std::nothrow) Ghost(PME_OBJECT_GHOST_BLUE, 14, 14,
this);
146 pActor->setBrain(iGhostBlueBrain | PME_OBJECT_GHOST_BLUE);
147 vObjects.push_back(pActor);
151 if(iGhostOrangeBrain != PME_OBJECT_NULL)
153 pActor =
new(std::nothrow) Ghost(PME_OBJECT_GHOST_ORANGE, 15, 14,
this);
154 pActor->setBrain(iGhostOrangeBrain | PME_OBJECT_GHOST_ORANGE);
155 vObjects.push_back(pActor);
158 #ifdef DEBUG_INTERNAL
159 Main::Instance().ILogMgr().get()->msg(LML_NORMAL,
" [GameField] Info: Maze loaded and game initialized.\n");
163 pMazeGen =
new(std::nothrow) Maze(9, 5);
170Sint32 GameField::nextMaze()
172 Sint32 x = 0, i, y = 0, iPowerPellet = PME_OBJECT_PELLET_POWER1;
173 char* pMaze =
nullptr;
174 Object* pObj =
nullptr;
175 vector<Uint8> vTiles;
177 if(iFieldArray ==
nullptr)
return PME_BREAK;
180 for(i = 0; i < vObjects.size();)
182 if(vObjects[i]->getID() >= PME_OBJECT_PELLET_POWER1)
185 vObjects.erase(vObjects.begin() + i);
189 iNumPellets = iNumEatenPellets = 0;
192 if(pGlobalStatus->iGameType == PME_GAME_STANDARD)
194 if(iMazeStaticLength < (MAZE_WIDTH * MAZE_HEIGHT))
return PME_BREAK;
195 i = iMazeReady % iMazeStaticNumber;
196 pMaze = (
char*)mazeStatic[i];
197 iMazeDynamicGenerationAttemps = 1;
198 iMazeDynamicGenerationTime = 0;
203 i =
static_cast<Sint32
>(Main::Instance().ITimer().getTicksNow());
204 iMazeDynamicGenerationAttemps = pMazeGen->createMaze(vTiles);
205 iMazeDynamicGenerationTime =
static_cast<Sint32
>(Main::Instance().ITimer().getTicksNow());
206 iMazeDynamicGenerationTime -= i;
207 pMaze = (
char*)&vTiles[0];
211 for(y = 0; y < MAZE_HEIGHT; y++)
212 for(x = 0; x < MAZE_WIDTH; x++)
215 iFieldArray[y][x].iState = PME_STATE_NULL;
216 iFieldArray[y][x].iItem = PME_ITEM_NULL;
217 iFieldArray[y][x].iObject = PME_OBJECT_NULL;
229 iFieldArray[y][x].iState = PME_STATE_WALL;
234 iFieldArray[y][x].iState = PME_STATE_WALKABLE;
239 iFieldArray[y][x].iState = PME_STATE_WALKABLE;
240 iFieldArray[y][x].iItem = PME_ITEM_PELLET;
246 iFieldArray[y][x].iState = PME_STATE_WALKABLE;
247 if(pGlobalStatus->workBench.iTraining != 1)
249 pObj =
new(std::nothrow) Object(iPowerPellet, x, y,
this);
250 vObjects.push_back(pObj);
251 iFieldArray[y][x].iObject = iPowerPellet;
261 iFieldArray[12][13].iState = PME_STATE_WALKABLE_GHOST;
262 iFieldArray[12][14].iState = PME_STATE_NULL;
263 for(y = 13; y < 16; y++)
264 for(x = 11; x < 17; x++)
267 iFieldArray[y][x].iState = PME_STATE_WALKABLE_GHOST;
274 Main::Instance().IAudioTrackMgr().fadeOutTag(ATT_MUSIC, 500);
275 Main::Instance().IConfigMgr().get()->fadeToColor(0, 0, 0, 500);
276 Main::Instance().IAudioTrackMgr().get(ResourceManager::Instance().get(RM_MUS_GAME))->play(-1);
277 pGlobalStatus->iRenderScreen = PME_SCREEN_GAME;
284Sint32 GameField::close()
289 for(i = 0; i < vObjects.size(); ++i)
delete vObjects[i];
292 iMazeReady = iNumPellets = iNumEatenPellets = 0;
294 iMazePixelX = iMazePixelY = 0;
295 if(iFieldArray) delete2DArray(iFieldArray);
296 iFieldArray =
nullptr;
298 iRenderGraphicsStatus = -1;
299 iSpecialTextCounter = -1;
300 sSpecialMessageCounter.clear();
301 sSpecialMessage.clear();
304 if(pMazeGen !=
nullptr)
delete pMazeGen;
308 Main::Instance().IAudioTrackMgr().fadeOutTag(ATT_MUSIC, 500);
309 Main::Instance().IConfigMgr().get()->fadeToColor(0, 0, 0, 500);
311 #ifdef DEBUG_INTERNAL
312 Main::Instance().ILogMgr().get()->msg(LML_NORMAL,
" [GameField] Info: Maze closed.\n\n");
320Sint32 GameField::execute()
322 Sint32 iDone = PME_LOOP, i;
324 Main& mC64 = Main::Instance();
327 if(iMazeReady == 0)
return PME_BREAK;
330 if(pGlobalStatus->iGameType != PME_GAME_WORKBENCH) messageStart();
334 iTimeStart = mC64.ITimer().getTicksNow();
335 iRenderGraphicsStatus = RENDERGRAPHICS_GAME;
336 while(iDone == PME_LOOP)
339 sGlobalWave.update();
342 for(i = 0; (i < vObjects.size()) && (iDone == PME_LOOP) && (sSpecialMessage !=
"PAUSED"); ++i)
347 if(vObjects[i]->getID() == PME_OBJECT_PACMAN)
350 iDone = vObjects[i]->execute();
352 if(iDone != PME_ACTOR_SPECIAL) --sGlobalWave.iTicks;
353 else iDone = PME_LOOP;
357 else vObjects[i]->execute();
361 if(iNumPellets == iNumEatenPellets)
363 iDone = PME_MAZE_END;
367 if(pGlobalStatus->iGameType == PME_GAME_WORKBENCH)
369 if(pGlobalStatus->workBench.iTime != 0)
371 if((mC64.ITimer().getTicksNow() - iTimeStart) > (pGlobalStatus->workBench.iTime * 1000))
379 while(mC64.update(&eEvent))
383 case SDL_EVENT_KEY_UP:
384 switch(eEvent.key.key)
393 if(sSpecialMessage ==
"PAUSED") sSpecialMessage.clear();
394 else if(sSpecialMessage.size() == 0) sSpecialMessage =
"PAUSED";
399 bDebug = bDebug * (-1);
404 if(iDebugMode > 0) --iDebugMode;
410 if(iDebugMode < 4) ++iDebugMode;
417 bDebugDisableObjectRender = bDebugDisableObjectRender * (-1);
424 mC64.IConfigMgr().get()->getSnapshot(
"screenshot.png");
431 iDone = PME_MAZE_END;
438 bDebugShowTarget = bDebugShowTarget * (-1);
442 vObjects[0]->msgGhostCollision();
443 for(i = 0; i < vObjects.size(); ++i) vObjects[i]->msgPause();
452 if(iDone != PME_MAZE_END)
454 if(pGlobalStatus->iGameType != PME_GAME_WORKBENCH) messageEnd(iDone);
458 if(pGlobalStatus->workBench.iTraining != 1)
460 mC64.ILogMgr().get()->msg(LML_NORMAL,
" [GameField] Info: Maze '%d' (%s %d %dms)- %2.2f FPS during %2.2f seconds - Points %d \n",
461 iMazeReady, (pGlobalStatus->iGameType == PME_GAME_STANDARD) ?
"static" :
"dynamic", iMazeDynamicGenerationAttemps, iMazeDynamicGenerationTime,
462 mC64.ITimer().getAverageRFR(), (
float)(mC64.ITimer().getTicksNow() - iTimeStart) / 1000.0f,
463 pGlobalStatus->iPoints);
470Sint32 GameField::render(Sint32 iMode)
472 Sint32 iScreenW, iScreenH;
473 Sint32 x, y, i, iLifes;
476 Main& mC64 = Main::Instance();
481 if(iMazeReady == 0)
return PME_BREAK;
484 pScreen = mC64.IConfigMgr().get();
485 pScreen->getSize(&iScreenW, &iScreenH);
486 iMazePixelX = (iScreenW - (MAZE_TILE_SIZE * MAZE_WIDTH)) / 2;
487 iMazePixelY = MAZE_TILE_SIZE;
490 rDst.w = rDst.h = (float)MAZE_TILE_SIZE;
499 for(y = 0; y < MAZE_HEIGHT; y++)
501 for(x = 0; x < MAZE_WIDTH; x++)
503 if(iFieldArray[y][x].iState == PME_STATE_WALL)
505 rDst.x = (x * rDst.w) + (
float)iMazePixelX;
506 rDst.y = (y * rDst.h) + (
float)iMazePixelY;
507 mC64.IGFX().rectFilled(rDst.x, rDst.y, rDst.x + rDst.w, rDst.y + rDst.h, 0x0000AAFF);
509 if(iFieldArray[y][x].iItem == PME_ITEM_PELLET)
511 rDst.x = (x * rDst.w) + (
float)iMazePixelX;
512 rDst.y = (y * rDst.h) + (
float)iMazePixelY;
513 i = ResourceManager::Instance().get(RM_SPR_PELLET);
514 mC64.ISpriteMgr().get(i)->setPosition(rDst.x, rDst.y);
515 mC64.ISpriteMgr().get(i)->render();
521 for(i = (Sint32)vObjects.size() - 1; vObjects.size() > i; --i)
523 if(vObjects[i]->getID() == PME_OBJECT_PACMAN)
525 iLifes =
reinterpret_cast<PacMan*
>(vObjects[i])->getLifes();
527 if(bDebugDisableObjectRender == -1) vObjects[i]->render(iMazePixelX, iMazePixelY);
531 pFont = mC64.IFontMgr().get(ResourceManager::Instance().get(RM_FONT_SCORE));
532 pFont->setPosition((
float)iMazePixelX, -8.0f);
533 mC64.ITool().intToStrDec(pGlobalStatus->iPoints, sTmp);
534 sText =
"Score "; sText += sTmp;
535 pFont->render(sText);
536 rDst.x = (float)((iScreenW / 2) - MAZE_TILE_SIZE - (MAZE_TILE_SIZE / 2));
537 rDst.y = 0.0f; rDst.w = (float)MAZE_TILE_SIZE; rDst.h = (float)MAZE_TILE_SIZE;
540 mC64.IImageMgr().get(ResourceManager::Instance().get(RM_IMG_ICON))->render(0,
nullptr, &rDst);
542 rDst.x += (float)MAZE_TILE_SIZE;
544 mC64.ITool().intToStrDec(pGlobalStatus->iHighestScore, sTmp);
545 sText =
"Highest "; sText += sTmp;
546 pFont->setPosition((
float)(iMazePixelX + (MAZE_WIDTH * MAZE_TILE_SIZE) - 250), -8.0f);
548 pFont->render(sText);
551 if(iRenderGraphicsStatus == RENDERGRAPHICS_START)
553 pScreen = mC64.IConfigMgr().get();
554 pScreen->getSize(&i,
nullptr);
555 pFont = mC64.IFontMgr().get(ResourceManager::Instance().get(RM_FONT_INFO));
557 specialText(pFont, (
float)((i - pFont->getWidth(sSpecialMessage)) / 2), (
float)((iScreenH / 2) - 150.0f), sSpecialMessage, iSpecialTextCounter);
558 pFont->setPosition((
float)((i - pFont->getWidth(sSpecialMessageCounter)) / 2), (
float)((iScreenH / 2) - 80));
559 pFont->render(sSpecialMessageCounter);
565 if(sSpecialMessage.size() > 0)
567 pFont->setPosition((
float)((iScreenW - pFont->getWidth(sSpecialMessage)) / 2), (
float)((iScreenH / 2) + 20));
568 pFont->render(sSpecialMessage);
574 for(i = 0; i < vObjects.size(); ++i) vObjects[i]->debug(bDebugShowTarget);
583MapSearchAStar& GameField::mapSearch()
589Sint32 GameField::getState(Sint32 iMX, Sint32 iMY)
592 if(iMX < 0)
return PME_STATE_NULL;
593 else if(iMX > MAZE_WIDTH - 1)
return PME_STATE_NULL;
594 if(iMY < 0)
return PME_STATE_NULL;
595 else if(iMY > MAZE_HEIGHT - 1)
return PME_STATE_NULL;
598 return iFieldArray[iMY][iMX].iState;
602Sint32 GameField::getItem(Sint32 iMX, Sint32 iMY)
605 if(iMX < 0)
return PME_STATE_NULL;
606 else if(iMX > MAZE_WIDTH - 1)
return PME_STATE_NULL;
607 if(iMY < 0)
return PME_STATE_NULL;
608 else if(iMY > MAZE_HEIGHT - 1)
return PME_STATE_NULL;
611 return iFieldArray[iMY][iMX].iItem;
615Sint32 GameField::getEatenPelletsPercent()
617 return (iNumEatenPellets * 100) / iNumPellets;
621Sint32 GameField::getObjectPosition(Sint32 iID, Sint32 &iX, Sint32 &iY)
623 Sint32 i = getObjectIndex(iID);
626 vObjects[i]->getPositionMaze(iX, iY);
633Sint32 GameField::getObjectDirection(Sint32 iID, Sint32 &iX, Sint32 &iY)
635 Sint32 i = getObjectIndex(iID);
638 vObjects[i]->getDirection(iX, iY);
645Sint32 GameField::getObjectStateName(Sint32 iID,
string &sN)
647 Sint32 i = getObjectIndex(iID);
650 reinterpret_cast<Actor*
>(vObjects[i])->getStateName(sN);
657Sint32 GameField::getClosestPellet(Sint32 iID, Sint32 &iX, Sint32 &iY)
659 Sint32 iRadius = 1, iOX, iOY;
660 Sint32 i = getObjectIndex(iID);
663 vObjects[i]->getPositionMaze(iOX, iOY);
668 for(
int y = -iRadius; y <= iRadius; y++)
670 for(
int x = -iRadius; x <= iRadius; x++)
672 if(x*x + y * y <= iRadius * iRadius)
677 if(getItem(iX, iY) == PME_ITEM_PELLET)
694Sint32 GameField::moveTo(Sint32 iID, Sint32 iCurMX, Sint32 iCurMY, Sint32 iNewMX, Sint32 iNewMY)
696 Sint32 i, iObjs, iTmp;
697 Sint32 iX = 0, iY = 0;
700 iFieldArray[iCurMY][iCurMX].iObject -= iID;
703 iFieldArray[iNewMY][iNewMX].iObject += iID;
706 iObjs = iFieldArray[iNewMY][iNewMX].iObject;
709 if(iID == PME_OBJECT_PACMAN)
712 if(iFieldArray[iNewMY][iNewMX].iItem == PME_ITEM_PELLET)
714 iFieldArray[iNewMY][iNewMX].iItem = PME_ITEM_NULL;
715 Main::Instance().IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEEATPELLET))->play();
716 addPoints(PME_POINTS_EAT_PELLET);
721 if(iObjs >= PME_OBJECT_PELLET_POWER1)
723 iTmp = PME_GET_PELLET(iObjs);
724 iFieldArray[iNewMY][iNewMX].iObject -= iTmp;
725 Main::Instance().IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEEATPELLETPOWER))->play();
726 addPoints(PME_POINTS_EAT_PELLET_POWER);
730 i = getObjectIndex(iTmp);
733 vObjects[i]->getPositionMaze(iX, iY);
735 vObjects.erase(vObjects.begin() + i);
739 for(i = 0; i < vObjects.size(); ++i) vObjects[i]->msgPelletPowerEaten(iX, iY);
744 if(iObjs & PME_OBJECT_PACMAN)
749 if(iObjs & PME_OBJECT_GHOST_RED)
751 i = getObjectIndex(PME_OBJECT_GHOST_RED);
752 if(i != -1) iTmp = vObjects[i]->msgGhostCollision();
754 else if((iObjs & PME_OBJECT_GHOST_BLUE) && (iTmp == 2))
756 i = getObjectIndex(PME_OBJECT_GHOST_BLUE);
757 if(i != -1) iTmp = vObjects[i]->msgGhostCollision();
759 else if((iObjs & PME_OBJECT_GHOST_PINK) && (iTmp == 2))
761 i = getObjectIndex(PME_OBJECT_GHOST_PINK);
762 if(i != -1) iTmp = vObjects[i]->msgGhostCollision();
764 else if((iObjs & PME_OBJECT_GHOST_ORANGE) && (iTmp == 2))
766 i = getObjectIndex(PME_OBJECT_GHOST_ORANGE);
767 if(i != -1) iTmp = vObjects[i]->msgGhostCollision();
773 i = getObjectIndex(PME_OBJECT_PACMAN);
776 Main::Instance().IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEEATGHOST))->play();
777 addPoints(vObjects[i]->msgGhostCollision());
783 i = getObjectIndex(PME_OBJECT_PACMAN);
786 if(pGlobalStatus->iGameType != PME_GAME_WORKBENCH) Main::Instance().IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEPLAYERDEATH))->play();
787 vObjects[i]->msgGhostCollision();
788 for(i = 0; i < vObjects.size(); ++i) vObjects[i]->msgPause();
799Sint32 GameField::messageGetReady(Sint32 iShow)
801 if(iShow == 0) sSpecialMessage.clear();
802 else if(iShow == 1) sSpecialMessage =
"Get Ready!";
803 return iGetReadyTime;
807Sint32 GameField::initObjects()
812 for(y = 0; y < MAZE_HEIGHT; y++)
813 for(x = 0; x < MAZE_WIDTH; x++)
815 if(iFieldArray[y][x].iObject < PME_OBJECT_PELLET_POWER1) iFieldArray[y][x].iObject = PME_OBJECT_NULL;
819 if((iFieldArray[y][x].iObject & PME_OBJECT_PELLET_POWER1) == PME_OBJECT_PELLET_POWER1) iFieldArray[y][x].iObject = PME_OBJECT_PELLET_POWER1;
820 else if((iFieldArray[y][x].iObject & PME_OBJECT_PELLET_POWER2) == PME_OBJECT_PELLET_POWER2) iFieldArray[y][x].iObject = PME_OBJECT_PELLET_POWER2;
821 else if((iFieldArray[y][x].iObject & PME_OBJECT_PELLET_POWER3) == PME_OBJECT_PELLET_POWER3) iFieldArray[y][x].iObject = PME_OBJECT_PELLET_POWER3;
822 else if((iFieldArray[y][x].iObject & PME_OBJECT_PELLET_POWER4) == PME_OBJECT_PELLET_POWER4) iFieldArray[y][x].iObject = PME_OBJECT_PELLET_POWER4;
827 iFieldArray[23][14].iObject = PME_OBJECT_PACMAN;
828 iFieldArray[14][12].iObject = PME_OBJECT_GHOST_RED;
829 iFieldArray[14][13].iObject = PME_OBJECT_GHOST_PINK;
830 iFieldArray[14][14].iObject = PME_OBJECT_GHOST_BLUE;
831 iFieldArray[14][15].iObject = PME_OBJECT_GHOST_ORANGE;
834 for(i = 0; i < vObjects.size(); ++i) vObjects[i]->msgGoInit();
840 if(pGlobalStatus->iGameType == PME_GAME_WORKBENCH) sGlobalWave.iChanges = PME_CRUISE_MODE;
846Sint32 GameField::validateMazePosition(Sint32& iX, Sint32& iY)
848 Sint32 iRadius = 1, iOX, iOY;
852 else if(iX > (MAZE_WIDTH - 1)) iX = MAZE_WIDTH - 1;
854 else if(iY >(MAZE_HEIGHT - 1)) iY = MAZE_HEIGHT - 1;
861 for(
int y = -iRadius; y <= iRadius; y++)
863 for(
int x = -iRadius; x <= iRadius; x++)
865 if(x*x + y * y <= iRadius * iRadius)
869 if(getState(iX, iY) == PME_STATE_WALKABLE)
885Sint32 GameField::getMovementOptions(Sint32 iX, Sint32 iY, vector<MazePoint>& vMP)
893 if(getState(iX, iY - 1) == PME_STATE_WALKABLE)
897 vMP.push_back(vPoint);
901 if(getState(iX - 1, iY) == PME_STATE_WALKABLE)
905 vMP.push_back(vPoint);
908 else if((iX - 1) < 0)
912 vMP.push_back(vPoint);
916 if(getState(iX, iY + 1) == PME_STATE_WALKABLE)
920 vMP.push_back(vPoint);
924 if(getState(iX + 1, iY) == PME_STATE_WALKABLE)
928 vMP.push_back(vPoint);
931 else if((iX + 1) > (MAZE_WIDTH - 1))
935 vMP.push_back(vPoint);
942Sint32 GameField::getWaveMode()
944 return sGlobalWave.iMode;
948Sint32 GameField::setWaveMode(Sint32 iMode)
950 if(iMode == PME_GLOBAL_WAVE_EVADING)
952 sGlobalWave.iPreviousMode = sGlobalWave.iMode;
953 sGlobalWave.iMode = PME_GLOBAL_WAVE_EVADING;
955 else if(iMode == PME_GLOBAL_WAVE_EVADING_END) sGlobalWave.iMode = PME_GLOBAL_WAVE_EVADING_END;
960Sint32 GameField::restoreWaveMode()
962 sGlobalWave.iMode = sGlobalWave.iPreviousMode;
967Sint32 GameField::sGlobalWave::update()
972 iMode = PME_GLOBAL_WAVE_CHASING;
973 iTicks =
static_cast<Sint32
>((PME_GHOST_CHASING_TIME * Main::Instance().ITimer().getLFR()) / 1000);
978 if((iMode == PME_GLOBAL_WAVE_EVADING) || (iMode == PME_GLOBAL_WAVE_EVADING_END))
return 0;
981 if(iChanges >= PME_CRUISE_MODE)
983 iMode = PME_GLOBAL_WAVE_CHASING;
984 iTicks =
static_cast<Sint32
>((PME_GHOST_CHASING_TIME * Main::Instance().ITimer().getLFR()) / 1000);
990 if(iMode == PME_GLOBAL_WAVE_CHASING)
992 iMode = PME_GLOBAL_WAVE_SCATTERING;
994 iTicks =
static_cast<Sint32
>((PME_GHOST_SCATTERING_TIME * Main::Instance().ITimer().getLFR()) / 1000);
998 iMode = PME_GLOBAL_WAVE_CHASING;
1000 iTicks =
static_cast<Sint32
>((PME_GHOST_CHASING_TIME * Main::Instance().ITimer().getLFR()) / 1000);
1007Sint32 GameField::sGlobalWave::reset()
1009 iMode = iChanges = iPreviousMode = 0;
1014Sint32 GameField::messageStart()
1016 Uint64 iTime = 0, iTmp, iStart, iDelay;
1020 Main& mC64 = Main::Instance();
1022 iSpecialTextCounter = 0;
1023 sSpecialMessage =
"Starting maze ";
1024 mC64.ITool().intToStrDec(iMazeReady, sMazeNumber);
1025 sSpecialMessage += sMazeNumber;
1027 iDelay = (iDone * 1000);
1028 iRenderGraphicsStatus = RENDERGRAPHICS_START;
1029 mC64.IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMESTARTING))->play();
1030 iStart = mC64.ITimer().getTicksNow();
1035 iTmp = mC64.ITimer().getTicksNow();
1039 mC64.ITool().intToStrDec(iDone, sSpecialMessageCounter);
1041 else if(iTmp > (iTime + 1000))
1046 iSpecialTextCounter += 2;
1049 if(iTmp > (iStart + iDelay)) iDone = 0;
1052 while(mC64.update(&eEvent));
1055 sSpecialMessage.clear();
1061Sint32 GameField::messageEnd(Sint32 bFlag)
1063 Sint32 iDone = PME_LOOP;
1066 Main& mC64 = Main::Instance();
1067 Panel* myPanel = mC64.IGUIMgr().getPanel(ResourceManager::Instance().get(RM_PANEL_GAME));
1070 mC64.IAudioTrackMgr().fadeOutTag(ATT_MUSIC, 500);
1075 myPanel->getWidget(ID_GAME_LABEL)->setText(
"Game Aborted");
1076 mC64.IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEABORT))->play();
1079 myPanel->getWidget(ID_GAME_LABEL)->setText(
" Game Over! ");
1080 mC64.IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_GAMEOVER))->play();
1087 if(pGlobalStatus->iLowestScore > pGlobalStatus->iPoints) myPanel->getWidget(ID_GAME_ENTERNAME)->hide();
1088 else myPanel->getWidget(ID_GAME_ENTERNAME)->show();
1091 mC64.ICursorMgr().show();
1092 mC64.IGUIMgr().getPanel(ResourceManager::Instance().get(RM_PANEL_GAME))->baseWidget().show();
1093 while(iDone == PME_LOOP)
1098 while(mC64.update(&eEvent))
1104 if(eEvent.user.code == C64_EVENT_WIDGET)
1106 if(*
static_cast<Sint32*
>(eEvent.user.data1) == ID_GAME_CLOSE)
1108 mC64.IAudioTrackMgr().get(ResourceManager::Instance().get(RM_SND_CLICKOK))->play();
1119 myPanel->getWidget(ID_GAME_ENTERNAME)->getText(sText);
1120 if(sText.empty()) sText =
"PacMan";
1121 mC64.ITool().szCopy(pGlobalStatus->szName, sText.c_str(),
sizeof(pGlobalStatus->szName));
1122 #ifdef DEBUG_INTERNAL
1123 mC64.ILogMgr().get()->msg(LML_INFO,
" Player '%s' - Points '%d' (%d<->%d)\n", sText.c_str(), pGlobalStatus->iPoints, pGlobalStatus->iLowestScore, pGlobalStatus->iHighestScore);
1127 sSpecialMessage.clear();
1128 mC64.ICursorMgr().hide();
1129 mC64.IGUIMgr().getPanel(ResourceManager::Instance().get(RM_PANEL_GAME))->baseWidget().hide();
1135Sint32 GameField::specialText(Font* pFont, Sint32 iX, Sint32 iY,
string &sText, Sint32 iCount)
1138 Sint32 i, iXPos, iYPos;
1142 dAngle = (double)iCount * 5.0;
1145 for(i = 0; i < (Sint32)sText.length(); i++)
1147 sChar[0] = sText[i];
1149 if(i == 0) iXPos = iX;
1150 iYPos = (Sint32)(iY + sin(SDL_PI_D / 180 * (dAngle + i * 12)) * pFont->getHeight());
1151 pFont->setPosition((
float)iXPos, (
float)iYPos);
1152 pFont->render(sChar);
1153 iXPos = iXPos + pFont->getWidth(sChar);
1159Sint32 GameField::debug()
1161 Sint32 x, y, iFW, iFH;
1162 string sDebug, sTmp;
1163 Main& mC64 = Main::Instance();
1164 Font* pFont = mC64.IFontMgr().get(ResourceManager::Instance().get(RM_FONT_CONSOLE));
1167 if(iMazeReady == 0)
return -1;
1168 iFH = pFont->getHeight();
1171 for(y = 0; y < MAZE_HEIGHT; y++)
1173 for(x = 0; x < MAZE_WIDTH; x++)
1180 mC64.ITool().intToStrDec(x, sTmp);
1181 sDebug = sTmp; sDebug +=
",";
1182 mC64.ITool().intToStrDec(y, sTmp);
1188 mC64.ITool().intToStrDec(iFieldArray[y][x].iState, sTmp);
1194 mC64.ITool().intToStrDec(iFieldArray[y][x].iItem, sTmp);
1200 mC64.ITool().intToStrDec(iFieldArray[y][x].iObject, sTmp);
1206 iFW = pFont->getWidth(sDebug);
1207 pFont->setPosition((
float)((x * MAZE_TILE_SIZE + iMazePixelX) - ((iFW - MAZE_TILE_SIZE) / 2)), (
float)((y * MAZE_TILE_SIZE + iMazePixelY) - ((iFH - MAZE_TILE_SIZE) / 2)));
1208 pFont->render(sDebug);
1213 sDebug =
"Debug mode: ";
1220 sDebug +=
"coordinates";
1229 sDebug +=
"objects";
1232 pFont->setPosition((
float)PME_DEBUG_PANEL_GAMEFIELD_X, (
float)(PME_DEBUG_PANEL_GAMEFIELD_Y + iMazePixelY));
1233 pFont->render(sDebug);
1234 if(bDebugDisableObjectRender == 1) sDebug =
"Objects rendering disabled";
1235 else sDebug =
"Objects rendering enabled";
1236 pFont->setPosition((
float)PME_DEBUG_PANEL_GAMEFIELD_X, (
float)(PME_DEBUG_PANEL_GAMEFIELD_Y + iMazePixelY + 16));
1237 pFont->render(sDebug);
1239 mC64.ITool().intToStrDec(iMazeReady, sTmp);
1240 sDebug += sTmp; sDebug +=
" - Wave: ";
1241 mC64.ITool().intToStrDec(sGlobalWave.iTicks, sTmp);
1243 pFont->setPosition((
float)PME_DEBUG_PANEL_GAMEFIELD_X, (
float)(PME_DEBUG_PANEL_GAMEFIELD_Y + iMazePixelY + 48));
1244 pFont->render(sDebug);
1245 sDebug =
"Pellets: ";
1246 mC64.ITool().intToStrDec(iNumEatenPellets, sTmp);
1247 sDebug += sTmp; sDebug +=
"/";
1248 mC64.ITool().intToStrDec(iNumPellets, sTmp);
1249 sDebug += sTmp; sDebug +=
" (";
1250 mC64.ITool().intToStrDec(getEatenPelletsPercent(), sTmp);
1251 sDebug += sTmp; sDebug +=
"%)";
1252 pFont->setPosition((
float)PME_DEBUG_PANEL_GAMEFIELD_X, (
float)(PME_DEBUG_PANEL_GAMEFIELD_Y + iMazePixelY + 64));
1253 pFont->render(sDebug);
1255 sDebug =
"LFR/RFR: ";
1256 mC64.ITool().intToStrDec(mC64.ITimer().getCurrentLFR(), sTmp);
1257 sDebug += sTmp; sDebug +=
"/";
1258 mC64.ITool().intToStrDec(mC64.ITimer().getCurrentRFR(), sTmp);
1260 pFont->setPosition((
float)PME_DEBUG_PANEL_GAMEFIELD_X, (
float)(PME_DEBUG_PANEL_GAMEFIELD_Y + iMazePixelY + 80));
1261 pFont->render(sDebug);
1267Sint32 GameField::addPoints(Sint32 iP)
1269 pGlobalStatus->iPoints += iP;
1270 if(pGlobalStatus->iHighestScore < pGlobalStatus->iPoints) pGlobalStatus->iHighestScore = pGlobalStatus->iPoints;
1277Sint32 GameField::getObjectIndex(Sint32 iID)
1281 for(i = 0; i < vObjects.size(); ++i)
1283 if(vObjects[i]->getID() == iID)
return i;
1289Actor* GameField::getActor(Sint32 iID)
1291 Sint32 i = getObjectIndex(iID);
1294 return reinterpret_cast<Actor*
>(vObjects[i]);
1300Sint32 GameField::getMazeNumber()
1306template <
typename T> T** GameField::create2DArray(Sint32 height, Sint32 width)
1313 ppi =
new(std::nothrow) T*[height];
1315 pool =
new(std::nothrow) T[width * height];
1319 for(
int i = 0; i < height; i++)
1321 *(ppi + i) = curPtr;
1329template <
typename T> Sint32 GameField::delete2DArray(T** Array)