Finally, bullets murder NPCS, also fixed SetExpObjects to not crash... oops!

This commit is contained in:
cuckydev 2019-01-30 18:44:31 -05:00
parent 7a44e6c8e0
commit eee18d71a3
6 changed files with 220 additions and 30 deletions

View file

@ -4,6 +4,7 @@
#include "Caret.h" #include "Caret.h"
#include "Draw.h" #include "Draw.h"
#include "Triangle.h"
#include "Game.h" #include "Game.h"
#define CARET_MAX 0x40 #define CARET_MAX 0x40
@ -181,6 +182,38 @@ void ActCaret09(CARET *crt)
crt->rect = {0, 80, 16, 96}; crt->rect = {0, 80, 16, 96};
} }
void ActCaret11(CARET *crt)
{
if (!crt->act_no)
{
crt->act_no = 1;
uint8_t deg = Random(0, 0xFF);
crt->xm = 2 * GetCos(deg);
crt->ym = 2 * GetSin(deg);
}
crt->x += crt->xm;
crt->y += crt->ym;
RECT rcRight[7];
rcRight[0] = {56, 8, 64, 16};
rcRight[1] = {64, 8, 72, 16};
rcRight[2] = {72, 8, 80, 16};
rcRight[3] = {80, 8, 88, 16};
rcRight[4] = {88, 8, 96, 16};
rcRight[5] = {96, 8, 104, 16};
rcRight[6] = {104, 8, 112, 16};
if (++crt->ani_wait > 2)
{
crt->ani_wait = 0;
if (++crt->ani_no > 6)
crt->cond = 0;
}
crt->rect = rcRight[crt->ani_no];
}
void ActCaret13(CARET *crt) void ActCaret13(CARET *crt)
{ {
RECT rcLeft[2]; RECT rcLeft[2];
@ -259,7 +292,7 @@ CARETFUNCTION gpCaretFuncTbl[] =
ActCaret08, ActCaret08,
ActCaret09, ActCaret09,
nullptr, //ActCaret10, nullptr, //ActCaret10,
nullptr, //ActCaret11, ActCaret11,
nullptr, //ActCaret12, nullptr, //ActCaret12,
ActCaret13, ActCaret13,
nullptr, //ActCaret14, nullptr, //ActCaret14,

View file

@ -478,7 +478,7 @@ int ModeAction()
HitNpCharMap(); HitNpCharMap();
//HitBossMap(); //HitBossMap();
HitBulletMap(); HitBulletMap();
//HitNpCharBullet(); HitNpCharBullet();
//HitBossBullet(); //HitBossBullet();
if (g_GameFlags & 2) if (g_GameFlags & 2)
ShootBullet(); ShootBullet();

View file

@ -9,8 +9,10 @@
#include "Caret.h" #include "Caret.h"
#include "MyChar.h" #include "MyChar.h"
#include "Game.h" #include "Game.h"
#include "ArmsItem.h"
#include "Flags.h" #include "Flags.h"
#include "Sound.h" #include "Sound.h"
#include "ValueView.h"
#include "NpcTbl.h" #include "NpcTbl.h"
#include "Draw.h" #include "Draw.h"
@ -172,43 +174,51 @@ void SetDestroyNpCharUp(int x, int y, int w, int num)
void SetExpObjects(int x, int y, int exp) void SetExpObjects(int x, int y, int exp)
{ {
int sub_exp;
for (int n = 0x100; exp; SetUniqueParameter(&gNPC[n])) for (int n = 0x100; exp; SetUniqueParameter(&gNPC[n]))
{ {
if (!gNPC[n].cond) while (true)
{ {
memset(&gNPC[n], 0, sizeof(NPCHAR)); bool v3 = n < NPC_MAX && gNPC[n].cond;
if (!v3)
break;
++n;
}
if (n == NPC_MAX)
break;
memset(&gNPC[n], 0, sizeof(NPCHAR));
int sub_exp = 0; if (exp < 20)
if (exp < 20) {
if (exp < 5)
{ {
if (exp < 5) if (exp > 0)
{ {
if (exp > 0) --exp;
{ sub_exp = 1;
--exp;
sub_exp = 1;
}
}
else
{
exp -= 5;
sub_exp = 5;
} }
} }
else else
{ {
exp -= 20; exp -= 5;
sub_exp = 20; sub_exp = 5;
} }
gNPC[n].cond |= 0x80u;
gNPC[n].direct = 0;
gNPC[n].code_char = 1;
gNPC[n].x = x;
gNPC[n].y = y;
gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits;
gNPC[n].exp = sub_exp;
} }
else
{
exp -= 20;
sub_exp = 20;
}
gNPC[n].cond |= 0x80u;
gNPC[n].direct = 0;
gNPC[n].code_char = 1;
gNPC[n].x = x;
gNPC[n].y = y;
gNPC[n].bits = gNpcTable[gNPC[n].code_char].bits;
gNPC[n].exp = sub_exp;
} }
} }
@ -220,7 +230,7 @@ bool SetBulletObject(int x, int y, int val)
memset(tamakazu_ari, 0, sizeof(tamakazu_ari)); memset(tamakazu_ari, 0, sizeof(tamakazu_ari));
for (int n = 0; n < 8; n++) for (int n = 0; n < 8; n++)
{ {
int code = 0; //gArmsData[n].code; int code = gArmsData[n].code;
if (code == 5) if (code == 5)
tamakazu_ari[t++] = 0; tamakazu_ari[t++] = 0;
else if (code == 10) else if (code == 10)
@ -310,7 +320,7 @@ void PutNpChar(int fx, int fy)
a = 0; a = 0;
if (gNPC[n].bits & npc_showDamage && gNPC[n].damage_view) if (gNPC[n].bits & npc_showDamage && gNPC[n].damage_view)
{ {
//SetValueView(&gNPC[n].x, &gNPC[n].y, gNPC[n].damage_view); SetValueView(&gNPC[n].x, &gNPC[n].y, gNPC[n].damage_view);
gNPC[n].damage_view = 0; gNPC[n].damage_view = 0;
} }
} }

View file

@ -83,6 +83,7 @@ void SetDestroyNpChar(int x, int y, int w, int num);
void SetDestroyNpCharUp(int x, int y, int w, int num); void SetDestroyNpCharUp(int x, int y, int w, int num);
void SetExpObjects(int x, int y, int exp); void SetExpObjects(int x, int y, int exp);
bool SetBulletObject(int x, int y, int val); bool SetBulletObject(int x, int y, int val);
bool SetLifeObject(int x, int y, int val);
void VanishNpChar(NPCHAR *npc); void VanishNpChar(NPCHAR *npc);
void PutNpChar(int fx, int fy); void PutNpChar(int fx, int fy);
void ActNpChar(); void ActNpChar();

View file

@ -1,4 +1,12 @@
#include "NpChar.h" #include "NpChar.h"
#include "ValueView.h"
#include "Sound.h"
#include "Flags.h"
#include "Caret.h"
#include "Game.h"
#include "Bullet.h"
#include "MyChar.h"
#include "TextScr.h"
#include "Map.h" #include "Map.h"
void JadgeHitNpCharBlock(NPCHAR *npc, int x, int y) void JadgeHitNpCharBlock(NPCHAR *npc, int x, int y)
@ -398,4 +406,141 @@ void HitNpCharMap()
} }
} }
} }
} }
void LoseNpChar(NPCHAR *npc, bool bVanish)
{
//Play death sound
PlaySoundObject(npc->destroy_voice, 1);
//Create smoke
switch (npc->size)
{
case 1:
SetDestroyNpChar(npc->x, npc->y, npc->view.back, 3);
break;
case 2:
SetDestroyNpChar(npc->x, npc->y, npc->view.back, 7);
break;
case 3:
SetDestroyNpChar(npc->x, npc->y, npc->view.back, 12);
break;
}
//Create drop
if (npc->exp)
{
int v3 = Random(1, 5);
char v4;
if (v3 == 1)
{
if (npc->exp <= 6)
SetLifeObject(npc->x, npc->y, 2);
else
SetLifeObject(npc->x, npc->y, 6);
}
else if (v3 != 2 || (npc->exp <= 6 ? (v4 = SetBulletObject(npc->x, npc->y, 1)) : (v4 = SetBulletObject(npc->x, npc->y, 3)), !v4)) //TODO: what the FUCK
{
SetExpObjects(npc->x, npc->y, npc->exp);
}
}
//Set flag
SetNPCFlag(npc->code_flag);
//Create value view
if (!(npc->bits & npc_showDamage))
{
npc->cond = 0;
}
else
{
if ((npc->bits & npc_showDamage) && npc->damage_view)
SetValueView(&npc->x, &npc->y, npc->damage_view);
if (bVanish)
VanishNpChar(npc);
}
}
void HitNpCharBullet()
{
for (int n = 0; n < NPC_MAX; n++)
{
if ((gNPC[n].cond & 0x80) && (!(gNPC[n].bits & npc_shootable) || !(gNPC[n].bits & npc_interact)))
{
for (int b = 0; b < BULLET_MAX; b++)
{
if (gBul[b].cond & 0x80 && gBul[b].damage != -1)
{
//Check if bullet touches npc
bool bHit = false;
if (gNPC[n].bits & npc_shootable
&& gNPC[n].x - gNPC[n].hit.back < gBul[b].x + gBul[b].enemyXL
&& gNPC[n].x + gNPC[n].hit.back > gBul[b].x - gBul[b].enemyXL
&& gNPC[n].y - gNPC[n].hit.top < gBul[b].y + gBul[b].enemyYL
&& gNPC[n].y + gNPC[n].hit.bottom > gBul[b].y - gBul[b].enemyYL)
bHit = true;
else if (gNPC[n].bits & npc_invulnerable
&& gNPC[n].x - gNPC[n].hit.back < gBul[b].x + gBul[b].blockXL
&& gNPC[n].x + gNPC[n].hit.back > gBul[b].x - gBul[b].blockXL
&& gNPC[n].y - gNPC[n].hit.top < gBul[b].y + gBul[b].blockYL
&& gNPC[n].y + gNPC[n].hit.bottom > gBul[b].y - gBul[b].blockYL)
bHit = true;
if (bHit)
{
//Damage NPC
if (gNPC[n].bits & npc_shootable)
{
gNPC[n].life -= gBul[b].damage;
if (gNPC[n].life > 0)
{
if (gNPC[n].shock < 14)
{
SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, 11, 0);
SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, 11, 0);
SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, 11, 0);
PlaySoundObject(gNPC[n].hit_voice, 1);
gNPC[n].shock = 16;
}
}
else
{
gNPC[n].life = 0;
if (gNPC[n].bits & npc_showDamage)
gNPC[n].damage_view -= gBul[b].damage;
if ((gMC.cond & 0x80) && gNPC[n].bits & npc_eventDie)
StartTextScript(gNPC[n].code_event);
else
gNPC[n].cond |= 8;
}
}
//Hit invulnerable NPC
else if (gBul[b].code_bullet != 13
&& gBul[b].code_bullet != 14
&& gBul[b].code_bullet != 15
&& gBul[b].code_bullet != 28
&& gBul[b].code_bullet != 29
&& gBul[b].code_bullet != 30
&& !(gBul[b].bbits & 0x10))
{
SetCaret((gBul[b].x + gNPC[n].x) / 2, (gBul[b].y + gNPC[n].y) / 2, 2, 2);
PlaySoundObject(31, 1);
gBul[b].life = 0;
continue;
}
--gBul[b].life;
}
}
}
if (gNPC[n].cond & 8)
LoseNpChar(&gNPC[n], true);
}
}
}

View file

@ -2,3 +2,4 @@
#include "NpChar.h" #include "NpChar.h"
void HitNpCharMap(); void HitNpCharMap();
void HitNpCharBullet();