Made MiniMap.cpp supposedly ASM-accurate

Goes toward #74
A few core functions like Flip_SystemTask and GetTrg have a different
number of parameters to the original version of the game, so they cause
the ASM to generate differently.
This commit is contained in:
Clownacy 2019-02-26 00:36:09 +00:00
parent 2d23396d0d
commit d019b85616
3 changed files with 81 additions and 70 deletions

View file

@ -16,10 +16,13 @@
#include "MyChar.h" #include "MyChar.h"
#include "Stage.h" #include "Stage.h"
BOOLEAN gMapping[0x80]; char gMapping[0x80];
void WriteMiniMapLine(int line) void WriteMiniMapLine(int line)
{ {
int x;
unsigned char a;
RECT rcLevel[4] = { RECT rcLevel[4] = {
{240, 24, 241, 25}, {240, 24, 241, 25},
{241, 24, 242, 25}, {241, 24, 242, 25},
@ -27,69 +30,63 @@ void WriteMiniMapLine(int line)
{243, 24, 244, 25}, {243, 24, 244, 25},
}; };
for (int x = 0; x < gMap.width; x++) for (x = 0; x < gMap.width; x++)
{ {
uint8_t a = GetAttribute(x, line); a = GetAttribute(x, line);
switch (a)
{
case 0:
Surface2Surface(x, line, &rcLevel[0], 9, 26);
break;
case 68: // Yup. This really is an if/else chain.
case 1: // No switch here.
case 64: if (a == 0)
case 128: Surface2Surface(x, line, &rcLevel[0], 9, 26);
case 129: else if (a == 68 ||
case 130: a == 1 ||
case 131: a == 64 ||
case 81: a == 128 ||
case 82: a == 129 ||
case 85: a == 130 ||
case 86: a == 131 ||
case 2: a == 81 ||
case 96: a == 82 ||
case 113: a == 85 ||
case 114: a == 86 ||
case 117: a == 2 ||
case 118: a == 96 ||
case 160: a == 113 ||
case 161: a == 114 ||
case 162: a == 117 ||
case 163: a == 118 ||
Surface2Surface(x, line, &rcLevel[1], 9, 26); a == 160 ||
break; a == 161 ||
a == 162 ||
case 67: a == 163)
case 99: Surface2Surface(x, line, &rcLevel[1], 9, 26);
case 80: else if (a == 67 ||
case 83: a == 99 ||
case 84: a == 80 ||
case 87: a == 83 ||
case 112: a == 84 ||
case 115: a == 87 ||
case 116: a == 96 || // This is already listed above
case 119: a == 112 ||
Surface2Surface(x, line, &rcLevel[2], 9, 26); a == 115 ||
break; a == 116 ||
a == 119)
default: Surface2Surface(x, line, &rcLevel[2], 9, 26);
Surface2Surface(x, line, &rcLevel[3], 9, 26); else
break; Surface2Surface(x, line, &rcLevel[3], 9, 26);
}
} }
return;
} }
int MiniMapLoop() int MiniMapLoop()
{ {
int f;
RECT my_rect = {0, 57, 1, 58}; RECT my_rect = {0, 57, 1, 58};
int my_x = (gMC.x / 0x200 + 8) / 16; int my_x = (gMC.x / 0x200 + 8) / 16;
int my_y = (gMC.y / 0x200 + 8) / 16; int my_y = (gMC.y / 0x200 + 8) / 16;
RECT rcView; RECT rcView;
for (int f = 0; f <= 8; f++) for (f = 0; f <= 8; f++)
{ {
GetTrg(); GetTrg();
@ -106,10 +103,10 @@ int MiniMapLoop()
PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB);
rcView.left = (WINDOW_WIDTH / 2) - f * gMap.width / 16; rcView.left = (WINDOW_WIDTH / 2) - gMap.width * f / 8 / 2;
rcView.right = (WINDOW_WIDTH / 2) + f * gMap.width / 16; rcView.right = (WINDOW_WIDTH / 2) + gMap.width * f / 8 / 2;
rcView.top = (WINDOW_HEIGHT / 2) - f * gMap.length / 16; rcView.top = (WINDOW_HEIGHT / 2) - gMap.length * f / 8 / 2;
rcView.bottom = (WINDOW_HEIGHT / 2) + f * gMap.length / 16; rcView.bottom = (WINDOW_HEIGHT / 2) + gMap.length * f / 8 / 2;
PutMapName(true); PutMapName(true);
CortBox(&rcView, 0); CortBox(&rcView, 0);
@ -119,7 +116,12 @@ int MiniMapLoop()
return 0; return 0;
} }
RECT rcMiniMap = {0, 0, gMap.width, gMap.length}; RECT rcMiniMap;
rcMiniMap.left = 0;
rcMiniMap.top = gMap.width;
rcMiniMap.right = 0;
rcMiniMap.bottom = gMap.length;
rcView.right = --rcView.left + gMap.width + 2; rcView.right = --rcView.left + gMap.width + 2;
rcView.bottom = --rcView.top + gMap.length + 2; rcView.bottom = --rcView.top + gMap.length + 2;
CortBox2(&rcMiniMap, 0, SURFACE_ID_MAP); CortBox2(&rcMiniMap, 0, SURFACE_ID_MAP);
@ -147,15 +149,22 @@ int MiniMapLoop()
PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB);
CortBox(&rcView, 0); CortBox(&rcView, 0);
if (gMap.length > line) if (line < gMap.length)
WriteMiniMapLine(line++); {
if (gMap.length > line) WriteMiniMapLine(line);
WriteMiniMapLine(line++); line++;
}
if (line < gMap.length)
{
WriteMiniMapLine(line);
line++;
}
PutBitmap3(&grcGame, rcView.left + 1, rcView.top + 1, &rcMiniMap, SURFACE_ID_MAP); PutBitmap3(&grcGame, rcView.left + 1, rcView.top + 1, &rcMiniMap, SURFACE_ID_MAP);
PutMapName(true); PutMapName(true);
if ((++my_wait >> 3) & 1) if (++my_wait / 8 % 2)
PutBitmap3(&grcGame, my_x + rcView.left + 1, my_y + rcView.top + 1, &my_rect, SURFACE_ID_TEXT_BOX); PutBitmap3(&grcGame, my_x + rcView.left + 1, my_y + rcView.top + 1, &my_rect, SURFACE_ID_TEXT_BOX);
PutFramePerSecound(); PutFramePerSecound();
@ -163,7 +172,7 @@ int MiniMapLoop()
return 0; return 0;
} }
for (int f = 8; f >= -1; --f) for (f = 8; f >= -1; --f)
{ {
GetTrg(); GetTrg();
@ -180,10 +189,10 @@ int MiniMapLoop()
PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB); PutBitmap4(&grcGame, 0, 0, &grcGame, SURFACE_ID_SCREEN_GRAB);
rcView.left = (WINDOW_WIDTH / 2) - f * gMap.width / 16; rcView.left = (WINDOW_WIDTH / 2) - gMap.width * f / 8 / 2;
rcView.right = (WINDOW_WIDTH / 2) + f * gMap.width / 16; rcView.right = (WINDOW_WIDTH / 2) + gMap.width * f / 8 / 2;
rcView.top = (WINDOW_HEIGHT / 2) - f * gMap.length / 16; rcView.top = (WINDOW_HEIGHT / 2) - gMap.length * f / 8 / 2;
rcView.bottom = (WINDOW_HEIGHT / 2) + f * gMap.length / 16; rcView.bottom = (WINDOW_HEIGHT / 2) + gMap.length * f / 8 / 2;
PutMapName(true); PutMapName(true);
CortBox(&rcView, 0); CortBox(&rcView, 0);
@ -198,7 +207,10 @@ int MiniMapLoop()
BOOL IsMapping() BOOL IsMapping()
{ {
return gMapping[gStageNo]; if (gMapping[gStageNo] == FALSE)
return FALSE;
else
return TRUE;
} }
void StartMapping() void StartMapping()

View file

@ -4,7 +4,7 @@
#include "WindowsWrapper.h" #include "WindowsWrapper.h"
extern BOOLEAN gMapping[0x80]; extern char gMapping[0x80];
int MiniMapLoop(); int MiniMapLoop();
BOOL IsMapping(); BOOL IsMapping();

View file

@ -4,7 +4,6 @@ int rep_rand();
void rep_srand(unsigned int seed); void rep_srand(unsigned int seed);
typedef int BOOL; typedef int BOOL;
typedef unsigned char BOOLEAN;
#ifndef FALSE #ifndef FALSE
#define FALSE 0 #define FALSE 0