mgs_reversing/source/overlays/s04c/onoda/s04b/wire.c

682 lines
20 KiB
C

#include <stdio.h>
#include "common.h"
#include "bullet/blast.h"
#include "game/game.h"
#include "linkvar.h"
#include "game/vibrate.h"
#include "takabe/thing.h"
#include "strcode.h"
typedef struct _WireWork
{
GV_ACT actor;
int name;
OBJECT objects[25];
DG_PRIM *f1668;
int f166C;
int f1670;
SVECTOR verts[112];
int map;
int f19F8;
MATRIX f19FC[2];
MATRIX f1A3C[2];
MATRIX f1A7C[2];
MATRIX f1ABC[2];
MATRIX f1AFC[2];
MATRIX f1B3C[2];
MATRIX f1B7C[2];
MATRIX f1BBC[2];
MATRIX f1BFC[2];
MATRIX f1C3C[2];
MATRIX f1C7C[2];
MATRIX f1CBC[2];
MATRIX f1CFC[2];
MATRIX f1D3C[2];
MATRIX f1D7C[2];
MATRIX f1DBC[2];
MATRIX f1DFC[2];
MATRIX f1E3C[2];
MATRIX f1E7C[2];
MATRIX f1EBC[2];
MATRIX f1EFC[2];
MATRIX f1F3C[2];
MATRIX f1F7C[2];
MATRIX f1FBC[2];
MATRIX f1FFC[2];
TARGET *f203C;
char pad1[0x7C];
SVECTOR f20BC;
SVECTOR f20C4;
int f20CC;
int f20D0;
TARGET *f20D4;
SVECTOR f20D8;
} WireWork;
extern BLAST_DATA blast_data_8009F4B8[8];
unsigned short s04c_dword_800C35E8[] = {HASH_KILL};
char s04c_dword_800C35EC[] = {0x7F, 0x03, 0x00, 0x00};
SVECTOR s04c_dword_800C35F0 = {2000, 2000, 2000, 0};
SVECTOR s04c_dword_800C35F8 = {2500, 10000, 2500, 0};
#define EXEC_LEVEL GV_ACTOR_LEVEL5
void s04c_wire_800D2E7C(WireWork *work)
{
int px, pz;
int x, z;
GM_CurrentMap = work->map;
px = GM_PlayerPosition.vx;
pz = GM_PlayerPosition.vz;
if (GM_PlayerPosition.vy > 300)
{
if (px <= 0)
{
if (px >= -5000 && pz <= 8500 && pz >= 3500)
{
if (px >= -5000 && px <= -4000)
{
if (pz >= (-px + 2500) || pz <= (px + 9500))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
else if (px >= -4000 && px <= -3500)
{
if ((pz >= (-px + 2500) && pz <= (-px + 4500)) || (pz <= (px + 9500) && pz >= (px + 7500)))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
else if (px >= -3500 && px <= -2500)
{
if (pz <= (-px + 4500) && pz >= (px + 7500))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
else if (px >= -2500 && px <= -1500)
{
if (pz >= (-px + 2500) && pz <= (px + 9500))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
else if (px >= -1500 && px <= -1000)
{
if ((pz <= (px + 9500) && pz >= (px + 7500)) || (pz <= (-px + 0x1194) && pz >= (-px + 2500)))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
else if (px >= -1000 && px <= 0 && pz >= (px + 7500) && pz <= (-px + 4500))
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
}
}
else if (px <= -1500)
{
if (px >= -3500 && pz <= 7000 && pz >= 5000)
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f1670 = 1;
work->f166C++;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut by HOFUKU!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
return;
}
}
if (work->f20CC == 1)
{
if (px > -500)
{
work->f20CC = 0;
work->f20BC = work->f20C4;
}
else if (px < -4500)
{
work->f20CC = 0;
work->f20BC = work->f20C4;
}
else if (pz > 8000)
{
work->f20CC = 0;
work->f20BC = work->f20C4;
}
else if (pz < 4000)
{
work->f20CC = 0;
work->f20BC = work->f20C4;
}
}
if (work->f203C->damaged & 0x8)
{
x = work->f203C->offset.vx;
if (x != 0)
{
work->f20BC.vx += (x / abs(x)) * 150;
}
z = work->f203C->offset.vz;
if (z != 0)
{
work->f20BC.vz += (z / abs(z)) * 150;
}
work->f20CC = 1;
work->f203C->damaged &= ~0x8;
}
if ((work->f20D4->damaged & 0x4) && work->f20D4->a_mode == 2)
{
GM_SeSet2(0, 63, 182);
NewPadVibration(s04c_dword_800C35EC, 1);
work->f166C = 15;
work->f1670 = 1;
if (!(GM_GameStatus & STATE_DEMO) && GM_GameOverTimer == 0)
{
printf("Wire Cut by BAKUFUU!!\n");
GM_GameOverTimer = -2;
if (GM_CurrentItemId == IT_Camera || GM_CurrentItemId == IT_Scope)
{
GM_CurrentItemId = IT_None;
}
}
work->f203C->class &= ~TARGET_PUSH;
}
}
void s04c_wire_800D350C(WireWork *work)
{
GM_CurrentMap = work->map;
switch (work->f166C)
{
case 30:
NewBlast(&work->objects[0].objs->world, &blast_data_8009F4B8[1]);
break;
case 31:
NewBlast(&work->objects[3].objs->world, &blast_data_8009F4B8[1]);
break;
case 32:
NewBlast(&work->objects[2].objs->world, &blast_data_8009F4B8[1]);
break;
case 33:
NewBlast(&work->objects[1].objs->world, &blast_data_8009F4B8[1]);
break;
case 34:
NewBlast(&work->objects[15].objs->world, &blast_data_8009F4B8[1]);
break;
case 35:
NewBlast(&work->objects[14].objs->world, &blast_data_8009F4B8[1]);
break;
case 36:
NewBlast(&work->objects[13].objs->world, &blast_data_8009F4B8[1]);
break;
case 37:
NewBlast(&work->objects[6].objs->world, &blast_data_8009F4B8[1]);
break;
case 38:
NewBlast(&work->objects[5].objs->world, &blast_data_8009F4B8[1]);
break;
case 39:
NewBlast(&work->objects[4].objs->world, &blast_data_8009F4B8[1]);
break;
case 40:
NewBlast(&work->objects[21].objs->world, &blast_data_8009F4B8[1]);
break;
case 41:
NewBlast(&work->objects[20].objs->world, &blast_data_8009F4B8[1]);
break;
case 42:
NewBlast(&work->objects[19].objs->world, &blast_data_8009F4B8[1]);
break;
case 43:
NewBlast(&work->objects[9].objs->world, &blast_data_8009F4B8[1]);
break;
case 44:
NewBlast(&work->objects[8].objs->world, &blast_data_8009F4B8[1]);
break;
case 45:
NewBlast(&work->objects[7].objs->world, &blast_data_8009F4B8[1]);
break;
case 46:
NewBlast(&work->objects[24].objs->world, &blast_data_8009F4B8[1]);
break;
case 47:
NewBlast(&work->objects[23].objs->world, &blast_data_8009F4B8[1]);
break;
case 48:
NewBlast(&work->objects[22].objs->world, &blast_data_8009F4B8[1]);
break;
case 49:
NewBlast(&work->objects[12].objs->world, &blast_data_8009F4B8[1]);
break;
case 50:
NewBlast(&work->objects[11].objs->world, &blast_data_8009F4B8[1]);
break;
case 51:
NewBlast(&work->objects[10].objs->world, &blast_data_8009F4B8[1]);
break;
case 52:
NewBlast(&work->objects[18].objs->world, &blast_data_8009F4B8[1]);
break;
case 53:
NewBlast(&work->objects[17].objs->world, &blast_data_8009F4B8[1]);
break;
case 54:
NewBlast(&work->objects[16].objs->world, &blast_data_8009F4B8[1]);
break;
case 55:
GV_DestroyActor(&work->actor);
break;
}
work->f166C++;
}
void WireAct_800D36B8(WireWork *work)
{
SVECTOR pos;
if (work->f19F8 < 6)
{
pos.vx = work->objects[0].objs->world.t[0];
pos.vy = work->objects[0].objs->world.t[1];
pos.vz = work->objects[0].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f19FC);
pos.vx = work->objects[3].objs->world.t[0];
pos.vy = work->objects[3].objs->world.t[1];
pos.vz = work->objects[3].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1A3C);
pos.vx = work->objects[2].objs->world.t[0];
pos.vy = work->objects[2].objs->world.t[1];
pos.vz = work->objects[2].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1A7C);
pos.vx = work->objects[1].objs->world.t[0];
pos.vy = work->objects[1].objs->world.t[1];
pos.vz = work->objects[1].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1ABC);
pos.vx = work->objects[15].objs->world.t[0];
pos.vy = work->objects[15].objs->world.t[1];
pos.vz = work->objects[15].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1D3C);
pos.vx = work->objects[14].objs->world.t[0];
pos.vy = work->objects[14].objs->world.t[1];
pos.vz = work->objects[14].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1D7C);
pos.vx = work->objects[13].objs->world.t[0];
pos.vy = work->objects[13].objs->world.t[1];
pos.vz = work->objects[13].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1DBC);
pos.vx = work->objects[6].objs->world.t[0];
pos.vy = work->objects[6].objs->world.t[1];
pos.vz = work->objects[6].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1AFC);
pos.vx = work->objects[5].objs->world.t[0];
pos.vy = work->objects[5].objs->world.t[1];
pos.vz = work->objects[5].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1B3C);
pos.vx = work->objects[4].objs->world.t[0];
pos.vy = work->objects[4].objs->world.t[1];
pos.vz = work->objects[4].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1B7C);
pos.vx = work->objects[21].objs->world.t[0];
pos.vy = work->objects[21].objs->world.t[1];
pos.vz = work->objects[21].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1EBC);
pos.vx = work->objects[20].objs->world.t[0];
pos.vy = work->objects[20].objs->world.t[1];
pos.vz = work->objects[20].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1EFC);
pos.vx = work->objects[19].objs->world.t[0];
pos.vy = work->objects[19].objs->world.t[1];
pos.vz = work->objects[19].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1F3C);
pos.vx = work->objects[9].objs->world.t[0];
pos.vy = work->objects[9].objs->world.t[1];
pos.vz = work->objects[9].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1BBC);
pos.vx = work->objects[8].objs->world.t[0];
pos.vy = work->objects[8].objs->world.t[1];
pos.vz = work->objects[8].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1BFC);
pos.vx = work->objects[7].objs->world.t[0];
pos.vy = work->objects[7].objs->world.t[1];
pos.vz = work->objects[7].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1C3C);
pos.vx = work->objects[24].objs->world.t[0];
pos.vy = work->objects[24].objs->world.t[1];
pos.vz = work->objects[24].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1F7C);
pos.vx = work->objects[23].objs->world.t[0];
pos.vy = work->objects[23].objs->world.t[1];
pos.vz = work->objects[23].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1FBC);
pos.vx = work->objects[22].objs->world.t[0];
pos.vy = work->objects[22].objs->world.t[1];
pos.vz = work->objects[22].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1FFC);
pos.vx = work->objects[12].objs->world.t[0];
pos.vy = work->objects[12].objs->world.t[1];
pos.vz = work->objects[12].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1C7C);
pos.vx = work->objects[11].objs->world.t[0];
pos.vy = work->objects[11].objs->world.t[1];
pos.vz = work->objects[11].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1CBC);
pos.vx = work->objects[10].objs->world.t[0];
pos.vy = work->objects[10].objs->world.t[1];
pos.vz = work->objects[10].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1CFC);
pos.vx = work->objects[18].objs->world.t[0];
pos.vy = work->objects[18].objs->world.t[1];
pos.vz = work->objects[18].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1DFC);
pos.vx = work->objects[17].objs->world.t[0];
pos.vy = work->objects[17].objs->world.t[1];
pos.vz = work->objects[17].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1E3C);
pos.vx = work->objects[16].objs->world.t[0];
pos.vy = work->objects[16].objs->world.t[1];
pos.vz = work->objects[16].objs->world.t[2];
DG_GetLightMatrix(&pos, work->f1E7C);
work->f19F8++;
}
switch (work->f1670)
{
case 0:
s04c_wire_800D2E7C(work);
GM_MoveTarget(work->f203C, &work->f20BC);
GM_PushTarget(work->f203C);
break;
case 1:
s04c_wire_800D350C(work);
break;
}
if (THING_Msg_CheckMessage(work->name, 1, s04c_dword_800C35E8) == 0)
{
GV_DestroyActor(&work->actor);
}
}
void WireDie_800D3DB0(WireWork *work)
{
GM_FreeObject(&work->objects[0]);
GM_FreeObject(&work->objects[3]);
GM_FreeObject(&work->objects[2]);
GM_FreeObject(&work->objects[1]);
GM_FreeObject(&work->objects[15]);
GM_FreeObject(&work->objects[14]);
GM_FreeObject(&work->objects[13]);
GM_FreeObject(&work->objects[6]);
GM_FreeObject(&work->objects[5]);
GM_FreeObject(&work->objects[4]);
GM_FreeObject(&work->objects[21]);
GM_FreeObject(&work->objects[20]);
GM_FreeObject(&work->objects[19]);
GM_FreeObject(&work->objects[9]);
GM_FreeObject(&work->objects[8]);
GM_FreeObject(&work->objects[7]);
GM_FreeObject(&work->objects[24]);
GM_FreeObject(&work->objects[23]);
GM_FreeObject(&work->objects[22]);
GM_FreeObject(&work->objects[12]);
GM_FreeObject(&work->objects[11]);
GM_FreeObject(&work->objects[10]);
GM_FreeObject(&work->objects[18]);
GM_FreeObject(&work->objects[17]);
GM_FreeObject(&work->objects[16]);
GM_FreePrim(work->f1668);
GM_FreeTarget(work->f203C);
GM_FreeTarget(work->f20D4);
}
int s04c_wire_800D3ED8(WireWork *work)
{
TARGET *target;
target = GM_AllocTarget();
work->f203C = target;
if (target == NULL)
{
return -1;
}
GM_SetTarget(target, TARGET_PUSH, NO_SIDE, &s04c_dword_800C35F0);
GM_MoveTarget(target, &work->f20C4);
return 0;
}
int s04c_wire_800D3F40(WireWork *work)
{
TARGET *target;
target = GM_AllocTarget();
work->f20D4 = target;
if (target == NULL)
{
return -1;
}
GM_SetTarget(target, TARGET_POWER, PLAYER_SIDE, &s04c_dword_800C35F8);
GM_MoveTarget(target, &work->f20D8);
return 0;
}
const char s04c_aWire_800DBBA8[] = "wire";
const char s04c_aBc_800DBBB0[] = "04b_c4";
#pragma INCLUDE_ASM("asm/overlays/s04c/s04c_wire_800D3FA8.s")
int s04c_wire_800D3FA8(WireWork *work, int name, int map);
void *NewWire_800D709C(int name, int where)
{
WireWork *work;
work = GV_NewActor(EXEC_LEVEL, sizeof(WireWork));
if (work != NULL)
{
GV_SetNamedActor(&work->actor, WireAct_800D36B8, WireDie_800D3DB0, "wire.c");
if (s04c_wire_800D3FA8(work, name, where) < 0)
{
GV_DestroyActor(&work->actor);
return NULL;
}
work->name = name;
}
return (void *)work;
}