got a bit of tsc done (still need to finish PutTextScript, then it's just commands as far as I know)
This commit is contained in:
parent
0d8179e98c
commit
17b0b503a9
7 changed files with 933 additions and 94 deletions
6
Makefile
6
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`
|
||||
|
||||
|
|
189
src/Game.cpp
189
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -2,3 +2,6 @@
|
|||
#include <stdint.h>
|
||||
|
||||
bool IsProfile();
|
||||
bool SaveProfile(char *name);
|
||||
bool LoadProfile(char *name);
|
||||
bool InitializeGame();
|
||||
|
|
|
@ -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();
|
||||
|
|
775
src/TextScr.cpp
775
src/TextScr.cpp
|
@ -1,10 +1,22 @@
|
|||
#include <stdint.h>
|
||||
#include <string>
|
||||
|
||||
#include <SDL_messagebox.h>
|
||||
#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;
|
||||
}
|
||||
|
|
|
@ -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();
|
Loading…
Add table
Reference in a new issue