Made Fade.cpp ASM-accurate

This commit is contained in:
Clownacy 2019-02-21 19:46:52 +00:00
parent 995a4f7a79
commit 5ba0454bc8
5 changed files with 247 additions and 219 deletions

View file

@ -474,6 +474,11 @@ void Surface2Surface(int x, int y, RECT *rect, int to, int from)
surf[to].needs_updating = true; surf[to].needs_updating = true;
} }
unsigned long GetCortBoxColor(unsigned long col)
{
return ((col & 0xFF) << 16) | (col & 0xFF00) | ((col & 0xFF0000) >> 16);
}
void CortBox(RECT *rect, uint32_t col) void CortBox(RECT *rect, uint32_t col)
{ {
//Get rect //Get rect

View file

@ -4,6 +4,10 @@
#include "WindowsWrapper.h" #include "WindowsWrapper.h"
#ifndef RGB
#define RGB(r,g,b) ((r) | ((g) << 8) | ((b) << 16))
#endif
extern RECT grcGame; extern RECT grcGame;
extern RECT grcFull; extern RECT grcFull;
@ -63,6 +67,7 @@ void BackupSurface(Surface_Ids surf_no, RECT *rect);
void PutBitmap3(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no); void PutBitmap3(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no);
void PutBitmap4(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no); void PutBitmap4(RECT *rcView, int x, int y, RECT *rect, Surface_Ids surf_no);
void Surface2Surface(int x, int y, RECT *rect, int to, int from); void Surface2Surface(int x, int y, RECT *rect, int to, int from);
unsigned long GetCortBoxColor(unsigned long col);
void CortBox(RECT *rect, uint32_t col); 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);
void InitTextObject(const char *font_name); void InitTextObject(const char *font_name);

View file

@ -8,20 +8,22 @@
#include "Game.h" #include "Game.h"
FADE gFade; FADE gFade;
static unsigned long mask_color;
void InitFade() void InitFade()
{ {
memset(&gFade, 0, sizeof(FADE)); memset(&gFade, 0, sizeof(FADE));
mask_color = GetCortBoxColor(RGB(0, 0, 0x20));
} }
void SetFadeMask() void SetFadeMask()
{ {
gFade.bMask = true; gFade.bMask = TRUE;
} }
void ClearFade() void ClearFade()
{ {
gFade.bMask = false; gFade.bMask = FALSE;
gFade.mode = 0; gFade.mode = 0;
} }
@ -30,239 +32,248 @@ void StartFadeOut(char dir)
gFade.mode = 2; gFade.mode = 2;
gFade.count = 0; gFade.count = 0;
gFade.dir = dir; gFade.dir = dir;
gFade.bMask = false; gFade.bMask = FALSE;
for (int y = 0; y < FADE_HEIGHT; y++) for (int y = 0; y < FADE_HEIGHT; y++)
{ {
for (int x = 0; x < FADE_WIDTH; x++) for (int x = 0; x < FADE_WIDTH; x++)
{ {
gFade.ani_no[y][x] = 0; gFade.ani_no[y][x] = 0;
gFade.flag[y][x] = 0; gFade.flag[y][x] = FALSE;
} }
} }
} }
void StartFadeIn(char dir) void StartFadeIn(char dir)
{ {
int x;
int y;
gFade.mode = 1; gFade.mode = 1;
gFade.count = 0; gFade.count = 0;
gFade.dir = dir; gFade.dir = dir;
gFade.bMask = true; gFade.bMask = TRUE;
for (int y = 0; y < FADE_HEIGHT; y++) for (y = 0; y < FADE_HEIGHT; y++)
{ {
for (int x = 0; x < FADE_WIDTH; x++) for (x = 0; x < FADE_WIDTH; x++)
{ {
gFade.ani_no[y][x] = 15; gFade.ani_no[y][x] = 15;
gFade.flag[y][x] = 0; gFade.flag[y][x] = FALSE;
} }
} }
x = x; // What
} }
void ProcFade() void ProcFade()
{ {
if (gFade.mode == 1) int x;
int y;
switch (gFade.mode)
{ {
gFade.bMask = false; case 2:
switch (gFade.dir)
switch (gFade.dir)
{
case 0:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x <= FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x)
gFade.flag[y][x] = 1;
}
}
break;
case 1:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_HEIGHT - 1) - gFade.count == y)
gFade.flag[y][x] = 1;
}
}
break;
case 2:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == x)
gFade.flag[y][x] = 1;
}
}
break;
case 3:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == y)
gFade.flag[y][x] = 1;
}
}
break;
case 4:
for (int y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (int x = 0; x < (FADE_WIDTH / 2); x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x + y)
gFade.flag[y][x] = 1;
}
}
for (int y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (int x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == y + ((FADE_WIDTH - 1) - x))
gFade.flag[y][x] = 1;
}
}
for (int y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (int x = 0; x < (FADE_WIDTH / 2); x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = 1;
}
}
for (int y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (int x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = 1;
}
}
break;
default:
break;
}
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{ {
if (gFade.ani_no[y][x] > 0 && gFade.flag[y][x]) case 0:
--gFade.ani_no[y][x]; for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x)
gFade.flag[y][x] = TRUE;
}
}
break;
case 2:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == x)
gFade.flag[y][x] = TRUE;
}
}
break;
case 1:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_HEIGHT - 1) - gFade.count == y)
gFade.flag[y][x] = TRUE;
}
}
break;
case 3:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == y)
gFade.flag[y][x] = TRUE;
}
}
break;
case 4:
for (y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (x = 0; x < (FADE_WIDTH / 2); x++)
{
if (gFade.count == x + y)
gFade.flag[y][x] = TRUE;
}
}
for (y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if (gFade.count == y + ((FADE_WIDTH - 1) - x))
gFade.flag[y][x] = TRUE;
}
}
for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (x = 0; x < (FADE_WIDTH / 2); x++)
{
if (gFade.count == x + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = TRUE;
}
}
for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if (gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = TRUE;
}
}
break;
} }
}
for (y = 0; y < FADE_HEIGHT; y++)
if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16)
gFade.mode = 0;
}
else if (gFade.mode == 2)
{
switch (gFade.dir)
{
case 0:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x <= FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x)
gFade.flag[y][x] = 1;
}
}
break;
case 1:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_HEIGHT - 1) - gFade.count == y)
gFade.flag[y][x] = 1;
}
}
break;
case 2:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == x)
gFade.flag[y][x] = 1;
}
}
break;
case 3:
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == y)
gFade.flag[y][x] = 1;
}
}
break;
case 4:
for (int y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (int x = 0; x < (FADE_WIDTH / 2); x++)
{
if (gFade.count == x + y)
gFade.flag[y][x] = 1;
}
}
for (int y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (int x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if (gFade.count == y + ((FADE_WIDTH - 1) - x))
gFade.flag[y][x] = 1;
}
}
for (int y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (int x = 0; x < (FADE_WIDTH / 2); x++)
{
if (gFade.count == x + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = 1;
}
}
for (int y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (int x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if (gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = 1;
}
}
break;
default:
break;
}
for (int y = 0; y < FADE_HEIGHT; y++)
{
for (int x = 0; x < FADE_WIDTH; x++)
{ {
if (gFade.ani_no[y][x] < 15 && gFade.flag[y][x]) for (x = 0; x < FADE_WIDTH; x++)
++gFade.ani_no[y][x]; {
if (gFade.ani_no[y][x] < 15 && gFade.flag[y][x])
++gFade.ani_no[y][x];
}
} }
}
if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16)
if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16) {
{ gFade.bMask = TRUE;
gFade.bMask = true; gFade.mode = 0;
gFade.mode = 0; }
}
break;
case 1:
gFade.bMask = FALSE;
switch (gFade.dir)
{
case 0:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x)
gFade.flag[y][x] = TRUE;
}
}
break;
case 2:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == x)
gFade.flag[y][x] = TRUE;
}
}
break;
case 1:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if ((FADE_HEIGHT - 1) - gFade.count == y)
gFade.flag[y][x] = TRUE;
}
}
break;
case 3:
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if (gFade.count == y)
gFade.flag[y][x] = TRUE;
}
}
break;
case 4:
for (y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (x = 0; x < (FADE_WIDTH / 2); x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x + y)
gFade.flag[y][x] = TRUE;
}
}
for (y = 0; y < (FADE_HEIGHT / 2); y++)
{
for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == y + ((FADE_WIDTH - 1) - x))
gFade.flag[y][x] = TRUE;
}
}
for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (x = 0; x < (FADE_WIDTH / 2); x++)
{
if ((FADE_WIDTH - 1) - gFade.count == x + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = TRUE;
}
}
for (y = (FADE_HEIGHT / 2); y < FADE_HEIGHT; y++)
{
for (x = (FADE_WIDTH / 2); x < FADE_WIDTH; x++)
{
if ((FADE_WIDTH - 1) - gFade.count == ((FADE_WIDTH - 1) - x) + ((FADE_HEIGHT - 1) - y))
gFade.flag[y][x] = TRUE;
}
}
break;
default:
break;
}
for (y = 0; y < FADE_HEIGHT; y++)
{
for (x = 0; x < FADE_WIDTH; x++)
{
if (gFade.ani_no[y][x] > 0 && gFade.flag[y][x])
--gFade.ani_no[y][x];
}
}
if (++gFade.count > ((FADE_WIDTH > FADE_HEIGHT) ? FADE_WIDTH : FADE_HEIGHT) + 16)
gFade.mode = 0;
break;
} }
} }
@ -274,23 +285,28 @@ void PutFade()
if (gFade.bMask) if (gFade.bMask)
{ {
CortBox(&grcGame, 0x000020); CortBox(&grcGame, mask_color);
return;
} }
else if (gFade.mode)
if (gFade.mode == 0)
return;
for (int y = 0; y < FADE_HEIGHT; y++)
{ {
for (int y = 0; y < FADE_HEIGHT; y++) for (int x = 0; x < FADE_WIDTH; x++)
{ {
for (int x = 0; x < FADE_WIDTH; x++) rect.left = 16 * gFade.ani_no[y][x];
{ rect.right = rect.left + 16;
rect.left = 16 * gFade.ani_no[y][x]; PutBitmap3(&grcGame, 16 * x, 16 * y, &rect, SURFACE_ID_FADE);
rect.right = rect.left + 16;
PutBitmap3(&grcGame, 16 * x, 16 * y, &rect, SURFACE_ID_FADE);
}
} }
} }
} }
bool GetFadeActive() BOOL GetFadeActive()
{ {
return gFade.mode != 0; if (gFade.mode == 0)
return FALSE;
else
return TRUE;
} }

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "CommonDefines.h" #include "CommonDefines.h"
#include "WindowsWrapper.h"
#define FADE_WIDTH (((WINDOW_WIDTH - 1) >> 4) + 1) #define FADE_WIDTH (((WINDOW_WIDTH - 1) >> 4) + 1)
#define FADE_HEIGHT (((WINDOW_HEIGHT - 1) >> 4) + 1) #define FADE_HEIGHT (((WINDOW_HEIGHT - 1) >> 4) + 1)
@ -8,10 +9,10 @@
struct FADE struct FADE
{ {
int mode; int mode;
bool bMask; BOOL bMask;
int count; int count;
char ani_no[FADE_HEIGHT][FADE_WIDTH]; char ani_no[FADE_HEIGHT][FADE_WIDTH];
char flag[FADE_HEIGHT][FADE_WIDTH]; BOOLEAN flag[FADE_HEIGHT][FADE_WIDTH];
char dir; char dir;
}; };
@ -22,4 +23,4 @@ void StartFadeOut(char dir);
void StartFadeIn(char dir); void StartFadeIn(char dir);
void ProcFade(); void ProcFade();
void PutFade(); void PutFade();
bool GetFadeActive(); BOOL GetFadeActive();

View file

@ -4,6 +4,7 @@ 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