Completed Curly boss fight

This commit is contained in:
Clownacy 2019-02-05 12:28:58 +00:00
parent 91a7c0185c
commit 528f775387
4 changed files with 541 additions and 6 deletions

View file

@ -114,8 +114,12 @@ 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 ActNpc125(NPCHAR *npc);

View file

@ -10,6 +10,7 @@
#include "Triangle.h"
#include "Frame.h"
#include "Caret.h"
#include "Bullet.h"
//Grate
void ActNpc100(NPCHAR *npc)
@ -1458,6 +1459,206 @@ void ActNpc117(NPCHAR *npc)
npc->rect = rcRight[npc->ani_no];
}
//Curly (boss)
void ActNpc118(NPCHAR *npc)
{
RECT rcLeft[9];
RECT rcRight[9];
rcLeft[0] = {0, 32, 32, 56};
rcLeft[1] = {32, 32, 64, 56};
rcLeft[2] = {64, 32, 96, 56};
rcLeft[3] = {96, 32, 128, 56};
rcLeft[4] = {0, 32, 32, 56};
rcLeft[5] = {128, 32, 160, 56};
rcLeft[6] = {0, 32, 32, 56};
rcLeft[7] = {0, 32, 32, 56};
rcLeft[8] = {160, 32, 192, 56};
rcRight[0] = {0, 56, 32, 80};
rcRight[1] = {32, 56, 64, 80};
rcRight[2] = {64, 56, 96, 80};
rcRight[3] = {96, 56, 128, 80};
rcRight[4] = {0, 56, 32, 80};
rcRight[5] = {128, 56, 160, 80};
rcRight[6] = {0, 56, 32, 80};
rcRight[7] = {0, 56, 32, 80};
rcRight[8] = {160, 56, 192, 80};
bool bUpper = false;
if (npc->direct == 0 && gMC.x > npc->x)
bUpper = true;
if ( npc->direct == 2 && gMC.x < npc->x)
bUpper = true;
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->ani_no = 0;
npc->ani_wait = 0;
break;
case 10:
npc->act_no = 11;
npc->act_wait = Random(50, 100);
npc->ani_no = 0;
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
npc->bits |= 0x20u;
npc->bits &= ~4u;
// Fallthrough
case 11:
if (npc->act_wait)
--npc->act_wait;
else
npc->act_no = 13;
break;
case 13:
npc->act_no = 14;
npc->ani_no = 3;
npc->act_wait = Random(50, 100);
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
// Fallthrough
case 14:
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 6)
npc->ani_no = 3;
if (npc->direct == 0)
npc->xm -= 0x40;
else
npc->xm += 0x40;
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
npc->bits |= 0x20u;
npc->act_no = 20;
npc->act_wait = 0;
PlaySoundObject(103, 1);
}
break;
case 20:
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
npc->xm = 8 * npc->xm / 9;
if (++npc->ani_no > 1)
npc->ani_no = 0;
if (++npc->act_wait > 50)
{
npc->act_no = 21;
npc->act_wait = 0;
}
break;
case 21:
if (++npc->act_wait % 4 == 1)
{
if (npc->direct == 0)
{
if (bUpper)
{
npc->ani_no = 2;
SetNpChar(123, npc->x, npc->y - 0x1000, 0, 0, 1, 0, 0x100);
}
else
{
npc->ani_no = 0;
SetNpChar(123, npc->x - 0x1000, npc->y + 0x800, 0, 0, 0, 0, 0x100);
npc->x += 0x200;
}
}
else
{
if (bUpper)
{
npc->ani_no = 2;
SetNpChar(123, npc->x, npc->y - 0x1000, 0, 0, 1, 0, 0x100);
}
else
{
npc->ani_no = 0;
SetNpChar(123, npc->x + 0x1000, npc->y + 0x800, 0, 0, 2, 0, 0x100);
npc->x -= 0x200;
}
}
}
if (npc->act_wait > 30)
npc->act_no = 10;
break;
case 30:
if (++npc->ani_no > 8)
npc->ani_no = 7;
if (++npc->act_wait > 30)
{
npc->act_no = 10;
npc->ani_no = 0;
}
break;
}
if (npc->act_no > 10 && npc->act_no < 30 && CountArmsBullet(6))
{
npc->act_wait = 0;
npc->act_no = 30;
npc->ani_no = 7;
npc->bits &= ~0x20;
npc->bits |= 4;
npc->xm = 0;
}
npc->ym += 0x20;
if (npc->xm > 0x1FF)
npc->xm = 0x1FF;
if (npc->xm < -0x1FF)
npc->xm = -0x1FF;
if (npc->ym > 0x5FF)
npc->ym = 0x5FF;
npc->y += npc->ym;
npc->x += npc->xm;
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
//Table and chair
void ActNpc119(NPCHAR *npc)
{

View file

@ -8,6 +8,336 @@
#include "Sound.h"
#include "Back.h"
#include "Triangle.h"
#include "Caret.h"
//Colon (1)
void ActNpc120(NPCHAR *npc)
{
RECT rect[2];
rect[0] = {64, 0, 80, 16};
rect[1] = {64, 16, 80, 32};
if (npc->direct == 0)
npc->rect = rect[0];
else
npc->rect = rect[1];
}
//Colon (2)
void ActNpc121(NPCHAR *npc)
{
RECT rect[3];
rect[0] = {0, 0, 16, 16};
rect[1] = {16, 0, 32, 16};
rect[2] = {112, 0, 128, 16};
if (npc->direct == 0)
{
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 1:
if (Random(0, 120) == 10)
{
npc->act_no = 2;
npc->act_wait = 0;
npc->ani_no = 1;
}
break;
case 2:
if (++npc->act_wait > 8)
{
npc->act_no = 1;
npc->ani_no = 0;
}
break;
}
npc->rect = rect[npc->ani_no];
}
npc->rect = rect[2];
if (++npc->act_wait > 100)
{
npc->act_wait = 0;
SetCaret(npc->x, npc->y, 5, 0);
}
}
//Colon (attacking)
void ActNpc122(NPCHAR *npc)
{
RECT rcLeft[10];
RECT rcRight[10];
rcLeft[0] = {0, 0, 16, 16};
rcLeft[1] = {16, 0, 32, 16};
rcLeft[2] = {32, 0, 48, 16};
rcLeft[3] = {0, 0, 16, 16};
rcLeft[4] = {48, 0, 64, 16};
rcLeft[5] = {0, 0, 16, 16};
rcLeft[6] = {80, 0, 96, 16};
rcLeft[7] = {96, 0, 112, 16};
rcLeft[8] = {112, 0, 128, 16};
rcLeft[9] = {128, 0, 144, 16};
rcRight[0] = {0, 16, 16, 32};
rcRight[1] = {16, 16, 32, 32};
rcRight[2] = {32, 16, 48, 32};
rcRight[3] = {0, 16, 16, 32};
rcRight[4] = {48, 16, 64, 32};
rcRight[5] = {0, 16, 16, 32};
rcRight[6] = {80, 16, 96, 32};
rcRight[7] = {96, 16, 112, 32};
rcRight[8] = {112, 16, 128, 32};
rcRight[9] = {128, 16, 144, 32};
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
npc->ani_no = 0;
npc->ani_wait = 0;
// Fallthrough
case 1:
if (Random(0, 120) == 10)
{
npc->act_no = 2;
npc->act_wait = 0;
npc->ani_no = 1;
}
if (gMC.x > npc->x - 0x4000 && gMC.x < npc->x + 0x4000 && gMC.y > npc->y - 0x4000 && gMC.y < npc->y + 0x2000)
{
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
}
break;
case 2:
if (++npc->act_wait > 8)
{
npc->act_no = 1;
npc->ani_no = 0;
}
break;
case 10:
npc->life = 1000;
npc->act_no = 11;
npc->act_wait = Random(0, 50);
npc->ani_no = 0;
npc->damage = 0;
// Fallthrough
case 11:
if (npc->act_wait)
--npc->act_wait;
else
npc->act_no = 13;
break;
case 13:
npc->act_no = 14;
npc->act_wait = Random(0, 50);
if (gMC.x < npc->x)
npc->direct = 0;
else
npc->direct = 2;
// Fallthrough
case 14:
if (++npc->ani_wait > 2)
{
npc->ani_wait = 0;
++npc->ani_no;
}
if (npc->ani_no > 5)
npc->ani_no = 2;
if (npc->direct == 0)
npc->xm -= 0x40;
else
npc->xm += 0x40;
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
npc->bits |= 0x20;
npc->act_no = 15;
npc->ani_no = 2;
npc->ym = -0x200;
npc->damage = 2;
}
break;
case 15:
if (npc->flag & 8)
{
npc->bits |= 0x20;
npc->xm = 0;
npc->act_no = 10;
npc->damage = 0;
}
break;
case 20:
if (npc->flag & 8)
{
npc->xm = 0;
npc->act_no = 21;
npc->damage = 0;
if (npc->ani_no == 6)
npc->ani_no = 8;
else
npc->ani_no = 9;
npc->act_wait = Random(300, 400);
}
break;
case 21:
if (npc->act_wait)
{
--npc->act_wait;
}
else
{
npc->bits |= 0x20;
npc->life = 1000;
npc->act_no = 11;
npc->act_wait = Random(0, 50);
npc->ani_no = 0;
}
break;
}
if (npc->act_no > 10 && npc->act_no < 20 && npc->life != 1000)
{
npc->act_no = 20;
npc->ym = -0x200;
npc->ani_no = Random(6, 7);
npc->bits &= ~0x20;
}
npc->ym += 0x20;
if (npc->xm > 0x1FF)
npc->xm = 0x1FF;
if (npc->xm < -0x1FF)
npc->xm = -0x1FF;
if (npc->ym > 0x5FF )
npc->ym = 0x5FF;
npc->y += npc->ym;
npc->x += npc->xm;
if (npc->direct == 0)
npc->rect = rcLeft[npc->ani_no];
else
npc->rect = rcRight[npc->ani_no];
}
//Curly boss projectile
void ActNpc123(NPCHAR *npc)
{
RECT rect[4];
rect[0] = {192, 0, 208, 16};
rect[1] = {208, 0, 224, 16};
rect[2] = {224, 0, 240, 16};
rect[3] = {240, 0, 256, 16};
bool bBreak = false;
switch (npc->act_no)
{
case 0:
npc->act_no = 1;
SetCaret(npc->x, npc->y, 3, 0);
PlaySoundObject(32, 1);
switch (npc->direct)
{
case 0:
npc->xm = -0x1000;
npc->ym = Random(-0x80, 0x80);
break;
case 1:
npc->ym = -0x1000;
npc->xm = Random(-0x80, 0x80);
break;
case 2:
npc->xm = 0x1000;
npc->ym = Random(-0x80, 0x80);
break;
case 3:
npc->ym = 0x1000;
npc->xm = Random(-0x80, 0x80);
break;
}
break;
case 1:
switch (npc->direct)
{
case 0:
if (npc->flag & 1)
bBreak = true;
break;
case 1:
if (npc->flag & 2)
bBreak = true;
break;
case 2:
if (npc->flag & 4)
bBreak = true;
break;
case 3:
if (npc->flag & 8)
bBreak = true;
break;
}
npc->x += npc->xm;
npc->y += npc->ym;
break;
}
if (bBreak)
{
SetCaret(npc->x, npc->y, 2, 2);
PlaySoundObject(28, 1);
npc->cond = 0;
}
npc->rect = rect[npc->direct];
}
//Hidden item
void ActNpc125(NPCHAR *npc)

View file

@ -174,12 +174,12 @@ NPCFUNCTION gpNpcFuncTbl[361] =
ActNpc115,
ActNpc116,
ActNpc117,
nullptr,
ActNpc118,
ActNpc119,
nullptr,
nullptr,
nullptr,
nullptr,
ActNpc120,
ActNpc121,
ActNpc122,
ActNpc123,
nullptr,
ActNpc125,
nullptr,