ref: e1e49a4dcc80a165cc9ed6fa0a787aa5121b70b1
parent: 0bb9760d875deab7f1ffcfe1326737206efd8d0c
author: Clownacy <Clownacy@users.noreply.github.com>
date: Mon Feb 18 19:18:32 EST 2019
Made ArmsItem.cpp ASM-accurate
--- a/src/ArmsItem.cpp
+++ b/src/ArmsItem.cpp
@@ -2,6 +2,8 @@
#include <string.h>
+#include "WindowsWrapper.h"
+
#include "CommonDefines.h"
#include "Draw.h"
#include "Escape.h"
@@ -19,7 +21,7 @@
int gSelectedArms;
int gSelectedItem;
int gCampTitleY;
-bool gCampActive;
+BOOL gCampActive;
void ClearArmsData()
{
@@ -32,106 +34,122 @@
memset(gItemData, 0, sizeof(gItemData));
}
-bool AddArmsData(int code, int max_num)
+BOOL AddArmsData(long code, long max_num)
{
- for (int i = 0; i < ARMS_MAX; i++)
+ int i = 0;
+ for (;i < ARMS_MAX;)
{
- if (gArmsData[i].code == code || !gArmsData[i].code)
- {
- if (!gArmsData[i].code)
- {
- memset(&gArmsData[i], 0, sizeof(ARMS));
- gArmsData[i].level = 1;
- }
-
- gArmsData[i].code = code;
- gArmsData[i].max_num += max_num;
- gArmsData[i].num += max_num;
- if (gArmsData[i].num > gArmsData[i].max_num)
- gArmsData[i].num = gArmsData[i].max_num;
- return true;
- }
+ if (gArmsData[i].code == code)
+ break;
+
+ if (gArmsData[i].code == 0)
+ break;
+
+ ++i;
}
+
+ if (i == ARMS_MAX)
+ return FALSE;
+
+ if (gArmsData[i].code == 0)
+ {
+ memset(&gArmsData[i], 0, sizeof(ARMS));
+ gArmsData[i].level = 1;
+ }
- return false;
+ gArmsData[i].code = code;
+ gArmsData[i].max_num += max_num;
+ gArmsData[i].num += max_num;
+
+ if (gArmsData[i].num > gArmsData[i].max_num)
+ gArmsData[i].num = gArmsData[i].max_num;
+
+ return TRUE;
}
-bool SubArmsData(int code)
+BOOL SubArmsData(long code)
{
- for (int i = 0; i < ARMS_MAX; i++)
- {
+ int i = 0;
+ for (;i < ARMS_MAX; ++i)
if (gArmsData[i].code == code)
- {
- //Shift all arms from the right to the left
- int ia;
- for (ia = i + 1; ia < ARMS_MAX; ++ia)
- {
- gArmsData[ia - 1].code = gArmsData[ia].code;
- gArmsData[ia - 1].level = gArmsData[ia].level;
- gArmsData[ia - 1].exp = gArmsData[ia].exp;
- gArmsData[ia - 1].max_num = gArmsData[ia].max_num;
- gArmsData[ia - 1].num = gArmsData[ia].num;
- }
-
- gArmsData[ia - 1].code = 0;
- gSelectedArms = 0;
- return true;
- }
- }
+ break;
+
+#ifdef FIX_BUGS
+ if (i == ARMS_MAX)
+#else
+ if (i == ITEM_MAX) // Oops
+#endif
+ return FALSE;
+
+ //Shift all arms from the right to the left
+ for (i += 1; i < ARMS_MAX; ++i)
+ gArmsData[i - 1] = gArmsData[i];
- return false;
+ gArmsData[i - 1].code = 0;
+ gSelectedArms = 0;
+ return TRUE;
}
-bool TradeArms(int code1, int code2, int max_num)
+BOOL TradeArms(long code1, long code2, long max_num)
{
- for (int i = 0; i < ARMS_MAX; i++)
+ int i = 0;
+ for (;i < ARMS_MAX;)
{
if (gArmsData[i].code == code1)
- {
- gArmsData[i].level = 1;
- gArmsData[i].code = code2;
- gArmsData[i].max_num += max_num;
- gArmsData[i].num += max_num;
- gArmsData[i].exp = 0;
- return true;
- }
+ break;
+
+ ++i;
}
-
- return false;
+
+ if (i == ARMS_MAX)
+ return FALSE;
+
+ gArmsData[i].level = 1;
+ gArmsData[i].code = code2;
+ gArmsData[i].max_num += max_num;
+ gArmsData[i].num += max_num;
+ gArmsData[i].exp = 0;
+ return TRUE;
}
-bool AddItemData(int code)
+BOOL AddItemData(long code)
{
- for (int i = 0; i < ITEM_MAX; i++)
+ int i = 0;
+ for (;i < ITEM_MAX;)
{
- if (gItemData[i].code == code || !gItemData[i].code)
- {
- gItemData[i].code = code;
- return true;
- }
+ if (gItemData[i].code == code)
+ break;
+
+ if (gItemData[i].code == 0)
+ break;
+
+ ++i;
}
-
- return false;
+
+ if (i == ITEM_MAX)
+ return false;
+
+ gItemData[i].code = code;
+ return true;
}
-bool SubItemData(int code)
+BOOL SubItemData(long code)
{
- for (int i = 0; i < ITEM_MAX; i++)
- {
+ int i = 0;
+ for (;i < ITEM_MAX; ++i)
if (gItemData[i].code == code)
- {
- //Shift all items from the right to the left
- int ia;
- for (ia = i + 1; ia < ITEM_MAX; ++ia)
- gItemData[ia - 1].code = gItemData[ia].code;
-
- gItemData[ia - 1].code = 0;
- gSelectedItem = 0;
- return true;
- }
- }
-
- return false;
+ break;
+
+ if (i == ITEM_MAX)
+ return FALSE;
+
+ //Shift all items from the right to the left
+ for (i += 1; i < ITEM_MAX; ++i)
+ gItemData[i - 1] = gItemData[i];
+
+ gItemData[i - 1].code = 0;
+ gSelectedItem = 0;
+ return TRUE;
}
void MoveCampCursor()
@@ -143,105 +161,108 @@
while ( gItemData[item_num].code != 0 )
++item_num;
- if (arms_num || item_num)
+ if (arms_num == 0 && item_num == 0)
+ return;
+
+ BOOL bChange = FALSE;
+ if (gCampActive == FALSE)
{
- bool bChange = false;
- if (gCampActive)
+ if (gKeyTrg & gKeyLeft)
{
- if (gKeyTrg & gKeyLeft)
- {
- if (gSelectedItem % 6)
- --gSelectedItem;
- else
- gSelectedItem += 5;
-
- bChange = true;
- }
+ --gSelectedArms;
+ bChange = TRUE;
+ }
+ if (gKeyTrg & gKeyRight)
+ {
+ ++gSelectedArms;
+ bChange = TRUE;
+ }
+ if ((gKeyDown | gKeyUp) & gKeyTrg)
+ {
+ if (item_num)
+ gCampActive = TRUE;
+ bChange = TRUE;
+ }
+
+ if (gSelectedArms < 0)
+ gSelectedArms = arms_num - 1;
+ if (gSelectedArms > arms_num - 1)
+ gSelectedArms = 0;
+ }
+ else
+ {
+ if (gKeyTrg & gKeyLeft)
+ {
+ if (gSelectedItem % 6 == 0)
+ gSelectedItem += 5;
+ else
+ --gSelectedItem;
- if (gKeyTrg & gKeyRight)
+ bChange = TRUE;
+ }
+
+ if (gKeyTrg & gKeyRight)
+ {
+ if (gSelectedItem == item_num - 1)
+ gSelectedItem = 6 * (gSelectedItem / 6);
+ else
{
- if (item_num - 1 == gSelectedItem)
- gSelectedItem = 6 * (gSelectedItem / 6);
- else if (gSelectedItem % 6 == 5)
+ if (gSelectedItem % 6 == 5)
gSelectedItem -= 5;
else
++gSelectedItem;
-
- bChange = true;
}
+
+ bChange = TRUE;
+ }
+
+ if (gKeyTrg & gKeyUp)
+ {
+ if (gSelectedItem / 6 == 0)
+ gCampActive = FALSE;
+ else
+ gSelectedItem -= 6;
- if (gKeyTrg & gKeyUp)
- {
- if (gSelectedItem + 5 > 10)
- gSelectedItem -= 6;
- else
- gCampActive = false;
-
- bChange = true;
- }
-
- if ( gKeyTrg & gKeyDown )
- {
- if ( gSelectedItem / 6 == (item_num - 1) / 6 )
- gCampActive = false;
- else
- gSelectedItem += 6;
-
- bChange = true;
- }
-
- if (gSelectedItem >= item_num)
- gSelectedItem = item_num - 1;
-
- if (gCampActive && gKeyTrg & gKeyOk)
- StartTextScript(gItemData[gSelectedItem].code + 6000);
+ bChange = TRUE;
}
- else
+
+ if ( gKeyTrg & gKeyDown )
{
- if (gKeyTrg & gKeyLeft)
- {
- --gSelectedArms;
- bChange = true;
- }
- if (gKeyTrg & gKeyRight)
- {
- ++gSelectedArms;
- bChange = true;
- }
- if ((gKeyDown | gKeyUp) & gKeyTrg)
- {
- if (item_num)
- gCampActive = true;
- bChange = true;
- }
+ if ( gSelectedItem / 6 == (item_num - 1) / 6 )
+ gCampActive = FALSE;
+ else
+ gSelectedItem += 6;
- if (gSelectedArms < 0)
- gSelectedArms = arms_num - 1;
- if (arms_num - 1 < gSelectedArms)
- gSelectedArms = 0;
+ bChange = TRUE;
}
- if (bChange)
+ if (gSelectedItem >= item_num)
+ gSelectedItem = item_num - 1;
+
+ if (gCampActive && gKeyTrg & gKeyOk)
+ StartTextScript(gItemData[gSelectedItem].code + 6000);
+ }
+
+ if (bChange)
+ {
+ if (gCampActive == FALSE)
{
- if (gCampActive)
- {
- PlaySoundObject(1, 1);
-
- if (item_num)
- StartTextScript(gItemData[gSelectedItem].code + 5000);
- else
- StartTextScript(5000);
- }
+ PlaySoundObject(4, 1);
+
+ if (arms_num)
+ StartTextScript(gArmsData[gSelectedArms].code + 1000);
else
- {
- PlaySoundObject(4, 1);
-
- if (arms_num)
- StartTextScript(gArmsData[gSelectedArms].code + 1000);
- else
- StartTextScript(1000);
- }
+ StartTextScript(1000);
}
+ else
+ {
+ PlaySoundObject(1, 1);
+
+ if (item_num)
+ StartTextScript(gItemData[gSelectedItem].code + 5000);
+ else
+ StartTextScript(5000);
+ }
}
}
@@ -252,12 +273,8 @@
RECT rcNone = {80, 48, 96, 56};
RECT rcLv = {80, 80, 96, 88};
RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
- RECT rcCur1[2];
- RECT rcCur2[2];
- rcCur1[0] = {0, 88, 40, 128};
- rcCur1[1] = {40, 88, 80, 128};
- rcCur2[0] = {80, 88, 112, 104};
- rcCur2[1] = {80, 104, 112, 120};
+ RECT rcCur1[2] = {{0, 88, 40, 128}, {40, 88, 80, 128}};
+ RECT rcCur2[2] = {{80, 88, 112, 104}, {80, 104, 112, 120}};
RECT rcTitle1 = {80, 48, 144, 56};
RECT rcTitle2 = {80, 56, 144, 64};
RECT rcBoxTop = {0, 0, 244, 8};
@@ -280,17 +297,20 @@
PutBitmap3(&rcView, (WINDOW_WIDTH - 224) / 2, gCampTitleY + 52, &rcTitle2, SURFACE_ID_TEXT_BOX);
//Draw arms cursor
- static int flash;
+ static unsigned int flash;
++flash;
- if (gCampActive)
- PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[1], SURFACE_ID_TEXT_BOX);
+ if (gCampActive == FALSE)
+ PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[(flash / 2) % 2], SURFACE_ID_TEXT_BOX);
else
- PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[(flash >> 1) & 1], SURFACE_ID_TEXT_BOX);
+ PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[1], SURFACE_ID_TEXT_BOX);
//Draw arms
- for (int i = 0; i < ARMS_MAX && gArmsData[i].code; i++)
+ for (int i = 0; i < ARMS_MAX; i++)
{
+ if (gArmsData[i].code == 0)
+ break;
+
RECT rcArms;
rcArms.left = 16 * (gArmsData[i].code % 16);
rcArms.right = rcArms.left + 16;
@@ -316,13 +336,16 @@
}
//Draw items cursor
- if (gCampActive)
- PutBitmap3(&rcView, 32 * (gSelectedItem % 6) + (WINDOW_WIDTH - 224) / 2, 16 * (gSelectedItem / 6) + (WINDOW_HEIGHT - 88) / 2, &rcCur2[(flash >> 1) & 1], SURFACE_ID_TEXT_BOX);
+ if (gCampActive == TRUE)
+ PutBitmap3(&rcView, 32 * (gSelectedItem % 6) + (WINDOW_WIDTH - 224) / 2, 16 * (gSelectedItem / 6) + (WINDOW_HEIGHT - 88) / 2, &rcCur2[(flash / 2) % 2], SURFACE_ID_TEXT_BOX);
else
PutBitmap3(&rcView, 32 * (gSelectedItem % 6) + (WINDOW_WIDTH - 224) / 2, 16 * (gSelectedItem / 6) + (WINDOW_HEIGHT - 88) / 2, &rcCur2[1], SURFACE_ID_TEXT_BOX);
- for (int i = 0; i < ITEM_MAX && gItemData[i].code; i++)
+ for (int i = 0; i < ITEM_MAX; i++)
{
+ if (gItemData[i].code == 0)
+ break;
+
RECT rcItem;
rcItem.left = 32 * (gItemData[i].code % 8);
rcItem.right = rcItem.left + 32;
@@ -341,9 +364,7 @@
char old_script_path[PATH_LENGTH];
GetTextScriptPath(old_script_path);
- char name[13];
- strcpy(name, "ArmsItem.tsc");
- LoadTextScript2(name);
+ LoadTextScript2("ArmsItem.tsc");
gCampTitleY = (WINDOW_HEIGHT - 192) / 2;
gCampActive = 0;
@@ -350,8 +371,9 @@
gSelectedItem = 0;
//Run script
- int arms_num;
- for (arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
+ int arms_num = 0;
+ for (;gArmsData[arms_num].code != 0;)
+ ++arms_num;
if (arms_num)
StartTextScript(gArmsData[gSelectedArms].code + 1000);
@@ -358,7 +380,7 @@
else
StartTextScript(gItemData[gSelectedItem].code + 5000);
- while (true)
+ for (;;)
{
GetTrg();
@@ -389,62 +411,73 @@
PutTextScript();
PutFramePerSecound();
- if (!gCampActive && (gKeyItem | gKeyCancel | gKeyOk) & gKeyTrg)
- break;
- else if (g_GameFlags & 2 && (gKeyItem | gKeyCancel) & gKeyTrg)
- break;
-
+ if (gCampActive)
+ {
+ if (g_GameFlags & 2 && (gKeyCancel | gKeyItem) & gKeyTrg)
+ {
+ StopTextScript();
+ break;
+ }
+ }
+ else
+ {
+ if ((gKeyCancel | gKeyOk | gKeyItem) & gKeyTrg)
+ {
+ StopTextScript();
+ break;
+ }
+ }
+
if (!Flip_SystemTask())
return 0;
}
//Resume original script
- StopTextScript();
LoadTextScript_Stage(old_script_path);
gArmsEnergyX = 32;
return 1;
}
-bool CheckItem(int a)
+BOOL CheckItem(long a)
{
for (int i = 0; i < ITEM_MAX; i++)
{
if (gItemData[i].code == a)
- return true;
+ return TRUE;
}
- return false;
+ return FALSE;
}
-bool CheckArms(int a)
+BOOL CheckArms(long a)
{
for (int i = 0; i < ARMS_MAX; i++)
{
if (gArmsData[i].code == a)
- return true;
+ return TRUE;
}
- return false;
+ return FALSE;
}
-bool UseArmsEnergy(int num)
+BOOL UseArmsEnergy(long num)
{
if (!gArmsData[gSelectedArms].max_num)
- return true;
+ return TRUE;
if (!gArmsData[gSelectedArms].num)
- return false;
+ return FALSE;
gArmsData[gSelectedArms].num -= num;
if (gArmsData[gSelectedArms].num < 0)
gArmsData[gSelectedArms].num = 0;
- return true;
+ return TRUE;
}
-bool ChargeArmsEnergy(int num)
+BOOL ChargeArmsEnergy(long num)
{
gArmsData[gSelectedArms].num += num;
if (gArmsData[gSelectedArms].num > gArmsData[gSelectedArms].max_num)
gArmsData[gSelectedArms].num = gArmsData[gSelectedArms].max_num;
- return true;
+ return TRUE;
}
void FullArmsEnergy()
@@ -451,38 +484,49 @@
{
for (int a = 0; a < ARMS_MAX; a++)
{
- if (gArmsData[a].code)
- gArmsData[a].num = gArmsData[a].max_num;
+ if (gArmsData[a].code == 0)
+ continue;
+
+ gArmsData[a].num = gArmsData[a].max_num;
}
}
int RotationArms()
{
- int arms_num;
- for (arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
- if (!arms_num)
+ int arms_num = 0;
+ for (;gArmsData[arms_num].code != 0;)
+ ++arms_num;
+
+ if (arms_num == 0)
return 0;
-
+
ResetSpurCharge();
-
+
++gSelectedArms;
- while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code)
+ while (gSelectedArms < arms_num)
+ {
+ if (gArmsData[gSelectedArms].code)
+ break;
+
++gSelectedArms;
-
+ }
+
if (gSelectedArms == arms_num)
gSelectedArms = 0;
-
+
gArmsEnergyX = 32;
PlaySoundObject(4, 1);
-
+
return gArmsData[gSelectedArms].code;
}
int RotationArmsRev()
{
- int arms_num;
- for (arms_num = 0; gArmsData[arms_num].code != 0; arms_num++);
- if (!arms_num)
+ int arms_num = 0;
+ for (;gArmsData[arms_num].code != 0;)
+ ++arms_num;
+
+ if (arms_num == 0)
return 0;
ResetSpurCharge();
@@ -489,8 +533,14 @@
if (--gSelectedArms < 0)
gSelectedArms = arms_num - 1;
- while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code)
+
+ while (gSelectedArms < arms_num)
+ {
+ if (gArmsData[gSelectedArms].code)
+ break;
+
--gSelectedArms;
+ }
gArmsEnergyX = 0;
PlaySoundObject(4, 1);
--- a/src/ArmsItem.h
+++ b/src/ArmsItem.h
@@ -1,5 +1,7 @@
#pragma once
+#include "WindowsWrapper.h"
+
struct ARMS
{
int code;
@@ -27,20 +29,20 @@
extern int gSelectedArms;
extern int gSelectedItem;
extern int gCampTitleY;
-extern bool gCampActive;
+extern BOOL gCampActive;
void ClearArmsData();
void ClearItemData();
-bool AddArmsData(int code, int max_num);
-bool SubArmsData(int code);
-bool TradeArms(int code1, int code2, int max_num);
-bool AddItemData(int code);
-bool SubItemData(int code);
+BOOL AddArmsData(long code, long max_num);
+BOOL SubArmsData(long code);
+BOOL TradeArms(long code1, long code2, long max_num);
+BOOL AddItemData(long code);
+BOOL SubItemData(long code);
int CampLoop();
-bool CheckItem(int a);
-bool CheckArms(int a);
-bool UseArmsEnergy(int num);
-bool ChargeArmsEnergy(int num);
+BOOL CheckItem(long a);
+BOOL CheckArms(long a);
+BOOL UseArmsEnergy(long num);
+BOOL ChargeArmsEnergy(long num);
void FullArmsEnergy();
int RotationArms();
int RotationArmsRev();
--- a/src/Draw.cpp
+++ b/src/Draw.cpp
@@ -50,12 +50,12 @@
#define FRAMERATE 20
-bool Flip_SystemTask()
+BOOL Flip_SystemTask()
{
while (true)
{
if (!SystemTask())
- return false;
+ return FALSE;
//Framerate limiter
static uint32_t timePrev;
@@ -75,7 +75,7 @@
}
SDL_RenderPresent(gRenderer);
- return true;
+ return TRUE;
}
bool StartDirectDraw(int lMagnification, int lColourDepth)
--- a/src/Draw.h
+++ b/src/Draw.h
@@ -50,7 +50,7 @@
extern SURFACE surf[SURFACE_ID_MAX];
-bool Flip_SystemTask();
+BOOL Flip_SystemTask();
bool StartDirectDraw(int lMagnification, int lColourDepth);
void EndDirectDraw();
void ReleaseSurface(int s);
--
⑨