diff --git a/Makefile b/Makefile index fc8a1d64..ddeef95b 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,7 @@ SOURCES = \ NpcAct120 \ NpcAct140 \ NpcAct200 \ + NpcAct260 \ NpcAct280 \ NpcAct300 \ NpcAct340 \ diff --git a/src/NpcAct.h b/src/NpcAct.h index 02c839df..56199a52 100644 --- a/src/NpcAct.h +++ b/src/NpcAct.h @@ -49,6 +49,7 @@ void ActNpc062(NPCHAR *npc); void ActNpc064(NPCHAR *npc); void ActNpc065(NPCHAR *npc); +void ActNpc069(NPCHAR *npc); void ActNpc070(NPCHAR *npc); void ActNpc071(NPCHAR *npc); void ActNpc072(NPCHAR *npc); @@ -59,6 +60,8 @@ void ActNpc076(NPCHAR *npc); void ActNpc077(NPCHAR *npc); void ActNpc078(NPCHAR *npc); void ActNpc079(NPCHAR *npc); +void ActNpc080(NPCHAR *npc); +void ActNpc081(NPCHAR *npc); void ActNpc083(NPCHAR *npc); void ActNpc084(NPCHAR *npc); @@ -78,6 +81,8 @@ void ActNpc151(NPCHAR *npc); void ActNpc211(NPCHAR *npc); +void ActNpc278(NPCHAR *npc); + void ActNpc298(NPCHAR *npc); void ActNpc299(NPCHAR *npc); void ActNpc300(NPCHAR *npc); diff --git a/src/NpcAct060.cpp b/src/NpcAct060.cpp index 163fd438..573e8b60 100644 --- a/src/NpcAct060.cpp +++ b/src/NpcAct060.cpp @@ -660,6 +660,142 @@ void ActNpc065(NPCHAR *npc) npc->rect = rect_right[npc->ani_no]; } +//Sparkle +void ActNpc069(NPCHAR *npc) +{ + RECT rcLeft[6]; + RECT rcRight[6]; + + rcLeft[0] = {48, 0, 64, 16}; + rcLeft[1] = {64, 0, 80, 16}; + rcLeft[2] = {80, 0, 96, 16}; + rcLeft[3] = {96, 0, 112, 16}; + rcLeft[4] = {48, 0, 64, 16}; + rcLeft[5] = {112, 0, 128, 16}; + + rcRight[0] = {48, 16, 64, 32}; + rcRight[1] = {64, 16, 80, 32}; + rcRight[2] = {80, 16, 96, 32}; + rcRight[3] = {96, 16, 112, 32}; + rcRight[4] = {48, 16, 64, 32}; + rcRight[5] = {112, 16, 128, 32}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 100) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + else + { + if (Random(0, 150) == 1) + { + if (npc->direct == 0) + npc->direct = 2; + else + npc->direct = 0; + } + + if (Random(0, 150) == 1) + { + npc->act_no = 3; + npc->act_wait = 50; + npc->ani_no = 0; + } + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (--npc->act_wait == 0) + npc->act_no = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (npc->flag & 1) + { + npc->direct = 2; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + npc->direct = 0; + npc->xm = -0x200; + } + + if (npc->direct == 0) + npc->xm = -0x100u; + else + npc->xm = 0x100; + + break; + + case 5: + if (npc->flag & 8) + npc->act_no = 0; + + break; + } + + switch (npc->act_no) + { + case 1: + case 2: + case 4: + if (npc->shock) + { + npc->ym = -0x200; + npc->ani_no = 5; + npc->act_no = 5; + } + + break; + } + + npc->ym += 0x40; + 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]; +} + //Sparkle void ActNpc070(NPCHAR *npc) { diff --git a/src/NpcAct080.cpp b/src/NpcAct080.cpp index 7855b0db..429ba103 100644 --- a/src/NpcAct080.cpp +++ b/src/NpcAct080.cpp @@ -10,6 +10,298 @@ #include "Triangle.h" #include "Caret.h" +//Gravekeeper +void ActNpc080(NPCHAR *npc) +{ + RECT rcLeft[7]; + RECT rcRight[7]; + + rcLeft[0] = {0, 64, 24, 88}; + rcLeft[1] = {24, 64, 48, 88}; + rcLeft[2] = {0, 64, 24, 88}; + rcLeft[3] = {48, 64, 72, 88}; + rcLeft[4] = {72, 64, 96, 88}; + rcLeft[5] = {96, 64, 120, 88}; + rcLeft[6] = {120, 64, 144, 88}; + + rcRight[0] = {0, 88, 24, 112}; + rcRight[1] = {24, 88, 48, 112}; + rcRight[2] = {0, 88, 24, 112}; + rcRight[3] = {48, 88, 72, 112}; + rcRight[4] = {72, 88, 96, 112}; + rcRight[5] = {96, 88, 120, 112}; + rcRight[6] = {120, 88, 144, 112}; + + switch (npc->act_no) + { + case 0: + npc->bits &= ~0x20; + npc->act_no = 1; + npc->damage = 0; + npc->hit.front = 0x800; + // Fallthrough + case 1: + npc->ani_no = 0; + + if (npc->x - 0x10000 < gMC.x && npc->x + 0x10000 > gMC.x && npc->y - 0x6000 < gMC.y && npc->y + 0x4000 > gMC.y) + { + npc->ani_wait = 0; + npc->act_no = 2; + } + + if (npc->shock) + { + npc->ani_no = 1; + npc->ani_wait = 0; + npc->act_no = 2; + npc->bits &= ~0x20u; + } + + if (gMC.x >= npc->x) + npc->direct = 2; + else + npc->direct = 0; + + break; + + case 2: + if (++npc->ani_wait > 6) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 3) + npc->ani_no = 0; + + if (npc->x - 0x2000 < gMC.x && npc->x + 0x2000 > gMC.x) + { + npc->hit.front = 0x2400; + npc->act_wait = 0; + npc->act_no = 3; + npc->bits |= 0x20; + PlaySoundObject(34, 1); + + if (npc->direct == 0) + npc->xm = -0x400; + else + npc->xm = 0x400; + } + + if (gMC.x >= npc->x) + { + npc->direct = 2; + npc->xm = 0x100; + } + else + { + npc->direct = 0; + npc->xm = -0x100; + } + + break; + + case 3: + npc->xm = 0; + + if (++npc->act_wait > 40) + { + npc->act_wait = 0; + npc->act_no = 4; + PlaySoundObject(106, 1); + } + + npc->ani_no = 4; + break; + + case 4: + npc->damage = 10; + + if (++npc->act_wait > 2) + { + npc->act_wait = 0; + npc->act_no = 5; + } + + npc->ani_no = 5; + break; + + case 5: + npc->ani_no = 6; + + if (++npc->act_wait > 60) + npc->act_no = 0; + + break; + } + + if (npc->xm < 0 && npc->flag & 1) + npc->xm = 0; + if (npc->xm > 0 && npc->flag & 4) + npc->xm = 0; + + npc->ym += 0x20; + + if (npc->xm > 0x400) + npc->xm = 0x400; + if (npc->xm < -0x400) + npc->xm = -0x400; + + if (npc->ym > 0x5FF) + npc->xm = 0x5FF; + if (npc->ym < -0x5FF) + npc->xm = -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]; +} + +//Giant pignon +void ActNpc081(NPCHAR *npc) +{ + RECT rcLeft[6]; + RECT rcRight[6]; + + rcLeft[0] = {144, 64, 168, 88}; + rcLeft[1] = {168, 64, 192, 88}; + rcLeft[2] = {192, 64, 216, 88}; + rcLeft[3] = {216, 64, 240, 88}; + rcLeft[4] = {144, 64, 168, 88}; + rcLeft[5] = {240, 64, 264, 88}; + + rcRight[0] = {144, 88, 168, 112}; + rcRight[1] = {168, 88, 192, 112}; + rcRight[2] = {192, 88, 216, 112}; + rcRight[3] = {216, 88, 240, 112}; + rcRight[4] = {144, 88, 168, 112}; + rcRight[5] = {240, 88, 264, 112}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 100) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + else + { + if (Random(0, 150) == 1) + { + if (npc->direct == 0) + npc->direct = 2; + else + npc->direct = 0; + } + + if (Random(0, 150) == 1) + { + npc->act_no = 3; + npc->act_wait = 50; + npc->ani_no = 0; + } + } + + break; + + case 2: + if (++npc->act_wait > 8) + { + npc->act_no = 1; + npc->ani_no = 0; + } + + break; + + case 3: + npc->act_no = 4; + npc->ani_no = 2; + npc->ani_wait = 0; + // Fallthrough + case 4: + if (--npc->act_wait == 0) + npc->act_no = 0; + + if (++npc->ani_wait > 2) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 4) + npc->ani_no = 2; + + if (npc->flag & 1) + { + npc->direct = 2; + npc->xm = 0x200; + } + + if (npc->flag & 4) + { + npc->direct = 0; + npc->xm = -0x200; + } + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + break; + + case 5: + if (npc->flag & 8) + npc->act_no = 0; + + break; + } + + switch (npc->act_no) + { + case 1: + case 2: + case 4: + if (npc->shock ) + { + npc->ym = -0x200; + npc->ani_no = 5; + npc->act_no = 5; + + if (npc->x >= gMC.x) + npc->xm = -0x100; + else + npc->xm = 0x100; + } + + break; + } + + npc->ym += 0x40; + 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]; +} + //Igor (cutscene) void ActNpc083(NPCHAR *npc) { diff --git a/src/NpcAct260.cpp b/src/NpcAct260.cpp new file mode 100644 index 00000000..1c24abcd --- /dev/null +++ b/src/NpcAct260.cpp @@ -0,0 +1,122 @@ +#include "WindowsWrapper.h" + +#include "NpcAct.h" + +#include "MyChar.h" +#include "NpChar.h" +#include "Game.h" +#include "Sound.h" +#include "Back.h" +#include "Triangle.h" + +//Little family +void ActNpc278(NPCHAR *npc) +{ + RECT rcMama[2]; + RECT rcPapa[2]; + RECT rcKodomo[2]; + + rcPapa[0] = {0, 120, 8, 128}; + rcPapa[1] = {8, 120, 16, 128}; + + rcMama[0] = {16, 120, 24, 128}; + rcMama[1] = {24, 120, 32, 128}; + + rcKodomo[0] = {32, 120, 40, 128}; + rcKodomo[1] = {40, 120, 48, 128}; + + switch (npc->act_no) + { + case 0: + npc->act_no = 1; + npc->ani_no = 0; + npc->ani_wait = 0; + npc->xm = 0; + // Fallthrough + case 1: + if (Random(0, 60) == 1) + { + npc->act_no = 2; + npc->act_wait = 0; + npc->ani_no = 1; + } + + if (Random(0, 60) == 1) + { + npc->act_no = 10; + 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; + + case 10: + npc->act_no = 11; + npc->act_wait = Random(0, 16); + npc->ani_no = 0; + npc->ani_wait = 0; + + if (Random(0, 9) % 2) + npc->direct = 0; + else + npc->direct = 2; + + // Fallthrough + case 11: + if (npc->direct == 0 && (npc->flag & 1)) + npc->direct = 2; + else if ( npc->direct == 2 && npc->flag & 4 ) + npc->direct = 0; + + if (npc->direct == 0) + npc->xm = -0x100; + else + npc->xm = 0x100; + + if (++npc->ani_wait > 4) + { + npc->ani_wait = 0; + ++npc->ani_no; + } + + if (npc->ani_no > 1) + npc->ani_no = 0; + + if (++npc->act_wait > 0x20) + npc->act_no = 0; + + break; + } + + npc->ym += 0x20; + if (npc->ym > 0x5FF) + npc->ym = 0x5FF; + + npc->x += npc->xm; + npc->y += npc->ym; + + + switch (npc->code_event) + { + case 200: + npc->rect = rcPapa[npc->ani_no]; + break; + + case 210: + npc->rect = rcMama[npc->ani_no]; + break; + + default: + npc->rect = rcKodomo[npc->ani_no]; + break; + } +} diff --git a/src/NpcTbl.cpp b/src/NpcTbl.cpp index 8b41e041..8fb6aeb0 100644 --- a/src/NpcTbl.cpp +++ b/src/NpcTbl.cpp @@ -125,7 +125,7 @@ NPCFUNCTION gpNpcFuncTbl[361] = nullptr, nullptr, nullptr, - nullptr, + ActNpc069, ActNpc070, ActNpc071, ActNpc072, @@ -136,8 +136,8 @@ NPCFUNCTION gpNpcFuncTbl[361] = ActNpc077, ActNpc078, ActNpc079, - nullptr, - nullptr, + ActNpc080, + ActNpc081, nullptr, ActNpc083, ActNpc084, @@ -334,7 +334,7 @@ NPCFUNCTION gpNpcFuncTbl[361] = nullptr, nullptr, nullptr, - nullptr, + ActNpc278, nullptr, nullptr, nullptr,