diff --git a/src/NpcAct.h b/src/NpcAct.h index 60a2cc6e..3bc250f9 100644 --- a/src/NpcAct.h +++ b/src/NpcAct.h @@ -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); diff --git a/src/NpcAct100.cpp b/src/NpcAct100.cpp index 65e9d310..a9e2fbbc 100644 --- a/src/NpcAct100.cpp +++ b/src/NpcAct100.cpp @@ -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) { diff --git a/src/NpcAct120.cpp b/src/NpcAct120.cpp index d1c55c51..034b550f 100644 --- a/src/NpcAct120.cpp +++ b/src/NpcAct120.cpp @@ -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) diff --git a/src/NpcTbl.cpp b/src/NpcTbl.cpp index 6d2c7d98..d14dbbcb 100644 --- a/src/NpcTbl.cpp +++ b/src/NpcTbl.cpp @@ -174,12 +174,12 @@ NPCFUNCTION gpNpcFuncTbl[361] = ActNpc115, ActNpc116, ActNpc117, - nullptr, + ActNpc118, ActNpc119, - nullptr, - nullptr, - nullptr, - nullptr, + ActNpc120, + ActNpc121, + ActNpc122, + ActNpc123, nullptr, ActNpc125, nullptr,