shithub: cstory

Download patch

ref: 25b58cc07200530ceed8f6bde8dd471b771a8311
parent: 76cb99342ac7b5c3c019a593f1bef18307a442e7
author: Clownacy <[email protected]>
date: Tue Jan 29 15:12:49 EST 2019

More NPCs

--- a/Makefile
+++ b/Makefile
@@ -67,6 +67,7 @@
 	NpcAct060 \
 	NpcAct080 \
 	NpcAct100 \
+	NpcAct120 \
 	NpcAct140 \
 	NpcAct200 \
 	NpcAct280 \
--- a/src/NpcAct.h
+++ b/src/NpcAct.h
@@ -9,7 +9,7 @@
 void ActNpc004(NPCHAR *npc);
 void ActNpc005(NPCHAR *npc);
 void ActNpc006(NPCHAR *npc);
-
+void ActNpc007(NPCHAR *npc);
 void ActNpc008(NPCHAR *npc);
 
 void ActNpc015(NPCHAR *npc);
@@ -22,10 +22,15 @@
 void ActNpc022(NPCHAR *npc);
 void ActNpc023(NPCHAR *npc);
 
+void ActNpc025(NPCHAR *npc);
+
+void ActNpc029(NPCHAR *npc);
 void ActNpc030(NPCHAR *npc);
 
 void ActNpc032(NPCHAR *npc);
 
+void ActNpc034(NPCHAR *npc);
+
 void ActNpc037(NPCHAR *npc);
 
 void ActNpc039(NPCHAR *npc);
@@ -45,8 +50,16 @@
 void ActNpc073(NPCHAR *npc);
 
 void ActNpc083(NPCHAR *npc);
+void ActNpc084(NPCHAR *npc);
+void ActNpc085(NPCHAR *npc);
+void ActNpc086(NPCHAR *npc);
+void ActNpc087(NPCHAR *npc);
 
+void ActNpc116(NPCHAR *npc);
+
 void ActNpc119(NPCHAR *npc);
+
+void ActNpc125(NPCHAR *npc);
 
 void ActNpc151(NPCHAR *npc);
 
--- a/src/NpcAct000.cpp
+++ b/src/NpcAct000.cpp
@@ -620,6 +620,88 @@
 		npc->rect = rcLeft[npc->ani_no];
 }
 
+//Basil
+void ActNpc007(NPCHAR *npc)
+{
+	RECT rcLeft[3];
+	RECT rcRight[3];
+
+	rcLeft[0] = {256, 64, 288, 80};
+	rcLeft[1] = {256, 80, 288, 96};
+	rcLeft[2] = {256, 96, 288, 112};
+
+	rcRight[0] = {288, 64, 320, 80};
+	rcRight[1] = {288, 80, 320, 96};
+	rcRight[2] = {288, 96, 320, 112};
+
+	switch (npc->act_no)
+	{
+		case 0:
+			npc->x = gMC.x;
+
+			if (npc->direct == 0)
+				npc->act_no = 1;
+			else
+				npc->act_no = 2;
+
+			break;
+
+		case 1:
+			npc->xm -= 0x40;
+
+			if (npc->x < gMC.x - 0x18000)
+				npc->act_no = 2;
+
+			if (npc->flag & 1)
+			{
+				npc->xm = 0;
+				npc->act_no = 2;
+			}
+
+			break;
+
+		case 2:
+			npc->xm += 0x40;
+
+			if (npc->x > gMC.x + 0x18000)
+				npc->act_no = 1;
+
+			if (npc->flag & 4)
+			{
+				npc->xm = 0;
+				npc->act_no = 1;
+			}
+
+			break;
+	}
+
+	if (npc->xm >= 0)
+		npc->direct = 2;
+	else
+		npc->direct = 0;
+
+	if (npc->xm > 0x5FF)
+		npc->xm = 0x5FF;
+	if (npc->xm < -0x5FF)
+		npc->xm = -0x5FF;
+
+	npc->x += npc->xm;
+
+	if (++npc->ani_wait > 1)
+	{
+		npc->ani_wait = 0;
+		++npc->ani_no;
+	}
+
+	if (npc->ani_no > 2)
+		npc->ani_no = 0;
+
+	if (npc->direct == 0)
+		npc->rect = rcLeft[npc->ani_no];
+	else
+		npc->rect = rcRight[npc->ani_no];
+}
+
 //Beetle (Follows you, Egg Corridor)
 void ActNpc008(NPCHAR *npc)
 {
--- a/src/NpcAct020.cpp
+++ b/src/NpcAct020.cpp
@@ -108,6 +108,166 @@
 	npc->rect = rect[npc->ani_no];
 }
 
+// Egg Corridor lift
+void ActNpc025(NPCHAR *npc)
+{
+	RECT rcLeft[2];
+
+	rcLeft[0] = {256, 64, 288, 80};
+	rcLeft[1] = {256, 80, 288, 96};
+
+	switch (npc->act_no)
+	{
+		case 0:
+			npc->act_no = 1;
+			npc->ani_no = 0;
+			npc->ani_wait = 0;
+			npc->x += 0x1000;
+			// Fallthrough
+		case 1:
+			if (++npc->act_wait > 150)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+
+			break;
+
+		case 2:
+			if (++npc->act_wait > 0x40)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+			else
+			{
+				npc->y -= 0x200;
+			}
+
+			break;
+
+		case 3:
+			if (++npc->act_wait > 150)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+
+			break;
+
+		case 4:
+			if (++npc->act_wait > 0x40)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+			else
+			{
+				npc->y -= 0x200;
+			}
+
+			break;
+
+		case 5:
+			if (++npc->act_wait > 150)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+
+			break;
+
+		case 6:
+			if (++npc->act_wait > 0x40)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+			else
+			{
+				npc->y += 0x200;
+			}
+
+			break;
+
+		case 7:
+			if (++npc->act_wait > 150)
+			{
+				npc->act_wait = 0;
+				++npc->act_no;
+			}
+
+			break;
+
+		case 8:
+			if (++npc->act_wait > 0x40)
+			{
+				npc->act_wait = 0;
+				npc->act_no = 1;
+			}
+			else
+			{
+				npc->y += 0x200;
+			}
+
+			break;
+	}
+
+	switch ( npc->act_no )
+	{
+		case 2:
+		case 4:
+		case 6:
+		case 8:
+			if (++npc->ani_wait > 1)
+			{
+				npc->ani_wait = 0;
+				++npc->ani_no;
+			}
+
+			if (npc->ani_no > 1)
+				npc->ani_no = 0;
+
+			break;
+	}
+
+	npc->rect = rcLeft[npc->ani_no];
+}
+
+//Cthulhu
+void ActNpc029(NPCHAR *npc)
+{
+	RECT rcLeft[2];
+	RECT rcRight[2];
+
+	rcLeft[0] = {0, 192, 16, 216};
+	rcLeft[1] = {16, 192, 32, 216};
+
+	rcRight[0] = {0, 216, 16, 240};
+	rcRight[1] = {16, 216, 32, 240};
+
+	switch (npc->act_no)
+	{
+		case 0:
+			npc->act_no = 1;
+			npc->ani_no = 0;
+			npc->ani_wait = 0;
+			// Fallthrough
+		case 1:
+			if (npc->x - 0x6000 < gMC.x && npc->x + 0x6000 > gMC.x && npc->y - 0x6000 < gMC.y && npc->y + 0x2000 > gMC.y)
+				npc->ani_no = 1;
+			else
+				npc->ani_no = 0;
+
+			break;
+	}
+
+	if (npc->direct == 0)
+		npc->rect = rcLeft[npc->ani_no];
+	else
+		npc->rect = rcRight[npc->ani_no];
+}
+
 //Gunsmith
 void ActNpc030(NPCHAR *npc)
 {
@@ -186,6 +346,21 @@
 		npc->ani_no = 0;
 
 	npc->rect = rect[npc->ani_no];
+}
+
+// Bed
+void ActNpc034(NPCHAR *npc)
+{
+	RECT rcLeft[1];
+	RECT rcRight[1];
+
+	rcLeft[0] = {192, 48, 224, 64};
+	rcRight[0] = {192, 184, 224, 200};
+
+	if (npc->direct == 0)
+		npc->rect = rcLeft[0];
+	else
+		npc->rect = rcRight[0];
 }
 
 //Signpost
--- /dev/null
+++ b/src/NpcAct080.cpp
@@ -1,0 +1,360 @@
+#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"
+
+//Igor (cutscene)
+void ActNpc083(NPCHAR *npc)
+{
+	RECT rcLeft[8];
+	RECT rcRight[8];
+
+	rcLeft[0] = {0, 0, 40, 40};
+	rcLeft[1] = {40, 0, 80, 40};
+	rcLeft[2] = {80, 0, 120, 40};
+	rcLeft[3] = {0, 0, 40, 40};
+	rcLeft[4] = {120, 0, 160, 40};
+	rcLeft[5] = {0, 0, 40, 40};
+	rcLeft[6] = {160, 0, 200, 40};
+	rcLeft[7] = {200, 0, 240, 40};
+
+	rcRight[0] = {0, 40, 40, 80};
+	rcRight[1] = {40, 40, 80, 80};
+	rcRight[2] = {80, 40, 120, 80};
+	rcRight[3] = {0, 40, 40, 80};
+	rcRight[4] = {120, 40, 160, 80};
+	rcRight[5] = {0, 40, 40, 80};
+	rcRight[6] = {160, 40, 200, 80};
+	rcRight[7] = {200, 40, 240, 80};
+
+	switch (npc->act_no)
+	{
+		case 0:
+			npc->xm = 0;
+			npc->act_no = 1;
+			npc->ani_no = 0;
+			npc->ani_wait = 0;
+			// Fallthrough
+		case 1:
+			if (++npc->ani_wait > 5)
+			{
+				npc->ani_wait = 0;
+				++npc->ani_no;
+			}
+
+			if (npc->ani_no > 1)
+				npc->ani_no = 0;
+
+			break;
+
+		case 2:
+			npc->act_no = 3;
+			npc->ani_no = 2;
+			npc->ani_wait = 0;
+			// Fallthrough
+		case 3:
+			if (++npc->ani_wait > 3)
+			{
+				npc->ani_wait = 0;
+				++npc->ani_no;
+			}
+
+			if (npc->ani_no > 5)
+				npc->ani_no = 2;
+
+			if (npc->direct == 0)
+				npc->xm = -0x200;
+			else
+				npc->xm = 0x200;
+
+			break;
+
+		case 4:
+			npc->xm = 0;
+			npc->act_no = 5;
+			npc->act_wait = 0;
+			npc->ani_no = 6;
+			// Fallthrough
+		case 5:
+			if (++npc->act_wait > 10)
+			{
+				npc->act_wait = 0;
+				npc->act_no = 6;
+				npc->ani_no = 7;
+				PlaySoundObject(70, 1);
+			}
+
+			break;
+
+		case 6:
+			if (++npc->act_wait > 8)
+			{
+				npc->act_no = 0;
+				npc->ani_no = 0;
+			}
+
+			break;
+
+		case 7:
+			npc->act_no = 1;
+			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];
+}
+
+//Basu projectile (Egg Corridor)
+void ActNpc084(NPCHAR *npc)
+{
+	if (npc->flag & 0xFF)
+	{
+		SetCaret(npc->x, npc->y, 2, 0);
+		npc->cond = 0;
+	}
+
+	npc->y += npc->ym;
+	npc->x += npc->xm;
+
+	RECT rect_left[4];
+
+	rect_left[0] = {48, 48, 64, 64};
+	rect_left[1] = {64, 48, 80, 64};
+	rect_left[2] = {48, 64, 64, 80};
+	rect_left[3] = {64, 64, 80, 80};
+
+	if (++npc->ani_wait > 2)
+	{
+		npc->ani_wait = 0;
+		++npc->ani_no;
+	}
+
+	if (npc->ani_no > 3)
+		npc->ani_no = 0;
+
+	npc->rect = rect_left[npc->ani_no];
+
+	if (++npc->count1 > 300)
+	{
+		SetCaret(npc->x, npc->y, 2, 0);
+		npc->cond = 0;
+	}
+}
+
+// Terminal
+void ActNpc085(NPCHAR *npc)
+{
+	RECT rcLeft[3];
+	RECT rcRight[3];
+
+	rcLeft[0] = {256, 96, 272, 120};
+	rcLeft[1] = {256, 96, 272, 120};
+	rcLeft[2] = {272, 96, 288, 120};
+
+	rcRight[0] = {256, 96, 272, 120};
+	rcRight[1] = {288, 96, 304, 120};
+	rcRight[2] = {304, 96, 320, 120};
+
+	switch(npc->act_no)
+	{
+		case 0:
+			npc->ani_no = 0;
+
+			if (npc->x - 0x1000 < gMC.x && npc->x + 0x1000 > gMC.x && npc->y - 0x2000 < gMC.y && npc->y + 0x1000 > gMC.y)
+			{
+				PlaySoundObject(43, 1);
+				npc->act_no = 1;
+			}
+
+			break;
+
+		case 1:
+			if (++npc->ani_no > 2)
+				npc->ani_no = 1;
+
+			break;
+	}
+
+	if (npc->direct == 0)
+		npc->rect = rcLeft[npc->ani_no];
+	else
+		npc->rect = rcRight[npc->ani_no];
+}
+
+// Missile
+void ActNpc086(NPCHAR *npc)
+{
+	RECT rect1[2];
+	RECT rect3[2];
+	RECT rcLast[1];
+
+	rect1[0] = {0, 80, 16, 96};
+	rect1[1] = {16, 80, 32, 96};
+
+	rect3[0] = {0, 112, 16, 128};
+	rect3[1] = {16, 112, 32, 128};
+
+	rcLast[0] = {16, 0, 32, 16};
+
+	if (npc->direct == 0)
+	{
+		if (++npc->ani_wait > 2)
+		{
+			npc->ani_wait = 0;
+			++npc->ani_no;
+		}
+
+		if (npc->ani_no > 1)
+			npc->ani_no = 0;
+	}
+
+	if (gBack.type == 5 || gBack.type == 6)
+	{
+		if (npc->act_no == 0)
+		{
+			npc->act_no = 1;
+			npc->ym = Random(-0x20, 0x20);
+			npc->xm = Random(0x7F, 0x100);
+		}
+
+		npc->xm -= 8;
+
+		if (npc->x < 0xA000)
+			npc->cond = 0;
+
+		if (npc->x < -0x600)
+			npc->x = -0x600;
+
+		if (npc->flag & 1)
+			npc->xm = 0x100;
+
+		if (npc->flag & 2)
+			npc->ym = 0x40;
+
+		if (npc->flag & 8)
+			npc->ym = -0x40;
+
+		npc->x += npc->xm;
+		npc->y += npc->ym;
+	}
+
+	switch (npc->exp)
+	{
+		case 1:
+			npc->rect = rect1[npc->ani_no];
+			break;
+
+		case 3:
+			npc->rect = rect3[npc->ani_no];
+			break;
+	}
+
+	if (npc->direct == 0)
+		++npc->count1;
+
+	if (npc->count1 > 550)
+		npc->cond = 0;
+
+	if (npc->count1 > 500 && npc->count1 / 2 % 2)
+		npc->rect.right = 0;
+
+	if (npc->count1 > 547)
+		npc->rect = rcLast[0];;
+}
+
+// Heart
+void ActNpc087(NPCHAR *npc)
+{
+	RECT rect2[5];
+	RECT rect6[2];
+	RECT rcLast[1];
+
+	rect2[0] = {32, 80, 48, 96};
+	rect2[1] = {48, 80, 64, 96};
+
+	rect6[0] = {64, 80, 80, 96};
+	rect6[1] = {80, 80, 96, 96};
+
+	rcLast[0] = {16, 0, 32, 16};
+
+	if (npc->direct == 0)
+	{
+		if (++npc->ani_wait > 2)
+		{
+			npc->ani_wait = 0;
+			++npc->ani_no;
+		}
+
+		if (npc->ani_no > 1)
+			npc->ani_no = 0;
+	}
+
+	if (gBack.type == 5 || gBack.type == 6)
+	{
+		if (npc->act_no == 0)
+		{
+			npc->act_no = 1;
+			npc->ym = Random(-0x20, 0x20);
+			npc->xm = Random(0x7F, 0x100);
+		}
+
+		npc->xm -= 8;
+
+		if (npc->x < 0xA000)
+			npc->cond = 0;
+
+		if (npc->x < -0x600)
+			npc->x = -0x600;
+
+		if (npc->flag & 1)
+			npc->xm = 0x100;
+
+		if (npc->flag & 2)
+			npc->ym = 0x40;
+
+		if (npc->flag & 8)
+			npc->ym = -0x40;
+
+		npc->x += npc->xm;
+		npc->y += npc->ym;
+	}
+
+	switch (npc->exp)
+	{
+		case 2:
+			npc->rect = rect2[npc->ani_no];
+			break;
+
+		case 6:
+			npc->rect = rect6[npc->ani_no];
+			break;
+	}
+
+	if (npc->direct == 0)
+		++npc->count1;
+
+	if (npc->count1 > 550)
+		npc->cond = 0;
+
+	if (npc->count1 > 500 && npc->count1 / 2 % 2)
+		npc->rect.right = 0;
+
+	if (npc->count1 > 547)
+		npc->rect = rcLast[0];
+}
--- a/src/NpcAct100.cpp
+++ b/src/NpcAct100.cpp
@@ -9,6 +9,16 @@
 #include "Back.h"
 #include "Triangle.h"
 
+//Red petals
+void ActNpc116(NPCHAR *npc)
+{
+	RECT rc[1];
+
+	rc[0] = {272, 184, 320, 200};
+
+	npc->rect = rc[0];
+}
+
 //Table and chair
 void ActNpc119(NPCHAR *npc)
 {
--- /dev/null
+++ b/src/NpcAct120.cpp
@@ -1,0 +1,37 @@
+#include "WindowsWrapper.h"
+
+#include "NpcAct.h"
+
+#include "MyChar.h"
+#include "NpChar.h"
+#include "Game.h"
+#include "Sound.h"
+#include "Back.h"
+#include "Triangle.h"
+
+//Hidden item
+void ActNpc125(NPCHAR *npc)
+{
+	if (npc->life < 990)
+	{
+		SetDestroyNpChar(npc->x, npc->y, npc->view.back, 8);
+		PlaySoundObject(70, 1);
+
+		if (npc->direct)
+			SetNpChar(86, npc->x, npc->y, 0, 0, 2, 0, 0);
+		else
+			SetNpChar(87, npc->x, npc->y, 0, 0, 2, 0, 0);
+
+		npc->cond = 0;
+	}
+
+	RECT rc[2];
+
+	rc[0] = {0, 96, 16, 112};
+	rc[1] = {16, 96, 32, 112};
+
+	if (npc->direct == 0)
+		npc->rect = rc[0];
+	else
+		npc->rect = rc[1];
+}
--- /dev/null
+++ b/src/NpcAct140.cpp
@@ -1,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"
+
+//Blue robot (standing)
+void ActNpc151(NPCHAR *npc)
+{
+	RECT rcLeft[2];
+	RECT rcRight[2];
+
+	rcLeft[0] = {192, 0, 208, 16};
+	rcLeft[1] = {208, 0, 224, 16};
+
+	rcRight[0] = {192, 16, 208, 32};
+	rcRight[1] = {208, 16, 224, 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, 100) == 0)
+			{
+				npc->act_no = 2;
+				npc->act_wait = 0;
+				npc->ani_no = 1;
+			}
+
+			break;
+
+		case 2:
+			if (++npc->act_wait > 16)
+			{
+				npc->act_no = 1;
+				npc->ani_no = 0;
+			}
+
+			break;
+	}
+
+	if (npc->direct == 0)
+		npc->rect = rcLeft[npc->ani_no];
+	else
+		npc->rect = rcRight[npc->ani_no];
+}
--- a/src/NpcTbl.cpp
+++ b/src/NpcTbl.cpp
@@ -63,7 +63,7 @@
 	ActNpc004,
 	ActNpc005,
 	ActNpc006,
-	nullptr,
+	ActNpc007,
 	ActNpc008,
 	nullptr,
 	nullptr,
@@ -81,18 +81,18 @@
 	ActNpc022,
 	ActNpc023,
 	nullptr,
+	ActNpc025,
 	nullptr,
 	nullptr,
 	nullptr,
-	nullptr,
-	nullptr,
+	ActNpc029,
 	ActNpc030,
 	nullptr,
 	ActNpc032,
 	nullptr,
+	ActNpc034,
 	nullptr,
 	nullptr,
-	nullptr,
 	ActNpc037,
 	nullptr,
 	ActNpc039,
@@ -140,6 +140,10 @@
 	nullptr,
 	nullptr,
 	ActNpc083,
+	ActNpc084,
+	ActNpc085,
+	ActNpc086,
+	ActNpc087,
 	nullptr,
 	nullptr,
 	nullptr,
@@ -168,13 +172,9 @@
 	nullptr,
 	nullptr,
 	nullptr,
+	ActNpc116,
 	nullptr,
 	nullptr,
-	nullptr,
-	nullptr,
-	nullptr,
-	nullptr,
-	nullptr,
 	ActNpc119,
 	nullptr,
 	nullptr,
@@ -181,7 +181,7 @@
 	nullptr,
 	nullptr,
 	nullptr,
-	nullptr,
+	ActNpc125,
 	nullptr,
 	nullptr,
 	nullptr,