Merge branch 'master' into addBetterMakefileDebugFlags

This commit is contained in:
Gabriel Ravier 2019-05-07 19:43:38 +02:00
commit 54ee8d1347
23 changed files with 263 additions and 223 deletions

View file

@ -11,6 +11,14 @@ name = "InitBack"
addr = 0x402270 addr = 0x402270
size = 0x100 size = 0x100
[[func]]
name = "ActBack"
addr = 0x402370
[[func]]
name = "PutBack"
addr = 0x4023D0
[[func]] [[func]]
name = "PutFront" name = "PutFront"
addr = 0x402830 addr = 0x402830
@ -271,6 +279,14 @@ addr = 0x40ABC0
name = "SetCaret" name = "SetCaret"
addr = 0x40AC90 addr = 0x40AC90
[[func]]
name = "LoadConfigData"
addr = 0x40AD60
[[func]]
name = "DefaultConfigData"
addr = 0x40AE30
[[func]] [[func]]
name = "Call_Escape" name = "Call_Escape"
addr = 0x40DD70 addr = 0x40DD70
@ -606,6 +622,18 @@ addr = 0x41FE70
name = "PlaySoundObject" name = "PlaySoundObject"
addr = 0x420640 addr = 0x420640
[[func]]
name = "TransferStage"
addr = 0x420BE0
[[func]]
name = "ChangeMusic"
addr = 0x420EE0
[[func]]
name = "ReCallMusic"
addr = 0x420F50
[[func]] [[func]]
name = "InitStar" name = "InitStar"
addr = 0x420FA0 addr = 0x420FA0

View file

@ -158,9 +158,9 @@ void MoveCampCursor()
{ {
int arms_num = 0; int arms_num = 0;
int item_num = 0; int item_num = 0;
while ( gArmsData[arms_num].code != 0 ) while (gArmsData[arms_num].code != 0)
++arms_num; ++arms_num;
while ( gItemData[item_num].code != 0 ) while (gItemData[item_num].code != 0)
++item_num; ++item_num;
if (arms_num == 0 && item_num == 0) if (arms_num == 0 && item_num == 0)
@ -228,9 +228,9 @@ void MoveCampCursor()
bChange = TRUE; bChange = TRUE;
} }
if ( gKeyTrg & gKeyDown ) if (gKeyTrg & gKeyDown)
{ {
if ( gSelectedItem / 6 == (item_num - 1) / 6 ) if (gSelectedItem / 6 == (item_num - 1) / 6)
gCampActive = FALSE; gCampActive = FALSE;
else else
gSelectedItem += 6; gSelectedItem += 6;
@ -325,7 +325,7 @@ void PutCampObject()
PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 160) / 2, gArmsData[i].level, 0); PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 160) / 2, gArmsData[i].level, 0);
// Draw ammo // Draw ammo
if ( gArmsData[i].max_num ) if (gArmsData[i].max_num)
{ {
PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 144) / 2, gArmsData[i].num, 0); PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 144) / 2, gArmsData[i].num, 0);
PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 128) / 2, gArmsData[i].max_num, 0); PutNumber4(40 * i + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT - 128) / 2, gArmsData[i].max_num, 0);

View file

@ -21,7 +21,7 @@ BOOL InitBack(const char *fName, int type)
// Unused, hilariously // Unused, hilariously
color_black = GetCortBoxColor(RGB(0, 0, 0x10)); color_black = GetCortBoxColor(RGB(0, 0, 0x10));
//Get width and height // Get width and height
char path[PATH_LENGTH]; char path[PATH_LENGTH];
sprintf(path, "%s/%s.pbm", gDataPath, fName); sprintf(path, "%s/%s.pbm", gDataPath, fName);
@ -38,8 +38,8 @@ BOOL InitBack(const char *fName, int type)
// This is ridiculously platform-dependant: // This is ridiculously platform-dependant:
// It should break on big-endian CPUs, and platforms // It should break on big-endian CPUs, and platforms
// where short isn't 16-bit and long isn't 32-bit. // where short isn't 16-bit and long isn't 32-bit.
short bmp_header_buffer[7]; unsigned short bmp_header_buffer[7]; // These names aren't the original. This ruins the stack frame layout.
long bmp_header_buffer2[10]; unsigned long bmp_header_buffer2[10];
fread(bmp_header_buffer, 14, 1, fp); fread(bmp_header_buffer, 14, 1, fp);
@ -72,7 +72,7 @@ BOOL InitBack(const char *fName, int type)
fclose(fp); fclose(fp);
#endif #endif
//Set background stuff and load texture // Set background stuff and load texture
gBack.flag = 1; gBack.flag = 1;
if (!ReloadBitmap_File(fName, SURFACE_ID_LEVEL_BACKGROUND)) if (!ReloadBitmap_File(fName, SURFACE_ID_LEVEL_BACKGROUND))
return FALSE; return FALSE;
@ -138,7 +138,7 @@ void PutBack(int fx, int fy)
case 6: case 6:
case 7: case 7:
//Sky // Sky
static unsigned int fillNext; static unsigned int fillNext;
fillNext = 0; fillNext = 0;
for (int y = 0; y < WINDOW_HEIGHT - 240 + 88; y += 88) for (int y = 0; y < WINDOW_HEIGHT - 240 + 88; y += 88)
@ -156,7 +156,7 @@ void PutBack(int fx, int fy)
rect.right = 320; rect.right = 320;
PutBitmap4(&grcGame, (WINDOW_WIDTH - 320) / 2, WINDOW_HEIGHT - 240, &rect, SURFACE_ID_LEVEL_BACKGROUND); PutBitmap4(&grcGame, (WINDOW_WIDTH - 320) / 2, WINDOW_HEIGHT - 240, &rect, SURFACE_ID_LEVEL_BACKGROUND);
//Cloud layer 1 // Cloud layer 1
rect.top = 88; rect.top = 88;
rect.bottom = 123; rect.bottom = 123;
rect.left = gBack.fx / 2; rect.left = gBack.fx / 2;
@ -167,7 +167,7 @@ void PutBack(int fx, int fy)
for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++) for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++)
PutBitmap4(&grcGame, (320 * (i + 1)) - gBack.fx / 2 % 320, 88 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND); PutBitmap4(&grcGame, (320 * (i + 1)) - gBack.fx / 2 % 320, 88 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND);
//Cloud layer 2 // Cloud layer 2
rect.top = 123; rect.top = 123;
rect.bottom = 146; rect.bottom = 146;
rect.left = gBack.fx % 320; rect.left = gBack.fx % 320;
@ -178,7 +178,7 @@ void PutBack(int fx, int fy)
for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++) for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++)
PutBitmap4(&grcGame, (320 * (i + 1)) - gBack.fx % 320, 123 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND); PutBitmap4(&grcGame, (320 * (i + 1)) - gBack.fx % 320, 123 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND);
//Cloud layer 3 // Cloud layer 3
rect.top = 146; rect.top = 146;
rect.bottom = 176; rect.bottom = 176;
rect.left = 2 * gBack.fx % 320; rect.left = 2 * gBack.fx % 320;
@ -189,7 +189,7 @@ void PutBack(int fx, int fy)
for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++) for (int i = 0; i < ((WINDOW_WIDTH - 1) / 320) + 1; i++)
PutBitmap4(&grcGame, (320 * (i + 1)) - 2 * gBack.fx % 320, 146 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND); PutBitmap4(&grcGame, (320 * (i + 1)) - 2 * gBack.fx % 320, 146 + (WINDOW_HEIGHT - 240), &rect, SURFACE_ID_LEVEL_BACKGROUND);
//Cloud layer 4 // Cloud layer 4
rect.top = 176; rect.top = 176;
rect.bottom = 240; rect.bottom = 240;
rect.left = 4 * gBack.fx % 320; rect.left = 4 * gBack.fx % 320;
@ -248,49 +248,49 @@ void PutFront(int fx, int fy)
} }
//Draw black bars // Draw black bars
if (!(g_GameFlags & 8)) //Detect if credits are running if (!(g_GameFlags & 8)) // Detect if credits are running
{ {
const bool fromFocus = (gStageNo == 31); //Get if we should only draw around a 320x240 area of the focus point const bool fromFocus = (gStageNo == 31); // Get if we should only draw around a 320x240 area of the focus point
//Get focus rect // Get focus rect
int focusX = gFrame.x + (WINDOW_WIDTH << 8) - (320 << 8); int focusX = gFrame.x + (WINDOW_WIDTH << 8) - (320 << 8);
int focusY = gFrame.y + (WINDOW_HEIGHT << 8) - (240 << 8); int focusY = gFrame.y + (WINDOW_HEIGHT << 8) - (240 << 8);
int focusR = focusX + (320 << 9); int focusR = focusX + (320 << 9);
int focusB = focusY + (240 << 9); int focusB = focusY + (240 << 9);
//Get borders // Get borders
const int barLeft = fromFocus ? focusX : -0x1000; const int barLeft = fromFocus ? focusX : -0x1000;
const int barTop = fromFocus ? focusY : -0x1000; const int barTop = fromFocus ? focusY : -0x1000;
const int barRight = fromFocus ? focusR : (gMap.width << 13) - 0x1000; const int barRight = fromFocus ? focusR : (gMap.width << 13) - 0x1000;
const int barBottom = fromFocus ? focusB : (gMap.length << 13) - 0x1000; const int barBottom = fromFocus ? focusB : (gMap.length << 13) - 0x1000;
//Draw bars // Draw bars
RECT barRect; RECT barRect;
//Left // Left
barRect.left = 0; barRect.left = 0;
barRect.top = 0; barRect.top = 0;
barRect.right = (barLeft - gFrame.x) >> 9; barRect.right = (barLeft - gFrame.x) >> 9;
barRect.bottom = WINDOW_HEIGHT; barRect.bottom = WINDOW_HEIGHT;
CortBox(&barRect, 0x000000); CortBox(&barRect, 0x000000);
//Top // Top
barRect.left = 0; barRect.left = 0;
barRect.top = 0; barRect.top = 0;
barRect.right = WINDOW_WIDTH; barRect.right = WINDOW_WIDTH;
barRect.bottom = (barTop - gFrame.y) >> 9; barRect.bottom = (barTop - gFrame.y) >> 9;
CortBox(&barRect, 0x000000); CortBox(&barRect, 0x000000);
//Right // Right
barRect.left = (barRight - gFrame.x) >> 9; barRect.left = (barRight - gFrame.x) >> 9;
barRect.top = 0; barRect.top = 0;
barRect.right = WINDOW_WIDTH; barRect.right = WINDOW_WIDTH;
barRect.bottom = WINDOW_HEIGHT; barRect.bottom = WINDOW_HEIGHT;
CortBox(&barRect, 0x000000); CortBox(&barRect, 0x000000);
//Bottom // Bottom
barRect.left = 0; barRect.left = 0;
barRect.top = (barBottom - gFrame.y) >> 9; barRect.top = (barBottom - gFrame.y) >> 9;
barRect.right = WINDOW_WIDTH; barRect.right = WINDOW_WIDTH;

View file

@ -97,7 +97,7 @@ void HitBossBullet()
if (gBul[bul].damage == -1) if (gBul[bul].damage == -1)
continue; continue;
//Check if bullet touches boss // Check if bullet touches boss
bHit = FALSE; bHit = FALSE;
if (gBoss[bos].bits & npc_shootable if (gBoss[bos].bits & npc_shootable
&& gBoss[bos].x - gBoss[bos].hit.back < gBul[bul].x + gBul[bul].enemyXL && gBoss[bos].x - gBoss[bos].hit.back < gBul[bul].x + gBul[bul].enemyXL
@ -114,7 +114,7 @@ void HitBossBullet()
if (bHit) if (bHit)
{ {
//Damage boss // Damage boss
if (gBoss[bos].bits & npc_shootable) if (gBoss[bos].bits & npc_shootable)
{ {
if (gBoss[bos].cond & 0x10) if (gBoss[bos].cond & 0x10)

View file

@ -459,7 +459,7 @@ void ActBossChar_Core(void)
PlaySoundObject(101, 1); PlaySoundObject(101, 1);
} }
if ( npc->act_wait > 400 ) if (npc->act_wait > 400)
{ {
npc->act_no = 200; npc->act_no = 200;
gBoss[4].ani_no = 2; gBoss[4].ani_no = 2;

View file

@ -230,7 +230,7 @@ void ActBossChar_Ballos(void)
SetQuake2(30); SetQuake2(30);
PlaySoundObject(44, 1); PlaySoundObject(44, 1);
if ( gMC.y > npc->y + 0x6000 && gMC.x < npc->x + 0x3000 && gMC.x > npc->x - 0x3000 ) if (gMC.y > npc->y + 0x6000 && gMC.x < npc->x + 0x3000 && gMC.x > npc->x - 0x3000)
DamageMyChar(16); DamageMyChar(16);
for (i = 0; i < 0x10; ++i) for (i = 0; i < 0x10; ++i)

View file

@ -183,7 +183,7 @@ void ActBossChar_Omega()
gBoss[5].cond = 0x80; gBoss[5].cond = 0x80;
break; break;
case 20: //Rising out of the ground case 20: // Rising out of the ground
gBoss[0].act_no = 30; gBoss[0].act_no = 30;
gBoss[0].act_wait = 0; gBoss[0].act_wait = 0;
gBoss[0].ani_no = 0; gBoss[0].ani_no = 0;
@ -227,7 +227,7 @@ void ActBossChar_Omega()
} }
break; break;
case 50: //Open mouth case 50: // Open mouth
if (++gBoss[0].count1 > 2) if (++gBoss[0].count1 > 2)
{ {
gBoss[0].count1 = 0; gBoss[0].count1 = 0;
@ -244,7 +244,7 @@ void ActBossChar_Omega()
} }
break; break;
case 60: //Shoot out of mouth case 60: // Shoot out of mouth
if (++gBoss[0].act_wait > 20 && gBoss[0].act_wait < 80 && !(gBoss[0].act_wait % 3)) if (++gBoss[0].act_wait > 20 && gBoss[0].act_wait < 80 && !(gBoss[0].act_wait % 3))
{ {
if (Random(0, 9) < 8) if (Random(0, 9) < 8)
@ -263,7 +263,7 @@ void ActBossChar_Omega()
} }
break; break;
case 70: //Close mouth case 70: // Close mouth
if (++gBoss[0].count1 > 2) if (++gBoss[0].count1 > 2)
{ {
gBoss[0].count1 = 0; gBoss[0].count1 = 0;
@ -299,7 +299,7 @@ void ActBossChar_Omega()
} }
break; break;
case 90: //Go back into the ground case 90: // Go back into the ground
SetQuake(2); SetQuake(2);
gBoss[0].y += 0x200; gBoss[0].y += 0x200;
@ -313,7 +313,7 @@ void ActBossChar_Omega()
} }
break; break;
case 100: //Move to proper position for coming out of the ground case 100: // Move to proper position for coming out of the ground
if (++gBoss[0].act_wait == 120) if (++gBoss[0].act_wait == 120)
{ {
gBoss[0].act_wait = 0; gBoss[0].act_wait = 0;

View file

@ -490,7 +490,7 @@ void ActBossChar_Twin(void)
} }
} }
if ( npc->count1 > 0x3FF ) if (npc->count1 > 0x3FF)
npc->count1 -= 0x400; npc->count1 -= 0x400;
break; break;

View file

@ -55,7 +55,7 @@ static void ActBossChar03_01(NPCHAR *npc)
++npc->ani_no; ++npc->ani_no;
} }
if ( npc->ani_no > 3 ) if (npc->ani_no > 3)
npc->ani_no = 2; npc->ani_no = 2;
npc->xm -= 0x20; npc->xm -= 0x20;
@ -100,7 +100,7 @@ static void ActBossChar03_01(NPCHAR *npc)
++npc->ani_no; ++npc->ani_no;
} }
if ( npc->ani_no > 5 ) if (npc->ani_no > 5)
npc->ani_no = 4; npc->ani_no = 4;
npc->xm += 0x20; npc->xm += 0x20;

View file

@ -186,7 +186,7 @@ void ActCaret05(CARET *crt)
++crt->ani_no; ++crt->ani_no;
} }
if ( crt->ani_no > 6 ) if (crt->ani_no > 6)
crt->cond = 0; crt->cond = 0;
crt->x += 0x80; crt->x += 0x80;
@ -468,9 +468,8 @@ void ActCaret17(CARET *crt)
crt->rect = rcLeft[1]; crt->rect = rcLeft[1];
} }
//Tables // Tables
CARET_TABLE gCaretTable[18] = CARET_TABLE gCaretTable[18] = {
{
{0, 0}, {0, 0},
{0x800, 0x800}, {0x800, 0x800},
{0x1000, 0x1000}, {0x1000, 0x1000},

View file

@ -1,6 +1,6 @@
#pragma once #pragma once
#define PATH_LENGTH 260 //Pixel had the path size locked to 260 (dangerously low), if you tried to open the executable in a path with more than around 220 characters, it'd crash. #define PATH_LENGTH 260 // Pixel had the path size locked to 260 (dangerously low), if you tried to open the executable in a path with more than around 220 characters, it'd crash.
#define WINDOW_WIDTH 320 #define WINDOW_WIDTH 320
#define WINDOW_HEIGHT 240 #define WINDOW_HEIGHT 240

View file

@ -11,21 +11,27 @@
#include "Tags.h" #include "Tags.h"
#include "Types.h" #include "Types.h"
bool LoadConfigData(CONFIG *conf) static const char* const config_filename = "Config.dat"; // Not the original name
static const char* const config_magic = "DOUKUTSU20041206"; // Not the original name
BOOL LoadConfigData(CONFIG *conf)
{ {
//Clear old config data //Clear old config data
memset(conf, 0, sizeof(CONFIG)); memset(conf, 0, sizeof(CONFIG));
//Get path //Get path
char path[PATH_LENGTH]; char path[PATH_LENGTH];
sprintf(path, "%s/%s", gModulePath, "Config.dat"); sprintf(path, "%s/%s", gModulePath, config_filename);
//Open file //Open file
FILE *fp = fopen(path, "rb"); FILE *fp = fopen(path, "rb");
if (fp == NULL) if (fp == NULL)
return false; return FALSE;
//Read data //Read data
#ifdef NONPORTABLE
size_t fread_result = fread(conf, sizeof(CONFIG), 1, fp); // Not the original name
#else
//Read the version id and font name //Read the version id and font name
fread(conf->proof, sizeof(conf->proof), 1, fp); fread(conf->proof, sizeof(conf->proof), 1, fp);
fread(conf->font_name, sizeof(conf->font_name), 1, fp); fread(conf->font_name, sizeof(conf->font_name), 1, fp);
@ -42,23 +48,33 @@ bool LoadConfigData(CONFIG *conf)
conf->bJoystick = File_ReadLE32(fp); conf->bJoystick = File_ReadLE32(fp);
for (int button = 0; button < 8; button++) for (int button = 0; button < 8; button++)
conf->joystick_button[button] = File_ReadLE32(fp); conf->joystick_button[button] = File_ReadLE32(fp);
#endif
//Close file //Close file
fclose(fp); fclose(fp);
//Check if version is correct, return that it succeeded //Check if version is not correct, and return if it failed
if (!strcmp(conf->proof, "DOUKUTSU20041206")) #ifdef NONPORTABLE
return true; if (fread_result != 1 || strcmp(conf->proof, config_magic))
#else
if (strcmp(conf->proof, config_magic))
#endif
{
memset(conf, 0, sizeof(CONFIG));
return FALSE;
}
//If not, return that it failed return TRUE;
return false;
} }
void DefaultConfigData(CONFIG *conf) void DefaultConfigData(CONFIG *conf)
{ {
//Claer old config data //Clear old config data
memset(conf, 0, sizeof(CONFIG)); memset(conf, 0, sizeof(CONFIG));
//Fun fact: The Linux port added this line:
//conf->display_mode = 1;
//Reset joystick settings (as these can't simply be set to 0) //Reset joystick settings (as these can't simply be set to 0)
conf->bJoystick = 1; conf->bJoystick = 1;
conf->joystick_button[0] = 2; conf->joystick_button[0] = 2;

View file

@ -2,6 +2,8 @@
#include <stdint.h> #include <stdint.h>
#include "WindowsWrapper.h"
struct CONFIG struct CONFIG
{ {
char proof[0x20]; char proof[0x20];
@ -14,5 +16,5 @@ struct CONFIG
int32_t joystick_button[8]; int32_t joystick_button[8];
}; };
bool LoadConfigData(CONFIG *conf); BOOL LoadConfigData(CONFIG *conf);
void DefaultConfigData(CONFIG *conf); void DefaultConfigData(CONFIG *conf);

View file

@ -56,7 +56,7 @@ BOOL Flip_SystemTask()
if (!SystemTask()) if (!SystemTask())
return FALSE; return FALSE;
//Framerate limiter // Framerate limiter
static uint32_t timePrev; static uint32_t timePrev;
const uint32_t timeNow = SDL_GetTicks(); const uint32_t timeNow = SDL_GetTicks();
@ -81,15 +81,15 @@ BOOL StartDirectDraw(int lMagnification, int lColourDepth)
{ {
(void)lColourDepth; (void)lColourDepth;
//Initialize rendering // Initialize rendering
SDL_InitSubSystem(SDL_INIT_VIDEO); SDL_InitSubSystem(SDL_INIT_VIDEO);
//Create renderer // Create renderer
gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED);
if (gRenderer != NULL) if (gRenderer != NULL)
{ {
//Print the name of the renderer SDL2 is using // Print the name of the renderer SDL2 is using
SDL_RendererInfo info; SDL_RendererInfo info;
SDL_GetRendererInfo(gRenderer, &info); SDL_GetRendererInfo(gRenderer, &info);
printf("Renderer: %s\n", info.name); printf("Renderer: %s\n", info.name);
@ -120,10 +120,10 @@ BOOL StartDirectDraw(int lMagnification, int lColourDepth)
void EndDirectDraw() void EndDirectDraw()
{ {
//Quit sub-system // Quit sub-system
SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_QuitSubSystem(SDL_INIT_VIDEO);
//Release all surfaces // Release all surfaces
for (int i = 0; i < SURFACE_ID_MAX; i++) for (int i = 0; i < SURFACE_ID_MAX; i++)
ReleaseSurface(i); ReleaseSurface(i);
} }
@ -143,7 +143,7 @@ static bool IsEnableBitmap(SDL_RWops *fp)
void ReleaseSurface(int s) void ReleaseSurface(int s)
{ {
//Release the surface we want to release // Release the surface we want to release
if (surf[s].in_use) if (surf[s].in_use)
{ {
SDL_DestroyTexture(surf[s].texture); SDL_DestroyTexture(surf[s].texture);
@ -172,7 +172,7 @@ BOOL MakeSurface_Generic(int bxsize, int bysize, Surface_Ids surf_no)
} }
else else
{ {
//Create surface // Create surface
surf[surf_no].surface = SDL_CreateRGBSurfaceWithFormat(0, bxsize * magnification, bysize * magnification, 0, SDL_PIXELFORMAT_RGB24); surf[surf_no].surface = SDL_CreateRGBSurfaceWithFormat(0, bxsize * magnification, bysize * magnification, 0, SDL_PIXELFORMAT_RGB24);
SDL_SetSurfaceBlendMode(surf[surf_no].surface, SDL_BLENDMODE_NONE); SDL_SetSurfaceBlendMode(surf[surf_no].surface, SDL_BLENDMODE_NONE);
@ -320,7 +320,7 @@ static BOOL LoadBitmap_File(const char *name, Surface_Ids surf_no, bool create_s
char path[PATH_LENGTH]; char path[PATH_LENGTH];
SDL_RWops *fp; SDL_RWops *fp;
//Attempt to load PBM // Attempt to load PBM
sprintf(path, "%s/%s.pbm", gDataPath, name); sprintf(path, "%s/%s.pbm", gDataPath, name);
fp = SDL_RWFromFile(path, "rb"); fp = SDL_RWFromFile(path, "rb");
if (fp) if (fp)
@ -338,7 +338,7 @@ static BOOL LoadBitmap_File(const char *name, Surface_Ids surf_no, bool create_s
} }
} }
//Attempt to load BMP // Attempt to load BMP
sprintf(path, "%s/%s.bmp", gDataPath, name); sprintf(path, "%s/%s.bmp", gDataPath, name);
fp = SDL_RWFromFile(path, "rb"); fp = SDL_RWFromFile(path, "rb");
if (fp) if (fp)
@ -412,22 +412,22 @@ static SDL_Rect RectToSDLRectScaled(RECT *rect)
void BackupSurface(Surface_Ids surf_no, RECT *rect) void BackupSurface(Surface_Ids surf_no, RECT *rect)
{ {
//Get renderer size // Get renderer size
int w, h; int w, h;
SDL_GetRendererOutputSize(gRenderer, &w, &h); SDL_GetRendererOutputSize(gRenderer, &w, &h);
//Get texture of what's currently rendered on screen // Get texture of what's currently rendered on screen
SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormat(0, w, h, 0, SDL_PIXELFORMAT_RGB24); SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormat(0, w, h, 0, SDL_PIXELFORMAT_RGB24);
SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);
SDL_RenderReadPixels(gRenderer, NULL, SDL_PIXELFORMAT_RGB24, surface->pixels, surface->pitch); SDL_RenderReadPixels(gRenderer, NULL, SDL_PIXELFORMAT_RGB24, surface->pixels, surface->pitch);
//Get rects // Get rects
SDL_Rect frameRect = RectToSDLRectScaled(rect); SDL_Rect frameRect = RectToSDLRectScaled(rect);
SDL_BlitSurface(surface, &frameRect, surf[surf_no].surface, &frameRect); SDL_BlitSurface(surface, &frameRect, surf[surf_no].surface, &frameRect);
surf[surf_no].needs_updating = true; surf[surf_no].needs_updating = true;
//Free surface // Free surface
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
} }
@ -439,40 +439,39 @@ static void DrawBitmap(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_
surf[surf_no].needs_updating = false; surf[surf_no].needs_updating = false;
} }
//Get SDL_Rects // Get SDL_Rects
SDL_Rect clipRect = RectToSDLRectScaled(rcView); SDL_Rect clipRect = RectToSDLRectScaled(rcView);
SDL_Rect frameRect = RectToSDLRectScaled(rect); SDL_Rect frameRect = RectToSDLRectScaled(rect);
//Get dest rect // Get dest rect
SDL_Rect destRect = {x * magnification, y * magnification, frameRect.w, frameRect.h}; SDL_Rect destRect = {x * magnification, y * magnification, frameRect.w, frameRect.h};
//Set cliprect // Set cliprect
SDL_RenderSetClipRect(gRenderer, &clipRect); SDL_RenderSetClipRect(gRenderer, &clipRect);
SDL_SetTextureBlendMode(surf[surf_no].texture, transparent ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE); SDL_SetTextureBlendMode(surf[surf_no].texture, transparent ? SDL_BLENDMODE_BLEND : SDL_BLENDMODE_NONE);
//Draw to screen // Draw to screen
if (SDL_RenderCopy(gRenderer, surf[surf_no].texture, &frameRect, &destRect) < 0) if (SDL_RenderCopy(gRenderer, surf[surf_no].texture, &frameRect, &destRect) < 0)
printf("Failed to draw texture %d\nSDL Error: %s\n", surf_no, SDL_GetError()); printf("Failed to draw texture %d\nSDL Error: %s\n", surf_no, SDL_GetError());
//Undo cliprect // Undo cliprect
SDL_RenderSetClipRect(gRenderer, NULL); SDL_RenderSetClipRect(gRenderer, NULL);
} }
void PutBitmap3(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no) //Transparency void PutBitmap3(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no) // Transparency
{ {
DrawBitmap(rcView, x, y, rect, surf_no, true); DrawBitmap(rcView, x, y, rect, surf_no, true);
} }
void PutBitmap4(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no) //No Transparency void PutBitmap4(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no) // No Transparency
{ {
DrawBitmap(rcView, x, y, rect, surf_no, false); DrawBitmap(rcView, x, y, rect, surf_no, false);
} }
void Surface2Surface(int x, int y, RECT *rect, int to, int from) void Surface2Surface(int x, int y, RECT *rect, int to, int from)
{ {
//Get rects // Get rects
SDL_Rect rcSet = {x * magnification, y * magnification, (rect->right - rect->left) * magnification, (rect->bottom - rect->top) * magnification}; SDL_Rect rcSet = {x * magnification, y * magnification, (rect->right - rect->left) * magnification, (rect->bottom - rect->top) * magnification};
SDL_Rect frameRect = RectToSDLRectScaled(rect); SDL_Rect frameRect = RectToSDLRectScaled(rect);
@ -488,10 +487,10 @@ unsigned long GetCortBoxColor(unsigned long col)
void CortBox(RECT *rect, uint32_t col) void CortBox(RECT *rect, uint32_t col)
{ {
//Get rect // Get rect
SDL_Rect destRect = RectToSDLRectScaled(rect); SDL_Rect destRect = RectToSDLRectScaled(rect);
//Set colour and draw // Set colour and draw
const unsigned char col_red = col & 0x0000FF; const unsigned char col_red = col & 0x0000FF;
const unsigned char col_green = (col & 0x00FF00) >> 8; const unsigned char col_green = (col & 0x00FF00) >> 8;
const unsigned char col_blue = (col & 0xFF0000) >> 16; const unsigned char col_blue = (col & 0xFF0000) >> 16;
@ -501,10 +500,10 @@ void CortBox(RECT *rect, uint32_t col)
void CortBox2(RECT *rect, uint32_t col, Surface_Ids surf_no) void CortBox2(RECT *rect, uint32_t col, Surface_Ids surf_no)
{ {
//Get rect // Get rect
SDL_Rect destRect = RectToSDLRectScaled(rect); SDL_Rect destRect = RectToSDLRectScaled(rect);
//Set colour and draw // Set colour and draw
const unsigned char col_red = col & 0x0000FF; const unsigned char col_red = col & 0x0000FF;
const unsigned char col_green = (col & 0x00FF00) >> 8; const unsigned char col_green = (col & 0x00FF00) >> 8;
const unsigned char col_blue = (col & 0xFF0000) >> 16; const unsigned char col_blue = (col & 0xFF0000) >> 16;
@ -558,7 +557,7 @@ static unsigned char* GetFontFromWindows(size_t *data_size, const char *font_nam
void InitTextObject(const char *font_name) void InitTextObject(const char *font_name)
{ {
//Get font size // Get font size
unsigned int fontWidth, fontHeight; unsigned int fontWidth, fontHeight;
// The original did this, but Windows would downscale it to 5/10 anyway. // The original did this, but Windows would downscale it to 5/10 anyway.
@ -568,10 +567,13 @@ void InitTextObject(const char *font_name)
fontHeight = 12; fontHeight = 12;
} }
else else
{*/ {
fontWidth = 5 * magnification;
fontHeight = 10 * magnification;
}*/
fontWidth = 5 * magnification; fontWidth = 5 * magnification;
fontHeight = 10 * magnification; fontHeight = 10 * magnification;
// }
size_t data_size; size_t data_size;
#ifdef WINDOWS #ifdef WINDOWS
@ -632,7 +634,7 @@ void PutText2(int x, int y, const char *text, uint32_t color, Surface_Ids surf_n
void EndTextObject() void EndTextObject()
{ {
//Destroy font // Destroy font
UnloadFont(gFont); UnloadFont(gFont);
gFont = NULL; gFont = NULL;
} }

View file

@ -23,32 +23,32 @@ CREDIT Credit;
STRIP Strip[MAX_STRIP]; STRIP Strip[MAX_STRIP];
ILLUSTRATION Illust; ILLUSTRATION Illust;
//Update casts // Update casts
void ActionStripper() void ActionStripper()
{ {
for (int s = 0; s < MAX_STRIP; s++) for (int s = 0; s < MAX_STRIP; s++)
{ {
//Move up // Move up
if (Strip[s].flag & 0x80 && Credit.mode) if (Strip[s].flag & 0x80 && Credit.mode)
Strip[s].y -= 0x100; Strip[s].y -= 0x100;
//Get removed when off-screen // Get removed when off-screen
if (Strip[s].y <= -0x2000) if (Strip[s].y <= -0x2000)
Strip[s].flag = 0; Strip[s].flag = 0;
} }
} }
//Draw casts // Draw casts
void PutStripper() void PutStripper()
{ {
for (int s = 0; s < MAX_STRIP; s++) for (int s = 0; s < MAX_STRIP; s++)
{ {
if (Strip[s].flag & 0x80) if (Strip[s].flag & 0x80)
{ {
//Draw text // Draw text
RECT rc = {0, 16 * s, 320, 16 * s + 16}; RECT rc = {0, 16 * s, 320, 16 * s + 16};
PutBitmap3(&grcFull, (Strip[s].x + ((WINDOW_WIDTH - 320) << 8)) / 0x200, Strip[s].y / 0x200, &rc, SURFACE_ID_CREDIT_CAST); PutBitmap3(&grcFull, (Strip[s].x + ((WINDOW_WIDTH - 320) << 8)) / 0x200, Strip[s].y / 0x200, &rc, SURFACE_ID_CREDIT_CAST);
//Draw character // Draw character
rc.left = 24 * (Strip[s].cast % 13); rc.left = 24 * (Strip[s].cast % 13);
rc.right = rc.left + 24; rc.right = rc.left + 24;
rc.top = 24 * (Strip[s].cast / 13); rc.top = 24 * (Strip[s].cast / 13);
@ -58,21 +58,21 @@ void PutStripper()
} }
} }
//Create a cast object // Create a cast object
void SetStripper(int x, int y, const char *text, int cast) void SetStripper(int x, int y, const char *text, int cast)
{ {
for (int s = 0; s < MAX_STRIP; s++) for (int s = 0; s < MAX_STRIP; s++)
{ {
if (!(Strip[s].flag & 0x80)) if (!(Strip[s].flag & 0x80))
{ {
//Initialize cast property // Initialize cast property
Strip[s].flag = 0x80; Strip[s].flag = 0x80;
Strip[s].x = x; Strip[s].x = x;
Strip[s].y = y; Strip[s].y = y;
Strip[s].cast = cast; Strip[s].cast = cast;
strcpy(Strip[s].str, text); strcpy(Strip[s].str, text);
//Draw text // Draw text
RECT rc = {0, 16 * s, 320, 16 * s + 16}; RECT rc = {0, 16 * s, 320, 16 * s + 16};
CortBox2(&rc, 0, SURFACE_ID_CREDIT_CAST); CortBox2(&rc, 0, SURFACE_ID_CREDIT_CAST);
PutText2(0, 16 * s, text, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_CREDIT_CAST); PutText2(0, 16 * s, text, RGB(0xFF, 0xFF, 0xFE), SURFACE_ID_CREDIT_CAST);
@ -81,7 +81,7 @@ void SetStripper(int x, int y, const char *text, int cast)
} }
} }
//Regenerate cast text // Regenerate cast text
void RestoreStripper() void RestoreStripper()
{ {
for (int s = 0; s < MAX_STRIP; s++) for (int s = 0; s < MAX_STRIP; s++)
@ -95,22 +95,22 @@ void RestoreStripper()
} }
} }
//Handle the illustration // Handle the illustration
void ActionIllust() void ActionIllust()
{ {
switch (Illust.act_no) switch (Illust.act_no)
{ {
case 0: //Off-screen to the left case 0: // Off-screen to the left
Illust.x = -0x14000; Illust.x = -0x14000;
break; break;
case 1: //Move in from the left case 1: // Move in from the left
Illust.x += 0x5000; Illust.x += 0x5000;
if (Illust.x > 0) if (Illust.x > 0)
Illust.x = 0; Illust.x = 0;
break; break;
case 2: //Move out from the right case 2: // Move out from the right
Illust.x -= 0x5000; Illust.x -= 0x5000;
if (Illust.x < -0x14000) if (Illust.x < -0x14000)
Illust.x = -0x14000; Illust.x = -0x14000;
@ -118,7 +118,7 @@ void ActionIllust()
} }
} }
//Draw illustration // Draw illustration
void PutIllust() void PutIllust()
{ {
RECT rcIllust = {0, 0, 160, 240}; RECT rcIllust = {0, 0, 160, 240};
@ -126,7 +126,7 @@ void PutIllust()
PutBitmap3(&rcClip, (Illust.x + ((WINDOW_WIDTH - 320) << 8)) / 0x200, (WINDOW_HEIGHT - 240) / 2, &rcIllust, SURFACE_ID_CREDITS_IMAGE); PutBitmap3(&rcClip, (Illust.x + ((WINDOW_WIDTH - 320) << 8)) / 0x200, (WINDOW_HEIGHT - 240) / 2, &rcIllust, SURFACE_ID_CREDITS_IMAGE);
} }
//Load illustration // Load illustration
void ReloadIllust(int a) void ReloadIllust(int a)
{ {
char name[16]; char name[16];
@ -134,10 +134,10 @@ void ReloadIllust(int a)
ReloadBitmap_Resource(name, SURFACE_ID_CREDITS_IMAGE); ReloadBitmap_Resource(name, SURFACE_ID_CREDITS_IMAGE);
} }
//Initialize and release credits // Initialize and release credits
void InitCreditScript() void InitCreditScript()
{ {
//Clear script state and casts // Clear script state and casts
memset(&Credit, 0, sizeof(CREDIT)); memset(&Credit, 0, sizeof(CREDIT));
memset(Strip, 0, sizeof(Strip)); memset(Strip, 0, sizeof(Strip));
} }
@ -146,23 +146,23 @@ void ReleaseCreditScript()
{ {
if (Credit.pData) if (Credit.pData)
{ {
//Free script data // Free script data
free(Credit.pData); free(Credit.pData);
Credit.pData = NULL; Credit.pData = NULL;
} }
} }
//Start playing credits // Start playing credits
bool StartCreditScript() bool StartCreditScript()
{ {
//Clear previously existing credits data // Clear previously existing credits data
if (Credit.pData) if (Credit.pData)
{ {
free(Credit.pData); free(Credit.pData);
Credit.pData = NULL; Credit.pData = NULL;
} }
//Open file // Open file
char path[PATH_LENGTH]; char path[PATH_LENGTH];
sprintf(path, "%s/%s", gDataPath, "Credit.tsc"); sprintf(path, "%s/%s", gDataPath, "Credit.tsc");
@ -170,7 +170,7 @@ bool StartCreditScript()
if (Credit.size == -1) if (Credit.size == -1)
return false; return false;
//Allcoate buffer data // Allocate buffer data
Credit.pData = (char*)malloc(Credit.size); Credit.pData = (char*)malloc(Credit.size);
if (Credit.pData == NULL) if (Credit.pData == NULL)
return false; return false;
@ -182,7 +182,7 @@ bool StartCreditScript()
return false; return false;
} }
//Read data // Read data
fread(Credit.pData, 1, Credit.size, fp); fread(Credit.pData, 1, Credit.size, fp);
EncryptionBinaryData2((uint8_t*)Credit.pData, Credit.size); EncryptionBinaryData2((uint8_t*)Credit.pData, Credit.size);
@ -191,30 +191,30 @@ bool StartCreditScript()
fclose(fp); fclose(fp);
#endif #endif
//Reset credits // Reset credits
Credit.offset = 0; Credit.offset = 0;
Credit.wait = 0; Credit.wait = 0;
Credit.mode = 1; Credit.mode = 1;
Illust.x = -0x14000; Illust.x = -0x14000;
Illust.act_no = 0; Illust.act_no = 0;
//Modify cliprect // Modify cliprect
grcGame.left = WINDOW_WIDTH / 2; grcGame.left = WINDOW_WIDTH / 2;
// These three are non-vanilla: for wide/tallscreen support // These three are non-vanilla: for wide/tallscreen support
grcGame.right = ((WINDOW_WIDTH - 320) / 2) + 320; grcGame.right = ((WINDOW_WIDTH - 320) / 2) + 320;
grcGame.top = (WINDOW_HEIGHT - 240) / 2; grcGame.top = (WINDOW_HEIGHT - 240) / 2;
grcGame.bottom = ((WINDOW_HEIGHT - 240) / 2) + 240; grcGame.bottom = ((WINDOW_HEIGHT - 240) / 2) + 240;
//Reload casts // Reload casts
if (!ReloadBitmap_File("casts", SURFACE_ID_CASTS)) if (!ReloadBitmap_File("casts", SURFACE_ID_CASTS))
return false; return false;
//Clear casts // Clear casts
memset(Strip, 0, sizeof(Strip)); memset(Strip, 0, sizeof(Strip));
return true; return true;
} }
//Get number from text (4 digit) // Get number from text (4 digit)
int GetScriptNumber(const char *text) int GetScriptNumber(const char *text)
{ {
return 1000 * text[0] - 48000 + return 1000 * text[0] - 48000 +
@ -223,19 +223,19 @@ int GetScriptNumber(const char *text)
text[3] - 48; text[3] - 48;
} }
//Parse credits // Parse credits
void ActionCredit_Read() void ActionCredit_Read()
{ {
while (Credit.offset < Credit.size) while (Credit.offset < Credit.size)
{ {
//Get character // Get character
uint8_t character = Credit.pData[Credit.offset]; uint8_t character = Credit.pData[Credit.offset];
int a, b, len; int a, b, len;
switch (character) switch (character)
{ {
case '[': //Create cast case '[': // Create cast
//Get the range for the cast text // Get the range for the cast text
a = ++Credit.offset; a = ++Credit.offset;
while (Credit.pData[a] != ']') while (Credit.pData[a] != ']')
@ -248,35 +248,35 @@ void ActionCredit_Read()
len = a - Credit.offset; len = a - Credit.offset;
//Copy the text to the cast text // Copy the text to the cast text
char text[40]; char text[40];
memcpy(text, &Credit.pData[Credit.offset], a - Credit.offset); memcpy(text, &Credit.pData[Credit.offset], a - Credit.offset);
text[len] = 0; text[len] = 0;
//Get cast id // Get cast id
Credit.offset = a + 1; Credit.offset = a + 1;
len = GetScriptNumber(&Credit.pData[a + 1]); len = GetScriptNumber(&Credit.pData[a + 1]);
//Create cast object // Create cast object
SetStripper(Credit.start_x, (WINDOW_HEIGHT << 9) + 0x1000, text, len); SetStripper(Credit.start_x, (WINDOW_HEIGHT << 9) + 0x1000, text, len);
//Change offset // Change offset
Credit.offset += 4; Credit.offset += 4;
return; return;
case 'j': //Jump to label case 'j': // Jump to label
//Get number // Get number
b = GetScriptNumber(&Credit.pData[++Credit.offset]); b = GetScriptNumber(&Credit.pData[++Credit.offset]);
//Change offset // Change offset
Credit.offset += 4; Credit.offset += 4;
//Jump to specific label // Jump to specific label
while (Credit.offset < Credit.size) while (Credit.offset < Credit.size)
{ {
if (Credit.pData[Credit.offset] == 'l') if (Credit.pData[Credit.offset] == 'l')
{ {
//what is this // What is this
a = GetScriptNumber(&Credit.pData[++Credit.offset]); a = GetScriptNumber(&Credit.pData[++Credit.offset]);
Credit.offset += 4; Credit.offset += 4;
if (b == a) if (b == a)
@ -294,29 +294,29 @@ void ActionCredit_Read()
return; return;
case '~': //Start fading out music case '~': // Start fading out music
++Credit.offset; ++Credit.offset;
SetOrganyaFadeout(); SetOrganyaFadeout();
return; return;
case 'f': //Flag jump case 'f': // Flag jump
//Read numbers XXXX:YYYY // Read numbers XXXX:YYYY
a = GetScriptNumber(&Credit.pData[++Credit.offset]); a = GetScriptNumber(&Credit.pData[++Credit.offset]);
Credit.offset += 5; Credit.offset += 5;
b = GetScriptNumber(&Credit.pData[Credit.offset]); b = GetScriptNumber(&Credit.pData[Credit.offset]);
Credit.offset += 4; Credit.offset += 4;
//If flag is set // If flag is set
if (GetNPCFlag(a)) if (GetNPCFlag(a))
{ {
//Jump to label // Jump to label
while ( Credit.offset < Credit.size ) while (Credit.offset < Credit.size)
{ {
if (Credit.pData[Credit.offset] == 'l') if (Credit.pData[Credit.offset] == 'l')
{ {
a = GetScriptNumber(&Credit.pData[++Credit.offset]); a = GetScriptNumber(&Credit.pData[++Credit.offset]);
Credit.offset += 4; Credit.offset += 4;
if ( b == a ) if (b == a)
return; return;
} }
else if (IsShiftJIS(Credit.pData[Credit.offset])) else if (IsShiftJIS(Credit.pData[Credit.offset]))
@ -331,39 +331,39 @@ void ActionCredit_Read()
} }
return; return;
case '+': //Change casts x-position case '+': // Change casts x-position
Credit.start_x = GetScriptNumber(&Credit.pData[++Credit.offset]) << 9; Credit.start_x = GetScriptNumber(&Credit.pData[++Credit.offset]) << 9;
Credit.offset += 4; Credit.offset += 4;
return; return;
case '-': //Wait for X amount of frames case '-': // Wait for X amount of frames
Credit.wait = GetScriptNumber(&Credit.pData[++Credit.offset]); Credit.wait = GetScriptNumber(&Credit.pData[++Credit.offset]);
Credit.offset += 4; Credit.offset += 4;
Credit.mode = 2; Credit.mode = 2;
return; return;
case '/': //Stop credits case '/': // Stop credits
Credit.mode = 0; Credit.mode = 0;
return; return;
case '!': //Change music case '!': // Change music
a = GetScriptNumber(&Credit.pData[++Credit.offset]); a = GetScriptNumber(&Credit.pData[++Credit.offset]);
Credit.offset += 4; Credit.offset += 4;
ChangeMusic(a); ChangeMusic(a);
return; return;
} }
//Progress through file // Progress through file
++Credit.offset; ++Credit.offset;
} }
} }
//Update credits // Update credits
void ActionCredit() void ActionCredit()
{ {
if (Credit.offset < Credit.size) if (Credit.offset < Credit.size)
{ {
//Update script, or if waiting, decrement the wait value // Update script, or if waiting, decrement the wait value
if (Credit.mode == 1) if (Credit.mode == 1)
{ {
ActionCredit_Read(); ActionCredit_Read();
@ -375,28 +375,28 @@ void ActionCredit()
} }
} }
//Change illustration // Change illustration
void SetCreditIllust(int a) void SetCreditIllust(int a)
{ {
ReloadIllust(a); ReloadIllust(a);
Illust.act_no = 1; Illust.act_no = 1;
} }
//Slide illustration off-screen // Slide illustration off-screen
void CutCreditIllust() void CutCreditIllust()
{ {
Illust.act_no = 2; Illust.act_no = 2;
} }
//Scene of the island falling // Scene of the island falling
int Scene_DownIsland(int mode) int Scene_DownIsland(int mode)
{ {
//Setup background // Setup background
RECT rc_frame = {(WINDOW_WIDTH - 160) / 2, (WINDOW_HEIGHT - 80) / 2, (WINDOW_WIDTH + 160) / 2, (WINDOW_HEIGHT + 80) / 2}; RECT rc_frame = {(WINDOW_WIDTH - 160) / 2, (WINDOW_HEIGHT - 80) / 2, (WINDOW_WIDTH + 160) / 2, (WINDOW_HEIGHT + 80) / 2};
RECT rc_sky = {0, 0, 160, 80}; RECT rc_sky = {0, 0, 160, 80};
RECT rc_ground = {160, 48, 320, 80}; RECT rc_ground = {160, 48, 320, 80};
//Setup island // Setup island
RECT rc_sprite = {160, 0, 200, 24}; RECT rc_sprite = {160, 0, 200, 24};
ISLAND_SPRITE sprite; ISLAND_SPRITE sprite;
@ -405,10 +405,10 @@ int Scene_DownIsland(int mode)
for (int wait = 0; wait < 900; wait++) for (int wait = 0; wait < 900; wait++)
{ {
//Get pressed keys // Get pressed keys
GetTrg(); GetTrg();
//Escape menu // Escape menu
if (gKey & 0x8000) if (gKey & 0x8000)
{ {
int escRet = Call_Escape(); int escRet = Call_Escape();
@ -421,7 +421,7 @@ int Scene_DownIsland(int mode)
switch (mode) switch (mode)
{ {
case 0: case 0:
//Move down // Move down
sprite.y += 0x33; sprite.y += 0x33;
break; break;
@ -432,38 +432,38 @@ int Scene_DownIsland(int mode)
{ {
if (wait >= 600) if (wait >= 600)
{ {
//End scene // End scene
if (wait == 750) if (wait == 750)
wait = 900; wait = 900;
} }
else else
{ {
//Move down slow // Move down slow
sprite.y += 0xC; sprite.y += 0xC;
} }
} }
else else
{ {
//Move down slower // Move down slower
sprite.y += 0x19; sprite.y += 0x19;
} }
} }
else else
{ {
//Move down at normal speed // Move down at normal speed
sprite.y += 0x33; sprite.y += 0x33;
} }
break; break;
} }
//Draw scene // Draw scene
CortBox(&grcFull, 0); CortBox(&grcFull, 0);
PutBitmap3(&rc_frame, 80 + (WINDOW_WIDTH - 320) / 2, 80 + (WINDOW_HEIGHT - 240) / 2, &rc_sky, SURFACE_ID_LEVEL_SPRITESET_1); PutBitmap3(&rc_frame, 80 + (WINDOW_WIDTH - 320) / 2, 80 + (WINDOW_HEIGHT - 240) / 2, &rc_sky, SURFACE_ID_LEVEL_SPRITESET_1);
PutBitmap3(&rc_frame, sprite.x / 0x200 - 20 + (WINDOW_WIDTH - 320) / 2, sprite.y / 512 - 12 + (WINDOW_HEIGHT - 240) / 2, &rc_sprite, SURFACE_ID_LEVEL_SPRITESET_1); PutBitmap3(&rc_frame, sprite.x / 0x200 - 20 + (WINDOW_WIDTH - 320) / 2, sprite.y / 512 - 12 + (WINDOW_HEIGHT - 240) / 2, &rc_sprite, SURFACE_ID_LEVEL_SPRITESET_1);
PutBitmap3(&rc_frame, 80 + (WINDOW_WIDTH - 320) / 2, 128 + (WINDOW_HEIGHT - 240) / 2, &rc_ground, SURFACE_ID_LEVEL_SPRITESET_1); PutBitmap3(&rc_frame, 80 + (WINDOW_WIDTH - 320) / 2, 128 + (WINDOW_HEIGHT - 240) / 2, &rc_ground, SURFACE_ID_LEVEL_SPRITESET_1);
PutTimeCounter(16, 8); PutTimeCounter(16, 8);
//Draw window // Draw window
PutFramePerSecound(); PutFramePerSecound();
if (!Flip_SystemTask()) if (!Flip_SystemTask())
return 0; return 0;

View file

@ -33,7 +33,7 @@ struct ISLAND_SPRITE
int y; int y;
}; };
#define MAX_STRIP (WINDOW_HEIGHT / 16) + 1 #define MAX_STRIP ((WINDOW_HEIGHT / 16) + 1)
void ActionStripper(); void ActionStripper();
void PutStripper(); void PutStripper();

View file

@ -13,33 +13,33 @@ int Call_Escape()
while (1) while (1)
{ {
//Get pressed keys // Get pressed keys
GetTrg(); GetTrg();
if (gKeyTrg & KEY_ESCAPE) //Escape is pressed, quit game if (gKeyTrg & KEY_ESCAPE) // Escape is pressed, quit game
{ {
gKeyTrg = 0; gKeyTrg = 0;
return 0; return 0;
} }
if (gKeyTrg & KEY_F1) //F1 is pressed, continue if (gKeyTrg & KEY_F1) // F1 is pressed, continue
{ {
gKeyTrg = 0; gKeyTrg = 0;
return 1; return 1;
} }
if (gKeyTrg & KEY_F2) //F2 is pressed, reset if (gKeyTrg & KEY_F2) // F2 is pressed, reset
{ {
gKeyTrg = 0; gKeyTrg = 0;
return 2; return 2;
} }
//Draw screen // Draw screen
CortBox(&grcFull, 0x000000); CortBox(&grcFull, 0x000000);
PutBitmap3(&grcFull, (WINDOW_WIDTH - 208) / 2, (WINDOW_HEIGHT - 16) / 2, &rc, SURFACE_ID_TEXT_BOX); PutBitmap3(&grcFull, (WINDOW_WIDTH - 208) / 2, (WINDOW_HEIGHT - 16) / 2, &rc, SURFACE_ID_TEXT_BOX);
PutFramePerSecound(); PutFramePerSecound();
if (!Flip_SystemTask()) if (!Flip_SystemTask())
{ {
//Quit if window is closed // Quit if window is closed
gKeyTrg = 0; gKeyTrg = 0;
return 0; return 0;
} }

View file

@ -81,7 +81,7 @@ BOOL LoadMapData2(const char *path_map)
BOOL LoadAttributeData(const char *path_atrb) BOOL LoadAttributeData(const char *path_atrb)
{ {
//Open file //Open file
char path[260]; char path[PATH_LENGTH];
sprintf(path, "%s/%s", gDataPath, path_atrb); sprintf(path, "%s/%s", gDataPath, path_atrb);
FILE *fp = fopen(path, "rb"); FILE *fp = fopen(path, "rb");

View file

@ -53,14 +53,14 @@ void SetUniqueParameter(NPCHAR *npc)
npc->view.bottom = gNpcTable[code].view.bottom << 9; npc->view.bottom = gNpcTable[code].view.bottom << 9;
} }
bool LoadEvent(const char *path_event) BOOL LoadEvent(const char *path_event)
{ {
char path[PATH_LENGTH]; char path[PATH_LENGTH];
sprintf(path, "%s/%s", gDataPath, path_event); sprintf(path, "%s/%s", gDataPath, path_event);
FILE *fp = fopen(path, "rb"); FILE *fp = fopen(path, "rb");
if (fp == NULL) if (fp == NULL)
return false; return FALSE;
//Read "PXE" check //Read "PXE" check
char code[4]; char code[4];
@ -71,7 +71,7 @@ bool LoadEvent(const char *path_event)
// The original game forgot to close the file here // The original game forgot to close the file here
fclose(fp); fclose(fp);
#endif #endif
return false; return FALSE;
} }
//Get amount of NPCs //Get amount of NPCs
@ -128,7 +128,7 @@ bool LoadEvent(const char *path_event)
} }
fclose(fp); fclose(fp);
return true; return TRUE;
} }
void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index) void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index)
@ -235,7 +235,7 @@ void SetExpObjects(int x, int y, int exp)
} }
} }
bool SetBulletObject(int x, int y, int val) BOOL SetBulletObject(int x, int y, int val)
{ {
int tamakazu_ari[10]; int tamakazu_ari[10];
@ -254,7 +254,7 @@ bool SetBulletObject(int x, int y, int val)
} }
if (!t) if (!t)
return false; return FALSE;
n = Random(1, 10 * t); n = Random(1, 10 * t);
int bullet_no = tamakazu_ari[n % t]; int bullet_no = tamakazu_ari[n % t];
@ -272,14 +272,14 @@ bool SetBulletObject(int x, int y, int val)
gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits;
gNPC[n].exp = val; gNPC[n].exp = val;
SetUniqueParameter(&gNPC[n]); SetUniqueParameter(&gNPC[n]);
return true; return TRUE;
} }
} }
return false; return FALSE;
} }
bool SetLifeObject(int x, int y, int val) BOOL SetLifeObject(int x, int y, int val)
{ {
for (int n = 0x100; n < NPC_MAX; n++) for (int n = 0x100; n < NPC_MAX; n++)
{ {
@ -294,11 +294,11 @@ bool SetLifeObject(int x, int y, int val)
gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits; gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits;
gNPC[n].exp = val; gNPC[n].exp = val;
SetUniqueParameter(&gNPC[n]); SetUniqueParameter(&gNPC[n]);
return true; return TRUE;
} }
} }
return false; return FALSE;
} }
void VanishNpChar(NPCHAR *npc) void VanishNpChar(NPCHAR *npc)

View file

@ -83,13 +83,13 @@ extern int gSuperXpos;
extern int gSuperYpos; extern int gSuperYpos;
void InitNpChar(); void InitNpChar();
bool LoadEvent(const char *path_event); BOOL LoadEvent(const char *path_event);
void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index); void SetNpChar(int code_char, int x, int y, int xm, int ym, int dir, NPCHAR *npc, int start_index);
void SetDestroyNpChar(int x, int y, int w, int num); void SetDestroyNpChar(int x, int y, int w, int num);
void SetDestroyNpCharUp(int x, int y, int w, int num); void SetDestroyNpCharUp(int x, int y, int w, int num);
void SetExpObjects(int x, int y, int exp); void SetExpObjects(int x, int y, int exp);
bool SetBulletObject(int x, int y, int val); BOOL SetBulletObject(int x, int y, int val);
bool SetLifeObject(int x, int y, int val); BOOL SetLifeObject(int x, int y, int val);
void VanishNpChar(NPCHAR *npc); void VanishNpChar(NPCHAR *npc);
void PutNpChar(int fx, int fy); void PutNpChar(int fx, int fy);
void ActNpChar(); void ActNpChar();

View file

@ -132,7 +132,7 @@ const STAGE_TABLE gTMT[95] = {
BOOL TransferStage(int no, int w, int x, int y) BOOL TransferStage(int no, int w, int x, int y)
{ {
//Move character //Move character
SetMyCharPosition(x << 13, y << 13); SetMyCharPosition(x * 0x10 * 0x200, y * 0x10 * 0x200);
BOOL bError = FALSE; BOOL bError = FALSE;
@ -166,7 +166,7 @@ BOOL TransferStage(int no, int w, int x, int y)
bError = TRUE; bError = TRUE;
//Load background //Load background
strcpy(path, gTMT[no].back); sprintf(path, "%s", gTMT[no].back);
if (!InitBack(path, gTMT[no].bkType)) if (!InitBack(path, gTMT[no].bkType))
bError = TRUE; bError = TRUE;
@ -183,12 +183,8 @@ BOOL TransferStage(int no, int w, int x, int y)
bError = TRUE; bError = TRUE;
if (bError) if (bError)
{
printf("Failed to load stage %d\n", no);
return FALSE; return FALSE;
}
else
{
//Load map name //Load map name
ReadyMapName(gTMT[no].name); ReadyMapName(gTMT[no].name);
@ -202,9 +198,6 @@ BOOL TransferStage(int no, int w, int x, int y)
ResetFlash(); ResetFlash();
gStageNo = no; gStageNo = no;
return TRUE; return TRUE;
}
return FALSE;
} }
//Music //Music
@ -264,8 +257,9 @@ int gMusicNo;
void ChangeMusic(int no) void ChangeMusic(int no)
{ {
if (!no || no != gMusicNo) if (no && no == gMusicNo)
{ return;
//Stop and keep track of old song //Stop and keep track of old song
gOldPos = GetOrganyaPosition(); gOldPos = GetOrganyaPosition();
gOldNo = gMusicNo; gOldNo = gMusicNo;
@ -279,7 +273,6 @@ void ChangeMusic(int no)
SetOrganyaPosition(0); SetOrganyaPosition(0);
PlayOrganyaMusic(); PlayOrganyaMusic();
gMusicNo = no; gMusicNo = no;
}
} }
void ReCallMusic() void ReCallMusic()

View file

@ -112,7 +112,7 @@ void EncryptionBinaryData2(uint8_t *pData, int size)
} }
//Load generic .tsc //Load generic .tsc
bool LoadTextScript2(const char *name) BOOL LoadTextScript2(const char *name)
{ {
//Get path //Get path
char path[260]; char path[260];
@ -120,12 +120,12 @@ bool LoadTextScript2(const char *name)
gTS.size = GetFileSizeLong(path); gTS.size = GetFileSizeLong(path);
if (gTS.size == -1) if (gTS.size == -1)
return false; return FALSE;
//Open file //Open file
FILE *fp = fopen(path, "rb"); FILE *fp = fopen(path, "rb");
if (fp == NULL) if (fp == NULL)
return false; return FALSE;
//Read data //Read data
fread(gTS.data, 1, gTS.size, fp); fread(gTS.data, 1, gTS.size, fp);
@ -137,11 +137,11 @@ bool LoadTextScript2(const char *name)
//Decrypt data //Decrypt data
EncryptionBinaryData2((uint8_t*)gTS.data, gTS.size); EncryptionBinaryData2((uint8_t*)gTS.data, gTS.size);
return true; return TRUE;
} }
//Load stage .tsc //Load stage .tsc
bool LoadTextScript_Stage(const char *name) BOOL LoadTextScript_Stage(const char *name)
{ {
//Open Head.tsc //Open Head.tsc
char path[PATH_LENGTH]; char path[PATH_LENGTH];
@ -149,11 +149,11 @@ bool LoadTextScript_Stage(const char *name)
long head_size = GetFileSizeLong(path); long head_size = GetFileSizeLong(path);
if (head_size == -1) if (head_size == -1)
return false; return FALSE;
FILE *fp = fopen(path, "rb"); FILE *fp = fopen(path, "rb");
if (fp == NULL) if (fp == NULL)
return false; return FALSE;
//Read Head.tsc //Read Head.tsc
fread(gTS.data, 1, head_size, fp); fread(gTS.data, 1, head_size, fp);
@ -166,11 +166,11 @@ bool LoadTextScript_Stage(const char *name)
long body_size = GetFileSizeLong(path); long body_size = GetFileSizeLong(path);
if (body_size == -1) if (body_size == -1)
return false; return FALSE;
fp = fopen(path, "rb"); fp = fopen(path, "rb");
if (fp == NULL) if (fp == NULL)
return false; return FALSE;
//Read stage's tsc //Read stage's tsc
fread(&gTS.data[head_size], 1, body_size, fp); fread(&gTS.data[head_size], 1, body_size, fp);
@ -181,7 +181,7 @@ bool LoadTextScript_Stage(const char *name)
//Set parameters //Set parameters
gTS.size = head_size + body_size; gTS.size = head_size + body_size;
strcpy(gTS.path, name); strcpy(gTS.path, name);
return true; return TRUE;
} }
//Get current path //Get current path

View file

@ -60,8 +60,8 @@ struct TEXT_SCRIPT
BOOL InitTextScript2(); BOOL InitTextScript2();
void EndTextScript(); void EndTextScript();
void EncryptionBinaryData2(uint8_t *pData, int size); void EncryptionBinaryData2(uint8_t *pData, int size);
bool LoadTextScript2(const char *name); BOOL LoadTextScript2(const char *name);
bool LoadTextScript_Stage(const char *name); BOOL LoadTextScript_Stage(const char *name);
void GetTextScriptPath(char *path); void GetTextScriptPath(char *path);
BOOL StartTextScript(int no); BOOL StartTextScript(int no);
void StopTextScript(); void StopTextScript();