diff --git a/Makefile b/Makefile index 73d7a885..c48567eb 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ ifeq ($(RELEASE), 1) CXXFLAGS := -O3 -s FILENAME := release else -CXXFLAGS := -O0 -g -mconsole +CXXFLAGS := -O0 -g FILENAME := debug endif @@ -20,6 +20,10 @@ ifeq ($(FIX_BUGS), 1) CXXFLAGS += -DFIX_BUGS endif +ifeq ($(CONSOLE), 1) +CXXFLAGS += -mconsole +endif + CXXFLAGS += `sdl2-config --cflags` `pkg-config freetype2 --cflags` LIBS += `sdl2-config --static-libs` `pkg-config freetype2 --libs` diff --git a/src/Game.cpp b/src/Game.cpp index 0050f0e7..43ee1714 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -161,14 +161,14 @@ int ModeOpening() PutFade(); //Update Text Script - //int tscRet = TextScriptProc(); - //if (tscRet == 0) - // return 0; - //if (tscRet == 2) - // return 1; + int tscRet = TextScriptProc(); + if (tscRet == 0) + return 0; + if (tscRet == 2) + return 1; PutMapName(false); - //PutTextScript(); + PutTextScript(); PutFramePerSecound(); if (!Flip_SystemTask()) @@ -440,92 +440,107 @@ int ModeAction() InitFlags(); //InitBossLife(); - TransferStage(2, 94, 5, 6); - ChangeMusic(mus_MischievousRobot); - SetFrameTargetMyChar(16); - SetFrameMyChar(); - - while (true) + if ((bContinue && LoadProfile(NULL)) || InitializeGame()) { - //Get pressed keys - GetTrg(); - - //Escape menu - if (gKey & KEY_ESCAPE) + while (true) { - int escRet = Call_Escape(); - if (escRet == 0) - return 0; - if (escRet == 2) - return 1; - } - - if (swPlay & 1 && g_GameFlags & 1) - { - if (g_GameFlags & 2) - ActMyChar(true); - else - ActMyChar(false); + //Get pressed keys + GetTrg(); - //ActStar(); - ActNpChar(); - //ActBossChar(); - //ActValueView(); - ActBack(); - ResetMyCharFlag(); - HitMyCharMap(); - //HitMyCharNpChar(); - //HitMyCharBoss(); - HitNpCharMap(); - //HitBossMap(); - //HitBulletMap(); - //HitNpCharBullet(); - //HitBossBullet(); - //if (g_GameFlags & 2) - // ShootBullet(); - //ActBullet(); - ActCaret(); - MoveFrame3(); - //ActFlash(frame_x, frame_y); + //Escape menu + if (gKey & KEY_ESCAPE) + { + int escRet = Call_Escape(); + if (escRet == 0) + return 0; + if (escRet == 2) + return 1; + } - if (g_GameFlags & 2) - AnimationMyChar(true); - else - AnimationMyChar(false); + if (swPlay & 1 && g_GameFlags & 1) + { + if (g_GameFlags & 2) + ActMyChar(true); + else + ActMyChar(false); + + //ActStar(); + ActNpChar(); + //ActBossChar(); + //ActValueView(); + ActBack(); + ResetMyCharFlag(); + HitMyCharMap(); + //HitMyCharNpChar(); + //HitMyCharBoss(); + HitNpCharMap(); + //HitBossMap(); + //HitBulletMap(); + //HitNpCharBullet(); + //HitBossBullet(); + //if (g_GameFlags & 2) + // ShootBullet(); + //ActBullet(); + ActCaret(); + MoveFrame3(); + //ActFlash(frame_x, frame_y); + + if (g_GameFlags & 2) + AnimationMyChar(true); + else + AnimationMyChar(false); + } + + if (g_GameFlags & 8) + { + ActionCredit(); + ActionIllust(); + ActionStripper(); + } + + ProcFade(); + CortBox(&grcFull, 0x000020); + 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); + //PutBullet(frame_x, frame_y); + PutMyChar(frame_x, frame_y); + //PutStar(frame_x, frame_y); + PutMapDataVector(frame_x, frame_y); + PutStage_Front(frame_x, frame_y); + PutFront(frame_x, frame_y); + //PutFlash(); + PutCaret(frame_x, frame_y); + //PutValueView(frame_x, frame_y); + //PutBossLife(); + PutFade(); + + if (swPlay & 1) + { + int tscRet = TextScriptProc(); + if (tscRet == 0) + return 0; + if (tscRet == 2) + return 1; + } + + PutMapName(false); + + if (g_GameFlags & 8) + { + PutIllust(); + PutStripper(); + } + + PutTextScript(); + + PutFramePerSecound(); + if (!Flip_SystemTask()) + break; + ++gCounter; } - - if (g_GameFlags & 8) - { - ActionCredit(); - ActionIllust(); - ActionStripper(); - } - - ProcFade(); - CortBox(&grcFull, 0x000020); - 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); - //PutBullet(frame_x, frame_y); - PutMyChar(frame_x, frame_y); - //PutStar(frame_x, frame_y); - PutMapDataVector(frame_x, frame_y); - PutStage_Front(frame_x, frame_y); - PutFront(frame_x, frame_y); - //PutFlash(); - PutCaret(frame_x, frame_y); - //PutValueView(frame_x, frame_y); - //PutBossLife(); - PutFade(); - - PutMapName(false); - - PutFramePerSecound(); - if (!Flip_SystemTask()) - break; - ++gCounter; } return 0; diff --git a/src/Profile.cpp b/src/Profile.cpp index 6b173425..5dea8159 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -6,6 +6,12 @@ #include "CommonDefines.h" #include "Tags.h" #include "Profile.h" +#include "Fade.h" +#include "Flags.h" +#include "MyChar.h" +#include "Frame.h" +#include "Stage.h" +#include "Game.h" const char *gDefaultName = "Profile.dat"; const char *gProfileCode = "Do041220"; @@ -22,3 +28,38 @@ bool IsProfile() SDL_RWclose(fp); return true; } + +bool SaveProfile(char *name) +{ + return false; +} + +bool LoadProfile(char *name) +{ + return false; +} + +bool InitializeGame() +{ + InitMyChar(); + //gSelectedArms = 0; + //gSelectedItem = 0; + gCounter = 0; + //ClearArmsData(); + //ClearItemData(); + //ClearPermitStage(); + //StartMapping(); + InitFlags(); + if (!TransferStage(13, 200, 10, 8)) + return false; + ClearFade(); + SetFrameMyChar(); + SetFrameTargetMyChar(16); + //InitBossLife(); + //CutNoise(); + //ClearValueView(); + //gCurlyShoot_wait = 0; + SetFadeMask(); + SetFrameTargetMyChar(16); + return true; +} diff --git a/src/Profile.h b/src/Profile.h index 99fe9e7e..d65fc997 100644 --- a/src/Profile.h +++ b/src/Profile.h @@ -2,3 +2,6 @@ #include bool IsProfile(); +bool SaveProfile(char *name); +bool LoadProfile(char *name); +bool InitializeGame(); diff --git a/src/Stage.cpp b/src/Stage.cpp index 9052856f..89b25ff6 100644 --- a/src/Stage.cpp +++ b/src/Stage.cpp @@ -129,7 +129,7 @@ bool TransferStage(int no, int w, int x, int y) //Load map name ReadyMapName(gTMT[no].name); - //StartTextScript(w); + StartTextScript(w); SetFrameMyChar(); //ClearBullet(); InitCaret(); diff --git a/src/TextScr.cpp b/src/TextScr.cpp index 88b42c9f..401337e2 100644 --- a/src/TextScr.cpp +++ b/src/TextScr.cpp @@ -1,10 +1,22 @@ #include #include +#include +#include "WindowsWrapper.h" + #include "CommonDefines.h" #include "TextScr.h" #include "Draw.h" #include "Tags.h" +#include "MyChar.h" +#include "Fade.h" +#include "Stage.h" +#include "Flags.h" +#include "MapName.h" +#include "KeyControl.h" +#include "NpChar.h" +#include "Sound.h" +#include "Organya.h" #include "Game.h" #define TSC_BUFFER_SIZE 0x5000 @@ -14,7 +26,7 @@ TEXT_SCRIPT gTS; int gNumberTextScript[4]; char text[0x100]; -const RECT gRect_line = {0, 0, 216, 16}; +RECT gRect_line = {0, 0, 216, 16}; //Initialize and end tsc bool InitTextScript2() @@ -64,6 +76,32 @@ void EncryptionBinaryData2(uint8_t *pData, int size) } } +//Load generic .tsc +bool LoadTextScript2(char *name) +{ + //Get path + char path[260]; + sprintf(path, "%s/%s", gDataPath, name); + + //Open file + SDL_RWops *fp = SDL_RWFromFile(path, "rb"); + if (!fp) + return false; + + //Read data + gTS.size = SDL_RWsize(fp); + fp->read(fp, gTS.data, 1, gTS.size); + gTS.data[gTS.size] = 0; + fp->close(fp); + + //Set path + strcpy(gTS.path, name); + + //Decrypt data + EncryptionBinaryData2((uint8_t*)gTS.data, gTS.size); + return true; +} + //Load stage .tsc bool LoadTextScript_Stage(char *name) { @@ -77,7 +115,6 @@ bool LoadTextScript_Stage(char *name) //Read Head.tsc int head_size = SDL_RWsize(fp); - fp->read(fp, gTS.data, 1, head_size); EncryptionBinaryData2((uint8_t*)gTS.data, head_size); gTS.data[head_size] = 0; @@ -102,3 +139,737 @@ bool LoadTextScript_Stage(char *name) strcpy(gTS.path, name); return true; } + +//Get current path +void GetTextScriptPath(char *path) +{ + strcpy(path, gTS.path); +} + +//Get 4 digit number from TSC data +int GetTextScriptNo(int a) +{ + return gTS.data[a + 3] - 48 + + 10 * gTS.data[a + 2] - 480 + + 100 * gTS.data[a + 1] - 4800 + + 1000 * gTS.data[a] - 48000; +} + +//Start TSC event +bool StartTextScript(int no) +{ + //Reset state + gTS.mode = 1; + g_GameFlags |= 5; + gTS.line = 0; + gTS.p_write = 0; + gTS.wait = 4; + gTS.flags = 0; + gTS.wait_beam = 0; + gTS.face = 0; + gTS.item = 0; + gTS.offsetY = 0; + + gMC.shock = 0; + + gTS.rcText = {WINDOW_WIDTH / 2 - 108, WINDOW_HEIGHT - 56, WINDOW_WIDTH + 108, WINDOW_HEIGHT - 8}; + + //Clear text lines + for (int i = 0; i < 4; i++) + { + gTS.ypos_line[i] = 16 * i; + CortBox2(&gRect_line, 0x000000, i + 30); + memset(&text[i * 0x40], 0, 0x40); + } + + //Find where event starts + for (gTS.p_read = 0; ; gTS.p_read++) + { + //Check if we are still in the proper range + if (!gTS.data[gTS.p_read]) + return false; + + //Check if we are at an event + if (gTS.data[gTS.p_read] != '#') + continue; + + //Check if this is our event + int event_no = GetTextScriptNo(++gTS.p_read); + + if (no == event_no) + break; + if (no < event_no) + return false; + } + + //Advance until new-line + while (gTS.data[gTS.p_read] != '\n') + ++gTS.p_read; + ++gTS.p_read; + + return true; +} + +bool JumpTextScript(int no) +{ + //Set state + gTS.mode = 1; + g_GameFlags |= 4u; + gTS.line = 0; + gTS.p_write = 0; + gTS.wait = 4; + gTS.wait_beam = 0; + + //Clear text lines + for (int i = 0; i < 4; i++) + { + gTS.ypos_line[i] = 16 * i; + CortBox2(&gRect_line, 0x000000, i + 30); + memset(&text[i * 0x40], 0, 0x40); + } + + //Find where event starts + for (gTS.p_read = 0; ; gTS.p_read++) + { + //Check if we are still in the proper range + if (!gTS.data[gTS.p_read]) + return false; + + //Check if we are at an event + if (gTS.data[gTS.p_read] != '#') + continue; + + //Check if this is our event + int event_no = GetTextScriptNo(++gTS.p_read); + + if (no == event_no) + break; + if (no < event_no) + return false; + } + + //Advance until new-line + while (gTS.data[gTS.p_read] != '\n') + ++gTS.p_read; + ++gTS.p_read; + + return true; +} + +//End event +void StopTextScript() +{ + //End TSC and reset flags + gTS.mode = 0; + g_GameFlags &= ~4; + g_GameFlags |= 3; + gTS.flags = 0; +} + +//Prepare a new line +void CheckNewLine() +{ + if (gTS.ypos_line[gTS.line % 4] == 48) + { + gTS.mode = 3; + g_GameFlags |= 4; + CortBox2(&gRect_line, 0, gTS.line % 4 + 30); + memset(&text[gTS.line % 4 * 0x40], 0, 0x40); + } +} + +//Type a number into the text buffer +void SetNumberTextScript(int index) +{ + //Get digit table + int table[3]; + table[0] = 1000; + table[1] = 100; + table[2] = 10; + + //Get number to print + int a = gNumberTextScript[index]; + int b; + + char str[5]; + bool bZero = false; + int offset = 0; + + for (int i = 0; i < 3; i++) + { + if (a / table[i] || bZero) + { + //Do whatever the fuck this is + b = a / table[i]; + str[offset] = b + 0x30; + bZero = true; + a -= b * table[i]; + ++offset; + } + } + + //Set last digit of string, and add null terminator + str[offset] = a + 0x30; + str[offset + 1] = 0; + + //Append number to line + PutText2(6 * gTS.p_write, 0, str, 0xFFFFFE, gTS.line % 4 + 30); + strcat(&text[gTS.line % 4 * 0x40], str); + + //Play sound and reset blinking cursor + PlaySoundObject(2, 1); + gTS.wait_beam = 0; + + //Check if should move to next line (prevent a memory overflow, come on guys, this isn't a leftover of pixel trying to make text wrapping) + gTS.p_write += strlen(str); + + if (gTS.p_write > 34) + { + gTS.p_write = 0; + gTS.line++; + CheckNewLine(); + } +} + +//Clear text lines +void ClearTextLine() +{ + gTS.line = 0; + gTS.p_write = 0; + gTS.offsetY = 0; + + for (int i = 0; i < 4; i++) + { + gTS.ypos_line[i] = 16 * i; + CortBox2(&gRect_line, 0x000000, i + 30); + memset(&text[i * 0x40], 0, 0x40); + } +} + +//Draw textbox and whatever else +void PutTextScript() +{ + if (gTS.mode && (gTS.flags & 1)) + { + //Set textbox position + if (gTS.flags & 0x20) + { + gTS.rcText.top = 32; + gTS.rcText.bottom = 80; + } + else + { + gTS.rcText.top = WINDOW_HEIGHT - 56; + gTS.rcText.bottom = WINDOW_HEIGHT - 8; + } + + //Draw textbox + if (gTS.flags & 2) + { + RECT rcFrame1 = {0, 0, 244, 8}; + RECT rcFrame2 = {0, 8, 244, 16}; + RECT rcFrame3 = {0, 16, 244, 24}; + + PutBitmap3(&grcFull, gTS.rcText.left - 14, gTS.rcText.top - 10, &rcFrame1, 26); + int i; + for (i = 1; i < 7; i++) + PutBitmap3(&grcFull, gTS.rcText.left - 14, 8 * i + gTS.rcText.top - 10, &rcFrame2, 26); + PutBitmap3(&grcFull, gTS.rcText.left - 14, 8 * i + gTS.rcText.top - 10, &rcFrame3, 26); + } + + //Draw face picture + RECT rcFace; + rcFace.left = 48 * (gTS.face % 6); + rcFace.top = 48 * (gTS.face / 6); + rcFace.right = 48 * (gTS.face % 6) + 48; + rcFace.bottom = 48 * (gTS.face / 6) + 48; + + if (gTS.face_x < (gTS.rcText.left << 9)) + gTS.face_x += 0x1000; + PutBitmap3(&gTS.rcText, gTS.face_x / 0x200, gTS.rcText.top - 3, &rcFace, 27); + + //Draw text + int text_offset; + if (gTS.face) + text_offset = 56; + else + text_offset = 0; + + for (int i = 0; i < 4; i++) + PutBitmap3(&gTS.rcText, text_offset + gTS.rcText.left, gTS.offsetY + gTS.ypos_line[i] + gTS.rcText.top, &gRect_line, i + 30); + + //Draw NOD cursor + if ((gTS.wait_beam++ % 20 > 12) && gTS.mode == 2) + { + RECT rect; + rect.left = gTS.rcText.left + text_offset + 6 * gTS.p_write; + rect.top = gTS.rcText.top + gTS.ypos_line[gTS.line % 4] + gTS.offsetY; + rect.right = rect.left + 5; + rect.bottom = rect.top + 11; + CortBox(&rect, 0xFFFFFE); + } + } +} + +//Parse TSC +int TextScriptProc() +{ + RECT rcSymbol = {64, 48, 72, 56}; + + bool bExit; + + switch (gTS.mode) + { + case 1: //PARSE + //Type out (faster if ok or cancel are held) + ++gTS.wait; + + if (!(g_GameFlags & 2) && (gKeyCancel | gKeyOk) & gKey) + gTS.wait += 4; + + if (gTS.wait < 4) + break; + + gTS.wait = 0; + + //Parsing time + bExit = false; + + while (!bExit) + { + if (gTS.data[gTS.p_read] != '<') + { + if (gTS.data[gTS.p_read] == '\r') + { + //Go to new-line + gTS.p_read += 2; + gTS.p_write = 0; + + if (gTS.flags & 1) + { + ++gTS.line; + CheckNewLine(); + } + } + else if (gTS.flags & 0x10) + { + //SAT/CAT/TUR printing + int x; + for (x = gTS.p_read; ; x++) + { + //Break if reaches command, or new-line + if (gTS.data[x] == '<' || gTS.data[x] == '\r') + break; + //Skip if SHIFT-JIS + if (gTS.data[x] & 0x80) + ++x; + } + + //Get text to copy + char str[72]; + int length = x - gTS.p_read; + memcpy(str, &gTS.data[gTS.p_read], length); + str[length] = 0; + + gTS.p_write = x; + + //Print text + PutText2(0, 0, str, 0xFFFFFE, gTS.line % 4 + 30); + sprintf(&text[gTS.line % 4 * 0x40], str); + + //Check if should move to next line (prevent a memory overflow, come on guys, this isn't a leftover of pixel trying to make text wrapping) + gTS.p_read += length; + + if (gTS.p_write > 34) + CheckNewLine(); + + bExit = true; + } + else + { + //Get text to print + char c[3]; + c[0] = gTS.data[gTS.p_read]; + + if (!(c[0] & 0x80)) + { + c[1] = 0; + } + else + { + c[1] = gTS.data[gTS.p_read + 1]; + c[2] = 0; + } + + //Print text + if (c[0] == '=') + { + Surface2Surface(6 * gTS.p_write, 2, &rcSymbol, gTS.line % 4 + 30, 26); + } + else + { + PutText2(6 * gTS.p_write, 0, c, 0xFFFFFE, gTS.line % 4 + 30); + } + + strcat(&text[gTS.line % 4 * 0x40], c); + PlaySoundObject(2, 1); + gTS.wait_beam = 0; + + //Offset read and write positions + if (!(c[0] & 0x80)) + { + gTS.p_read++; + gTS.p_write++; + } + else + { + gTS.p_read += 2; + gTS.p_write += 2; + } + + if (gTS.p_write > 34) + { + CheckNewLine(); + gTS.p_write = 0; + ++gTS.line; + CheckNewLine(); + } + + bExit = true; + } + } + else + { + if (gTS.data[gTS.p_read + 1] == 'E' && + gTS.data[gTS.p_read + 2] == 'N' && + gTS.data[gTS.p_read + 3] == 'D') + { + gTS.mode = 0; + gMC.cond &= ~1; + g_GameFlags |= 3; + gTS.face = 0; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'T' && + gTS.data[gTS.p_read + 2] == 'R' && + gTS.data[gTS.p_read + 3] == 'A') + { + int z = GetTextScriptNo(gTS.p_read + 4); + int w = GetTextScriptNo(gTS.p_read + 9); + int x = GetTextScriptNo(gTS.p_read + 14); + int y = GetTextScriptNo(gTS.p_read + 19); + if (!TransferStage(z, w, x, y)) + return 0; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'L' && + gTS.data[gTS.p_read + 3] == '+') + { + int z = GetTextScriptNo(gTS.p_read + 4); + SetNPCFlag(z); + gTS.p_read += 8; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'L' && + gTS.data[gTS.p_read + 3] == '-') + { + int z = GetTextScriptNo(gTS.p_read + 4); + CutNPCFlag(z); + gTS.p_read += 8; + } + else if (gTS.data[gTS.p_read + 1] == 'S' && + gTS.data[gTS.p_read + 2] == 'K' && + gTS.data[gTS.p_read + 3] == '+') + { + int z = GetTextScriptNo(gTS.p_read + 4); + SetSkipFlag(z); + gTS.p_read += 8; + } + else if (gTS.data[gTS.p_read + 1] == 'S' && + gTS.data[gTS.p_read + 2] == 'K' && + gTS.data[gTS.p_read + 3] == '-') + { + int z = GetTextScriptNo(gTS.p_read + 4); + CutSkipFlag(z); + gTS.p_read += 8; + } + else if (gTS.data[gTS.p_read + 1] == 'K' && + gTS.data[gTS.p_read + 2] == 'E' && + gTS.data[gTS.p_read + 3] == 'Y') + { + g_GameFlags &= ~2; + g_GameFlags |= 1; + gMC.up = false; + gMC.shock = 0; + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'P' && + gTS.data[gTS.p_read + 2] == 'R' && + gTS.data[gTS.p_read + 3] == 'I') + { + g_GameFlags &= ~3; + gMC.shock = 0; + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'R' && + gTS.data[gTS.p_read + 3] == 'E') + { + g_GameFlags |= 3; + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'N' && + gTS.data[gTS.p_read + 2] == 'O' && + gTS.data[gTS.p_read + 3] == 'D') + { + gTS.mode = 2; + gTS.p_read += 4; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'C' && + gTS.data[gTS.p_read + 2] == 'L' && + gTS.data[gTS.p_read + 3] == 'R') + { + ClearTextLine(); + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'M' && + gTS.data[gTS.p_read + 2] == 'S' && + gTS.data[gTS.p_read + 3] == 'G') + { + ClearTextLine(); + gTS.flags |= 0x03; + gTS.flags &= ~0x30; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.p_read += 4; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'M' && + gTS.data[gTS.p_read + 2] == 'S' && + gTS.data[gTS.p_read + 3] == '2') + { + ClearTextLine(); + gTS.flags |= 0x21; + gTS.flags &= ~0x12; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.face = 0; + gTS.p_read += 4; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'M' && + gTS.data[gTS.p_read + 2] == 'S' && + gTS.data[gTS.p_read + 3] == '3') + { + ClearTextLine(); + gTS.flags |= 0x23; + gTS.flags &= ~0x10; + if (gTS.flags & 0x40) + gTS.flags |= 0x10; + gTS.p_read += 4; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'W' && + gTS.data[gTS.p_read + 2] == 'A' && + gTS.data[gTS.p_read + 3] == 'I') + { + gTS.mode = 4; + gTS.wait_next = GetTextScriptNo(gTS.p_read + 4); + gTS.p_read += 8; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'T' && + gTS.data[gTS.p_read + 2] == 'U' && + gTS.data[gTS.p_read + 3] == 'R') + { + gTS.p_read += 4; + gTS.flags |= 0x10; + } + else if (gTS.data[gTS.p_read + 1] == 'S' && + gTS.data[gTS.p_read + 2] == 'A' && + gTS.data[gTS.p_read + 3] == 'T') + { + gTS.p_read += 4; + gTS.flags |= 0x40; + } + else if (gTS.data[gTS.p_read + 1] == 'C' && + gTS.data[gTS.p_read + 2] == 'A' && + gTS.data[gTS.p_read + 3] == 'T') + { + gTS.p_read += 4; + gTS.flags |= 0x40; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'L' && + gTS.data[gTS.p_read + 3] == 'J') + { + int x = GetTextScriptNo(gTS.p_read + 4); + int z = GetTextScriptNo(gTS.p_read + 9); + + if (GetNPCFlag(x)) + JumpTextScript(z); + else + gTS.p_read += 13; + } + else if (gTS.data[gTS.p_read + 1] == 'S' && + gTS.data[gTS.p_read + 2] == 'K' && + gTS.data[gTS.p_read + 3] == 'J') + { + int x = GetTextScriptNo(gTS.p_read + 4); + int z = GetTextScriptNo(gTS.p_read + 9); + + if (GetSkipFlag(x)) + JumpTextScript(z); + else + gTS.p_read += 13; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'A' && + gTS.data[gTS.p_read + 3] == 'I') + { + int z = GetTextScriptNo(gTS.p_read + 4); + StartFadeIn(z); + gTS.mode = 5; + gTS.p_read += 8; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'A' && + gTS.data[gTS.p_read + 3] == 'O') + { + int z = GetTextScriptNo(gTS.p_read + 4); + StartFadeOut(z); + gTS.mode = 5; + gTS.p_read += 8; + bExit = true; + } + else if (gTS.data[gTS.p_read + 1] == 'M' && + gTS.data[gTS.p_read + 2] == 'N' && + gTS.data[gTS.p_read + 3] == 'A') + { + StartMapName(); + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'C' && + gTS.data[gTS.p_read + 2] == 'M' && + gTS.data[gTS.p_read + 3] == 'U') + { + int z = GetTextScriptNo(gTS.p_read + 4); + ChangeMusic(z); + gTS.p_read += 8; + } + else if (gTS.data[gTS.p_read + 1] == 'F' && + gTS.data[gTS.p_read + 2] == 'M' && + gTS.data[gTS.p_read + 3] == 'U') + { + SetOrganyaFadeout(); + gTS.p_read += 4; + } + else if (gTS.data[gTS.p_read + 1] == 'R' && + gTS.data[gTS.p_read + 2] == 'M' && + gTS.data[gTS.p_read + 3] == 'U') + { + ReCallMusic(); + gTS.p_read += 4; + } + else + { + printf("Unimplemented command: <%c%c%c\n", (char)gTS.data[gTS.p_read + 1], (char)gTS.data[gTS.p_read + 2], (char)gTS.data[gTS.p_read + 3]); + gTS.p_read += 4; + return 1; + } + } + } + break; + + case 2: //NOD + if ((gKeyCancel | gKeyOk) & gKeyTrg) + gTS.mode = 1; + break; + + case 3: //NEW LINE + for (int i = 0; i < 4; i++) + { + gTS.ypos_line[i] -= 4; + + if (!gTS.ypos_line[i]) + gTS.mode = 1; + + if (gTS.ypos_line[i] == -16) + gTS.ypos_line[i] = 48; + } + break; + + case 4: //WAI + if (gTS.wait_next != 9999) + { + if (gTS.wait != 9999) + ++gTS.wait; + + if (gTS.wait >= gTS.wait_next) + { + gTS.mode = 1; + gTS.wait_beam = 0; + } + } + break; + + case 5: //FAI/FAO + if (!GetFadeActive()) + { + gTS.mode = 1; + gTS.wait_beam = 0; + } + break; + case 7: //WAS + if (gMC.flag & 8) + { + gTS.mode = 1; + gTS.wait_beam = 0; + } + break; + case 6: //YNJ + if (gTS.wait >= 16) + { + //Select option + if (gKeyTrg & gKeyOk) + { + PlaySoundObject(18, 1); + + if (gTS.select == 1) + { + JumpTextScript(gTS.next_event); + } + else + { + gTS.mode = 1; + gTS.wait_beam = 0; + } + } + //Yes + else if (gKeyTrg & gKeyLeft) + { + gTS.select = 0; + PlaySoundObject(1, 1); + } + //No + else if (gKeyTrg & gKeyRight) + { + gTS.select = 1; + PlaySoundObject(1, 1); + } + } + else + { + gTS.wait++; + } + break; + } + + if (gTS.mode) + g_GameFlags |= 4; + else + g_GameFlags &= ~4; + return 1; +} diff --git a/src/TextScr.h b/src/TextScr.h index d4ce4beb..5e37bf60 100644 --- a/src/TextScr.h +++ b/src/TextScr.h @@ -19,8 +19,8 @@ struct TEXT_SCRIPT char flags; //Current positions (read position in buffer, x position in line) - int p_read; - int p_write; + unsigned int p_read; + unsigned int p_write; //Current line to write to int line; @@ -47,7 +47,7 @@ struct TEXT_SCRIPT //Text rect RECT rcText; - //??? + //..? int offsetY; //NOD cursor blink @@ -57,4 +57,9 @@ struct TEXT_SCRIPT bool InitTextScript2(); void EndTextScript(); void EncryptionBinaryData2(uint8_t *pData, int size); +bool LoadTextScript2(char *name); bool LoadTextScript_Stage(char *name); +void GetTextScriptPath(char *path); +bool StartTextScript(int no); +void PutTextScript(); +int TextScriptProc(); \ No newline at end of file