⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demosubstates.cpp

📁 VIGASOCO (VIdeo GAmes SOurce COde) Windows port (v0.01)
💻 CPP
字号:
// DemoSubstates.cpp
//
/////////////////////////////////////////////////////////////////////////////

#include "DemoSubstates.h"
#include "Difficulty.h"
#include "Game.h"
#include "Ghost.h"
#include "Pacman.h"
#include "Video.h"
#include "Writer.h"

void DemoInitSubstate::run()
{
	// clear gameplay VRAM and init CRAM
	Video::clearVRAM(true);
	Video::initCRAM(0);

	// init pacman and ghosts positions, tile positions, orientation vars and sprite data
	theGame->initCharacterState(false);

	// reset pacman, fruit and ghost positions
	theGame->resetCharacterPositions();

	// prints CHARACTER/NICKNAME
	Writer::printString(0x0c);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoDrawRedGhostSubstate::run()
{
	// draw red ghost
	Video::drawTileGhost(0x304, 1);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintRedGhostNameSubstate::run()
{
	// print ghost name
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x15 : 0x14);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintRedGhostNicknameSubstate::run()
{
	// print ghost nickname
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x0e : 0x0d);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}


void DemoDrawPinkGhostSubstate::run()
{
	// draw pink ghost
	Video::drawTileGhost(0x307, 3);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintPinkGhostNameSubstate::run()
{
	// print ghost name
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x17 : 0x16);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintPinkGhostNicknameSubstate::run()
{
	// print ghost nickname
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x10 : 0x0f);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoDrawBlueGhostSubstate::run()
{
	// draw blue ghost
	Video::drawTileGhost(0x30a, 5);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintBlueGhostNameSubstate::run()
{
	// print ghost name
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x34 : 0x33);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintBlueGhostNicknameSubstate::run()
{
	// print ghost nickname
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x30 : 0x2f);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}


void DemoDrawOrangeGhostSubstate::run()
{
	// draw red ghost
	Video::drawTileGhost(0x30d, 7);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintOrangeGhostNameSubstate::run()
{
	// print ghost name
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x36 : 0x35);

	// schedules a substate change in half a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 5));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoPrintOrangeGhostNicknameSubstate::run()
{
	// print ghost nickname
	Writer::printString((theGame->settings.alternateGhostNames) ? 0x32 : 0x31);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

void DemoDrawPillPointsSubstate::run()
{
	// prints small pill 10 pts
	Writer::printString(0x11);

	// prints big pill 50 pts
	Writer::printString(0x12);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;
}

static void demoMainLoop()
{
	// handle collisions
	theGame->moveAndHandleCollisions();
	theGame->moveAndHandleCollisions();

	// update ghost and pill animations
	theGame->updateGhostAnimCounters();
	theGame->updateSuperPillState();

	// set dead ghosts colors
	theGame->setDeadGhostsColor();

	// check if we have to change pacman's orientation
	theGame->pacman->checkOrientationChanges();

	// check if we have to change ghosts orientation
	for (int i = 0; i < 4; i++){
		theGame->ghost[i]->checkOrientationChanges();
	}
}

void DemoInitSimulationSubstate::run()
{
	// prints NAMCO
	Writer::printString(0x13);

	// schedules a substate change in a second
	theScheduler->addScheduledTask(new Task(2, Task::TEN_HUNDREDTHS, 10));

	// changes to the next substate
	theGame->states[DEMO]->substate++;

	// inits players/level data
	theGame->initPlayersLevelData();

	// clears game state
	theGame->initGameState();

	theGame->cntGhostsMovHome = 0x55;

	// sets difficulty settings
	Difficulty::setDifficultySettings(20);

	// init pacman and ghosts positions, tile positions, orientation vars and sprite data
	theGame->initCharacterState(true);

	// sets number of lives lives and number of players
	theGame->levelState->lives = 1;
	theGame->levelState->displayedLives = 0;
	theGame->numberOfPlayers = 0;

	// draws a big pill
	theGame->VRAM[0x332] = 0x14;

	// creates a mini level composed of 2 invisible lines
	Video::drawInvisibleMiniLevel();
}

void DemoAnim0Substate::run()
{
	// when pacman reaches a position, set red ghost to go for pacman and change state
	if (theGame->pacman->tilePosX == 0x21){
		theGame->ghost[RED]->substate = 1;

		// change to the next substate
		theGame->states[DEMO]->substate++;
	} else {
		// otherwise, keep animating
		demoMainLoop();
	}
}

void DemoAnim1Substate::run()
{
	// when red ghost reaches a position, set pink ghost to go for pacman and change state
	if (theGame->ghost[RED]->actualTilePosX == 0x20){
		theGame->ghost[PINK]->substate = 1;

		// change to the next substate
		theGame->states[DEMO]->substate++;
	} else {
		// otherwise, keep animating
		demoMainLoop();
	}
}

void DemoAnim2Substate::run()
{
	// when red ghost reaches a position, set blue ghost to go for pacman and change state
	if (theGame->ghost[RED]->actualTilePosX == 0x22){
		theGame->ghost[BLUE]->substate = 1;

		// change to the next substate
		theGame->states[DEMO]->substate++;
	} else {
		// otherwise, keep animating
		demoMainLoop();
	}
}

void DemoAnim3Substate::run()
{
	// when red ghost reaches a position, set orange ghost to go for pacman and change state
	if (theGame->ghost[RED]->actualTilePosX == 0x24){
		theGame->ghost[ORANGE]->substate = 1;

		// change to the next substate
		theGame->states[DEMO]->substate++;
	} else {
		// otherwise, keep animating
		demoMainLoop();
	}
}

void DemoAnim4Substate::run()
{
	// if we've just finished killing the last ghost, advance substate
	if ((theGame->currentKills + theGame->ghostDeadAnimState) == 6){
		theGame->states[DEMO]->substate++;
	} else {
		// otherwise, keep animating
		demoMainLoop();
	}
}

void DemoPlayingSubstate::run()
{
	// play demo game
	theGame->states[PLAYING]->run();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -