1489 lines
33 KiB
C
1489 lines
33 KiB
C
#include <stdio.h>
|
|
#include "meryl72.h"
|
|
|
|
/****Inlines**********************************************************************************************/
|
|
static inline void SetAction( Meryl72Work *work, int n_action, int interp )
|
|
{
|
|
extern short ActTable_800C3310[];
|
|
work->f8BC.field_18 = n_action;
|
|
GM_ConfigObjectAction( &( work->body ), ActTable_800C3310[n_action], 0, interp );
|
|
}
|
|
|
|
static inline void UnsetMode( Meryl72Work *work )
|
|
{
|
|
extern short ActTable_800C3310[];
|
|
GM_ConfigObjectOverride( &( work->body ), ActTable_800C3310[STANDSTILL], 0, ACTINTERP, 0 );
|
|
|
|
work->action2 = 0;
|
|
work->time2 = 0;
|
|
work->control.turn.vz = 0;
|
|
work->control.turn.vx = 0;
|
|
}
|
|
/*********************************************************************************************************/
|
|
|
|
extern void s07c_meryl72_unk1_800C86EC( Meryl72Work* work, int time ) ;
|
|
|
|
short ActTable_800C3310[58] =
|
|
{
|
|
0x10, 0x11, 0x11, 0x18, 0x10, 0x10, 0x10, 0x10,
|
|
0x18, 0x12, 0x13, 0x1B, 0x1C, 0x1D, 0x10, 0x10,
|
|
0x10, 0x10, 0x10, 0x10, 0x01, 0x10, 0x10, 0x10,
|
|
0x10, 0x10, 0x10, 0x10, 0x14, 0x1A, 0x19, 0x15,
|
|
0x0A, 0x0B, 0x0C, 0x0D, 0x08, 0x16, 0x17, 0x10,
|
|
0x04, 0x04, 0x04, 0x02, 0x17, 0x05, 0x09, 0x05,
|
|
0x0E, 0x0F, 0x0E, 0x0F, 0x06, 0x07, 0x05, 0x09,
|
|
0x05, 0x18
|
|
};
|
|
|
|
unsigned char s07c_dword_800C3384[4] = { 1, 4, 0, 0 };
|
|
unsigned char s07c_dword_800C3388[4] = { 255, 4, 0, 0 };
|
|
|
|
SVECTOR s07c_dword_800C338C = { -150, 0, 300 };
|
|
|
|
void ActStandStill_800C8580( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1;
|
|
work->vision.length = 4000;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, 0, ACTINTERP ) ;
|
|
GM_ConfigMotionAdjust( &( work->body ), &( work->rots[ 16 ] ) );
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) || CheckPad_800C8308( work ) )
|
|
{
|
|
UnsetMode( work ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( work->pad.dir >= 0 )
|
|
{
|
|
if ( GV_DiffDirAbs( work->control.rot.vy, work->pad.dir ) < 0x100 )
|
|
{
|
|
if ( work->pad.mode & 0x1 )
|
|
{
|
|
SetAction( work, ACTION2, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION1, ACTINTERP );
|
|
}
|
|
SetMode( work, s07c_meryl72_unk1_800C86EC );
|
|
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->pad.dir;
|
|
}
|
|
}
|
|
|
|
work->vision.facedir = work->control.rot.vy;
|
|
work->target->class |= 0x9E;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C86EC( Meryl72Work* work, int time )
|
|
{
|
|
int s0;
|
|
int tmp;
|
|
int dist;
|
|
CONTROL * ctrl;
|
|
int dir;
|
|
int cur_act;
|
|
SVECTOR* svec;
|
|
|
|
work->act_status = 1;
|
|
work->vision.length = 4000;
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
UnsetMode( work ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( CheckPad_800C8308( work ) )
|
|
{
|
|
UnsetMode( work ) ;
|
|
return ;
|
|
}
|
|
|
|
dist = -1;
|
|
dir = work->pad.dir;
|
|
ctrl = &(work->control );
|
|
cur_act = work->f8BC.field_18;
|
|
svec = work->control.nearvecs;
|
|
|
|
if ( (work->pad.mode & 0x1) && ( cur_act != ACTION2 ) )
|
|
{
|
|
SetAction( work, ACTION2, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( dir >= 0 )
|
|
{
|
|
s0 = ctrl->touch_flag;
|
|
if ( s0 > 0 )
|
|
{
|
|
dist = GV_VecDir2( svec );
|
|
|
|
if ( s0 >= 2 )
|
|
{
|
|
tmp = GV_VecDir2( &ctrl->nearvecs[1] );
|
|
if ( GV_DiffDirAbs( dir, tmp ) < GV_DiffDirAbs( dir, dist ) )
|
|
{
|
|
dist = tmp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( dir < 0 )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
UnsetMode( work ) ;
|
|
return;
|
|
}
|
|
|
|
|
|
switch ( s07c_meryl72_unk1_800C7FCC( dir, dist ) )
|
|
{
|
|
case 1:
|
|
dir = ( dist - 1024 ) & 0xFFF;
|
|
break;
|
|
case 2:
|
|
dir = ( dist + 1024 ) & 0xFFF;
|
|
break;
|
|
}
|
|
|
|
if ( !work->body.objs->bound_mode )
|
|
{
|
|
ctrl->rot.vy = dir;
|
|
}
|
|
|
|
ctrl->turn.vy = dir;
|
|
work->vision.facedir = GV_NearExp4P( work->vision.facedir, work->control.rot.vy );
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
|
|
extern void s07c_meryl72_unk1_800CA0EC( Meryl72Work* work, int time ) ;
|
|
|
|
void s07c_meryl72_unk1_800C88EC( Meryl72Work* work, int time )
|
|
{
|
|
if ( time == 0 )
|
|
{
|
|
work->f8BC.field_14 = 4;
|
|
SetAction( work, ACTION41, 4 );
|
|
}
|
|
|
|
if ( !( CheckDamage_800C7F6C( work ) ) && ( work->body.is_end ) )
|
|
{
|
|
work->pad.tmp = 0;
|
|
SetMode( work, s07c_meryl72_unk1_800CA0EC );
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C8970( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1 ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION21, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
if ( work->body.is_end || !( work->pad.press & 0x20 ) )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
return ;
|
|
}
|
|
|
|
work->control.turn.vy = work->sn_dir ;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C8A30( Meryl72Work* work, int time )
|
|
{
|
|
int dir;
|
|
|
|
work->vision.length = 4000 ;
|
|
work->act_status |= 9 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
GM_GameStatus |= STATE_PADRELEASE;
|
|
SetAction( work, ACTION28, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 1 )
|
|
{
|
|
dir = work->sn_dir;
|
|
GM_PlayerControl->turn.vy = ( dir + 0x800 ) & 0xFFF ;
|
|
}
|
|
|
|
if ( time == 98 )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0x38 );
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xBD );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xC7 );
|
|
}
|
|
}
|
|
|
|
if ( time == 101 && AttackForce_800C80DC( work, 0 ) )
|
|
{
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xB0 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xC8 );
|
|
}
|
|
if ( s07c_meryl72_unk1_800C829C( work ) )
|
|
{
|
|
ExecProc_800C7C58( work, 2 );
|
|
}
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
work->fC08 = 3;
|
|
GM_GameStatus &= ~STATE_PADRELEASE;
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C8BC4( Meryl72Work* work, int time )
|
|
{
|
|
work->vision.length = 4000 ;
|
|
work->act_status |= 9 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION13, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 30 )
|
|
{
|
|
GM_SeSetMode( &( work->control.mov ), 0xC1, 1 );
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
work->fC08 = 3;
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C8C7C( Meryl72Work* work, int time )
|
|
{
|
|
int local_time;
|
|
|
|
work->vision.length = 4000 ;
|
|
work->act_status |= 9 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
GM_GameStatus |= STATE_PADRELEASE;
|
|
SetAction( work, ACTION31, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 90 )
|
|
{
|
|
GM_CurrentItemId = -1;
|
|
GM_SeSet( &( work->control.mov ), 0x14 );
|
|
}
|
|
|
|
if ( time == 95 )
|
|
{
|
|
int dir = work->sn_dir;
|
|
GM_PlayerControl->turn.vy = ( dir + 0x800 ) & 0xFFF ;
|
|
}
|
|
|
|
local_time = 95;
|
|
|
|
if ( time == 95 )
|
|
{
|
|
SetAction( work, ACTION28, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 193 )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0x38 );
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xBD );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xC7 );
|
|
}
|
|
}
|
|
|
|
if ( time == ( local_time + 101 ) && AttackForce_800C80DC( work, 0 ) )
|
|
{
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xB0 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xC8 );
|
|
}
|
|
if ( s07c_meryl72_unk1_800C829C( work ) )
|
|
{
|
|
ExecProc_800C7C58( work, 2 );
|
|
}
|
|
}
|
|
|
|
if ( local_time < time && work->body.is_end )
|
|
{
|
|
work->fC08 = 3;
|
|
GM_GameStatus &= ~STATE_PADRELEASE;
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C8E74( Meryl72Work* work, int time )
|
|
{
|
|
work->vision.length = 4000 ;
|
|
work->act_status |= 9 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
GM_GameStatus |= STATE_PADRELEASE;
|
|
SetAction( work, ACTION28, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 50 )
|
|
{
|
|
SetAction( work, ACTION29, ACTINTERP );
|
|
}
|
|
|
|
if ( time == 63 )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0x38 );
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xBD );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0xC7 );
|
|
}
|
|
}
|
|
|
|
if ( time == 67 && AttackForce_800C80DC( work, 1 ) )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), 0x35 );
|
|
if ( s07c_meryl72_unk1_800C829C( work ) )
|
|
{
|
|
ExecProc_800C7C58( work, 2 );
|
|
}
|
|
}
|
|
|
|
if ( time > 0x32 && work->body.is_end )
|
|
{
|
|
work->fC08 = 3;
|
|
GM_GameStatus &= ~STATE_PADRELEASE;
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9000( Meryl72Work* work, int time )
|
|
{
|
|
|
|
int press = work->pad.press;
|
|
work->act_status = 1 ;
|
|
work->vision.length = 4000 ;
|
|
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION9, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( !CheckDamage_800C7F6C( work ) )
|
|
{
|
|
if ( !(press & 0x02000000) )
|
|
{
|
|
if ( !CheckPad_800C8308( work ) )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir ;
|
|
work->vision.facedir = work->control.rot.vy ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C90C8( Meryl72Work* work, int time )
|
|
{
|
|
|
|
int press = work->pad.press;
|
|
work->act_status = 1 ;
|
|
work->vision.length = 4000 ;
|
|
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION10, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( !CheckDamage_800C7F6C( work ) )
|
|
{
|
|
if ( !(press & 0x04000000) )
|
|
{
|
|
if ( !CheckPad_800C8308( work ) )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
work->vision.facedir = work->control.rot.vy;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9190( Meryl72Work* work, int time )
|
|
{
|
|
|
|
int press = work->pad.press;
|
|
work->act_status = 1 ;
|
|
work->vision.length = 4000 ;
|
|
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION11, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( !CheckDamage_800C7F6C( work ) )
|
|
{
|
|
if ( !(press & 0x20000000) )
|
|
{
|
|
if ( !CheckPad_800C8308( work ) )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
work->vision.facedir = work->control.rot.vy;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9258( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1 ;
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION31, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) ) return ;
|
|
if ( CheckPad_800C8308( work ) ) return ;
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
work->vision.facedir = work->control.rot.vy;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9318( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1 ;
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION12, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) ) return ;
|
|
if ( CheckPad_800C8308( work ) ) return ;
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
else
|
|
{
|
|
work->control.turn.vy = work->sn_dir;
|
|
work->vision.facedir = work->control.rot.vy;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
}
|
|
|
|
int s07c_meryl72_unk1_800C93D8( Meryl72Work* work )
|
|
{
|
|
int diff = GV_DiffDirS( work->control.rot.vy, work->sn_dir );
|
|
|
|
if ( diff < 768 && diff > -768 )
|
|
{
|
|
return work->control.turn.vy ;
|
|
}
|
|
|
|
return work->sn_dir ;
|
|
}
|
|
|
|
void ActReadyGun_800C9428( Meryl72Work* work, int time )
|
|
{
|
|
int press;
|
|
work->act_status = 1 ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
work->vision.length = 4000 ;
|
|
press = work->pad.press;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
if ( press & 0x10000 )
|
|
{
|
|
SetAction( work, ACTION3, ACTINTERP ) ;
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION5, ACTINTERP );
|
|
}
|
|
GM_ConfigMotionAdjust( &( work->body ), &work->rots[16] ) ;
|
|
}
|
|
|
|
ReviseReadyGun_800C8020( work );
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
work->rots[21].vx = 0;
|
|
work->rots[21].vy = 0;
|
|
return ;
|
|
}
|
|
|
|
if ( !(press & 0x30000) )
|
|
{
|
|
work->rots[21].vx = 0;
|
|
work->rots[21].vy = 0;
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( press & 0x40000 )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800C9594 ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( press & 0x80000 )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800C964C ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( press & 0x100000 )
|
|
{
|
|
SetMode( work, ActGrenade_800C9790 ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( press & 0x200000 )
|
|
{
|
|
SetMode( work, ActGrenade_800C9790 ) ;
|
|
return ;
|
|
}
|
|
|
|
work->control.turn.vy = s07c_meryl72_unk1_800C93D8( work ) ;
|
|
work->vision.facedir = work->control.rot.vy + work->rots[21].vy ;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9594( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1 ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION4, 0 ) ;
|
|
ML72_SetPutChar_800CB584( work, 3 ) ; //Meryl_SetPutChar
|
|
GM_ConfigMotionAdjust( &( work->body ), &work->rots[16] ) ;
|
|
}
|
|
|
|
work->control.turn.vy = work->sn_dir;
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
SetMode( work, ActReadyGun_800C9428 );
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C964C( Meryl72Work *work, int time )
|
|
{
|
|
SVECTOR *rot;
|
|
|
|
work->act_status = 1 ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
GM_ConfigMotionAdjust( &( work->body ), &work->rots[16] );
|
|
}
|
|
|
|
rot = &work->control.rot;
|
|
if ( time == 1 || time == 7 )
|
|
{
|
|
rot->vy = ( rot->vy - 0x100 ) & 0xFFF;
|
|
}
|
|
|
|
if ( time == 3 || time == 5 )
|
|
{
|
|
rot->vy = ( rot->vy + 0x100 ) & 0xFFF;
|
|
}
|
|
|
|
if ( time == 2 || time == 4 || time == 6 )
|
|
{
|
|
SetAction( work, ACTION6, 0 );
|
|
ML72_SetPutChar_800CB584( work, GUNSHOOT ) ;
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
SetMode( work, ActReadyGun_800C9428 );
|
|
}
|
|
|
|
work->control.rot.vy = rot->vy;
|
|
}
|
|
|
|
void ActGrenade_800C9790( Meryl72Work* work, int time )
|
|
{
|
|
work->act_status = 1 ;
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
work->vision.length = 4000 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
extern void *NewGrenadeEnemy_800D2138( CONTROL *, OBJECT *, int, unsigned int *, SVECTOR *, int ) ;
|
|
|
|
SetAction( work, GRENADE, ACTINTERP ) ;
|
|
work->subweapon = NewGrenadeEnemy_800D2138( &(work->control), &(work->body), 9, &(work->trigger), &GM_PlayerPosition, ENEMY_SIDE ) ;
|
|
}
|
|
|
|
if ( time > ACTINTERP )
|
|
{
|
|
work->trigger |= WEAPON_TAKE ;
|
|
}
|
|
if ( time == 17 )
|
|
{
|
|
GM_SeSet( &( work->control.mov ), SE_PINNUKI ) ;
|
|
}
|
|
if ( time == 45 )
|
|
{
|
|
work->trigger |= WEAPON_TRIG2 ;
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
GV_DestroyActor( work->subweapon ) ;
|
|
return ;
|
|
}
|
|
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
GV_DestroyActor( work->subweapon ) ;
|
|
SetMode( work, ActReadyGun_800C9428 ) ;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C98E0( Meryl72Work* work, int time )
|
|
{
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION24, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( !CheckDamage_800C7F6C( work ) && work->body.is_end )
|
|
{
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9970( Meryl72Work* work, int time )
|
|
{
|
|
TARGET *trgt = work->target ;
|
|
CONTROL *ctrl = &work->control ;
|
|
|
|
work->f8BC.field_1C = 0 ;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
work->fC08 = 1;
|
|
work->f8BC.field_14 = 7 ;
|
|
SetAction( work, ACTION36, ACTINTERP ) ;
|
|
}
|
|
|
|
if ( ( time > 7 ) && ( time < 20 ) )
|
|
{
|
|
GM_MoveTarget( &work->target2, &ctrl->mov );
|
|
GM_PowerTarget( &work->target2 );
|
|
}
|
|
|
|
if ( time == 24 )
|
|
{
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC2 );
|
|
}
|
|
GM_SeSet( &ctrl->mov, 0x33 );
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CA0EC ) ;
|
|
}
|
|
|
|
if ( time < 24 )
|
|
{
|
|
ctrl->turn = *trgt->field_1C ;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9AB0( Meryl72Work* work )
|
|
{
|
|
SVECTOR svec;
|
|
|
|
work->control.turn = GM_PlayerControl->rot;
|
|
DG_SetPos2( &GM_PlayerPosition, &GM_PlayerControl->rot ) ;
|
|
DG_PutVector( &s07c_dword_800C338C, &svec, 1 );
|
|
GV_SubVec3( &svec, &work->control.mov, &work->control.step );
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9B30( Meryl72Work* work, int time )
|
|
{
|
|
int s2;
|
|
TARGET *target;
|
|
|
|
target = work->target;
|
|
s2 = work->f8BC.field_18;
|
|
|
|
work->f8BC.field_1C = 0;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
work->fC08 = 1;
|
|
work->fAEA = target->faint;
|
|
work->fAEC = 0;
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xBE );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC4 );
|
|
}
|
|
}
|
|
|
|
if ( work->fAEA != target->faint )
|
|
{
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xBE );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC4 );
|
|
}
|
|
work->fAEA = target->faint;
|
|
}
|
|
|
|
if ( target->damaged & TARGET_POWER )
|
|
{
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 ) ;
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC2);
|
|
}
|
|
target->scale = DG_ZeroVector;
|
|
target->life_lost = 0;
|
|
target->damaged = TARGET_STALE;
|
|
|
|
if ( target->life <= 0 )
|
|
{
|
|
work->f8BC.field_14 = 6;
|
|
target->side = ENEMY_SIDE;
|
|
if ( !GM_GameOverTimer && GM_SnakeCurrentHealth > 0 )
|
|
{
|
|
ExecProc_800C7C58( work, 1 ) ;
|
|
GM_GameOver();
|
|
GM_GameOverTimer = -2;
|
|
}
|
|
SetMode( work, s07c_meryl72_unk1_800CA538 );
|
|
target->captured = 0;
|
|
}
|
|
}
|
|
|
|
switch ( GM_PlayerAction )
|
|
{
|
|
case 0x7:
|
|
case 0xD:
|
|
if( s2 != 0x20 && s2 != 0x1E )
|
|
{
|
|
target->side = PLAYER_SIDE;
|
|
SetAction( work, ACTION32, ACTINTERP );
|
|
work->fAEC = 0;
|
|
}
|
|
|
|
if ( work->fAEC == 0x32 && target->faint > 0 )
|
|
{
|
|
SetAction( work, ACTION30, ACTINTERP );
|
|
}
|
|
|
|
if ( s2 == 0x1E && !( work->fAEC & 7 ) )
|
|
{
|
|
NewPadVibration(s07c_dword_800C3384, 1);
|
|
NewPadVibration(s07c_dword_800C3388, 2);
|
|
}
|
|
work->control.turn = GM_PlayerControl->rot;
|
|
s07c_meryl72_unk1_800C9AB0( work );
|
|
work->fAEC++;
|
|
break;
|
|
case 0x26:
|
|
if ( s2 != 0x21 )
|
|
{
|
|
target->side = PLAYER_SIDE;
|
|
SetAction( work, ACTION33, ACTINTERP );
|
|
}
|
|
work->control.turn = GM_PlayerControl->rot;
|
|
s07c_meryl72_unk1_800C9AB0( work );
|
|
break;
|
|
case 0x27:
|
|
work->f8BC.field_14 = 5;
|
|
target->side = ENEMY_SIDE;
|
|
target->life = 0;
|
|
if ( !GM_GameOverTimer && GM_SnakeCurrentHealth > 0 )
|
|
{
|
|
ExecProc_800C7C58( work, 1 ) ;
|
|
GM_GameOver();
|
|
GM_GameOverTimer = -2;
|
|
}
|
|
SetMode( work, s07c_meryl72_unk1_800CA538 );
|
|
return ;
|
|
default:
|
|
work->f8BC.field_14 = 6 ;
|
|
target->side = ENEMY_SIDE ;
|
|
SetMode( work, s07c_meryl72_unk1_800CA538 ) ;
|
|
return ;
|
|
}
|
|
|
|
if ( work->sn_dis > 800 )
|
|
{
|
|
target->captured = 0 ;
|
|
}
|
|
|
|
work->target->class |= ( TARGET_SEEK | TARGET_POWER ) ;
|
|
work->vision.facedir = work->control.rot.vy ;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9F30( Meryl72Work *work, int time )
|
|
{
|
|
if ( time == 0 )
|
|
{
|
|
SetAction( work, ACTION44, ACTINTERP );
|
|
}
|
|
|
|
if (work->body.is_end )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CAA48 );
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800C9F98( Meryl72Work *work, int time )
|
|
{
|
|
CONTROL *ctrl;
|
|
int time_offset;
|
|
|
|
ctrl = &work->control;
|
|
work->f8BC.field_1C = 0;
|
|
work->vision.length = 0;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
work->fC08 = 1 ;
|
|
SetAction( work, ACTION37, ACTINTERP ) ;
|
|
work->target->faint = 0;
|
|
if ( GM_StreamStatus() != -1 )
|
|
{
|
|
GM_StreamPlayStop();
|
|
}
|
|
}
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
time_offset = 10;
|
|
|
|
if ( time == time_offset )
|
|
{
|
|
work->f8BC.field_14 = 2;
|
|
SetAction( work, ACTION38, ACTINTERP ) ;
|
|
}
|
|
else
|
|
{
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
|
|
if ( time == time_offset + 48 )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0x51 );
|
|
}
|
|
|
|
if ( time == time_offset + 74 )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0x33 );
|
|
}
|
|
|
|
if ( time >= time_offset + 50 && work->body.is_end )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CA0EC ) ;
|
|
}
|
|
}
|
|
|
|
extern void AN_Piyopiyo( SVECTOR *pos ) ;
|
|
|
|
void s07c_meryl72_unk1_800CA0EC( Meryl72Work *work, int time )
|
|
{
|
|
SVECTOR svec;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
if ( work->f8BC.field_14 < 4 )
|
|
{
|
|
if ( work->f8BC.field_14 == 1 )
|
|
{
|
|
SetAction( work, ACTION47, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION45, ACTINTERP );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION46, ACTINTERP );
|
|
}
|
|
|
|
if ( work->target->faint <= 0 )
|
|
{
|
|
work->target->faint = 7 ;
|
|
svec.vx = work->body.objs->objs[6].world.t[0];
|
|
svec.vy = work->body.objs->objs[6].world.t[1];
|
|
svec.vz = work->body.objs->objs[6].world.t[2];
|
|
AN_Piyopiyo( &svec ) ;
|
|
work->fAEA = 0x96;
|
|
}
|
|
else
|
|
{
|
|
work->fAEA = 0xA;
|
|
}
|
|
}
|
|
|
|
if (s07c_meryl72_unk1_800C7D00( work ) )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CA278 );
|
|
return;
|
|
}
|
|
|
|
if ( work->fAEA < time )
|
|
{
|
|
if ( work->target->faint <= 0 )
|
|
{
|
|
work->target->faint = work->param.faint;
|
|
}
|
|
SetMode( work, s07c_meryl72_unk1_800CA314 );
|
|
return;
|
|
}
|
|
|
|
work->target->class |= 0x22;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CA278( Meryl72Work *work, int time )
|
|
{
|
|
if ( time == 0 )
|
|
{
|
|
if ( work->f8BC.field_14 < 4 )
|
|
{
|
|
SetAction( work, ACTION52, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION53, ACTINTERP );
|
|
}
|
|
GM_SeSet( &work->control.mov, 0x36 );
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CAA48 );
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CA314( Meryl72Work* work, int time )
|
|
{
|
|
work->f8BC.field_1C = 0;
|
|
|
|
if ( time == 0 )
|
|
{
|
|
if ( work->f8BC.field_14 < 4 )
|
|
{
|
|
if ( work->fAEA == 0x96 )
|
|
{
|
|
SetAction( work, ACTION50, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION48, ACTINTERP );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( work->fAEA == 0x96 )
|
|
{
|
|
SetAction( work, ACTION51, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION49, ACTINTERP );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
work->fC34 = 0x1E;
|
|
SetMode( work, ActStandStill_800C8580 );
|
|
work->fC08 = 2;
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CA408( Meryl72Work* work, int time )
|
|
{
|
|
TARGET* target;
|
|
work->f8BC.field_1C = 0;
|
|
work->vision.length = 4000;
|
|
|
|
if ( CheckDamage_800C7F6C( work ) )
|
|
{
|
|
return ;
|
|
}
|
|
|
|
target = work->target;
|
|
if (time == 0 )
|
|
{
|
|
work->fC08 = 1;
|
|
SetAction( work, ACTION20, ACTINTERP ) ;
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &work->control.mov, 0xC2);
|
|
}
|
|
|
|
if ( target->a_mode == 3 )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0x34 );
|
|
ML72_PutBreath_800CB35C( work ); // putfog
|
|
}
|
|
else
|
|
{
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 ); // putblood
|
|
}
|
|
}
|
|
|
|
if ( work->body.is_end)
|
|
{
|
|
work->fC34 = 0x1E;
|
|
work->fC08 = 2 ;
|
|
printf( " nokezori end!!\n" ) ;
|
|
SetMode( work, ActStandStill_800C8580 ) ;
|
|
}
|
|
SetTargetClass( work->target, TARGET_FLAG );
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CA538( Meryl72Work *work, int time )
|
|
{
|
|
CONTROL* ctrl;
|
|
UNK *unk;
|
|
int s2;
|
|
|
|
s2 = 0xF;
|
|
unk = (UNK*)&work->f8BC;
|
|
work->f8BC.field_1C = 0;
|
|
work->control.step = work->target->scale;
|
|
ctrl = &work->control;
|
|
|
|
|
|
|
|
if ( time == 0 )
|
|
{
|
|
work->fC08 = 1;
|
|
switch( unk->field_14 )
|
|
{
|
|
case 0:
|
|
GM_SeSet( &ctrl->mov, 0x34 );
|
|
SetAction( work, ACTION40, ACTINTERP );
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC2);
|
|
}
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 );
|
|
work->fAEA = 17;
|
|
s2 = 0x10;
|
|
break;
|
|
case 1:
|
|
SetAction( work, ACTION43, ACTINTERP );
|
|
if ( work->target->life <= 0 )
|
|
{
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC4 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3);
|
|
}
|
|
if ( GM_CurrentWeaponId == WP_Rifle )
|
|
{
|
|
ML72_PutBlood_800CB2EC( work, 6, 2 );
|
|
}
|
|
else
|
|
{
|
|
ML72_PutBlood_800CB2EC( work, 6, 1 );
|
|
}
|
|
if ( work->target->a_mode == 3 )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0x34 );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC2) ;
|
|
}
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 );
|
|
}
|
|
work->fAEA = 46;
|
|
s2 = 0xF;
|
|
break;
|
|
case 4:
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC2);
|
|
}
|
|
s2 = 0xF;
|
|
SetAction( work, ACTION41, ACTINTERP );
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 );
|
|
work->fAEA = 14;
|
|
break;
|
|
case 3:
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC3 );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC2) ;
|
|
}
|
|
s2 = 0x11;
|
|
SetAction( work, ACTION42, ACTINTERP );
|
|
ML72_PutBlood_800CB2EC( work, 5, 0 );
|
|
work->fAEA = 22;
|
|
break;
|
|
case 5:
|
|
if ( !work->stage )
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xBF );
|
|
}
|
|
else
|
|
{
|
|
GM_SeSet( &ctrl->mov, 0xC5 );
|
|
}
|
|
s2 = 0xF;
|
|
GM_SeSet( &ctrl->mov, 0x90 );
|
|
SetAction( work, ACTION34, ACTINTERP );
|
|
work->fAEA = 67;
|
|
break;
|
|
case 6:
|
|
SetAction( work, ACTION35, ACTINTERP );
|
|
s2 = 0x10;
|
|
work->fAEA = 15;
|
|
break;
|
|
}
|
|
|
|
if ( GM_StreamStatus() != -1 )
|
|
{
|
|
GM_StreamPlayStop();
|
|
}
|
|
}
|
|
|
|
if ( time == 2 && work->target->life <= 0 )
|
|
{
|
|
GM_GameStatus |= STATE_PADRELEASE;
|
|
if ( GM_StreamStatus() == -1 )
|
|
{
|
|
GM_VoxStream( work->voices[ s2] , 0 );
|
|
}
|
|
}
|
|
|
|
|
|
switch( unk->field_14 )
|
|
{
|
|
case 1:
|
|
if ( time == 24 )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0x51 );
|
|
}
|
|
break;
|
|
case 0:
|
|
case 3:
|
|
case 4:
|
|
if ( time > 6 && time < 30 )
|
|
{
|
|
GM_MoveTarget( &work->target2, &work->control.mov );
|
|
GM_PowerTarget( &work->target2 );
|
|
}
|
|
break;
|
|
case 2:
|
|
case 5:
|
|
break;
|
|
}
|
|
|
|
if ( time > 16 && work->control.level_flag )
|
|
{
|
|
work->control.step = DG_ZeroVector;
|
|
}
|
|
|
|
if ( time == work->fAEA )
|
|
{
|
|
GM_SeSet( &work->control.mov, 0x33 ) ;
|
|
}
|
|
|
|
if ( work->body.is_end )
|
|
{
|
|
work->f8BC.field_1C = 1;
|
|
work->target->scale = DG_ZeroVector;
|
|
if ( work->target->life <= 0 )
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CAA48 );
|
|
}
|
|
else
|
|
{
|
|
SetMode( work, s07c_meryl72_unk1_800CA0EC );
|
|
}
|
|
}
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CAA48( Meryl72Work *work, int time )
|
|
{
|
|
if ( time == 0 )
|
|
{
|
|
if ( work->f8BC.field_14 < 4 )
|
|
{
|
|
if ( work->f8BC.field_14 == 1 )
|
|
{
|
|
SetAction( work, ACTION56, ACTINTERP );
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION54, ACTINTERP );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetAction( work, ACTION55, ACTINTERP );
|
|
}
|
|
GM_ConfigControlAttribute( &work->control, 0 );
|
|
work->target->class = TARGET_AVAIL;
|
|
}
|
|
|
|
if ( time > 32 && GM_StreamStatus() == -1 && GM_GameOverTimer == -2 )
|
|
{
|
|
GM_GameOverTimer = 1;
|
|
}
|
|
|
|
if ( time == 600 )
|
|
{
|
|
GM_GameOverTimer = 0;
|
|
GM_GameOver();
|
|
}
|
|
}
|
|
|
|
void s07a_meryl_unk_800D9508( Meryl72Work *work )
|
|
{
|
|
work->light[0].t[0] += ( work->fC0E * 5 ) ;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CAB68( Meryl72Work *work )
|
|
{
|
|
if ( work->fC34 > 0)
|
|
{
|
|
work->target->class = TARGET_AVAIL ;
|
|
work->fC34 -= 1 ;
|
|
return;
|
|
}
|
|
work->fC34 = 0;
|
|
}
|
|
|
|
void s07c_meryl72_unk1_800CABA0( Meryl72Work *work )
|
|
{
|
|
OBJECT *body;
|
|
short v0;
|
|
int time_prev;
|
|
ACTION action;
|
|
UNK *unk;
|
|
CONTROL *ctrl;
|
|
|
|
work->trigger = 0;
|
|
work->vision.length = 0;
|
|
work->target->class = TARGET_AVAIL;
|
|
|
|
unk = &work->f8BC;
|
|
ctrl = &work->control;
|
|
|
|
work->actend = 0;
|
|
work->fC08 = 0;
|
|
work->act_status = 0;
|
|
work->f8BC.field_1C = 1 ;
|
|
work->fB9C = 0;
|
|
|
|
body = &work->body;
|
|
action = work->action;
|
|
|
|
time_prev = work->time;
|
|
work->time++;
|
|
|
|
if ( !action )
|
|
{
|
|
action = ActStandStill_800C8580;
|
|
work->action = ActStandStill_800C8580;
|
|
}
|
|
|
|
action( work, time_prev );
|
|
action = work->action2;
|
|
|
|
if ( action )
|
|
{
|
|
time_prev = work->time2;
|
|
work->time2++;
|
|
action( work, time_prev );
|
|
}
|
|
|
|
ctrl->height = body->height ;
|
|
|
|
if ( !unk->field_1C )
|
|
{
|
|
ctrl->step_size = GV_NearExp2( ctrl->step_size, unk->field_1A );
|
|
}
|
|
else
|
|
{
|
|
ctrl->step_size = -1;
|
|
}
|
|
|
|
s07c_meryl72_unk1_800CAB68( work );
|
|
s07c_meryl72_unk1_800C80B4( work );
|
|
s07a_meryl_unk_800D9508( work );
|
|
|
|
|
|
if ( GM_AlertMode == 3 && work->target->class & TARGET_POWER )
|
|
{
|
|
work->hom->flag = 1;
|
|
}
|
|
else
|
|
{
|
|
work->hom->flag = 0;
|
|
}
|
|
|
|
if ( unk->field_04 < 0 && ctrl->level_flag )
|
|
{
|
|
unk->field_04 = 0;
|
|
}
|
|
|
|
v0 = unk->field_04 - 16;
|
|
unk->field_04 = v0;
|
|
ctrl->step.vy = v0;
|
|
}
|