cave-story-solaris/src/Game.cpp
cuckydev 8fe1b5d96f oop
2019-01-24 22:23:03 -05:00

452 lines
No EOL
8 KiB
C++

#include <string>
#include <stdlib.h>
#include <SDL_timer.h>
#include "WindowsWrapper.h"
#include "Tags.h"
#include "NpcTbl.h"
#include "NpChar.h"
#include "Generic.h"
#include "GenericLoad.h"
#include "TextScr.h"
#include "Fade.h"
#include "Frame.h"
#include "Flags.h"
#include "Escape.h"
#include "Stage.h"
#include "MyChar.h"
#include "Caret.h"
#include "Map.h"
#include "Main.h"
#include "MapName.h"
#include "Sound.h"
#include "Organya.h"
#include "Profile.h"
#include "Back.h"
#include "KeyControl.h"
#include "Draw.h"
#include "Ending.h"
int g_GameFlags;
int gCounter;
bool bContinue;
int Random(int min, int max)
{
return min + rand() % (max - min + 1);
}
void PutNumber4(int x, int y, int value, bool bZero)
{
//Define rects
RECT rcClient = grcFull;
RECT rect[10];
rect[0] = {0, 56, 8, 64};
rect[1] = {8, 56, 16, 64};
rect[2] = {16, 56, 24, 64};
rect[3] = {24, 56, 32, 64};
rect[4] = {32, 56, 40, 64};
rect[5] = {40, 56, 48, 64};
rect[6] = {48, 56, 56, 64};
rect[7] = {56, 56, 64, 64};
rect[8] = {64, 56, 72, 64};
rect[9] = {72, 56, 80, 64};
//Digits
int tbl[4] = {1000, 100, 10, 1};
//Limit value
if ( value > 9999 )
value = 9999;
//Go through number and draw digits
int offset = 0;
int sw = 0;
while (offset < 4)
{
//Get the digit that this is
int a = 0;
while (tbl[offset] <= value)
{
value -= tbl[offset];
++a;
++sw;
}
//Draw digit
if ( bZero && offset == 2 || sw != 0 || offset == 3 )
PutBitmap3(&rcClient, x + 8 * offset, y, &rect[a], SURFACE_ID_TEXT_BOX);
//Go to next digit
++offset;
}
}
int ModeOpening()
{
InitNpChar();
InitCaret();
//InitStar();
InitFade();
//InitFlash();
//InitBossLife();
ChangeMusic(0);
TransferStage(72, 100, 3, 3);
SetFrameTargetMyChar(16);
SetFadeMask();
//Reset cliprect and flags
grcGame.left = 0;
g_GameFlags = 3;
//CutNoise();
int wait = 0;
while (wait < 500)
{
//Increase timer
++wait;
//Get pressed keys
GetTrg();
//Escape menu
if (gKey & KEY_ESCAPE)
{
int escRet = Call_Escape();
if (escRet == 0)
return 0;
if (escRet == 2)
return 1;
}
//Skip intro if OK is pressed
if (gKey & gKeyOk)
break;
//Update everything
ActNpChar();
//ActBossChar();
ActBack();
//ResetMyCharFlag();
//HitMyCharMap();
//HitMyCharNpChar();
//HitMyCharBoss();
//HitNpCharMap();
//HitBossMap();
//HitBossBullet();
//ActCaret();
MoveFrame3();
ProcFade();
//Draw everything
CortBox(&grcFull, 0x000000);
int frame_x, frame_y;
GetFramePosition(&frame_x, &frame_y);
PutBack(frame_x, frame_y);
PutStage_Back(frame_x, frame_y);
//PutBossChar(frame_x, frame_y);
PutNpChar(frame_x, frame_y);
PutMapDataVector(frame_x, frame_y);
PutStage_Front(frame_x, frame_y);
PutFront(frame_x, frame_y);
//PutCaret(frame_x, frame_y);
PutFade();
//Update Text Script
//int tscRet = TextScriptProc();
//if (tscRet == 0)
// return 0;
//if (tscRet == 2)
// return 1;
PutMapName(false);
//PutTextScript();
PutFramePerSecound();
if (!Flip_SystemTask())
return 0;
++gCounter;
}
wait = SDL_GetTicks();
while (SDL_GetTicks() < wait + 500)
{
CortBox(&grcGame, 0x000000);
PutFramePerSecound();
if (!Flip_SystemTask())
return 0;
}
return 2;
}
int ModeTitle()
{
//Set rects
RECT rcTitle = {0, 0, 144, 32};
RECT rcPixel = {0, 0, 160, 16};
RECT rcNew = {144, 0, 192, 16};
RECT rcContinue = {144, 16, 192, 32};
RECT rcVersion = {152, 80, 208, 88};
RECT rcPeriod = {152, 88, 208, 96};
//Character rects
RECT rcMyChar[4];
RECT rcCurly[4];
RECT rcToroko[4];
RECT rcKing[4];
RECT rcSu[4];
rcMyChar[0] = {0, 16, 16, 32};
rcMyChar[1] = {16, 16, 32, 32};
rcMyChar[2] = {0, 16, 16, 32};
rcMyChar[3] = {32, 16, 48, 32};
rcCurly[0] = {0, 112, 16, 128};
rcCurly[1] = {16, 112, 32, 128};
rcCurly[2] = {0, 112, 16, 128};
rcCurly[3] = {32, 112, 48, 128};
rcToroko[0] = {64, 80, 80, 96};
rcToroko[1] = {80, 80, 96, 96};
rcToroko[2] = {64, 80, 80, 96};
rcToroko[3] = {96, 80, 112, 96};
rcKing[0] = {224, 48, 240, 64};
rcKing[1] = {288, 48, 304, 64};
rcKing[2] = {224, 48, 240, 64};
rcKing[3] = {304, 48, 320, 64};
rcSu[0] = {0, 16, 16, 32};
rcSu[1] = {32, 16, 48, 32};
rcSu[2] = {0, 16, 16, 32};
rcSu[3] = {48, 16, 64, 32};
//Reset everything
InitCaret();
//InitStar();
//CutNoise();
//Create variables
int anime = 0;
int char_type = 0;
int time_counter = 0;
//Set state
bContinue = IsProfile();
//Set character
time_counter = 0;//LoadTimeCounter();
if (time_counter && time_counter < 18000)
char_type = 1;
if (time_counter && time_counter < 15000)
char_type = 2;
if (time_counter && time_counter < 12000)
char_type = 3;
if (time_counter && time_counter < 9000)
char_type = 4;
//Set music to character's specific music
switch (char_type)
{
case 1:
ChangeMusic(mus_RunningHell);
break;
case 2:
ChangeMusic(mus_TorokosTheme);
break;
case 3:
ChangeMusic(mus_White);
break;
case 4:
ChangeMusic(mus_Safety);
break;
default:
ChangeMusic(mus_CaveStory);
break;
}
//Reset cliprect, flags, and give the player the booster 0.8?
grcGame.left = 0;
g_GameFlags = 0;
/*
v0 = unk_81C8598;
BYTE1(v0) |= 1u;
unk_81C8598 = v0;
*/
//Start loop
int wait = 0;
while (true)
{
//Don't accept selection for 10 frames
if (wait < 10)
++wait;
//Get pressed keys
GetTrg();
//Quit when OK is pressed
if (wait >= 10)
{
if (gKeyTrg & gKeyOk)
break;
}
if (gKey & KEY_ESCAPE)
{
int escRet = Call_Escape();
if (escRet == 0)
return 0;
if (escRet == 2)
return 1;
}
//Move cursor
if ((gKeyDown | gKeyUp) & gKeyTrg)
{
PlaySoundObject(1, 1);
bContinue = !bContinue;
}
//Update carets
//ActCaret();
//Animate character cursor
if ( ++anime >= 40 )
anime = 0;
//Draw title
CortBox(&grcGame, 0x202020);
//Draw version
PutBitmap3(&grcGame, 100, 216, &rcVersion, SURFACE_ID_TEXT_BOX);
PutBitmap3(&grcGame, 156, 216, &rcPeriod, SURFACE_ID_TEXT_BOX);
int v1, v2, v3, v4;
GetCompileVersion(&v1, &v2, &v3, &v4);
PutNumber4(140, 216, v1, 0);
PutNumber4(156, 216, v2, 0);
PutNumber4(172, 216, v3, 0);
PutNumber4(188, 216, v4, 0);
//Draw main title
PutBitmap3(&grcGame, 88, 40, &rcTitle, 0);
PutBitmap3(&grcGame, 136, 128, &rcNew, 0);
PutBitmap3(&grcGame, 136, 148, &rcContinue, 0);
PutBitmap3(&grcGame, 80, 192, &rcPixel, 1);
//Draw character cursor
RECT char_rc;
int char_surf;
switch ( char_type )
{
case 0:
char_rc = rcMyChar[anime / 10 % 4];
char_surf = SURFACE_ID_MY_CHAR;
break;
case 1:
char_rc = rcCurly[anime / 10 % 4];
char_surf = SURFACE_ID_NPC_REGU;
break;
case 2:
char_rc = rcToroko[anime / 10 % 4];
char_surf = SURFACE_ID_NPC_REGU;
break;
case 3:
char_rc = rcKing[anime / 10 % 4];
char_surf = SURFACE_ID_NPC_REGU;
break;
case 4:
char_rc = rcSu[anime / 10 % 4];
char_surf = SURFACE_ID_NPC_REGU;
break;
}
int char_y;
if (bContinue == 1)
char_y = 147;
else
char_y = 127;
PutBitmap3(&grcGame, 116, char_y, &char_rc, char_surf);
//Draw carets
//PutCaret(0, 0);
//if (time_counter)
// PutTimeCounter(16, 8);
PutFramePerSecound();
if (!Flip_SystemTask())
return 0;
}
PlaySoundObject(18, 1);
ChangeMusic(0);
//Black screen when option is selected
wait = SDL_GetTicks();
while (SDL_GetTicks() < wait + 1000)
{
CortBox(&grcGame, 0);
PutFramePerSecound();
if (!Flip_SystemTask())
return 0;
}
return 0;
}
bool Game()
{
if (LoadGenericData())
{
char path[PATH_LENGTH];
sprintf(path, "%s/npc.tbl", gDataPath);
if (LoadNpcTable(path) && InitStageTable())
{
InitTextScript2();
InitSkipFlags();
InitMapData2();
InitCreditScript();
int mode = 1;
while (mode)
{
if (mode == 1)
mode = ModeOpening();
if (mode == 2)
mode = ModeTitle();
//if (mode == 3)
// mode = ModeAction();
}
EndMapData();
EndTextScript();
ReleaseStageTable();
ReleaseNpcTable();
ReleaseCreditScript();
}
else
{
return false;
}
}
return true;
}