CSE2-tweaks/src/Flash.cpp

190 lines
3.4 KiB
C++

// THIS IS DECOMPILED PROPRIETARY CODE - USE AT YOUR OWN RISK.
//
// The original code belongs to Daisuke "Pixel" Amaya.
//
// Modifications and custom code are under the MIT licence.
// See LICENCE.txt for details.
#include "Flash.h"
#include "CommonDefines.h"
#include "Draw.h"
#include "WindowsWrapper.h"
static struct
{
FlashMode mode;
int act_no;
BOOL flag;
int cnt;
int width;
int x;
int y;
RECT rect1;
RECT rect2;
} flash;
unsigned int gFlashMode;
unsigned long gFlashColor;
void InitFlash(void)
{
if (gFlashMode == 1){
gFlashColor = GetCortBoxColor(RGB(0xDD, 0xDD, 0xDC));
}
else{
gFlashColor = GetCortBoxColor(RGB(0xFF, 0xFF, 0xFE));
}
}
void SetFlash(int x, int y, FlashMode mode)
{
flash.act_no = 0;
flash.flag = TRUE;
flash.x = x;
flash.y = y;
flash.mode = mode;
flash.cnt = 0;
flash.width = 0;
}
void ActFlash_Explosion(int flx, int fly)
{
int left, top, right, bottom;
switch (flash.act_no)
{
case 0: // Expand
flash.cnt += 0x200;
flash.width += flash.cnt;
left = (flash.x - flx - flash.width) / 0x200;
top = (flash.y - fly - flash.width) / 0x200;
right = (flash.x - flx + flash.width) / 0x200;
bottom = (flash.y - fly + flash.width) / 0x200;
if (left < 0)
left = 0;
if (top < 0)
top = 0;
if (right > WINDOW_WIDTH)
right = WINDOW_WIDTH;
if (bottom > WINDOW_HEIGHT)
bottom = WINDOW_HEIGHT;
// The tall part of the explosion
flash.rect1.left = left;
flash.rect1.right = right;
flash.rect1.top = 0;
flash.rect1.bottom = WINDOW_HEIGHT;
// The wide part of the explosion
flash.rect2.left = 0;
flash.rect2.right = WINDOW_WIDTH;
flash.rect2.top = top;
flash.rect2.bottom = bottom;
if (flash.width > WINDOW_WIDTH * 0x200 * 4) // I guess in theory this means that the explosion would take longer in widescreen...
{
flash.act_no = 1;
flash.cnt = 0;
flash.width = WINDOW_HEIGHT * 0x200;
}
break;
case 1: // Shrink
flash.width -= flash.width / 8;
if ((flash.width / 0x100) == 0)
flash.flag = FALSE;
top = (flash.y - fly - flash.width) / 0x200;
if (top < 0)
top = 0;
bottom = (flash.y - fly + flash.width) / 0x200;
if (bottom > WINDOW_HEIGHT)
bottom = WINDOW_HEIGHT;
// The tall part of the explosion
flash.rect1.left = 0;
flash.rect1.right = 0;
flash.rect1.top = 0;
flash.rect1.bottom = 0;
// The wide part of the explosion
flash.rect2.top = top;
flash.rect2.bottom = bottom;
flash.rect2.left = 0;
flash.rect2.right = WINDOW_WIDTH;
break;
}
}
void ActFlash_Flash(void)
{
++flash.cnt;
flash.rect1.left = 0;
flash.rect1.right = 0;
flash.rect1.top = 0;
flash.rect1.bottom = 0;
if (flash.cnt / 2 % 2)
{
flash.rect2.top = 0;
flash.rect2.bottom = WINDOW_HEIGHT;
flash.rect2.left = 0;
flash.rect2.right = WINDOW_WIDTH;
}
else
{
flash.rect2.left = 0;
flash.rect2.right = 0;
flash.rect2.top = 0;
flash.rect2.bottom = 0;
}
if (flash.cnt > 20)
flash.flag = FALSE;
}
void ActFlash(int flx, int fly)
{
if (!flash.flag)
return;
if(gFlashMode == 2)
return;
switch (flash.mode)
{
case FLASH_MODE_EXPLOSION:
ActFlash_Explosion(flx, fly);
break;
case FLASH_MODE_FLASH:
ActFlash_Flash();
break;
}
}
void PutFlash(void)
{
if (!flash.flag)
return;
if(gFlashMode == 2)
return;
CortBox(&flash.rect1, gFlashColor);
CortBox(&flash.rect2, gFlashColor);
}
void ResetFlash(void)
{
flash.flag = FALSE;
}