Made Flash.cpp *really* accurate

So I found out that the orignal EXE was compiled with Visual Studio .NET
2003, thanks to its Rich Header. With this compiler, I can create the
exact same assembly code as the EXE.

Using this, I found a bunch of inaccuracies in Flash.cpp, as a small
test. I'll come back to this later, once the rest of the game is
complete, but until then, here's a small taster.
This commit is contained in:
Clownacy 2019-02-08 16:35:35 +00:00
parent 8650af1d9e
commit dfe2ec83ae
2 changed files with 92 additions and 62 deletions

View file

@ -1,14 +1,14 @@
#include "WindowsWrapper.h"
#include "Flash.h" #include "Flash.h"
#include "Draw.h"
#include "CommonDefines.h" #include "CommonDefines.h"
#include "Draw.h"
#include "WindowsWrapper.h"
static struct static struct
{ {
int mode; int mode;
int act_no; int act_no;
bool flag; BOOL flag;
int cnt; int cnt;
int width; int width;
int x; int x;
@ -27,7 +27,7 @@ void InitFlash(void)
void SetFlash(int x, int y, int mode) void SetFlash(int x, int y, int mode)
{ {
flash.act_no = 0; flash.act_no = 0;
flash.flag = true; flash.flag = TRUE;
flash.x = x; flash.x = x;
flash.y = y; flash.y = y;
flash.mode = mode; flash.mode = mode;
@ -37,15 +37,18 @@ void SetFlash(int x, int y, int mode)
void ActFlash_Explosion(int flx, int fly) void ActFlash_Explosion(int flx, int fly)
{ {
if (flash.act_no == 0) int left, right, top, bottom;
switch (flash.act_no)
{ {
case 0:
flash.cnt += 0x200; flash.cnt += 0x200;
flash.width += flash.cnt; flash.width += flash.cnt;
int right = (flash.x - flx - flash.width) / 0x200; right = (flash.x - flx - flash.width) / 0x200;
int left = (flash.y - fly - flash.width) / 0x200; left = (flash.y - fly - flash.width) / 0x200;
int top = (flash.width + flash.x - flx) / 0x200; top = (flash.x - flx + flash.width) / 0x200;
int bottom = (flash.width + flash.y - fly) / 0x200; bottom = (flash.y - fly + flash.width) / 0x200;
if (right < 0) if (right < 0)
right = 0; right = 0;
@ -72,19 +75,20 @@ void ActFlash_Explosion(int flx, int fly)
flash.cnt = 0; flash.cnt = 0;
flash.width = (WINDOW_HEIGHT << 9); flash.width = (WINDOW_HEIGHT << 9);
} }
}
else if (flash.act_no == 1) break;
{
case 1:
flash.width -= flash.width / 8; flash.width -= flash.width / 8;
if ((flash.width / 0x100) == 0) if ((flash.width / 0x100) == 0)
flash.flag = false; flash.flag = FALSE;
int top = (flash.y - fly - flash.width) / 0x200; top = (flash.y - fly - flash.width) / 0x200;
if (top < 0) if (top < 0)
top = 0; top = 0;
int bottom = (flash.width + flash.y - fly) / 0x200; bottom = (flash.y - fly + flash.width) / 0x200;
if (bottom > WINDOW_HEIGHT) if (bottom > WINDOW_HEIGHT)
bottom = WINDOW_HEIGHT; bottom = WINDOW_HEIGHT;
@ -97,6 +101,8 @@ void ActFlash_Explosion(int flx, int fly)
flash.rect2.bottom = bottom; flash.rect2.bottom = bottom;
flash.rect2.left = 0; flash.rect2.left = 0;
flash.rect2.right = WINDOW_WIDTH; flash.rect2.right = WINDOW_WIDTH;
break;
} }
} }
@ -125,23 +131,36 @@ void ActFlash_Flash(void)
} }
if (flash.cnt > 20) if (flash.cnt > 20)
flash.flag = false; flash.flag = FALSE;
} }
void ActFlash(int flx, int fly) void ActFlash(int flx, int fly)
{ {
if (flash.flag) if (flash.flag == FALSE)
{ {
if (flash.mode == 1) // Do nothing
}
else
{
switch (flash.mode)
{
case 1:
ActFlash_Explosion(flx, fly); ActFlash_Explosion(flx, fly);
else if (flash.mode == 2) break;
case 2:
ActFlash_Flash(); ActFlash_Flash();
break;
}
} }
} }
void PutFlash(void) void PutFlash(void)
{ {
if (flash.flag) if (flash.flag == FALSE)
{
// Do nothing
}
else
{ {
CortBox(&flash.rect1, gFlashColor); CortBox(&flash.rect1, gFlashColor);
CortBox(&flash.rect2, gFlashColor); CortBox(&flash.rect2, gFlashColor);
@ -150,5 +169,5 @@ void PutFlash(void)
void ResetFlash(void) void ResetFlash(void)
{ {
flash.flag = false; flash.flag = FALSE;
} }

View file

@ -1,4 +1,15 @@
#pragma once #pragma once
typedef int BOOL;
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
struct RECT struct RECT
{ {
union union