Merge pull request #40 from Clownacy/master

Lotsa NPCs, and added the remaining bullet types
This commit is contained in:
Cucky 2019-02-05 16:51:07 -05:00 committed by GitHub
commit bae5773652
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 7672 additions and 97 deletions

View file

@ -42,6 +42,7 @@ SOURCES = \
ArmsItem \
Back \
Boss \
BossFrog \
BossLife \
BossOhm \
BulHit \
@ -76,6 +77,7 @@ SOURCES = \
NpcAct100 \
NpcAct120 \
NpcAct140 \
NpcAct180 \
NpcAct200 \
NpcAct260 \
NpcAct280 \

View file

@ -9,6 +9,7 @@
#include "Sound.h"
#include "Main.h"
#include "Game.h"
#include "Shoot.h"
int gArmsEnergyX = 16;
@ -457,7 +458,7 @@ int RotationArms()
if (!arms_num)
return 0;
//ResetSpurCharge();
ResetSpurCharge();
++gSelectedArms;
while (gSelectedArms < arms_num && !gArmsData[gSelectedArms].code)
@ -479,7 +480,7 @@ int RotationArmsRev()
if (!arms_num)
return 0;
//ResetSpurCharge();
ResetSpurCharge();
if (--gSelectedArms < 0)
gSelectedArms = arms_num - 1;

View file

@ -4,6 +4,7 @@
#include "WindowsWrapper.h"
#include "Boss.h"
#include "BossFrog.h"
#include "BossOhm.h"
#include "NpChar.h"
#include "MyChar.h"
@ -184,16 +185,16 @@ void ActBossChar_0()
BOSSFUNCTION gpBossFuncTbl[10] =
{
&ActBossChar_0,
&ActBossChar_Omega,
nullptr, //&ActBossChar_Frog,
nullptr, //&ActBossChar_MonstX,
nullptr, //&ActBossChar_Core,
nullptr, //&ActBossChar_Ironhead,
nullptr, //&ActBossChar_Twin,
nullptr, //&ActBossChar_Undead,
nullptr, //&ActBossChar_Press,
nullptr, //&ActBossChar_Ballos
ActBossChar_0,
ActBossChar_Omega,
ActBossChar_Frog,
nullptr, //ActBossChar_MonstX,
nullptr, //ActBossChar_Core,
nullptr, //ActBossChar_Ironhead,
nullptr, //ActBossChar_Twin,
nullptr, //ActBossChar_Undead,
nullptr, //ActBossChar_Press,
nullptr, //ActBossChar_Ballos
};
void ActBossChar()

525
src/BossFrog.cpp Normal file
View file

@ -0,0 +1,525 @@
#include "BossFrog.h"
#include "Boss.h"
#include "Frame.h"
#include "Game.h"
#include "MyChar.h"
#include "NpChar.h"
#include "Sound.h"
#include "Triangle.h"
#include "WindowsWrapper.h"
static void ActBossChar02_01(void)
{
int minus;
if (gBoss[0].direct == 0)
minus = 1;
else
minus = -1;
switch (gBoss[0].ani_no)
{
case 0:
gBoss[1].hit_voice = 52;
gBoss[1].hit.front = 0x2000;
gBoss[1].hit.top = 0x2000;
gBoss[1].hit.back = 0x2000;
gBoss[1].hit.bottom = 0x2000;
gBoss[1].size = 3;
gBoss[1].bits = 4;
break;
case 1:
gBoss[1].x = gBoss[0].x + -0x3000 * minus;
gBoss[1].y = gBoss[0].y - 0x3000;
break;
case 2:
gBoss[1].x = gBoss[0].x + -0x3000 * minus;
gBoss[1].y = gBoss[0].y - 0x2800;
break;
case 3:
case 4:
gBoss[1].x = gBoss[0].x + -0x3000 * minus;
gBoss[1].y = gBoss[0].y - 0x2000;
break;
case 5:
gBoss[1].x = gBoss[0].x + -0x3000 * minus;
gBoss[1].y = gBoss[0].y - 0x5600;
break;
}
}
static void ActBossChar02_02(void)
{
if (gBoss[0].ani_no)
{
if (gBoss[0].ani_no > 0 && gBoss[0].ani_no <= 5)
{
gBoss[2].x = gBoss[0].x;
gBoss[2].y = gBoss[0].y;
}
}
else
{
gBoss[2].hit_voice = 52;
gBoss[2].hit.front = 0x3000;
gBoss[2].hit.top = 0x2000;
gBoss[2].hit.back = 0x3000;
gBoss[2].hit.bottom = 0x2000;
gBoss[2].size = 3;
gBoss[2].bits = 4;
}
}
void ActBossChar_Frog(void)
{
RECT rcLeft[9];
RECT rcRight[9];
rcLeft[0] = {0, 0, 0, 0};
rcLeft[1] = {0, 48, 80, 112};
rcLeft[2] = {0, 112, 80, 176};
rcLeft[3] = {0, 176, 80, 240};
rcLeft[4] = {160, 48, 240, 112};
rcLeft[5] = {160, 112, 240, 200};
rcLeft[6] = {200, 0, 240, 24};
rcLeft[7] = {80, 0, 120, 24};
rcLeft[8] = {120, 0, 160, 24};
rcRight[0] = {0, 0, 0, 0};
rcRight[1] = {80, 48, 160, 112};
rcRight[2] = {80, 112, 160, 176};
rcRight[3] = {80, 176, 160, 240};
rcRight[4] = {240, 48, 320, 112};
rcRight[5] = {240, 112, 320, 200};
rcRight[6] = {200, 24, 240, 48};
rcRight[7] = {80, 24, 120, 48};
rcRight[8] = {120, 24, 160, 48};
switch (gBoss[0].act_no)
{
case 0:
gBoss->x = 0xC000;
gBoss->y = 0x19000;
gBoss->direct = 2;
gBoss->view.front = 0x6000;
gBoss->view.top = 0x6000;
gBoss->view.back = 0x4000;
gBoss->view.bottom = 0x2000;
gBoss->hit_voice = 52;
gBoss->hit.front = 0x3000;
gBoss->hit.top = 0x2000;
gBoss->hit.back = 0x3000;
gBoss->hit.bottom = 0x2000;
gBoss->size = 3;
gBoss->exp = 1;
gBoss->code_event = 1000;
gBoss->bits |= 0x8200;
gBoss->life = 300;
break;
case 10:
gBoss->act_no = 11;
gBoss->ani_no = 3;
gBoss->cond = 0x80;
gBoss->rect = rcRight[0];
gBoss[1].cond = -112;
gBoss[1].code_event = 1000;
gBoss[2].cond = 0x80;
gBoss[1].damage = 5;
gBoss[2].damage = 5;
for (int i = 0; i < 8; ++i)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
break;
case 20:
gBoss->act_no = 21;
gBoss->act_wait = 0;
// Fallthrough
case 21:
if (++gBoss->act_wait / 2 % 2)
gBoss->ani_no = 3;
else
gBoss->ani_no = 0;
break;
case 100:
gBoss->act_no = 101;
gBoss->act_wait = 0;
gBoss->ani_no = 1;
gBoss->xm = 0;
// Fallthrough
case 101:
if (++gBoss->act_wait > 50)
{
gBoss->act_no = 102;
gBoss->ani_wait = 0;
gBoss->ani_no = 2;
}
break;
case 102:
if (++gBoss->ani_wait > 10)
{
gBoss->act_no = 103;
gBoss->ani_wait = 0;
gBoss->ani_no = 1;
}
break;
case 103:
if (++gBoss->ani_wait > 4)
{
gBoss->act_no = 104;
gBoss->ani_no = 5;
gBoss->ym = -0x400;
PlaySoundObject(25, 1);
if (gBoss->direct == 0)
gBoss->xm = -0x200u;
else
gBoss->xm = 0x200;
gBoss->view.top = 0x8000;
gBoss->view.bottom = 0x3000;
}
break;
case 104:
if (gBoss->direct == 0 && gBoss->flag & 1)
{
gBoss->direct = 2;
gBoss->xm = 0x200;
}
if (gBoss->direct == 2 && gBoss->flag & 4)
{
gBoss->direct = 0;
gBoss->xm = -0x200;
}
if (gBoss->flag & 8)
{
PlaySoundObject(26, 1);
SetQuake(30);
gBoss->act_no = 100;
gBoss->ani_no = 1;
gBoss->view.top = 0x6000;
gBoss->view.bottom = 0x2000;
if (gBoss->direct == 0 && gBoss->x < gMC.x)
{
gBoss->direct = 2;
gBoss->act_no = 110;
}
if (gBoss->direct == 2 && gBoss->x > gMC.x)
{
gBoss->direct = 0;
gBoss->act_no = 110;
}
SetNpChar(110, Random(4, 16) * 0x2000, Random(0, 4) * 0x2000, 0, 0, 4, 0, 0x80);
for (int i = 0; i < 4; ++i)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + gBoss->hit.bottom, Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
}
break;
case 110:
gBoss->ani_no = 1;
gBoss->act_wait = 0;
gBoss->act_no = 111;
// Fallthrough
case 111:
++gBoss->act_wait;
gBoss->xm = 8 * gBoss->xm / 9;
if (gBoss->act_wait > 50)
{
gBoss->ani_no = 2;
gBoss->ani_wait = 0;
gBoss->act_no = 112;
}
break;
case 112:
if (++gBoss->ani_wait > 4)
{
gBoss->act_no = 113;
gBoss->act_wait = 0;
gBoss->ani_no = 3;
gBoss->count1 = 16;
gBoss[1].bits |= 0x20;
gBoss->tgt_x = gBoss->life;
}
break;
case 113:
if (gBoss->shock)
{
if (gBoss->count2++ / 2 % 2)
gBoss->ani_no = 4;
else
gBoss->ani_no = 3;
}
else
{
gBoss->count2 = 0;
gBoss->ani_no = 3;
}
gBoss->xm = 10 * gBoss->xm / 11;
if (++gBoss->act_wait > 16)
{
gBoss->act_wait = 0;
--gBoss->count1;
unsigned char deg;
if (gBoss->direct == 0)
deg = GetArktan(gBoss->x - 0x4000 - gMC.x, gBoss->y - 0x1000 - gMC.y);
else
deg = GetArktan(gBoss->x + 0x4000 - gMC.x, gBoss->y - 0x1000 - gMC.y);
deg += Random(-16, 16);
int ym = GetSin(deg);
int xm = GetCos(deg);
if (gBoss->direct == 0)
SetNpChar(108, gBoss->x - 0x4000, gBoss->y - 0x1000, xm, ym, 0, 0, 0x100);
else
SetNpChar(108, gBoss->x + 0x4000, gBoss->y - 0x1000, xm, ym, 0, 0, 0x100);
PlaySoundObject(39, 1);
if (gBoss->count1 == 0 || gBoss->life < gBoss->tgt_x - 90)
{
gBoss->act_no = 114;
gBoss->act_wait = 0;
gBoss->ani_no = 2;
gBoss->ani_wait = 0;
gBoss[1].bits &= ~0x20;
}
}
break;
case 114:
if (++gBoss->ani_wait > 10)
{
if (++gBoss[1].count1 > 2)
{
gBoss[1].count1 = 0;
gBoss->act_no = 120;
}
else
{
gBoss->act_no = 100;
}
gBoss->ani_wait = 0;
gBoss->ani_no = 1;
}
break;
case 120:
gBoss->act_no = 121;
gBoss->act_wait = 0;
gBoss->ani_no = 1;
gBoss->xm = 0;
// Fallthrough
case 121:
if (++gBoss->act_wait > 50)
{
gBoss->act_no = 122;
gBoss->ani_wait = 0;
gBoss->ani_no = 2;
}
break;
case 122:
if (++gBoss->ani_wait > 20)
{
gBoss->act_no = 123;
gBoss->ani_wait = 0;
gBoss->ani_no = 1;
}
break;
case 123:
if (++gBoss->ani_wait > 4)
{
gBoss->act_no = 124;
gBoss->ani_no = 5;
gBoss->ym = -0xA00;
gBoss->view.top = 0x8000;
gBoss->view.bottom = 0x3000;
PlaySoundObject(25, 1);
}
break;
case 124:
if (gBoss->flag & 8)
{
PlaySoundObject(26, 1);
SetQuake(60);
gBoss->act_no = 100;
gBoss->ani_no = 1;
gBoss->view.top = 0x6000;
gBoss->view.bottom = 0x2000;
for (int i = 0; i < 2; ++i)
SetNpChar(104, Random(4, 16) * 0x2000, Random(0, 4) * 0x2000, 0, 0, 4, 0, 0x80);
for (int i = 0; i < 6; ++i)
SetNpChar(110, Random(4, 16) * 0x2000, Random(0, 4) * 0x2000, 0, 0, 4, 0, 0x80);
for (int i = 0; i < 8; ++i)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + gBoss->hit.bottom, Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
if (gBoss->direct == 0 && gMC.x > gBoss->x)
{
gBoss->direct = 2;
gBoss->act_no = 110;
}
if ( gBoss->direct == 2 && gMC.x < gBoss->x)
{
gBoss->direct = 0;
gBoss->act_no = 110;
}
}
break;
case 130:
gBoss->act_no = 131;
gBoss->ani_no = 3;
gBoss->act_wait = 0;
gBoss->xm = 0;
PlaySoundObject(72, 1);
for (int i = 0; i < 8; ++i)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
gBoss[1].cond = 0;
gBoss[2].cond = 0;
// Fallthrough
case 131:
if (++gBoss->act_wait % 5 == 0)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
if (gBoss->act_wait / 2 % 2)
gBoss->x -= 0x200;
else
gBoss->x += 0x200;
if (gBoss->act_wait > 100)
{
gBoss->act_wait = 0;
gBoss->act_no = 132;
}
break;
case 132:
if (++gBoss->act_wait / 2 % 2)
{
gBoss->view.front = 0x2800;
gBoss->view.top = 0x1800;
gBoss->view.back = 0x2800;
gBoss->view.bottom = 0x1800;
gBoss->ani_no = 6;
}
else
{
gBoss->view.front = 0x6000;
gBoss->view.top = 0x6000;
gBoss->view.back = 0x4000;
gBoss->view.bottom = 0x2000;
gBoss->ani_no = 3;
}
if (gBoss->act_wait % 9 == 0)
SetNpChar(4, gBoss->x + (Random(-12, 12) * 0x200), gBoss->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
if (gBoss->act_wait > 150)
{
gBoss->act_no = 140;
gBoss->hit.bottom = 0x1800;
}
break;
case 140:
gBoss->act_no = 141;
// Fallthrough
case 141:
if (gBoss->flag & 8)
{
gBoss->act_no = 142;
gBoss->act_wait = 0;
gBoss->ani_no = 7;
}
break;
case 142:
if (++gBoss->act_wait > 30)
{
gBoss->ani_no = 8;
gBoss->ym = -0xA00;
gBoss->bits |= 8;
gBoss->act_no = 143;
}
break;
case 143:
gBoss->ym = -0xA00;
if (gBoss->y < 0)
{
gBoss->cond = 0;
PlaySoundObject(26, 1);
SetQuake(30);
}
break;
}
gBoss->ym += 0x40;
if (gBoss->ym > 0x5FF)
gBoss->ym = 0x5FF;
gBoss->x += gBoss->xm;
gBoss->y += gBoss->ym;
if (gBoss->direct == 0)
gBoss->rect = rcLeft[gBoss->ani_no];
else
gBoss->rect = rcRight[gBoss->ani_no];
ActBossChar02_01();
ActBossChar02_02();
}

3
src/BossFrog.h Normal file
View file

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

File diff suppressed because it is too large Load diff

View file

@ -35,9 +35,10 @@ void ActNpc029(NPCHAR *npc);
void ActNpc030(NPCHAR *npc);
void ActNpc031(NPCHAR *npc);
void ActNpc032(NPCHAR *npc);
void ActNpc033(NPCHAR *npc);
void ActNpc034(NPCHAR *npc);
void ActNpc035(NPCHAR *npc);
void ActNpc036(NPCHAR *npc);
void ActNpc037(NPCHAR *npc);
void ActNpc038(NPCHAR *npc);
void ActNpc039(NPCHAR *npc);
@ -45,11 +46,20 @@ void ActNpc040(NPCHAR *npc);
void ActNpc041(NPCHAR *npc);
void ActNpc042(NPCHAR *npc);
void ActNpc043(NPCHAR *npc);
void ActNpc044(NPCHAR *npc);
void ActNpc045(NPCHAR *npc);
void ActNpc046(NPCHAR *npc);
void ActNpc047(NPCHAR *npc);
void ActNpc048(NPCHAR *npc);
void ActNpc049(NPCHAR *npc);
void ActNpc050(NPCHAR *npc);
void ActNpc051(NPCHAR *npc);
void ActNpc052(NPCHAR *npc);
void ActNpc053(NPCHAR *npc);
void ActNpc054(NPCHAR *npc);
void ActNpc055(NPCHAR *npc);
void ActNpc056(NPCHAR *npc);
void ActNpc057(NPCHAR *npc);
void ActNpc058(NPCHAR *npc);
void ActNpc059(NPCHAR *npc);
void ActNpc060(NPCHAR *npc);
@ -92,33 +102,76 @@ void ActNpc096(NPCHAR *npc);
void ActNpc097(NPCHAR *npc);
void ActNpc098(NPCHAR *npc);
void ActNpc099(NPCHAR *npc);
void ActNpc100(NPCHAR *npc);
void ActNpc101(NPCHAR *npc);
void ActNpc102(NPCHAR *npc);
void ActNpc103(NPCHAR *npc);
void ActNpc104(NPCHAR *npc);
void ActNpc105(NPCHAR *npc);
void ActNpc106(NPCHAR *npc);
void ActNpc107(NPCHAR *npc);
void ActNpc108(NPCHAR *npc);
void ActNpc109(NPCHAR *npc);
void ActNpc110(NPCHAR *npc);
void ActNpc111(NPCHAR *npc);
void ActNpc112(NPCHAR *npc);
void ActNpc113(NPCHAR *npc);
void ActNpc114(NPCHAR *npc);
void ActNpc115(NPCHAR *npc);
void ActNpc116(NPCHAR *npc);
void ActNpc117(NPCHAR *npc);
void ActNpc118(NPCHAR *npc);
void ActNpc119(NPCHAR *npc);
void ActNpc120(NPCHAR *npc);
void ActNpc121(NPCHAR *npc);
void ActNpc122(NPCHAR *npc);
void ActNpc123(NPCHAR *npc);
void ActNpc124(NPCHAR *npc);
void ActNpc125(NPCHAR *npc);
void ActNpc126(NPCHAR *npc);
void ActNpc127(NPCHAR *npc);
void ActNpc128(NPCHAR *npc);
void ActNpc129(NPCHAR *npc);
void ActNpc130(NPCHAR *npc);
void ActNpc131(NPCHAR *npc);
void ActNpc132(NPCHAR *npc);
void ActNpc133(NPCHAR *npc);
void ActNpc134(NPCHAR *npc);
void ActNpc135(NPCHAR *npc);
void ActNpc136(NPCHAR *npc);
void ActNpc137(NPCHAR *npc);
void ActNpc138(NPCHAR *npc);
void ActNpc139(NPCHAR *npc);
void ActNpc140(NPCHAR *npc);
void ActNpc141(NPCHAR *npc);
void ActNpc142(NPCHAR *npc);
void ActNpc143(NPCHAR *npc);
void ActNpc144(NPCHAR *npc);
void ActNpc145(NPCHAR *npc);
void ActNpc146(NPCHAR *npc);
void ActNpc150(NPCHAR *npc);
void ActNpc151(NPCHAR *npc);
void ActNpc192(NPCHAR *npc);
void ActNpc193(NPCHAR *npc);
void ActNpc199(NPCHAR *npc);
void ActNpc211(NPCHAR *npc);
void ActNpc219(NPCHAR *npc);
void ActNpc278(NPCHAR *npc);
void ActNpc292(NPCHAR *npc);
void ActNpc298(NPCHAR *npc);
void ActNpc299(NPCHAR *npc);
void ActNpc300(NPCHAR *npc);
void ActNpc302(NPCHAR *npc);
void ActNpc355(NPCHAR *npc);
void ActNpc359(NPCHAR *npc);

View file

@ -963,7 +963,47 @@ void ActNpc032(NPCHAR *npc)
npc->rect = rect[npc->ani_no];
}
// Bed
//Balrog bouncing projectile
void ActNpc033(NPCHAR *npc)
{
if (npc->flag & 5)
{
SetCaret(npc->x, npc->y, 2, 0);
npc->cond = 0;
}
else if (npc->flag & 8)
{
npc->ym = -0x400;
}
npc->ym += 0x2A;
npc->y += npc->ym;
npc->x += npc->xm;
RECT rect_left[2];
rect_left[0] = {240, 64, 256, 80};
rect_left[1] = {240, 80, 256, 96};
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
if (++npc->ani_no > 1)
npc->ani_no = 0;
}
npc->rect = rect_left[npc->ani_no];
if (++npc->act_wait > 250)
{
SetCaret(npc->x, npc->y, 2, 0);
npc->cond = 0;
}
}
//Bed
void ActNpc034(NPCHAR *npc)
{
RECT rcLeft[1];
@ -978,6 +1018,260 @@ void ActNpc034(NPCHAR *npc)
npc->rect = rcRight[0];
}
//Mannan
void ActNpc035(NPCHAR *npc)
{
if (npc->act_no < 3 && npc->life < 90)
{
PlaySoundObject(71, 1);
SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8);
SetExpObjects(npc->x, npc->y, npc->exp);
npc->act_no = 3;
npc->act_wait = 0;
npc->ani_no = 2;
npc->bits &= ~0x20;
npc->damage = 0;
}
switch (npc->act_no)
{
case 0:
case 1:
if (npc->shock)
{
if (npc->direct)
SetNpChar(103, npc->x + 0x1000, npc->y + 0x1000, 0, 0, npc->direct, 0, 0x100);
else
SetNpChar(103, npc->x - 0x1000, npc->y + 0x1000, 0, 0, npc->direct, 0, 0x100);
npc->ani_no = 1;
npc->act_no = 2;
npc->act_wait = 0;
}
break;
case 2:
if (++npc->act_wait > 20)
{
npc->act_wait = 0;
npc->act_no = 1;
npc->ani_no = 0;
}
break;
case 3:
if (++npc->act_wait == 50 || npc->act_wait == 60)
npc->ani_no = 3;
if (npc->act_wait == 53 || npc->act_wait == 63)
npc->ani_no = 2;
if (npc->act_wait > 100)
npc->act_no = 4;
break;
}
RECT rcLeft[4];
RECT rcRight[4];
rcLeft[0] = {96, 64, 120, 96};
rcLeft[1] = {120, 64, 144, 96};
rcLeft[2] = {144, 64, 168, 96};
rcLeft[3] = {168, 64, 192, 96};
rcRight[0] = {96, 96, 120, 128};
rcRight[1] = {120, 96, 144, 128};
rcRight[2] = {144, 96, 168, 128};
rcRight[3] = {168, 96, 192, 128};
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
//Balrog (hover)
void ActNpc036(NPCHAR *npc)
{
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
// Fallthrough
case 1:
if (++npc->act_wait > 12)
{
npc->act_no = 2;
npc->act_wait = 0;
npc->count1 = 3;
npc->ani_no = 1;
}
break;
case 2:
if (++npc->act_wait > 16)
{
--npc->count1;
npc->act_wait = 0;
const unsigned char deg = GetArktan(npc->x - gMC.x, npc->y + 0x800 - gMC.y) + Random(-16, 16);
const int ym = GetSin(deg);
const int xm = GetCos(deg);
SetNpChar(11, npc->x, npc->y + 0x800, xm, ym, 0, 0, 0x100);
PlaySoundObject(39, 1);
if (npc->count1 == 0)
{
npc->act_no = 3;
npc->act_wait = 0;
}
}
break;
case 3:
if (++npc->act_wait > 3)
{
npc->act_no = 4;
npc->act_wait = 0;
npc->xm = (gMC.x - npc->x) / 100;
npc->ym = -0x600;
npc->ani_no = 3;
}
break;
case 4:
if (npc->ym > -0x200)
{
if (npc->life > 60)
{
npc->act_no = 5;
npc->ani_no = 4;
npc->ani_wait = 0;
npc->act_wait = 0;
npc->tgt_y = npc->y;
}
else
{
npc->act_no = 6;
}
}
break;
case 5:
if (++npc->ani_wait > 1)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 5)
{
npc->ani_no = 4;
PlaySoundObject(47, 1);
}
if (++npc->act_wait > 100)
{
npc->act_no = 6;
npc->ani_no = 3;
}
if (npc->y < npc->tgt_y)
npc->ym += 0x40;
else
npc->ym -= 0x40;
if (npc->ym < -0x200)
npc->ym = -0x200;
if (npc->ym > 0x200)
npc->ym = 0x200;
break;
case 6:
if (gMC.y > npc->y + 0x2000)
npc->damage = 10;
else
npc->damage = 0;
if (npc->flag & 8)
{
npc->act_no = 7;
npc->act_wait = 0;
npc->ani_no = 2;
PlaySoundObject(26, 1);
PlaySoundObject(25, 1);
SetQuake(30);
npc->damage = 0;
for (int i = 0; i < 8; ++i)
SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
for (int i = 0; i < 8; ++i)
SetNpChar(33, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-0x400, 0x400), Random(-0x400, 0), 0, 0, 0x100);
}
break;
case 7:
npc->xm = 0;
if (++npc->act_wait > 3)
{
npc->act_no = 1;
npc->act_wait = 0;
}
break;
}
if (npc->act_no != 5)
{
npc->ym += 0x33;
if (gMC.x > npc->x)
npc->direct = 2;
else
npc->direct = 0;
}
if (npc->ym > 0x5FF)
npc->ym = 0x5FF;
npc->x += npc->xm;
npc->y += npc->ym;
RECT rect_left[6];
RECT rect_right[6];
rect_left[0] = {0, 0, 40, 24};
rect_left[1] = {40, 0, 80, 24};
rect_left[2] = {80, 0, 120, 24};
rect_left[3] = {120, 0, 160, 24};
rect_left[4] = {160, 48, 200, 72};
rect_left[5] = {200, 48, 240, 72};
rect_right[0] = {0, 24, 40, 48};
rect_right[1] = {40, 24, 80, 48};
rect_right[2] = {80, 24, 120, 48};
rect_right[3] = {120, 24, 160, 48};
rect_right[4] = {160, 72, 200, 96};
rect_right[5] = {200, 72, 240, 96};
if (npc->direct == 0)
npc->rect = rect_left[npc->ani_no];
else
npc->rect = rect_right[npc->ani_no];
}
//Signpost
void ActNpc037(NPCHAR *npc)
{

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -8,6 +8,653 @@
#include "Sound.h"
#include "Back.h"
#include "Triangle.h"
#include "Caret.h"
#include "Frame.h"
#include "Flash.h"
#include "Bullet.h"
//Toroko (frenzied)
void ActNpc140(NPCHAR *npc)
{
RECT rcLeft[14];
RECT rcRight[14];
rcLeft[0] = {0, 0, 32, 32};
rcLeft[1] = {32, 0, 64, 32};
rcLeft[2] = {64, 0, 96, 32};
rcLeft[3] = {96, 0, 128, 32};
rcLeft[4] = {128, 0, 160, 32};
rcLeft[5] = {160, 0, 192, 32};
rcLeft[6] = {192, 0, 224, 32};
rcLeft[7] = {224, 0, 256, 32};
rcLeft[8] = {0, 64, 32, 96};
rcLeft[9] = {32, 64, 64, 96};
rcLeft[10] = {64, 64, 96, 96};
rcLeft[11] = {96, 64, 128, 96};
rcLeft[12] = {128, 64, 160, 96};
rcLeft[13] = {0, 0, 0, 0};
rcRight[0] = {0, 32, 32, 64};
rcRight[1] = {32, 32, 64, 64};
rcRight[2] = {64, 32, 96, 64};
rcRight[3] = {96, 32, 128, 64};
rcRight[4] = {128, 32, 160, 64};
rcRight[5] = {160, 32, 192, 64};
rcRight[6] = {192, 32, 224, 64};
rcRight[7] = {224, 32, 256, 64};
rcRight[8] = {0, 96, 32, 128};
rcRight[9] = {32, 96, 64, 128};
rcRight[10] = {64, 96, 96, 128};
rcRight[11] = {96, 96, 128, 128};
rcRight[12] = {128, 96, 160, 128};
rcRight[13] = {0, 0, 0, 0};
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->ani_no = 9;
npc->act_wait = 0;
npc->bits &= ~0x2000;
// Fallthrough
case 1:
if (++npc->act_wait > 50)
{
npc->act_no = 2;
npc->act_wait = 0;
npc->ani_no = 8;
}
break;
case 2:
if (++npc->ani_no > 10)
npc->ani_no = 9;
if (++npc->act_wait > 50)
{
npc->act_no = 3;
npc->act_wait = 0;
npc->ani_no = 0;
}
break;
case 3:
if (++npc->act_wait > 50)
{
npc->act_no = 10;
npc->bits |= 0x20;
}
break;
case 10:
npc->bits = npc->bits;
npc->act_no = 11;
npc->ani_no = 0;
npc->ani_wait = 0;
npc->act_wait = Random(20, 130);
npc->xm = 0;
// Fallthrough
case 11:
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
if (++npc->ani_wait > 4)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 1)
npc->ani_no = 0;
if (CountArmsBullet(6) || CountArmsBullet(3) > 3)
npc->act_no = 20;
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
if (Random(0, 99) % 2)
npc->act_no = 20;
else
npc->act_no = 50;
}
break;
case 20:
npc->act_no = 21;
npc->ani_no = 2;
npc->act_wait = 0;
// Fallthrough
case 21:
if (++npc->act_wait > 10)
{
npc->act_no = 22;
npc->act_wait = 0;
npc->ani_no = 3;
npc->ym = -0x5FF;
if (npc->direct == 0)
npc->xm = -0x200u;
else
npc->xm = 0x200;
}
break;
case 22:
if (++npc->act_wait > 10)
{
npc->act_no = 23;
npc->act_wait = 0;
npc->ani_no = 6;
SetNpChar(141, 0, 0, 0, 0, 0, npc, 0);
}
break;
case 23:
if (++npc->act_wait > 30)
{
npc->act_no = 24;
npc->act_wait = 0;
npc->ani_no = 7;
}
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
break;
case 24:
if (++npc->act_wait > 3)
{
npc->act_no = 25;
npc->ani_no = 3;
}
break;
case 25:
if (npc->flag & 8)
{
npc->act_no = 26;
npc->act_wait = 0;
npc->ani_no = 2;
PlaySoundObject(26, 1);
SetQuake(20);
}
break;
case 26:
npc->xm = 8 * npc->xm / 9;
if (++npc->act_wait > 20)
{
npc->act_no = 10;
npc->ani_no = 0;
}
break;
case 50:
npc->act_no = 51;
npc->act_wait = 0;
npc->ani_no = 4;
SetNpChar(141, 0, 0, 0, 0, 0, npc, 0);
// Fallthrough
case 51:
if (++npc->act_wait > 30)
{
npc->act_no = 52;
npc->act_wait = 0;
npc->ani_no = 5;
}
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
break;
case 52:
if (++npc->act_wait > 3)
{
npc->act_no = 10;
npc->ani_no = 0;
}
break;
case 100:
npc->ani_no = 3;
npc->act_no = 101;
npc->bits &= ~0x20;
npc->damage = 0;
for (int i = 0; i < 8; ++i)
SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600u, 0), 0, 0, 0x100);
break;
case 101:
if (npc->flag & 8)
{
npc->act_no = 102;
npc->act_wait = 0;
npc->ani_no = 2;
PlaySoundObject(26, 1);
SetQuake(20);
}
break;
case 102:
npc->xm = 8 * npc->xm / 9;
if (++npc->act_wait > 50)
{
npc->act_no = 103;
npc->act_wait = 0;
npc->ani_no = 10;
}
break;
case 103:
if (++npc->act_wait > 50)
{
npc->ani_no = 9;
npc->act_no = 104;
npc->act_wait = 0;
}
break;
case 104:
if (++npc->ani_no > 10)
npc->ani_no = 9;
if (++npc->act_wait > 100)
{
npc->act_wait = 0;
npc->ani_no = 9;
npc->act_no = 105;
}
break;
case 105:
if (++npc->act_wait > 50)
{
npc->ani_wait = 0;
npc->act_no = 106;
npc->ani_no = 11;
}
break;
case 106:
if (++npc->ani_wait > 50)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 12)
npc->ani_no = 12;
break;
case 140:
npc->act_no = 141;
npc->act_wait = 0;
npc->ani_no = 12;
PlaySoundObject(29, 1);
// Fallthrough
case 141:
if (++npc->ani_no > 13)
npc->ani_no = 12;
if (++npc->act_wait > 100)
{
for (int i = 0; i < 4; ++i)
SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
npc->cond = 0;
}
break;
}
if (npc->act_no > 100 && npc->act_no < 105 && npc->act_wait % 9 == 0)
SetNpChar(4, npc->x + (Random(-12, 12) * 0x200), npc->y + (Random(-12, 12) * 0x200), Random(-341, 341), Random(-0x600, 0), 0, 0, 0x100);
npc->ym += 0x20;
if (npc->ym > 0x5FF)
npc->ym = 0x5FF;
if (npc->ym < -0x5FF)
npc->ym = -0x5FF;
npc->x += npc->xm;
npc->y += npc->ym;
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
// Toroko block projectile
void ActNpc141(NPCHAR *npc)
{
RECT rect[2]; // [sp+8h] [bp-24h]@1
rect[0] = {288, 32, 304, 48};
rect[1] = {304, 32, 320, 48};
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->act_wait = 0;
// Fallthrough
case 1:
if (npc->pNpc->direct == 0)
npc->x = npc->pNpc->x + 0x1400;
else
npc->x = npc->pNpc->x - 0x1400;
npc->y = npc->pNpc->y - 0x1000;
if (npc->pNpc->act_no == 24 || npc->pNpc->act_no == 52)
{
npc->act_no = 10;
if (npc->pNpc->direct == 0)
npc->x = npc->pNpc->x - 0x2000;
else
npc->x = npc->pNpc->x + 0x2000;
npc->y = npc->pNpc->y;
const unsigned char deg = GetArktan(npc->x - gMC.x, npc->y - gMC.y);
npc->ym = 4 * GetSin(deg);
npc->xm = 4 * GetCos(deg);
PlaySoundObject(39, 1);
}
break;
case 10:
if (npc->flag & 0xF)
{
npc->act_no = 20;
npc->act_wait = 0;
SetCaret(npc->x, npc->y, 2, 0);
PlaySoundObject(12, 1);
for (int i = 0; i < 4; ++i)
SetNpChar(4, npc->x, npc->y, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, 0, 0x100);
}
else
{
npc->x += npc->xm;
npc->y += npc->ym;
}
break;
case 20:
npc->x += npc->xm;
npc->y += npc->ym;
if (++npc->act_wait > 4)
{
for (int i = 0; i < 4; ++i)
SetNpChar(4, npc->x, npc->y, Random(-0x200, 0x200), Random(-0x200, 0x200), 0, 0, 0x100);
npc->code_char = 142;
npc->ani_no = 0;
npc->act_no = 20;
npc->xm = 0;
npc->bits &= ~4;
npc->bits |= 0x20;
npc->damage = 1;
}
break;
}
if (++npc->ani_no > 1)
npc->ani_no = 0;
npc->rect = rect[npc->ani_no];
}
// Flower Cub
void ActNpc142(NPCHAR *npc)
{
RECT rect[5];
rect[0] = {0, 128, 16, 144};
rect[1] = {16, 128, 32, 144};
rect[2] = {32, 128, 48, 144};
rect[3] = {48, 128, 64, 144};
rect[4] = {64, 128, 80, 144};
switch (npc->act_no)
{
case 10:
npc->act_no = 11;
npc->ani_no = 0;
npc->act_wait = 0;
// Fallthrough
case 11:
if (++npc->act_wait > 30)
{
npc->act_no = 12;
npc->ani_no = 1;
npc->ani_wait = 0;
}
break;
case 12:
if (++npc->ani_wait > 8)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no == 3)
{
npc->act_no = 20;
npc->ym = -0x200;
if (gMC.x < npc->x)
npc->xm = -0x200;
else
npc->xm = 0x200;
}
break;
case 20:
if (npc->ym > -0x80)
npc->ani_no = 4;
else
npc->ani_no = 3;
if (npc->flag & 8)
{
npc->ani_no = 2;
npc->act_no = 21;
npc->act_wait = 0;
npc->xm = 0;
PlaySoundObject(23, 1);
}
break;
case 21:
if (++npc->act_wait > 10)
{
npc->act_no = 10;
npc->ani_no = 0;
}
break;
}
npc->ym += 0x40;
if (npc->ym > 0x5FF)
npc->ym = 0x5FF;
if (npc->ym < -0x5FF)
npc->ym = -0x5FF;
npc->x += npc->xm;
npc->y += npc->ym;
npc->rect = rect[npc->ani_no];
}
// Jenka (collapsed)
void ActNpc143(NPCHAR *npc)
{
RECT rcLeft[1];
RECT rcRight[1];
rcLeft[0] = {208, 32, 224, 48};
rcRight[0] = {208, 48, 224, 64};
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
//Toroko (teleporting in)
void ActNpc144(NPCHAR *npc)
{
RECT rcLeft[5];
RECT rcRight[5];
rcLeft[0] = {0, 64, 16, 80};
rcLeft[1] = {16, 64, 32, 80};
rcLeft[2] = {32, 64, 48, 80};
rcLeft[3] = {16, 64, 32, 80};
rcLeft[4] = {128, 64, 144, 80};
rcRight[0] = {0, 80, 16, 96};
rcRight[1] = {16, 80, 32, 96};
rcRight[2] = {32, 80, 48, 96};
rcRight[3] = {16, 80, 32, 96};
rcRight[4] = {128, 80, 144, 96};
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->ani_no = 0;
npc->ani_wait = 0;
npc->tgt_x = npc->x;
PlaySoundObject(29, 1);
// Fallthrough
case 1:
if (++npc->act_wait == 64)
{
npc->act_no = 2;
npc->act_wait = 0;
}
break;
case 2:
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 3)
npc->ani_no = 2;
if (npc->flag & 8)
{
npc->act_no = 4;
npc->act_wait = 0;
npc->ani_no = 4;
PlaySoundObject(23, 1);
}
break;
case 10:
npc->act_no = 11;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 11:
if (Random(0, 120) == 10)
{
npc->act_no = 12;
npc->act_wait = 0;
npc->ani_no = 1;
}
break;
case 12:
if (++npc->act_wait > 8)
{
npc->act_no = 11;
npc->ani_no = 0;
}
break;
}
if (npc->act_no > 1)
{
npc->ym += 0x20;
if (npc->ym > 0x5FF)
npc->ym = 0x5FF;
npc->y += npc->ym;
}
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
if (npc->act_no == 1)
{
npc->rect.bottom = npc->rect.top + npc->act_wait / 4;
if (npc->act_wait / 2 % 2)
npc->x = npc->tgt_x;
else
npc->x = npc->tgt_x + 0x200;
}
}
//King's sword
void ActNpc145(NPCHAR *npc)
@ -49,6 +696,56 @@ void ActNpc145(NPCHAR *npc)
npc->rect = rcRight[npc->ani_no];
}
//Lightning
void ActNpc146(NPCHAR *npc)
{
RECT rect[5];
rect[0] = {0, 0, 0, 0};
rect[1] = {256, 0, 272, 240};
rect[2] = {272, 0, 288, 240};
rect[3] = {288, 0, 304, 240};
rect[4] = {304, 0, 320, 240};
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
if (npc->direct == 2)
SetFlash(0, 0, 2);
// Fallthrough
case 1:
if (++npc->act_wait > 10)
{
npc->act_no = 2;
PlaySoundObject(101, 1);
}
break;
case 2:
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no == 2)
npc->damage = 10;
if (npc->ani_no > 4)
{
SetDestroyNpChar(npc->x, npc->y, 0x1000, 8);
npc->cond = 0;
}
break;
}
npc->rect = rect[npc->ani_no];
}
//Quote
void ActNpc150(NPCHAR *npc)
{

181
src/NpcAct180.cpp Normal file
View file

@ -0,0 +1,181 @@
#include "WindowsWrapper.h"
#include "NpcAct.h"
#include "MyChar.h"
#include "NpChar.h"
#include "Game.h"
#include "Sound.h"
#include "Back.h"
#include "Triangle.h"
#include "Caret.h"
//Scooter
void ActNpc192(NPCHAR *npc)
{
switch ( npc->act_no )
{
case 0:
npc->act_no = 1;
npc->view.back = 0x2000;
npc->view.front = 0x2000;
npc->view.top = 0x1000;
npc->view.bottom = 0x1000;
break;
case 10:
npc->act_no = 11;
npc->ani_no = 1;
npc->view.top = 0x2000;
npc->view.bottom = 0x2000;
npc->y -= 0xA00;
break;
case 20:
npc->act_no = 21;
npc->act_wait = 1;
npc->tgt_x = npc->x;
npc->tgt_y = npc->y;
// Fallthrough
case 21:
npc->x = npc->tgt_x + (Random(-1, 1) * 0x200);
npc->y = npc->tgt_y + (Random(-1, 1) * 0x200);
if (++npc->act_wait > 30)
npc->act_no = 30;
break;
case 30:
npc->act_no = 31;
npc->act_wait = 1;
npc->xm = -0x800;
npc->x = npc->tgt_x;
npc->y = npc->tgt_y;
PlaySoundObject(44, 1);
// Fallthrough
case 31:
npc->xm += 0x20;
npc->x += npc->xm;
++npc->act_wait;
npc->y = npc->tgt_y + (Random(-1, 1) * 0x200);
if (npc->act_wait > 10)
npc->direct = 2;
if (npc->act_wait > 200)
npc->act_no = 40;
break;
case 40:
npc->act_no = 41;
npc->act_wait = 2;
npc->direct = 0;
npc->y -= 0x6000;
npc->xm = -0x1000;
// Fallthrough
case 41:
npc->x += npc->xm;
npc->y += npc->ym;
npc->act_wait += 2;
if (npc->act_wait > 1200)
npc->cond = 0;
break;
}
if (npc->act_wait % 4 == 0 && npc->act_no >= 20)
{
PlaySoundObject(34, 1);
if (npc->direct == 0)
SetCaret(npc->x + 5120, npc->y + 5120, 7, 2);
else
SetCaret(npc->x - 5120, npc->y + 5120, 7, 0);
}
RECT rcLeft[2];
RECT rcRight[2];
rcLeft[0] = {224, 64, 256, 80};
rcLeft[1] = {256, 64, 288, 96};
rcRight[0] = {224, 80, 256, 96};
rcRight[1] = {288, 64, 320, 96};
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
//Scooter (broken)
void ActNpc193(NPCHAR *npc)
{
RECT rc[1];
rc[0] = {256, 96, 320, 112};
if (npc->act_no == 0)
{
npc->act_no = 1;
npc->y = npc->y;
npc->x += 0x3000;
}
npc->rect = rc[0];
}
//Water/wind particles
void ActNpc199(NPCHAR *npc)
{
RECT rect[5];
rect[0] = {72, 16, 74, 18};
rect[1] = {74, 16, 76, 18};
rect[2] = {76, 16, 78, 18};
rect[3] = {78, 16, 80, 18};
rect[4] = {80, 16, 82, 18};
if (npc->act_no == 0)
{
npc->act_no = 1;
npc->ani_no = Random(0, 2);
switch (npc->direct)
{
case 0:
npc->xm = -1;
break;
case 1:
npc->ym = -1;
break;
case 2:
npc->xm = 1;
break;
case 3:
npc->ym = 1;
break;
}
npc->xm *= (Random(4, 8) * 0x200) / 2;
npc->ym *= (Random(4, 8) * 0x200) / 2;
}
if (++npc->ani_wait > 6)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 4)
npc->cond = 0;
npc->x += npc->xm;
npc->y += npc->ym;
npc->rect = rect[npc->ani_no];
}

View file

@ -21,3 +21,18 @@ void ActNpc211(NPCHAR *npc)
npc->rect = rects[npc->code_event];
}
//Smoke generator
void ActNpc219(NPCHAR *npc)
{
RECT rc[1];
rc[0] = {0, 0, 0, 0};
if ( npc->direct )
SetNpChar(199, npc->x + (Random(-0xA0, 0xA0) * 0x200), npc->y + (Random(-0x80, 0x80) * 0x200), 0, 0, 2, 0, 0x100);
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];
}

View file

@ -8,6 +8,13 @@
#include "Sound.h"
#include "Back.h"
#include "Triangle.h"
#include "Frame.h"
//Quake
void ActNpc292(NPCHAR *npc)
{
SetQuake(10);
}
//Doctor (opening)
void ActNpc298(NPCHAR *npc)

View file

@ -9,6 +9,7 @@
#include "Back.h"
#include "Triangle.h"
#include "Caret.h"
#include "Boss.h"
//Demon crown (opening)
void ActNpc300(NPCHAR *npc)
@ -30,3 +31,71 @@ void ActNpc300(NPCHAR *npc)
npc->rect = rc[0];
}
//Camera focus marker
void ActNpc302(NPCHAR *npc)
{
switch (npc->act_no)
{
case 10:
npc->x = gMC.x;
npc->y = gMC.y - 0x4000;
break;
case 20:
switch (npc->direct)
{
case 0:
npc->x -= 0x400;
break;
case 1:
npc->y -= 0x400;
break;
case 2:
npc->x += 0x400;
break;
case 3:
npc->y += 0x400;
break;
}
gMC.x = npc->x;
gMC.y = npc->y;
break;
case 30:
npc->x = gMC.x;
npc->y = gMC.y + 0xA000;
break;
case 100:
npc->act_no = 101;
if (npc->direct)
{
int i;
for (i = 0xAA; i < 0x200; ++i)
{
if (gNPC[i].cond & 0x80 && gNPC[i].code_event == npc->direct)
{
npc->pNpc = &gNPC[i];
break;
}
}
if (i == 0x200)
{
npc->cond = 0;
break;
}
}
else
{
npc->pNpc = gBoss;
}
// Fallthrough
case 101:
npc->x = (npc->pNpc->x + gMC.x) / 2;
npc->y = (npc->pNpc->y + gMC.y) / 2;
break;
}
}

View file

@ -89,10 +89,10 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc030,
ActNpc031,
ActNpc032,
nullptr,
ActNpc033,
ActNpc034,
nullptr,
nullptr,
ActNpc035,
ActNpc036,
ActNpc037,
ActNpc038,
ActNpc039,
@ -100,20 +100,20 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc041,
ActNpc042,
ActNpc043,
nullptr,
nullptr,
ActNpc044,
ActNpc045,
ActNpc046,
nullptr,
ActNpc047,
ActNpc048,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc049,
ActNpc050,
ActNpc051,
ActNpc052,
ActNpc053,
ActNpc054,
ActNpc055,
ActNpc056,
ActNpc057,
ActNpc058,
ActNpc059,
ActNpc060,
@ -156,53 +156,53 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc097,
ActNpc098,
ActNpc099,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc100,
ActNpc101,
ActNpc102,
ActNpc103,
ActNpc104,
ActNpc105,
ActNpc106,
ActNpc107,
ActNpc108,
ActNpc109,
ActNpc110,
ActNpc111,
ActNpc112,
nullptr,
nullptr,
nullptr,
ActNpc113,
ActNpc114,
ActNpc115,
ActNpc116,
nullptr,
nullptr,
ActNpc117,
ActNpc118,
ActNpc119,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc120,
ActNpc121,
ActNpc122,
ActNpc123,
ActNpc124,
ActNpc125,
nullptr,
ActNpc126,
ActNpc127,
ActNpc128,
ActNpc129,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc130,
ActNpc131,
ActNpc132,
ActNpc133,
ActNpc134,
ActNpc135,
ActNpc136,
ActNpc137,
ActNpc138,
ActNpc139,
ActNpc140,
ActNpc141,
ActNpc142,
ActNpc143,
ActNpc144,
ActNpc145,
nullptr,
ActNpc146,
nullptr,
nullptr,
nullptr,
@ -248,14 +248,14 @@ NPCFUNCTION gpNpcFuncTbl[361] =
nullptr,
nullptr,
nullptr,
ActNpc192,
ActNpc193,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc199,
nullptr,
nullptr,
nullptr,
@ -275,7 +275,7 @@ NPCFUNCTION gpNpcFuncTbl[361] =
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc219,
nullptr,
nullptr,
nullptr,
@ -348,7 +348,7 @@ NPCFUNCTION gpNpcFuncTbl[361] =
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc292,
nullptr,
nullptr,
nullptr,
@ -358,7 +358,7 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc299,
ActNpc300,
nullptr,
nullptr,
ActNpc302,
nullptr,
nullptr,
nullptr,

View file

@ -10,6 +10,76 @@
int empty;
int spur_charge;
void ShootBullet_Frontia1(int level)
{
int bul_no;
switch (level)
{
case 1:
bul_no = 1;
break;
case 2:
bul_no = 2;
break;
case 3:
bul_no = 3;
break;
}
if (CountArmsBullet(1) <= 3 && gKeyTrg & gKeyShot)
{
if (!UseArmsEnergy(1))
{
ChangeToFirstArms();
}
else
{
if (gMC.up)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x600, gMC.y - 0x1400, 1);
SetCaret(gMC.x - 0x600, gMC.y - 0x1400, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x600, gMC.y - 0x1400, 1);
SetCaret(gMC.x + 0x600, gMC.y - 0x1400, 3, 0);
}
}
else if (gMC.down)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x600, gMC.y + 0x1400, 3);
SetCaret(gMC.x - 0x600, gMC.y + 0x1400, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x600, gMC.y + 0x1400, 3);
SetCaret(gMC.x + 0x600, gMC.y + 0x1400, 3, 0);
}
}
else
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0xC00, gMC.y + 0x400, 0);
SetCaret(gMC.x - 0x1800, gMC.y + 0x400, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0xC00, gMC.y + 0x400, 2);
SetCaret(gMC.x + 0x1800, gMC.y + 0x400, 3, 0);
}
}
PlaySoundObject(33, 1);
}
}
}
void ShootBullet_PoleStar(int level)
{
int bul_no;
@ -163,6 +233,7 @@ void ShootBullet_Machinegun1(int level)
if (CountArmsBullet(4) < 5)
{
int bul_no;
switch (level)
{
case 1:
@ -481,6 +552,427 @@ void ShootBullet_Missile(int level, bool bSuper)
PlaySoundObject(32, 1);
}
void ShootBullet_Bubblin1(void)
{
static int wait;
if (CountArmsBullet(7) <= 3)
{
if (gKeyTrg & gKeyShot)
{
if (!UseArmsEnergy(1))
{
PlaySoundObject(37, 1);
if (!empty)
{
SetCaret(gMC.x, gMC.y, 16, 0);
empty = 50;
}
}
else
{
if (gMC.up)
{
if (gMC.direct)
{
SetBullet(19, gMC.x + 0x200, gMC.y - 0x400, 1);
SetCaret(gMC.x + 0x200, gMC.y - 0x400, 3, 0);
}
else
{
SetBullet(19, gMC.x - 0x200, gMC.y - 0x400, 1);
SetCaret(gMC.x - 0x200, gMC.y - 0x400, 3, 0);
}
}
else if (gMC.down)
{
if (gMC.direct)
{
SetBullet(19, gMC.x + 0x200, gMC.y + 0x400, 3);
SetCaret(gMC.x + 0x200, gMC.y + 0x400, 3, 0);
}
else
{
SetBullet(19, gMC.x - 0x200, gMC.y + 0x400, 3);
SetCaret(gMC.x - 0x200, gMC.y + 0x400, 3, 0);
}
}
else if (gMC.direct)
{
SetBullet(19, gMC.x + 0xC00, gMC.y + 0x600, 2);
SetCaret(gMC.x + 0x1800, gMC.y + 0x600, 3, 0);
}
else
{
SetBullet(19, gMC.x - 0xC00, gMC.y + 0x600, 0);
SetCaret(gMC.x - 0x1800, gMC.y + 0x600, 3, 0);
}
PlaySoundObject(48, 1);
}
}
else if (++wait > 20)
{
wait = 0;
ChargeArmsEnergy(1);
}
}
}
void ShootBullet_Bubblin2(int level)
{
static int wait;
if (CountArmsBullet(7) <= 15)
{
level += 18;
if (!(gKey & gKeyShot))
gMC.rensha = 6;
if (gKey & gKeyShot)
{
if (++gMC.rensha >= 7)
{
gMC.rensha = 0;
if (!UseArmsEnergy(1))
{
PlaySoundObject(37, 1);
if (!empty)
{
SetCaret(gMC.x, gMC.y, 16, 0);
empty = 50;
}
}
else
{
if (gMC.up)
{
if (gMC.direct)
{
SetBullet(level, gMC.x + 0x600, gMC.y - 0x1000, 1);
SetCaret(gMC.x + 0x600, gMC.y - 0x2000, 3, 0);
}
else
{
SetBullet(level, gMC.x - 0x600, gMC.y - 0x1000, 1);
SetCaret(gMC.x - 0x600, gMC.y - 0x2000, 3, 0);
}
}
else if (gMC.down)
{
if (gMC.direct)
{
SetBullet(level, gMC.x + 0x600, gMC.y + 0x1000, 3);
SetCaret(gMC.x + 0x600, gMC.y + 0x2000, 3, 0);
}
else
{
SetBullet(level, gMC.x - 0x600, gMC.y + 0x1000, 3);
SetCaret(gMC.x - 0x600, gMC.y + 0x2000, 3, 0);
}
}
else if (gMC.direct)
{
SetBullet(level, gMC.x + 0xC00, gMC.y + 0x600, 2);
SetCaret(gMC.x + 0x1800, gMC.y + 0x600, 3, 0);
}
else
{
SetBullet(level, gMC.x - 0xC00, gMC.y + 0x600, 0);
SetCaret(gMC.x - 0x1800, gMC.y + 0x600, 3, 0);
}
PlaySoundObject(48, 1);
}
}
}
else if (++wait > 1)
{
wait = 0;
ChargeArmsEnergy(1);
}
}
}
void ShootBullet_Sword(int level)
{
if (CountArmsBullet(9) <= 0)
{
int bul_no;
switch (level)
{
case 1:
bul_no = 25;
break;
case 2:
bul_no = 26;
break;
case 3:
bul_no = 27;
break;
}
if (gKeyTrg & gKeyShot)
{
if (gMC.up)
{
if (gMC.direct == 0)
SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x800, 1);
else
SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x800, 1);
}
else if (gMC.down)
{
if (gMC.direct == 0)
SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0xC00, 3);
else
SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0xC00, 3);
}
else
{
if (gMC.direct == 0)
SetBullet(bul_no, gMC.x + 0xC00, gMC.y - 0x600, 0);
else
SetBullet(bul_no, gMC.x - 0xC00, gMC.y - 0x600, 2);
}
PlaySoundObject(34, 1);
}
}
}
void ShootBullet_Nemesis(int level)
{
int bul_no;
switch (level)
{
case 1:
bul_no = 34;
break;
case 2:
bul_no = 35;
break;
case 3:
bul_no = 36;
break;
}
if (CountArmsBullet(12) <= 1 && gKeyTrg & gKeyShot)
{
if (!UseArmsEnergy(1))
{
PlaySoundObject(37, 1);
}
else
{
if (gMC.up)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0x1800, 1);
SetCaret(gMC.x - 0x200, gMC.y - 0x1800, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0x1800, 1);
SetCaret(gMC.x + 0x200, gMC.y - 0x1800, 3, 0);
}
}
else if (gMC.down)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x1800, 3);
SetCaret(gMC.x - 0x200, gMC.y + 0x1800, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x1800, 3);
SetCaret(gMC.x + 0x200, gMC.y + 0x1800, 3, 0);
}
}
else
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x2C00, gMC.y + 0x600, 0);
SetCaret(gMC.x - 0x2000, gMC.y + 0x600, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x2C00, gMC.y + 0x600, 2);
SetCaret(gMC.x + 0x2000, gMC.y + 0x600, 3, 0);
}
}
switch (level)
{
case 1:
PlaySoundObject(117, 1);
break;
case 2:
PlaySoundObject(49, 1);
break;
case 3:
PlaySoundObject(60, 1);
break;
}
}
}
}
void ResetSpurCharge(void)
{
spur_charge = 0;
if (gArmsData[gSelectedArms].code == 13)
ZeroExpMyChar();
}
void ShootBullet_Spur(int level)
{
int bul_no;
bool bShot = false;
if (gKey & gKeyShot)
{
if (gMC.equip & 8)
AddExpMyChar(3);
else
AddExpMyChar(2);
if (++spur_charge / 2 % 2)
{
if (level == 1)
{
PlaySoundObject(59, 1);
}
else if (level == 2)
{
PlaySoundObject(60, 1);
}
else if (level == 3)
{
if (!IsMaxExpMyChar())
PlaySoundObject(61, 1);
}
}
}
else
{
if (spur_charge)
bShot = true;
spur_charge = 0;
}
static bool bMax;
if (IsMaxExpMyChar())
{
if (bMax == false)
{
bMax = true;
PlaySoundObject(65, 1);
}
}
else
{
bMax = false;
}
if (gKey & gKeyShot == 0)
ZeroExpMyChar();
switch (level)
{
case 1:
bul_no = 6;
bShot = false;
break;
case 2:
bul_no = 37;
break;
case 3:
if (bMax)
bul_no = 39;
else
bul_no = 38;
break;
}
if (CountArmsBullet(13) <= 0 && CountArmsBullet(14) <= 0 && (gKeyTrg & gKeyShot || bShot))
{
if (!UseArmsEnergy(1))
{
PlaySoundObject(37, 1);
}
else
{
if (gMC.up)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x200, gMC.y - 0x1000, 1);
SetCaret(gMC.x - 0x200, gMC.y - 0x1000, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x200, gMC.y - 0x1000, 1);
SetCaret(gMC.x + 0x200, gMC.y - 0x1000, 3, 0);
}
}
else if (gMC.down)
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0x200, gMC.y + 0x1000, 3);
SetCaret(gMC.x - 0x200, gMC.y + 0x1000, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0x200, gMC.y + 0x1000, 3);
SetCaret(gMC.x + 0x200, gMC.y + 0x1000, 3, 0);
}
}
else
{
if (gMC.direct == 0)
{
SetBullet(bul_no, gMC.x - 0xC00, gMC.y + 0x600, 0);
SetCaret(gMC.x - 0x1800, gMC.y + 0x600, 3, 0);
}
else
{
SetBullet(bul_no, gMC.x + 0xC00, gMC.y + 0x600, 2);
SetCaret(gMC.x + 0x1800, gMC.y + 0x600, 3, 0);
}
}
switch (bul_no)
{
case 6:
PlaySoundObject(49, 1);
break;
case 37:
PlaySoundObject(62, 1);
break;
case 38:
PlaySoundObject(63, 1);
break;
case 39:
PlaySoundObject(64, 1);
break;
}
}
}
}
void ShootBullet()
{
if (empty)
@ -503,6 +995,9 @@ void ShootBullet()
{
switch (gArmsData[gSelectedArms].code)
{
case 1:
ShootBullet_Frontia1(gArmsData[gSelectedArms].level);
break;
case 2:
ShootBullet_PoleStar(gArmsData[gSelectedArms].level);
break;
@ -514,13 +1009,46 @@ void ShootBullet()
break;
case 5:
ShootBullet_Missile(gArmsData[gSelectedArms].level, false);
break;
case 7:
switch (gArmsData[gSelectedArms].level)
{
case 1:
ShootBullet_Bubblin1();
break;
case 2:
ShootBullet_Bubblin2(2);
break;
case 3:
ShootBullet_Bubblin2(3);
break;
}
break;
case 9:
switch (gArmsData[gSelectedArms].level)
{
case 1:
ShootBullet_Sword(1);
break;
case 2:
ShootBullet_Sword(2);
break;
case 3:
ShootBullet_Sword(3);
break;
}
break;
case 10:
ShootBullet_Missile(gArmsData[gSelectedArms].level, true);
break;
case 12:
ShootBullet_Nemesis(gArmsData[gSelectedArms].level);
break;
case 13:
ShootBullet_Spur(gArmsData[gSelectedArms].level);
break;
}
if (!(gKeyTrg & gKeyShot))
return;
}
}

View file

@ -1,2 +1,3 @@
#pragma once
void ResetSpurCharge(void);
void ShootBullet();