mgs_reversing/source/overlays/s12a/okajima/wolf/action.c

350 lines
7.1 KiB
C

#include "wolf2.h"
#include "libgv/libgv.h"
#include "libdg/libdg.h"
#include "libgcl/libgcl.h"
SVECTOR wolf2_800C3560 = {0, 0, 100};
SVECTOR wolf2_800C3568 = {-1024, 0, 0};
extern SVECTOR wolf2_800DD6C8;
void NewBlood( MATRIX *, int );
void * NewDBloods_800D5B70( SVECTOR *, int, int, int );
void wolf2_PlayVoice(Wolf2Work *work, int index)
{
if (work->voices[0] != -1 && GM_StreamStatus() == -1)
{
GM_VoxStream(work->voices[index], 0);
}
}
void wolf2_ClearAdjust(Wolf2Work *work, int count)
{
SVECTOR *adjust;
int i;
adjust = work->adjust;
for (i = 0; i < count; i++)
{
*adjust++ = DG_ZeroVector;
}
}
// put.c
void wolf2_PutBlood(Wolf2Work *work, int unit, int count)
{
MATRIX world;
SVECTOR pos;
DG_SetPos(&work->body.objs->objs[unit].world);
DG_MovePos(&wolf2_800C3560);
wolf2_800C3568.vx += GV_RandS(128);
wolf2_800C3568.vy += GV_RandS(128);
wolf2_800C3568.vz += GV_RandS(512);
DG_RotatePos(&wolf2_800C3568);
ReadRotMatrix(&world);
NewBlood(&world, count);
pos.vx = world.t[0];
pos.vy = -30000;
pos.vz = world.t[2];
NewDBloods_800D5B70(&pos, 0, GV_RandU(256) + 256, 60);
}
void wolf2_SetAction(Wolf2Work *work, int action)
{
work->f688 = action;
GM_ConfigObjectAction(&work->body, action, 0, 4);
}
void wolf2_800D3704(Wolf2Work *work, int action, int arg2)
{
if (work->f688 != action)
{
work->f688 = action;
GM_ConfigObjectAction(&work->body, action, 0, 4);
return;
}
if (work->body.is_end == 1)
{
work->f690 = arg2;
}
}
void s12a_wolf2_800D375C(Wolf2Work *work)
{
GCL_ARGS args;
u_long data[1];
int proc_id;
proc_id = work->f784;
data[0] = 0;
if (proc_id >= 0)
{
data[0] = work->f7A4;
args.argc = 1;
args.argv = data;
GCL_ForceExecProc(work->f784, &args);
}
}
void s12a_wolf2_800D37A8(Wolf2Work *work)
{
TARGET *target;
target = work->f65C;
wolf2_800DD6C8 = work->control.mov;
switch(work->f690)
{
case 0:
wolf2_800D3704(work, 0, 0);
break;
case 2:
wolf2_800D3704(work, 1, 0);
break;
case 3:
wolf2_800D3704(work, 2, 1);
break;
case 4:
wolf2_800D3704(work, 3, 1);
break;
case 1:
if (work->f6B0 == 0)
{
switch (work->f770)
{
case 0:
wolf2_PlayVoice(work, 0);
break;
case 1:
wolf2_PlayVoice(work, 1);
break;
case 2:
wolf2_PlayVoice(work, 2);
break;
case 3:
wolf2_PlayVoice(work, 3);
break;
}
if (++work->f770 > 3)
{
work->f770 = 0;
}
}
else
{
switch (work->f774)
{
case 0:
wolf2_PlayVoice(work, 4);
break;
case 1:
wolf2_PlayVoice(work, 5);
break;
case 2:
wolf2_PlayVoice(work, 6);
break;
}
if (++work->f774 > 2)
{
work->f774 = 0;
}
}
work->f690 = 0;
break;
case 5:
wolf2_800D3704(work, 4, 6);
work->f6A0 = 90;
return;
case 6:
if (--work->f6A0 > 0)
{
wolf2_800D3704(work, 5, 6);
}
else
{
work->f778 = 1;
work->f690 = 7;
}
return;
case 7:
wolf2_800D3704(work, 5, 7);
break;
}
if (work->f6AC == 0)
{
if ((target->damaged & TARGET_POWER) && target->a_mode != 2)
{
work->f7A4 -= work->f65C->life_lost / 4;
s12a_wolf2_800D375C(work);
work->f6B0 = 0;
wolf2_ClearAdjust(work, 16);
work->f6A8 = 0;
work->f6A4 = 0;
wolf2_PutBlood(work, GV_RandU(8), 2);
if (work->f7A4 < 1)
{
work->f690 = 5;
if (work->f770 != -1)
{
GM_SeSet2(0, 63, 134);
work->f770 = -1;
}
if (work->f78C != -1)
{
GCL_ForceExecProc(work->f78C, NULL);
}
GM_GameOver();
}
else
{
work->f6AC = 1;
GM_SeSet2(0, 63, 133);
switch (GV_RandU(4))
{
case 0:
case 1:
work->f690 = 3;
break;
case 2:
case 3:
work->f690 = 4;
break;
}
}
}
else if ((work->f660->damaged & TARGET_POWER) || target->a_mode == 2)
{
work->f6B0 = 1;
if (target->a_mode == 2)
{
work->f7A4 -= work->f65C->life_lost / 4;
}
else
{
work->f7A4 -= work->f660->life_lost / 8;
}
s12a_wolf2_800D375C(work);
wolf2_PutBlood(work, GV_RandU(8), 2);
if (work->f7A4 < 1)
{
work->f690 = 5;
if (work->f770 != -1)
{
GM_SeSet2(0, 63, 134);
work->f770 = -1;
}
if (work->f78C != -1)
{
GCL_ForceExecProc(work->f78C, NULL);
}
GM_GameOver();
}
else
{
work->f6AC = 1;
GM_SeSet2(0, 63, 133);
switch (GV_RandU(4))
{
case 0:
case 1:
work->f690 = 3;
break;
case 2:
case 3:
work->f690 = 4;
break;
}
}
}
}
work->f65C->damaged &= ~TARGET_POWER;
work->f65C->life_lost = 0;
work->f65C->life = 1024;
work->f65C->a_mode = 0;
work->f660->damaged &= ~TARGET_POWER;
work->f660->life_lost = 0;
work->f660->life = 1024;
work->f660->a_mode = 0;
if (work->f6AC == 1 && GM_StreamStatus() == 2)
{
work->f6AC = 2;
}
else if (work->f6AC == 2 && GM_StreamStatus() == -1)
{
work->f6AC = 0;
work->f65C->damaged &= ~TARGET_POWER;
work->f660->damaged &= ~TARGET_POWER;
if (work->f6B0 == 1 && work->f788 != -1)
{
GCL_ForceExecProc(work->f788, NULL);
}
}
}
void wolf2_800D3D54(Wolf2Work *work)
{
work->f6A4 = 0;
work->f6A0 = 0;
work->f6A8 = 0;
work->f69C = 0;
work->f6AC = 0;
work->f690 = 0;
work->f688 = 6;
GM_ConfigMotionAdjust(&work->body, work->adjust);
wolf2_ClearAdjust(work, 16);
wolf2_SetAction(work, 0);
work->f778 = 0;
}