Merge pull request #41 from Clownacy/master

NPCs and fixes
This commit is contained in:
Cucky 2019-02-06 16:10:55 -05:00 committed by GitHub
commit 2c502f3821
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 3210 additions and 96 deletions

View file

@ -45,6 +45,7 @@ SOURCES = \
BossFrog \
BossLife \
BossOhm \
BossX \
BulHit \
Bullet \
Caret \
@ -77,11 +78,13 @@ SOURCES = \
NpcAct100 \
NpcAct120 \
NpcAct140 \
NpcAct160 \
NpcAct180 \
NpcAct200 \
NpcAct260 \
NpcAct280 \
NpcAct300 \
NpcAct320 \
NpcAct340 \
NpChar \
NpcHit \

View file

@ -267,8 +267,8 @@ void PutCampObject()
int y;
PutBitmap3(&rcView, (WINDOW_WIDTH - 244) / 2, (WINDOW_HEIGHT - 224) / 2, &rcBoxTop, 26);
for (y = 1; y < 18; y++)
PutBitmap3(&rcView, (WINDOW_WIDTH - 244) / 2, (WINDOW_HEIGHT - 224) / 2 * (y + 1), &rcBoxBody, 26);
PutBitmap3(&rcView, (WINDOW_WIDTH - 244) / 2, (WINDOW_HEIGHT - 224) / 2 * (y + 1), &rcBoxBottom, 26);
PutBitmap3(&rcView, (WINDOW_WIDTH - 244) / 2, ((WINDOW_HEIGHT - 240) / 2) + (8 * (y + 1)), &rcBoxBody, 26);
PutBitmap3(&rcView, (WINDOW_WIDTH - 244) / 2, ((WINDOW_HEIGHT - 240) / 2) + (8 * (y + 1)), &rcBoxBottom, 26);
//Move titles
if (gCampTitleY > (WINDOW_HEIGHT - 208) / 2)
@ -283,9 +283,9 @@ void PutCampObject()
++flash;
if (gCampActive)
PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, 24, &rcCur1[1], 26);
PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[1], 26);
else
PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, 24, &rcCur1[(flash >> 1) & 1], 26);
PutBitmap3(&rcView, 40 * gSelectedArms + (WINDOW_WIDTH - 224) / 2, (WINDOW_HEIGHT / 2) - 96, &rcCur1[(flash >> 1) & 1], 26);
//Draw arms
for (int i = 0; i < ARMS_MAX && gArmsData[i].code; i++)

View file

@ -6,6 +6,7 @@
#include "Boss.h"
#include "BossFrog.h"
#include "BossOhm.h"
#include "BossX.h"
#include "NpChar.h"
#include "MyChar.h"
#include "Sound.h"
@ -188,7 +189,7 @@ BOSSFUNCTION gpBossFuncTbl[10] =
ActBossChar_0,
ActBossChar_Omega,
ActBossChar_Frog,
nullptr, //ActBossChar_MonstX,
ActBossChar_MonstX,
nullptr, //ActBossChar_Core,
nullptr, //ActBossChar_Ironhead,
nullptr, //ActBossChar_Twin,

View file

@ -51,6 +51,7 @@ void ActBoss01_34()
{
case 0:
gBoss[i].act_no = 1;
// Fallthrough
case 1:
if (i == 3)
gBoss[i].x = gBoss[0].x - 0x2000;
@ -150,6 +151,7 @@ void ActBossChar_Omega()
gBoss[0].act_no = 30;
gBoss[0].act_wait = 0;
gBoss[0].ani_no = 0;
// Fallthrough
case 30:
SetQuake(2);
gBoss[0].y -= 0x200;

851
src/BossX.cpp Normal file
View file

@ -0,0 +1,851 @@
#include "BossX.h"
#include "Boss.h"
#include "Flash.h"
#include "Frame.h"
#include "Game.h"
#include "MyChar.h"
#include "NpChar.h"
#include "Sound.h"
#include "Triangle.h"
#include "WindowsWrapper.h"
static void ActBossChar03_01(NPCHAR *npc)
{
RECT rcUp[6];
RECT rcDown[6];
rcUp[0] = {0, 0, 72, 32};
rcUp[1] = {0, 32, 72, 64};
rcUp[2] = {72, 0, 144, 32};
rcUp[3] = {144, 0, 216, 32};
rcUp[4] = {72, 32, 144, 64};
rcUp[5] = {144, 32, 216, 64};
rcDown[0] = {0, 64, 72, 96};
rcDown[1] = {0, 96, 72, 128};
rcDown[2] = {72, 64, 144, 96};
rcDown[3] = {144, 64, 216, 96};
rcDown[4] = {72, 96, 144, 128};
rcDown[5] = {144, 96, 216, 128};
switch (npc->act_no)
{
case 10:
npc->ani_no = 0;
npc->bits &= ~0x10;
break;
case 100:
npc->bits |= 0x10;
npc->act_no = 101;
npc->act_wait = 0;
npc->ani_no = 2;
npc->ani_wait = 0;
// Fallthrough
case 101:
if (++npc->act_wait > 30)
npc->act_no = 102;
if (++npc->ani_wait > 0)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if ( npc->ani_no > 3 )
npc->ani_no = 2;
npc->xm -= 0x20;
break;
case 102:
npc->bits &= ~0x10;
npc->act_no = 103;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 103:
++npc->act_wait;
if (++npc->ani_wait > 1)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 1)
npc->ani_no = 0;
npc->xm -= 0x20;
break;
case 200:
npc->bits |= 0x10;
npc->bits |= 0x80;
npc->act_no = 201;
npc->act_wait = 0;
npc->ani_no = 4;
npc->ani_wait = 0;
// Fallthrough
case 201:
if (++npc->act_wait > 30)
npc->act_no = 202;
if (++npc->ani_wait > 0)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if ( npc->ani_no > 5 )
npc->ani_no = 4;
npc->xm += 0x20;
break;
case 202:
npc->bits &= ~0x10;
npc->act_no = 203;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 203:
++npc->act_wait;
if (++npc->ani_wait > 1)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 1)
npc->ani_no = 0;
npc->xm += 0x20;
break;
case 300:
npc->act_no = 301;
npc->ani_no = 4;
npc->ani_wait = 0;
npc->bits |= 0x10;
// Fallthrough
case 301:
if (++npc->ani_wait > 0)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 5)
npc->ani_no = 4;
npc->xm += 0x20;
if (npc->xm > 0)
{
npc->xm = 0;
npc->act_no = 10;
}
break;
case 400:
npc->act_no = 401;
npc->ani_no = 2;
npc->ani_wait = 0;
npc->bits |= 0x10;
// Fallthrough
case 401:
if (++npc->ani_wait > 0)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 3)
npc->ani_no = 2;
npc->xm -= 0x20;
if (npc->xm < 0)
{
npc->xm = 0;
npc->act_no = 10;
}
break;
}
if ((npc->act_no == 101 || npc->act_no == 201 || npc->act_no == 301 || npc->act_no == 401) && npc->act_wait % 2 == 1)
PlaySoundObject(112, 1);
if ((npc->act_no == 103 || npc->act_no == 203) && npc->act_wait % 4 == 1)
PlaySoundObject(111, 1);
if (npc->act_no < 100 || gMC.y >= npc->y + 0x800 || gMC.y <= npc->y - 0x800)
{
npc->damage = 0;
npc->bits &= ~0x80;
}
else
{
npc->damage = 10;
npc->bits |= 0x80;
}
if (npc->xm > 0x400)
npc->xm = 0x400;
if (npc->xm < -0x400)
npc->xm = -0x400;
npc->x += npc->xm;
if (npc->direct == 1)
npc->rect = rcUp[npc->ani_no];
else
npc->rect = rcDown[npc->ani_no];
}
static void ActBossChar03_02(NPCHAR *npc)
{
RECT rect[4];
rect[0] = {0, 128, 72, 160};
rect[1] = {72, 128, 144, 160};
rect[2] = {0, 160, 72, 192};
rect[3] = {72, 160, 144, 192};
switch (npc->act_no)
{
case 10:
npc->act_no = 11;
npc->act_wait = 30 * npc->ani_no + 30;
break;
case 11:
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
int x;
int y;
int direct;
switch (npc->ani_no)
{
case 0:
direct = 3;
x = -0x3C00;
y = 0xC00;
break;
case 1:
direct = 2;
x = 0x3C00;
y = 0xC00;
break;
case 2:
direct = 0;
x = -0x3C00;
y = -0xC00;
break;
case 3:
direct = 1;
x = 0x3C00;
y = -0xC00;
break;
}
SetNpChar(158, npc->x + x, npc->y + y, 0, 0, direct, 0, 0x100);
PlaySoundObject(39, 1);
npc->act_wait = 120;
}
break;
}
npc->x = (gBoss[0].x + gBoss[npc->count1].x) / 2;
npc->y = (gBoss[0].y + gBoss[npc->count1].y) / 2;
npc->rect = rect[npc->ani_no];
}
static void ActBossChar03_03(NPCHAR *npc)
{
switch (npc->act_no)
{
case 10:
npc->tgt_x += 0x200;
if (npc->tgt_x > 0x4000)
{
npc->tgt_x = 0x4000;
npc->act_no = 0;
gBoss[3].act_no = 10;
gBoss[4].act_no = 10;
gBoss[5].act_no = 10;
gBoss[6].act_no = 10;
}
break;
case 20:
npc->tgt_x -= 0x200;
if (npc->tgt_x < 0)
{
npc->tgt_x = 0;
npc->act_no = 0;
gBoss[3].act_no = 0;
gBoss[4].act_no = 0;
gBoss[5].act_no = 0;
gBoss[6].act_no = 0;
}
break;
case 30:
npc->tgt_x += 0x200;
if (npc->tgt_x > 0x2800)
{
npc->tgt_x = 0x2800;
npc->act_no = 0;
gBoss[7].act_no = 10;
gBoss[13].act_no = 10;
gBoss[14].act_no = 10;
gBoss[15].act_no = 10;
gBoss[16].act_no = 10;
}
break;
case 40:
npc->tgt_x -= 0x200;
if (npc->tgt_x < 0)
{
npc->tgt_x = 0;
npc->act_no = 0;
gBoss[7].act_no = 0;
gBoss[13].act_no = 0;
gBoss[14].act_no = 0;
gBoss[15].act_no = 0;
gBoss[16].act_no = 0;
}
break;
}
RECT rcLeft = {216, 96, 264, 144};
RECT rcRight = {264, 96, 312, 144};
if (npc->direct == 0)
{
npc->rect = rcLeft;
npc->x = gBoss[0].x - npc->tgt_x - 0x3000;
npc->y = gBoss[0].y;
}
else
{
npc->rect = rcRight;
npc->x = gBoss[0].x + npc->tgt_x + 0x3000;
npc->y = gBoss[0].y;
}
}
static void ActBossChar03_04(NPCHAR *npc)
{
RECT rect[8];
rect[0] = {0, 192, 16, 208};
rect[1] = {16, 192, 32, 208};
rect[2] = {32, 192, 48, 208};
rect[3] = {48, 192, 64, 208};
rect[4] = {0, 208, 16, 224};
rect[5] = {16, 208, 32, 224};
rect[6] = {32, 208, 48, 224};
rect[7] = {48, 208, 64, 224};
switch (npc->act_no)
{
case 0:
npc->bits &= ~0x20;
npc->ani_no = 0;
break;
case 10:
npc->act_no = 11;
npc->act_wait = 10 * npc->tgt_x + 40;
npc->bits |= 0x20;
// Fallthrough
case 11:
npc->ani_no = npc->act_wait < 16 && npc->act_wait / 2 % 2;
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
const unsigned char deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y) + Random(-2, 2);
const int ym = 3 * GetSin(deg);
const int xm = 3 * GetCos(deg);
SetNpChar(156, npc->x, npc->y, xm, ym, 0, 0, 0x100);
PlaySoundObject(39, 1);
npc->act_wait = 40;
}
break;
}
switch (npc->tgt_x)
{
case 0:
npc->x = gBoss[0].x - 0x2C00;
npc->y = gBoss[0].y - 0x2000;
break;
case 1:
npc->x = gBoss[0].x + 0x3800;
npc->y = gBoss[0].y - 0x2000;
break;
case 2:
npc->x = gBoss[0].x - 0x1E00;
npc->y = gBoss[0].y + 0x1C00;
break;
case 3:
npc->x = gBoss[0].x + 0x2200;
npc->y = gBoss[0].y + 0x1C00;
break;
}
npc->rect = rect[npc->tgt_x + 4 * npc->ani_no];
}
static void ActBossChar03_face(NPCHAR *npc)
{
RECT rect[3];
rect[0] = {216, 0, 320, 48};
rect[1] = {216, 48, 320, 96};
rect[2] = {216, 144, 320, 192};
switch (npc->act_no)
{
case 0:
gBoss[0].bits &= ~0x20;
npc->ani_no = 0;
break;
case 10:
npc->act_no = 11;
npc->act_wait = 10 * npc->tgt_x + 40;
gBoss[0].bits |= 0x20;
// Fallthrough
case 11:
if (gBoss[0].shock)
{
static unsigned char flash;
if ((flash++ >> 1) & 1)
npc->ani_no = 1;
else
npc->ani_no = 0;
}
else
{
npc->ani_no = 0;
}
break;
}
gBoss[7].x = gBoss[0].x;
gBoss[7].y = gBoss[0].y;
if (gBoss[0].act_no <= 10)
npc->ani_no = 2;
npc->rect = rect[npc->ani_no];
}
void ActBossChar_MonstX(void)
{
switch (gBoss[0].act_no)
{
case 0:
gBoss[0].life = 1;
gBoss[0].x = -0x28000;
break;
case 1:
gBoss[0].life = 700;
gBoss[0].exp = 1;
gBoss[0].act_no = 1;
gBoss[0].x = 0x100000;
gBoss[0].y = 102400;
gBoss[0].hit_voice = 54;
gBoss[0].hit.front = 0x3000;
gBoss[0].hit.top = 0x3000;
gBoss[0].hit.back = 0x3000;
gBoss[0].hit.bottom = 0x3000;
gBoss[0].bits = 0x8208;
gBoss[0].size = 3;
gBoss[0].code_event = 1000;
gBoss[0].ani_no = 0;
gBoss[1].cond = 0x80;
gBoss[1].size = 3;
gBoss[1].direct = 0;
gBoss[1].view.front = 0x3000;
gBoss[1].view.top = 0x3000;
gBoss[1].view.back = 0x3000;
gBoss[1].view.bottom = 0x3000;
gBoss[1].bits = 8;
gBoss[2] = gBoss[1];
gBoss[2].direct = 2;
gBoss[3].cond = 0x80;
gBoss[3].life = 60;
gBoss[3].hit_voice = 54;
gBoss[3].destroy_voice = 71;
gBoss[3].size = 2;
gBoss[3].view.front = 0x1000;
gBoss[3].view.top = 0x1000;
gBoss[3].view.back = 0x1000;
gBoss[3].view.bottom = 0x1000;
gBoss[3].hit.front = 0xA00;
gBoss[3].hit.back = 0xA00;
gBoss[3].hit.top = 0xA00;
gBoss[3].hit.bottom = 0xA00;
gBoss[3].bits = 8;
gBoss[3].tgt_x = 0;
gBoss[4] = gBoss[3];
gBoss[4].tgt_x = 1;
gBoss[5] = gBoss[3];
gBoss[5].tgt_x = 2;
gBoss[5].life = 100;
gBoss[6] = gBoss[3];
gBoss[6].tgt_x = 3;
gBoss[6].life = 100;
gBoss[7].cond = 0x80;
gBoss[7].x = 0x100000;
gBoss[7].y = 0x19000;
gBoss[7].view.front = 0x6800;
gBoss[7].view.top = 0x3000;
gBoss[7].view.back = 0x6800;
gBoss[7].view.bottom = 0x3000;
gBoss[7].hit_voice = 52;
gBoss[7].hit.front = 0x1000;
gBoss[7].hit.top = 0x3000;
gBoss[7].hit.back = 0x1000;
gBoss[7].hit.bottom = 0x2000;
gBoss[7].bits = 8;
gBoss[7].size = 3;
gBoss[7].ani_no = 0;
gBoss[9].cond = 0x80;
gBoss[9].act_no = 0;
gBoss[9].direct = 1;
gBoss[9].x = 0xF8000;
gBoss[9].y = 0x12000;
gBoss[9].view.front = 0x4800;
gBoss[9].view.top = 0x1000;
gBoss[9].view.back = 0x4800;
gBoss[9].view.bottom = 0x3000;
gBoss[9].hit_voice = 52;
gBoss[9].hit.front = 0x3800;
gBoss[9].hit.top = 0x1000;
gBoss[9].hit.back = 0x3800;
gBoss[9].hit.bottom = 0x2000;
gBoss[9].bits = 141;
gBoss[9].size = 3;
gBoss[10] = gBoss[9];
gBoss[10].x = 0x108000;
gBoss[11] = gBoss[9];
gBoss[11].direct = 3;
gBoss[11].x = 0xF8000;
gBoss[11].y = 0x20000;
gBoss[11].view.top = 0x3000;
gBoss[11].view.bottom = 0x1000;
gBoss[11].hit.top = 0x2000;
gBoss[11].hit.bottom = 0x1000;
gBoss[12] = gBoss[11];
gBoss[12].x = 0x108000;
gBoss[13] = gBoss[9];
gBoss[13].cond = 0x80;
gBoss[13].view.top = 0x2000;
gBoss[13].view.bottom = 0x2000;
gBoss[13].view.front = 0x3C00;
gBoss[13].view.back = 0x5400;
gBoss[13].count1 = 9;
gBoss[13].ani_no = 0;
gBoss[13].bits = 8;
gBoss[14] = gBoss[13];
gBoss[14].view.front = 0x5400;
gBoss[14].view.back = 0x3C00;
gBoss[14].count1 = 10;
gBoss[14].ani_no = 1;
gBoss[14].bits = 8;
gBoss[15] = gBoss[13];
gBoss[15].view.top = 0x2000;
gBoss[15].view.bottom = 0x2000;
gBoss[15].count1 = 11;
gBoss[15].ani_no = 2;
gBoss[15].bits = 8;
gBoss[16] = gBoss[15];
gBoss[16].view.front = 0x5400;
gBoss[16].view.back = 0x3C00;
gBoss[16].count1 = 12;
gBoss[16].ani_no = 3;
gBoss[16].bits = 8;
gBoss[0].act_no = 2;
break;
case 10:
gBoss[0].act_no = 11;
gBoss[0].act_wait = 0;
gBoss[0].count1 = 0;
// Fallthrough
case 11:
if (++gBoss[0].act_wait > 100)
{
gBoss[0].act_wait = 0;
if (gMC.x < gBoss[0].x)
gBoss[0].act_no = 100;
else
gBoss[0].act_no = 200;
}
break;
case 100:
gBoss[0].act_wait = 0;
gBoss[0].act_no = 101;
++gBoss[0].count1;
// Fallthrough
case 101:
if (++gBoss[0].act_wait == 4)
gBoss[9].act_no = 100;
if (gBoss[0].act_wait == 8)
gBoss[10].act_no = 100;
if (gBoss[0].act_wait == 10)
gBoss[11].act_no = 100;
if (gBoss[0].act_wait == 12)
gBoss[12].act_no = 100;
if (gBoss[0].act_wait > 120 && gBoss[0].count1 > 2)
gBoss[0].act_no = 300;
if (gBoss[0].act_wait > 121 && gMC.x > gBoss[0].x)
gBoss[0].act_no = 200;
break;
case 200:
gBoss[0].act_wait = 0;
gBoss[0].act_no = 201;
++gBoss[0].count1;
// Fallthrough
case 201:
if (++gBoss[0].act_wait == 4)
gBoss[9].act_no = 200;
if (gBoss[0].act_wait == 8)
gBoss[10].act_no = 200;
if (gBoss[0].act_wait == 10)
gBoss[11].act_no = 200;
if (gBoss[0].act_wait == 12)
gBoss[12].act_no = 200;
if (gBoss[0].act_wait > 120 && gBoss[0].count1 > 2)
gBoss[0].act_no = 400;
if (gBoss[0].act_wait > 121 && gMC.x < gBoss[0].x)
gBoss[0].act_no = 100;
break;
case 300:
gBoss[0].act_wait = 0;
gBoss[0].act_no = 301;
// Fallthrough
case 301:
if (++gBoss[0].act_wait == 4)
gBoss[9].act_no = 300;
if (gBoss[0].act_wait == 8)
gBoss[10].act_no = 300;
if (gBoss[0].act_wait == 10)
gBoss[11].act_no = 300;
if (gBoss[0].act_wait == 12)
gBoss[12].act_no = 300;
if (gBoss[0].act_wait > 50)
{
if (gBoss[3].cond || gBoss[4].cond || gBoss[5].cond || gBoss[6].cond)
gBoss[0].act_no = 500;
else
gBoss[0].act_no = 600;
}
break;
case 400:
gBoss[0].act_wait = 0;
gBoss[0].act_no = 401;
// Fallthrough
case 401:
if (++gBoss[0].act_wait == 4)
gBoss[9].act_no = 400;
if (gBoss[0].act_wait == 8)
gBoss[10].act_no = 400;
if (gBoss[0].act_wait == 10)
gBoss[11].act_no = 400;
if (gBoss[0].act_wait == 12)
gBoss[12].act_no = 400;
if (gBoss[0].act_wait > 50)
{
if (gBoss[3].cond || gBoss[4].cond || gBoss[5].cond || gBoss[6].cond)
gBoss[0].act_no = 500;
else
gBoss[0].act_no = 600;
}
break;
case 500:
gBoss[0].act_no = 501;
gBoss[0].act_wait = 0;
gBoss[1].act_no = 10;
gBoss[2].act_no = 10;
// Fallthrough
case 501:
if (++gBoss[0].act_wait > 300)
{
gBoss[0].act_no = 502;
gBoss[0].act_wait = 0;
}
if (gBoss[3].cond == 0 && gBoss[4].cond == 0 && gBoss[5].cond == 0 && gBoss[6].cond == 0)
{
gBoss[0].act_no = 502;
gBoss[0].act_wait = 0;
}
break;
case 502:
gBoss[0].act_no = 503;
gBoss[0].act_wait = 0;
gBoss[0].count1 = 0;
gBoss[1].act_no = 20;
gBoss[2].act_no = 20;
// Fallthrough
case 503:
if (++gBoss[0].act_wait > 50)
{
if (gMC.x < gBoss[0].x)
gBoss[0].act_no = 100;
else
gBoss[0].act_no = 200;
}
break;
case 600:
gBoss[0].act_no = 601;
gBoss[0].act_wait = 0;
gBoss[0].count2 = gBoss[0].life;
gBoss[1].act_no = 30;
gBoss[2].act_no = 30;
// Fallthrough
case 601:
++gBoss[0].act_wait;
if (gBoss[0].life < gBoss[0].count2 - 200 || gBoss[0].act_wait > 300)
{
gBoss[0].act_no = 602;
gBoss[0].act_wait = 0;
}
break;
case 602:
gBoss[0].act_no = 603;
gBoss[0].act_wait = 0;
gBoss[0].count1 = 0;
gBoss[1].act_no = 40;
gBoss[2].act_no = 40;
break;
case 603:
if (++gBoss[0].act_wait > 50)
{
if (gMC.x < gBoss[0].x)
gBoss[0].act_no = 100;
else
gBoss[0].act_no = 200;
}
break;
case 1000:
SetQuake(2);
if (++gBoss[0].act_wait % 8 == 0)
PlaySoundObject(52, 1);
SetDestroyNpChar(gBoss[0].x + (Random(-0x48, 0x48) * 0x200), gBoss[0].y + (Random(-0x40, 0x40) * 0x200), 1, 1);
if (gBoss[0].act_wait > 100)
{
gBoss[0].act_wait = 0;
gBoss[0].act_no = 1001;
SetFlash(gBoss[0].x, gBoss[0].y, 1);
PlaySoundObject(35, 1);
}
break;
case 1001:
SetQuake(40);
if (++gBoss[0].act_wait > 50)
{
for (int i = 0; i < 20; ++i)
gBoss[i].cond = 0;
DeleteNpCharCode(158, 1);
SetNpChar(159, gBoss[0].x, gBoss[0].y - 0x3000, 0, 0, 0, 0, 0);
}
break;
}
ActBossChar03_01(&gBoss[9]);
ActBossChar03_01(&gBoss[10]);
ActBossChar03_01(&gBoss[11]);
ActBossChar03_01(&gBoss[12]);
gBoss[0].x += ((gBoss[11].x + gBoss[10].x + gBoss[9].x + gBoss[12].x) / 4 - gBoss[0].x) / 16;
ActBossChar03_face(&gBoss[7]);
ActBossChar03_02(&gBoss[13]);
ActBossChar03_02(&gBoss[14]);
ActBossChar03_02(&gBoss[15]);
ActBossChar03_02(&gBoss[16]);
ActBossChar03_03(&gBoss[1]);
ActBossChar03_03(&gBoss[2]);
if (gBoss[3].cond)
ActBossChar03_04(&gBoss[3]);
if (gBoss[4].cond)
ActBossChar03_04(&gBoss[4]);
if (gBoss[5].cond)
ActBossChar03_04(&gBoss[5]);
if (gBoss[6].cond)
ActBossChar03_04(&gBoss[6]);
if (gBoss[0].life == 0 && gBoss[0].act_no < 1000)
{
gBoss[0].act_no = 1000;
gBoss[0].act_wait = 0;
gBoss[0].shock = 0x96;
gBoss[9].act_no = 300;
gBoss[10].act_no = 300;
gBoss[11].act_no = 300;
gBoss[12].act_no = 300;
}
}

3
src/BossX.h Normal file
View file

@ -0,0 +1,3 @@
#pragma once
void ActBossChar_MonstX(void);

View file

@ -915,7 +915,7 @@ void ActBullet_Bom(BULLET *bul, int level)
}
PlaySoundObject(44, 1);
// Fallthrough
case 1:
if (level == 1)
{

View file

@ -17,7 +17,7 @@ void InitCaret()
void ActCaret00(CARET *crt)
{
;
(void)crt;
}
void ActCaret01(CARET *crt)

View file

@ -1,5 +1,5 @@
#pragma once
#define PATH_LENGTH 260 //Pixel had the path size locked to 260 (dangerously low), if you tried to open the executable in a path with more than around 220 characters, it'd crash.
#define WINDOW_WIDTH 320
#define WINDOW_HEIGHT 240
#define WINDOW_WIDTH ((320*16)/9)
#define WINDOW_HEIGHT 320

View file

@ -145,9 +145,9 @@ static void FlushSurface(int surf_no)
unsigned char (*src_pixels)[surf[surf_no].surface->pitch / 4][4] = (unsigned char (*)[surf[surf_no].surface->pitch/ 4][4])surf[surf_no].surface->pixels;
unsigned char (*dst_pixels)[pitch / 4][4] = (unsigned char (*)[pitch/ 4][4])raw_pixels;
for (unsigned int h = 0; h < surf[surf_no].surface->h; ++h)
for (int h = 0; h < surf[surf_no].surface->h; ++h)
{
for (unsigned int w = 0; w < surf[surf_no].surface->w; ++w)
for (int w = 0; w < surf[surf_no].surface->w; ++w)
{
dst_pixels[h][w][0] = src_pixels[h][w][0];
dst_pixels[h][w][1] = src_pixels[h][w][1];

View file

@ -10,7 +10,7 @@ int Call_Escape()
{
RECT rc = {0, 128, 208, 144};
while (Flip_SystemTask())
while (1)
{
//Get pressed keys
GetTrg();
@ -35,9 +35,14 @@ int Call_Escape()
CortBox(&grcFull, 0x000000);
PutBitmap3(&grcFull, (WINDOW_WIDTH - 208) / 2, (WINDOW_HEIGHT - 16) / 2, &rc, 26);
PutFramePerSecound();
if (!Flip_SystemTask())
{
//Quit if window is closed
gKeyTrg = 0;
return 0;
}
}
//Quit if window is closed
gKeyTrg = 0;
return 0;
}

View file

@ -58,7 +58,7 @@ static unsigned long UTF8ToCode(const unsigned char *string, unsigned int *bytes
case 3:
case 4:
length = zero_bit;
charcode = string[0] & (1 << (8 - zero_bit)) - 1;
charcode = (string[0] & (1 << (8 - zero_bit))) - 1;
for (unsigned int i = 1; i < zero_bit; ++i)
{
@ -230,7 +230,7 @@ void DrawText(FontObject *font_object, SDL_Surface *surface, int x, int y, unsig
const int letter_x = x + pen_x + face->glyph->bitmap_left;
const int letter_y = y + ((FT_MulFix(face->ascender, face->size->metrics.y_scale) - face->glyph->metrics.horiBearingY + (64 / 2)) / 64);
for (int iy = MAX(-letter_y, 0); letter_y + iy < MIN(letter_y + converted.rows, surface->h); ++iy)
for (int iy = MAX(-letter_y, 0); letter_y + iy < MIN(letter_y + converted.rows, (unsigned int)surface->h); ++iy)
{
if (face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_LCD)
{

View file

@ -6,6 +6,7 @@
#include "NpChar.h"
#include "Game.h"
#include "CommonDefines.h"
#include "Boss.h"
FRAME gFrame;
@ -148,8 +149,8 @@ void SetFrameTargetNpChar(int event, int wait)
void SetFrameTargetBoss(int no, int wait)
{
//gFrame.tgt_x = &gBoss[no].x;
//gFrame.tgt_y = &gBoss[no].y;
gFrame.tgt_x = &gBoss[no].x;
gFrame.tgt_y = &gBoss[no].y;
gFrame.wait = wait;
}

View file

@ -92,7 +92,7 @@ void PutNumber4(int x, int y, int value, bool bZero)
}
//Draw digit
if ( bZero && offset == 2 || sw != 0 || offset == 3 )
if ((bZero && offset == 2) || sw != 0 || offset == 3 )
PutBitmap3(&rcClient, x + 8 * offset, y, &rect[a], SURFACE_ID_TEXT_BOX);
//Go to next digit
@ -119,7 +119,7 @@ int ModeOpening()
CutNoise();
int wait = 0;
unsigned int wait = 0;
while (wait < 500)
{
//Increase timer
@ -295,7 +295,7 @@ int ModeTitle()
gMC.equip |= 0x100;
//Start loop
int wait = 0;
unsigned int wait = 0;
while (true)
{

View file

@ -149,12 +149,37 @@ void ActNpc143(NPCHAR *npc);
void ActNpc144(NPCHAR *npc);
void ActNpc145(NPCHAR *npc);
void ActNpc146(NPCHAR *npc);
void ActNpc147(NPCHAR *npc);
void ActNpc148(NPCHAR *npc);
void ActNpc149(NPCHAR *npc);
void ActNpc150(NPCHAR *npc);
void ActNpc151(NPCHAR *npc);
void ActNpc153(NPCHAR *npc);
void ActNpc154(NPCHAR *npc);
void ActNpc155(NPCHAR *npc);
void ActNpc156(NPCHAR *npc);
void ActNpc157(NPCHAR *npc);
void ActNpc158(NPCHAR *npc);
void ActNpc159(NPCHAR *npc);
void ActNpc160(NPCHAR *npc);
void ActNpc161(NPCHAR *npc);
void ActNpc162(NPCHAR *npc);
void ActNpc163(NPCHAR *npc);
void ActNpc164(NPCHAR *npc);
void ActNpc165(NPCHAR *npc);
void ActNpc166(NPCHAR *npc);
void ActNpc167(NPCHAR *npc);
void ActNpc168(NPCHAR *npc);
void ActNpc169(NPCHAR *npc);
void ActNpc170(NPCHAR *npc);
void ActNpc173(NPCHAR *npc);
void ActNpc174(NPCHAR *npc);
void ActNpc192(NPCHAR *npc);
void ActNpc193(NPCHAR *npc);
void ActNpc194(NPCHAR *npc);
void ActNpc199(NPCHAR *npc);
@ -172,6 +197,8 @@ void ActNpc300(NPCHAR *npc);
void ActNpc302(NPCHAR *npc);
void ActNpc334(NPCHAR *npc);
void ActNpc355(NPCHAR *npc);
void ActNpc359(NPCHAR *npc);

View file

@ -414,7 +414,7 @@ void ActNpc005(NPCHAR *npc)
case 0: //Init
npc->y += 0x600;
npc->act_no = 1;
// Fallthrough
case 1: //Waiting
//Look at player
if (npc->x <= gMC.x)

View file

@ -52,7 +52,7 @@ void ActNpc021(NPCHAR *npc)
break;
}
RECT rect[0];
RECT rect[1];
rect[0] = {224, 40, 240, 48};

View file

@ -39,6 +39,7 @@ void ActNpc040(NPCHAR *npc)
npc->act_no = 1;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 1:
if (Random(0, 120) == 10)
{
@ -65,6 +66,7 @@ void ActNpc040(NPCHAR *npc)
npc->act_no = 4;
npc->ani_no = 2;
npc->ani_wait = 0;
// Fallthrough
case 4:
if (++npc->ani_wait > 4)
{

View file

@ -639,7 +639,7 @@ void ActNpc064(NPCHAR *npc)
case 0: //Init
npc->y += 0x600;
npc->act_no = 1;
// Fallthrough
case 1: //Waiting
//Look at player
if (npc->x <= gMC.x)

File diff suppressed because it is too large Load diff

1154
src/NpcAct160.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -129,6 +129,22 @@ void ActNpc193(NPCHAR *npc)
npc->rect = rc[0];
}
//Blue robot (broken)
void ActNpc194(NPCHAR *npc)
{
RECT rc[1];
rc[0] = {192, 120, 224, 128};
if (npc->act_no == 0)
{
npc->act_no = 1;
npc->y += 0x800;
}
npc->rect = rc[0];
}
//Water/wind particles
void ActNpc199(NPCHAR *npc)
{

View file

@ -34,5 +34,5 @@ void ActNpc219(NPCHAR *npc)
else if (Random(0, 40) == 1)
SetNpChar(4, npc->x + (Random(-20, 20) * 0x200), npc->y, 0, -0x200, 0, 0, 0x100);
npc->rect = rc[1];
}
npc->rect = rc[0];
}

View file

@ -13,6 +13,8 @@
//Quake
void ActNpc292(NPCHAR *npc)
{
(void)npc;
SetQuake(10);
}

56
src/NpcAct320.cpp Normal file
View file

@ -0,0 +1,56 @@
#include "WindowsWrapper.h"
#include "NpcAct.h"
#include "MyChar.h"
#include "NpChar.h"
#include "Game.h"
#include "Sound.h"
#include "Back.h"
#include "Triangle.h"
//Sweat
void ActNpc334(NPCHAR *npc)
{
RECT rcLeft[2];
RECT rcRight[2];
rcLeft[0] = {160, 184, 168, 200};
rcLeft[1] = {168, 184, 176, 200};
rcRight[0] = {176, 184, 184, 200};
rcRight[1] = {184, 184, 192, 200};
switch (npc->act_no)
{
case 0:
npc->act_no = 10;
if (npc->direct == 0)
{
npc->x += 0x1400;
npc->y -= 0x2400;
}
else
{
npc->x = gMC.x - 0x1400;
npc->y = gMC.y - 0x400;
}
// Fallthrough
case 10:
if (++npc->act_wait / 8 & 1)
npc->ani_no = 0;
else
npc->ani_no = 1;
if (npc->act_wait >= 64)
npc->cond = 0;
break;
}
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}

View file

@ -19,7 +19,7 @@ bool LoadNpcTable(const char *path)
const size_t tblSize = SDL_RWsize(fp);
const int npcCount = tblSize / 0x18;
const size_t npcCount = tblSize / 0x18;
gNpcTable = (NPC_TABLE*)malloc(npcCount * sizeof(NPC_TABLE));
for (size_t i = 0; i < npcCount; i++) //bits
@ -203,34 +203,34 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc144,
ActNpc145,
ActNpc146,
nullptr,
nullptr,
nullptr,
ActNpc147,
ActNpc148,
ActNpc149,
ActNpc150,
ActNpc151,
nullptr,
ActNpc153,
ActNpc154,
ActNpc155,
ActNpc156,
ActNpc157,
ActNpc158,
ActNpc159,
ActNpc160,
ActNpc161,
ActNpc162,
ActNpc163,
ActNpc164,
ActNpc165,
ActNpc166,
ActNpc167,
ActNpc168,
ActNpc169,
ActNpc170,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc173,
ActNpc174,
nullptr,
nullptr,
nullptr,
@ -250,7 +250,7 @@ NPCFUNCTION gpNpcFuncTbl[361] =
nullptr,
ActNpc192,
ActNpc193,
nullptr,
ActNpc194,
nullptr,
nullptr,
nullptr,
@ -390,7 +390,7 @@ NPCFUNCTION gpNpcFuncTbl[361] =
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc334,
nullptr,
nullptr,
nullptr,

View file

@ -123,7 +123,7 @@ bool MakeSoundObject8(int8_t *wavep, int8_t track, int8_t pipi)
uint8_t *wp_sub = wp;
size_t wav_tp = 0;
for (int i = 0; i < data_size; i++)
for (size_t i = 0; i < data_size; i++)
{
uint8_t work = *(wavep+wav_tp);
work += 0x80;

View file

@ -97,15 +97,15 @@ void PutStageSelectObject(void)
RECT rcCur[2];
RECT rcTitle1;
rcView = {0, 0, 320, 240};
rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
rcCur[0] = {80, 88, 112, 104};
rcCur[1] = {80, 104, 112, 120};
rcTitle1 = {80, 64, 144, 72};
if (gStageSelectTitleY > 46)
if (gStageSelectTitleY > (WINDOW_HEIGHT / 2) - 74)
--gStageSelectTitleY;
PutBitmap3(&rcView, 128, gStageSelectTitleY, &rcTitle1, SURFACE_ID_TEXT_BOX);
PutBitmap3(&rcView, (WINDOW_WIDTH / 2) - 32, gStageSelectTitleY, &rcTitle1, SURFACE_ID_TEXT_BOX);
int stage_num;
for (stage_num = 0; gPermitStage[stage_num].index; ++stage_num);
@ -114,9 +114,9 @@ void PutStageSelectObject(void)
if (stage_num)
{
int stage_x = (320 - 40 * stage_num) / 2;
int stage_x = (WINDOW_WIDTH - 40 * stage_num) / 2;
PutBitmap3(&rcView, stage_x + 40 * gSelectedStage, 64, &rcCur[(flash >> 1) % 2], SURFACE_ID_TEXT_BOX);
PutBitmap3(&rcView, stage_x + 40 * gSelectedStage, (WINDOW_HEIGHT / 2) - 56, &rcCur[(flash >> 1) % 2], SURFACE_ID_TEXT_BOX);
for (int i = 0; i < 8 && gPermitStage[i].index; ++i)
{
@ -126,7 +126,7 @@ void PutStageSelectObject(void)
rcStage.top = 16 * (gPermitStage[i].index / 8);
rcStage.bottom = rcStage.top + 16;
PutBitmap3(&rcView, stage_x + 40 * i, 64, &rcStage, SURFACE_ID_STAGE_ITEM);
PutBitmap3(&rcView, stage_x + 40 * i, (WINDOW_HEIGHT / 2) - 56, &rcStage, SURFACE_ID_STAGE_ITEM);
}
}
}
@ -135,13 +135,13 @@ int StageSelectLoop(int *p_event)
{
char old_script_path[260];
RECT rcView = {0, 0, 320, 240};
RECT rcView = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
gSelectedStage = 0;
BackupSurface(10, &grcFull);
GetTextScriptPath(old_script_path);
LoadTextScript2("StageSelect.tsc");
gStageSelectTitleY = 54;
gStageSelectTitleY = (WINDOW_HEIGHT / 2) - 66;
StartTextScript(gPermitStage[gSelectedStage].index + 1000);
do

View file

@ -886,7 +886,7 @@ void ShootBullet_Spur(int level)
bMax = false;
}
if (gKey & gKeyShot == 0)
if (!(gKey & gKeyShot))
ZeroExpMyChar();
switch (level)

View file

@ -76,18 +76,12 @@ SOUNDBUFFER::~SOUNDBUFFER()
void SOUNDBUFFER::Release()
{
if (this == NULL)
return;
//TODO: find a better and more stable(?) way to handle this function
delete this;
}
void SOUNDBUFFER::Lock(uint8_t **outBuffer, size_t *outSize)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
if (outBuffer != nullptr)
@ -99,17 +93,11 @@ void SOUNDBUFFER::Lock(uint8_t **outBuffer, size_t *outSize)
void SOUNDBUFFER::Unlock()
{
if (this == NULL)
return;
SDL_UnlockAudioDevice(audioDevice);
}
void SOUNDBUFFER::SetCurrentPosition(uint32_t dwNewPosition)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
samplePosition = dwNewPosition;
SDL_UnlockAudioDevice(audioDevice);
@ -117,9 +105,6 @@ void SOUNDBUFFER::SetCurrentPosition(uint32_t dwNewPosition)
void SOUNDBUFFER::SetFrequency(uint32_t dwFrequency)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
frequency = (double)dwFrequency;
SDL_UnlockAudioDevice(audioDevice);
@ -134,9 +119,6 @@ float MillibelToVolume(int32_t lVolume)
void SOUNDBUFFER::SetVolume(int32_t lVolume)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
volume = MillibelToVolume(lVolume);
SDL_UnlockAudioDevice(audioDevice);
@ -144,9 +126,6 @@ void SOUNDBUFFER::SetVolume(int32_t lVolume)
void SOUNDBUFFER::SetPan(int32_t lPan)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
volume_l = MillibelToVolume(-lPan);
volume_r = MillibelToVolume(lPan);
@ -155,9 +134,6 @@ void SOUNDBUFFER::SetPan(int32_t lPan)
void SOUNDBUFFER::Play(bool bLooping)
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
playing = true;
looping = bLooping;
@ -166,9 +142,6 @@ void SOUNDBUFFER::Play(bool bLooping)
void SOUNDBUFFER::Stop()
{
if (this == NULL)
return;
SDL_LockAudioDevice(audioDevice);
playing = false;
SDL_UnlockAudioDevice(audioDevice);
@ -176,9 +149,6 @@ void SOUNDBUFFER::Stop()
void SOUNDBUFFER::Mix(float (*buffer)[2], size_t samples)
{
if (this == NULL)
return;
if (!playing) //This sound buffer isn't playing
return;
@ -225,6 +195,8 @@ void SOUNDBUFFER::Mix(float (*buffer)[2], size_t samples)
//Sound mixer
void AudioCallback(void *userdata, uint8_t *stream, int len)
{
(void)userdata;
float (*buffer)[2] = (float(*)[2])stream;
const size_t samples = len / (sizeof(float) * 2);

View file

@ -27,6 +27,7 @@
#include "Map.h"
#include "BossLife.h"
#include "SelStage.h"
#include "Flash.h"
#define IS_COMMAND(c1, c2, c3) gTS.data[gTS.p_read + 1] == c1 && gTS.data[gTS.p_read + 2] == c2 && gTS.data[gTS.p_read + 3] == c3
@ -472,7 +473,7 @@ void PutTextScript()
PutBitmap3(&grcFull, (WINDOW_WIDTH + 112) / 2, i, &rect_yesno, 26);
if (gTS.wait == 16)
PutBitmap3(&grcFull, 41 * gTS.select + (WINDOW_WIDTH + 102) / 2, 154, &rect_cur, 26);
PutBitmap3(&grcFull, 41 * gTS.select + (WINDOW_WIDTH + 102) / 2, WINDOW_HEIGHT - 86, &rect_cur, 26);
}
}
}
@ -521,7 +522,6 @@ int TextScriptProc()
else if (gTS.flags & 0x10)
{
//SAT/CAT/TUR printing
x;
for (x = gTS.p_read; ; x++)
{
//Break if reaches command, or new-line
@ -673,6 +673,14 @@ int TextScriptProc()
SubArmsData(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('T','A','M'))
{
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
z = GetTextScriptNo(gTS.p_read + 14);
TradeArms(x, y, z);
gTS.p_read += 18;
}
else if (IS_COMMAND('P','S','+'))
{
x = GetTextScriptNo(gTS.p_read + 4);
@ -943,6 +951,11 @@ int TextScriptProc()
SetQuake(z);
gTS.p_read += 8;
}
else if (IS_COMMAND('F','L','A'))
{
SetFlash(0, 0, 2);
gTS.p_read += 4;
}
else if (IS_COMMAND('F','A','I'))
{
z = GetTextScriptNo(gTS.p_read + 4);
@ -977,6 +990,13 @@ int TextScriptProc()
SetFrameTargetNpChar(x, y);
gTS.p_read += 13;
}
else if (IS_COMMAND('F','O','B'))
{
x = GetTextScriptNo(gTS.p_read + 4);
y = GetTextScriptNo(gTS.p_read + 9);
SetFrameTargetBoss(x, y);
gTS.p_read += 13;
}
else if (IS_COMMAND('S','O','U'))
{
z = GetTextScriptNo(gTS.p_read + 4);

View file

@ -21,7 +21,7 @@ void SetValueView(int *px, int *py, int value)
int i;
//TODO: Boi I'm reaaaally boutta getcho pickle chin aah boi, egg head like collard greens head ass boi, ol' hell dat bell dirt aaah boi stank ah boi afro head ass, lip gloss chin ah boi ugly ahhh boi *snort* uglaaaa
for (i = 0; i < VALUEVIEW_MAX && (!gVV[i].flag || gVV[i].px != px || (gVV[i].value >= 0 || value >= 0) && (gVV[i].value <= 0 || value <= 0)); i++);
for (i = 0; i < VALUEVIEW_MAX && (!gVV[i].flag || gVV[i].px != px || ((gVV[i].value >= 0 || value >= 0) && (gVV[i].value <= 0 || value <= 0))); i++);
int index;
if (i == VALUEVIEW_MAX)