raze/source/games/sw/src/ninja.cpp
Christoph Oelckers 64fc0b66b2 - SW: added countermeasure to re-enable lower skills on mods not implementing them.
Aside from spawning the enemies from the lowest supported skill it will also reduce the threat level by reducing health of some enemies or by replacing the harder Ninja variants with the base type.
2021-07-06 10:26:43 +02:00

2625 lines
82 KiB
C++

//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "ns.h"
// Added Ninja Sliced fix
// Fixed Ninja sliced dead and rotation
// Added s_NinjaDieSlicedHack[]
// Fixed Saved Game
// Added GrabThroat Hack
//
#include "build.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "tags.h"
#include "ai.h"
#include "pal.h"
#include "player.h"
#include "network.h"
#include "weapon.h"
#include "misc.h"
#include "sprite.h"
BEGIN_SW_NS
int SpawnBlood(short SpriteNum, short Weapon, short hit_ang, int hit_x, int hit_y, int hit_z);
/*
!AIC - Decision tables used in mostly ai.c DoActorActionDecide().
*/
DECISION NinjaBattle[] =
{
{499, InitActorMoveCloser},
//{509, InitActorAmbientNoise},
//{710, InitActorRunAway},
{1024, InitActorAttack}
};
DECISION NinjaOffense[] =
{
{499, InitActorMoveCloser},
//{509, InitActorAmbientNoise},
{1024, InitActorAttack}
};
DECISION NinjaBroadcast[] =
{
//{1, InitActorAlertNoise},
{6, InitActorAmbientNoise},
{1024, InitActorDecide}
};
DECISION NinjaSurprised[] =
{
{701, InitActorMoveCloser},
{1024, InitActorDecide}
};
DECISION NinjaEvasive[] =
{
{400, InitActorDuck}, // 100
// {300, InitActorEvade},
// {800, InitActorRunAway},
{1024, NULL}
};
DECISION NinjaLostTarget[] =
{
{900, InitActorFindPlayer},
{1024, InitActorWanderAround}
};
DECISION NinjaCloseRange[] =
{
{700, InitActorAttack },
{1024, InitActorReposition }
};
/*
!AIC - Collection of decision tables
*/
PERSONALITY NinjaPersonality =
{
NinjaBattle,
NinjaOffense,
NinjaBroadcast,
NinjaSurprised,
NinjaEvasive,
NinjaLostTarget,
NinjaCloseRange,
NinjaCloseRange
};
// Sniper Ninjas
DECISION NinjaSniperRoam[] =
{
{1023, InitActorDuck},
{1024, InitActorAmbientNoise},
};
DECISION NinjaSniperBattle[] =
{
{499, InitActorDuck},
{500, InitActorAmbientNoise},
{1024, InitActorAttack}
};
PERSONALITY NinjaSniperPersonality =
{
NinjaSniperBattle,
NinjaSniperBattle,
NinjaSniperRoam,
NinjaSniperRoam,
NinjaSniperRoam,
NinjaSniperRoam,
NinjaSniperBattle,
NinjaSniperBattle
};
/*
!AIC - Extra attributes - speeds for running, animation tic adjustments for speeeds, etc
*/
ATTRIBUTE NinjaAttrib =
{
{110, 130, 150, 180}, // Speeds
//{90, 110, 130, 160}, // Speeds
//{60, 80, 100, 130}, // Speeds
{4, 0, 0, -2}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_NINJAAMBIENT, DIGI_NINJAALERT, DIGI_STAR,
DIGI_NINJAPAIN, DIGI_NINJASCREAM,0,0,0,0,0
}
};
ATTRIBUTE InvisibleNinjaAttrib =
{
{220, 240, 300, 360}, // Speeds
{4, 0, 0, -2}, // Tic Adjusts
3, // MaxWeapons;
{
DIGI_NINJAAMBIENT, DIGI_NINJAALERT, DIGI_STAR,
DIGI_NINJAPAIN, DIGI_NINJASCREAM,0,0,0,0,0
}
};
ATTRIBUTE DefaultAttrib =
{
{60, 80, 100, 130}, // Speeds
{3, 0, -2, -3}, // Tic Adjusts
3, // MaxWeapons;
{0, 0, 0}
};
//////////////////////
//
// NINJA RUN
//
//////////////////////
ANIMATOR DoNinjaMove, DoNinjaCrawl, DoStayOnFloor, NullNinja, DoActorJump, DoActorFall, DoActorDebris, DoNinjaHariKari, DoActorSlide;
ANIMATOR InitActorDecide;
#define NINJA_RATE 18
STATE s_NinjaRun[5][4] =
{
{
{NINJA_RUN_R0 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][1]},
{NINJA_RUN_R0 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][2]},
{NINJA_RUN_R0 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][3]},
{NINJA_RUN_R0 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][0]},
},
{
{NINJA_RUN_R1 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][1]},
{NINJA_RUN_R1 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][2]},
{NINJA_RUN_R1 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][3]},
{NINJA_RUN_R1 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][0]},
},
{
{NINJA_RUN_R2 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][1]},
{NINJA_RUN_R2 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][2]},
{NINJA_RUN_R2 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][3]},
{NINJA_RUN_R2 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][0]},
},
{
{NINJA_RUN_R3 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][1]},
{NINJA_RUN_R3 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][2]},
{NINJA_RUN_R3 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][3]},
{NINJA_RUN_R3 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][0]},
},
{
{NINJA_RUN_R4 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][1]},
{NINJA_RUN_R4 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][2]},
{NINJA_RUN_R4 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][3]},
{NINJA_RUN_R4 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][0]},
},
};
#if 0
STATE s_NinjaRun[5][6] =
{
{
{NINJA_RUN_R0 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][1]},
{NINJA_RUN_R0 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][2]},
{NINJA_RUN_R0 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][3]},
{NINJA_RUN_R0 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][4]},
{NINJA_RUN_R0 + 4, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][5]},
{NINJA_RUN_R0 + 5, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[0][0]},
},
{
{NINJA_RUN_R1 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][1]},
{NINJA_RUN_R1 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][2]},
{NINJA_RUN_R1 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][3]},
{NINJA_RUN_R1 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][4]},
{NINJA_RUN_R1 + 4, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][5]},
{NINJA_RUN_R1 + 5, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[1][0]},
},
{
{NINJA_RUN_R2 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][1]},
{NINJA_RUN_R2 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][2]},
{NINJA_RUN_R2 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][3]},
{NINJA_RUN_R2 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][4]},
{NINJA_RUN_R2 + 4, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][5]},
{NINJA_RUN_R2 + 5, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[2][0]},
},
{
{NINJA_RUN_R3 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][1]},
{NINJA_RUN_R3 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][2]},
{NINJA_RUN_R3 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][3]},
{NINJA_RUN_R3 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][4]},
{NINJA_RUN_R3 + 4, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][5]},
{NINJA_RUN_R3 + 5, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[3][0]},
},
{
{NINJA_RUN_R4 + 0, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][1]},
{NINJA_RUN_R4 + 1, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][2]},
{NINJA_RUN_R4 + 2, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][3]},
{NINJA_RUN_R4 + 3, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][4]},
{NINJA_RUN_R4 + 4, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][5]},
{NINJA_RUN_R4 + 5, NINJA_RATE | SF_TIC_ADJUST, DoNinjaMove, &s_NinjaRun[4][0]},
},
};
#endif
STATEp sg_NinjaRun[] =
{
s_NinjaRun[0],
s_NinjaRun[1],
s_NinjaRun[2],
s_NinjaRun[3],
s_NinjaRun[4]
};
//////////////////////
//
// NINJA STAND
//
//////////////////////
#define NINJA_STAND_RATE 10
STATE s_NinjaStand[5][1] =
{
{
{NINJA_STAND_R0 + 0, NINJA_STAND_RATE, DoNinjaMove, &s_NinjaStand[0][0]},
},
{
{NINJA_STAND_R1 + 0, NINJA_STAND_RATE, DoNinjaMove, &s_NinjaStand[1][0]},
},
{
{NINJA_STAND_R2 + 0, NINJA_STAND_RATE, DoNinjaMove, &s_NinjaStand[2][0]},
},
{
{NINJA_STAND_R3 + 0, NINJA_STAND_RATE, DoNinjaMove, &s_NinjaStand[3][0]},
},
{
{NINJA_STAND_R4 + 0, NINJA_STAND_RATE, DoNinjaMove, &s_NinjaStand[4][0]},
},
};
STATEp sg_NinjaStand[] =
{
s_NinjaStand[0],
s_NinjaStand[1],
s_NinjaStand[2],
s_NinjaStand[3],
s_NinjaStand[4]
};
//////////////////////
//
// NINJA RISE
//
//////////////////////
#define NINJA_RISE_RATE 10
STATE s_NinjaRise[5][3] =
{
{
{NINJA_KNEEL_R0 + 0, NINJA_RISE_RATE, NullNinja, &s_NinjaRise[0][1]},
{NINJA_STAND_R0 + 0, NINJA_STAND_RATE, NullNinja, &s_NinjaRise[0][2]},
{0, 0, NULL, (STATEp)sg_NinjaRun},
},
{
{NINJA_KNEEL_R1 + 0, NINJA_RISE_RATE, NullNinja, &s_NinjaRise[1][1]},
{NINJA_STAND_R1 + 0, NINJA_STAND_RATE, NullNinja, &s_NinjaRise[1][2]},
{0, 0, NULL, (STATEp)sg_NinjaRun},
},
{
{NINJA_KNEEL_R2 + 0, NINJA_RISE_RATE, NullNinja, &s_NinjaRise[2][1]},
{NINJA_STAND_R2 + 0, NINJA_STAND_RATE, NullNinja, &s_NinjaRise[2][2]},
{0, 0, NULL, (STATEp)sg_NinjaRun},
},
{
{NINJA_KNEEL_R3 + 0, NINJA_RISE_RATE, NullNinja, &s_NinjaRise[3][1]},
{NINJA_STAND_R3 + 0, NINJA_STAND_RATE, NullNinja, &s_NinjaRise[3][2]},
{0, 0, NULL, (STATEp)sg_NinjaRun},
},
{
{NINJA_KNEEL_R4 + 0, NINJA_RISE_RATE, NullNinja, &s_NinjaRise[4][1]},
{NINJA_STAND_R4 + 0, NINJA_STAND_RATE, NullNinja, &s_NinjaRise[4][2]},
{0, 0, NULL, (STATEp)sg_NinjaRun},
},
};
STATEp sg_NinjaRise[] =
{
s_NinjaRise[0],
s_NinjaRise[1],
s_NinjaRise[2],
s_NinjaRise[3],
s_NinjaRise[4]
};
//////////////////////
//
// NINJA CRAWL
//
//////////////////////
#define NINJA_CRAWL_RATE 14
STATE s_NinjaCrawl[5][4] =
{
{
{NINJA_CRAWL_R0 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[0][1]},
{NINJA_CRAWL_R0 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[0][2]},
{NINJA_CRAWL_R0 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[0][3]},
{NINJA_CRAWL_R0 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[0][0]},
},
{
{NINJA_CRAWL_R1 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[1][1]},
{NINJA_CRAWL_R1 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[1][2]},
{NINJA_CRAWL_R1 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[1][3]},
{NINJA_CRAWL_R1 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[1][0]},
},
{
{NINJA_CRAWL_R2 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[2][1]},
{NINJA_CRAWL_R2 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[2][2]},
{NINJA_CRAWL_R2 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[2][3]},
{NINJA_CRAWL_R2 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[2][0]},
},
{
{NINJA_CRAWL_R3 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[3][1]},
{NINJA_CRAWL_R3 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[3][2]},
{NINJA_CRAWL_R3 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[3][3]},
{NINJA_CRAWL_R3 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[3][0]},
},
{
{NINJA_CRAWL_R4 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[4][1]},
{NINJA_CRAWL_R4 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[4][2]},
{NINJA_CRAWL_R4 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[4][3]},
{NINJA_CRAWL_R4 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaCrawl[4][0]},
},
};
STATEp sg_NinjaCrawl[] =
{
s_NinjaCrawl[0],
s_NinjaCrawl[1],
s_NinjaCrawl[2],
s_NinjaCrawl[3],
s_NinjaCrawl[4]
};
//////////////////////
//
// NINJA KNEEL_CRAWL
//
//////////////////////
#define NINJA_KNEEL_CRAWL_RATE 20
STATE s_NinjaKneelCrawl[5][5] =
{
{
{NINJA_KNEEL_R0 + 0, NINJA_KNEEL_CRAWL_RATE, NullNinja, &s_NinjaKneelCrawl[0][1]},
{NINJA_CRAWL_R0 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[0][2]},
{NINJA_CRAWL_R0 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[0][3]},
{NINJA_CRAWL_R0 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[0][4]},
{NINJA_CRAWL_R0 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[0][1]},
},
{
{NINJA_KNEEL_R1 + 0, NINJA_KNEEL_CRAWL_RATE, NullNinja, &s_NinjaKneelCrawl[1][1]},
{NINJA_CRAWL_R1 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[1][2]},
{NINJA_CRAWL_R1 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[1][3]},
{NINJA_CRAWL_R1 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[1][4]},
{NINJA_CRAWL_R1 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[1][1]},
},
{
{NINJA_KNEEL_R2 + 0, NINJA_KNEEL_CRAWL_RATE, NullNinja, &s_NinjaKneelCrawl[2][1]},
{NINJA_CRAWL_R2 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[2][2]},
{NINJA_CRAWL_R2 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[2][3]},
{NINJA_CRAWL_R2 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[2][4]},
{NINJA_CRAWL_R2 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[2][1]},
},
{
{NINJA_KNEEL_R3 + 0, NINJA_KNEEL_CRAWL_RATE, NullNinja, &s_NinjaKneelCrawl[3][1]},
{NINJA_CRAWL_R3 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[3][2]},
{NINJA_CRAWL_R3 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[3][3]},
{NINJA_CRAWL_R3 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[3][4]},
{NINJA_CRAWL_R3 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[3][1]},
},
{
{NINJA_KNEEL_R4 + 0, NINJA_KNEEL_CRAWL_RATE, NullNinja, &s_NinjaKneelCrawl[4][1]},
{NINJA_CRAWL_R4 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[4][2]},
{NINJA_CRAWL_R4 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[4][3]},
{NINJA_CRAWL_R4 + 2, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[4][4]},
{NINJA_CRAWL_R4 + 1, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaKneelCrawl[4][1]},
},
};
STATEp sg_NinjaKneelCrawl[] =
{
s_NinjaKneelCrawl[0],
s_NinjaKneelCrawl[1],
s_NinjaKneelCrawl[2],
s_NinjaKneelCrawl[3],
s_NinjaKneelCrawl[4]
};
//////////////////////
//
// NINJA DUCK
//
//////////////////////
#define NINJA_DUCK_RATE 10
STATE s_NinjaDuck[5][2] =
{
{
{NINJA_KNEEL_R0 + 0, NINJA_DUCK_RATE, NullNinja, &s_NinjaDuck[0][1]},
{NINJA_CRAWL_R0 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaDuck[0][1]},
},
{
{NINJA_KNEEL_R1 + 0, NINJA_DUCK_RATE, NullNinja, &s_NinjaDuck[1][1]},
{NINJA_CRAWL_R1 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaDuck[1][1]},
},
{
{NINJA_KNEEL_R2 + 0, NINJA_DUCK_RATE, NullNinja, &s_NinjaDuck[2][1]},
{NINJA_CRAWL_R2 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaDuck[2][1]},
},
{
{NINJA_KNEEL_R3 + 0, NINJA_DUCK_RATE, NullNinja, &s_NinjaDuck[3][1]},
{NINJA_CRAWL_R3 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaDuck[3][1]},
},
{
{NINJA_KNEEL_R4 + 0, NINJA_DUCK_RATE, NullNinja, &s_NinjaDuck[4][1]},
{NINJA_CRAWL_R4 + 0, NINJA_CRAWL_RATE, DoNinjaMove, &s_NinjaDuck[4][1]},
},
};
STATEp sg_NinjaDuck[] =
{
s_NinjaDuck[0],
s_NinjaDuck[1],
s_NinjaDuck[2],
s_NinjaDuck[3],
s_NinjaDuck[4]
};
//////////////////////
//
// NINJA SIT
//
//////////////////////
STATE s_NinjaSit[5][1] =
{
{
{NINJA_KNEEL_R0 + 0, NINJA_RISE_RATE, DoNinjaMove, &s_NinjaSit[0][0]},
},
{
{NINJA_KNEEL_R1 + 0, NINJA_RISE_RATE, DoNinjaMove, &s_NinjaSit[1][0]},
},
{
{NINJA_KNEEL_R2 + 0, NINJA_RISE_RATE, DoNinjaMove, &s_NinjaSit[2][0]},
},
{
{NINJA_KNEEL_R3 + 0, NINJA_RISE_RATE, DoNinjaMove, &s_NinjaSit[3][0]},
},
{
{NINJA_KNEEL_R4 + 0, NINJA_RISE_RATE, DoNinjaMove, &s_NinjaSit[4][0]},
},
};
STATEp sg_NinjaSit[] =
{
s_NinjaSit[0],
s_NinjaSit[1],
s_NinjaSit[2],
s_NinjaSit[3],
s_NinjaSit[4]
};
//////////////////////
//
// NINJA CEILING
//
//////////////////////
ANIMATOR DoNinjaCeiling;
STATE s_NinjaCeiling[5][1] =
{
{
{NINJA_KNEEL_R0 + 0, NINJA_RISE_RATE, DoNinjaCeiling, &s_NinjaCeiling[0][0]},
},
{
{NINJA_KNEEL_R1 + 0, NINJA_RISE_RATE, DoNinjaCeiling, &s_NinjaCeiling[1][0]},
},
{
{NINJA_KNEEL_R2 + 0, NINJA_RISE_RATE, DoNinjaCeiling, &s_NinjaCeiling[2][0]},
},
{
{NINJA_KNEEL_R3 + 0, NINJA_RISE_RATE, DoNinjaCeiling, &s_NinjaCeiling[3][0]},
},
{
{NINJA_KNEEL_R4 + 0, NINJA_RISE_RATE, DoNinjaCeiling, &s_NinjaCeiling[4][0]},
},
};
STATEp sg_NinjaCeiling[] =
{
s_NinjaCeiling[0],
s_NinjaCeiling[1],
s_NinjaCeiling[2],
s_NinjaCeiling[3],
s_NinjaCeiling[4]
};
//////////////////////
//
// NINJA JUMP
//
//////////////////////
#define NINJA_JUMP_RATE 24
STATE s_NinjaJump[5][2] =
{
{
{NINJA_JUMP_R0 + 0, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[0][1]},
{NINJA_JUMP_R0 + 1, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[0][1]},
},
{
{NINJA_JUMP_R1 + 0, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[1][1]},
{NINJA_JUMP_R1 + 1, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[1][1]},
},
{
{NINJA_JUMP_R2 + 0, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[2][1]},
{NINJA_JUMP_R2 + 1, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[2][1]},
},
{
{NINJA_JUMP_R3 + 0, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[3][1]},
{NINJA_JUMP_R3 + 1, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[3][1]},
},
{
{NINJA_JUMP_R4 + 0, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[4][1]},
{NINJA_JUMP_R4 + 1, NINJA_JUMP_RATE, DoNinjaMove, &s_NinjaJump[4][1]},
},
};
STATEp sg_NinjaJump[] =
{
s_NinjaJump[0],
s_NinjaJump[1],
s_NinjaJump[2],
s_NinjaJump[3],
s_NinjaJump[4]
};
//////////////////////
//
// NINJA FALL
//
//////////////////////
#define NINJA_FALL_RATE 16
STATE s_NinjaFall[5][2] =
{
{
{NINJA_JUMP_R0 + 1, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[0][1]},
{NINJA_JUMP_R0 + 2, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[0][1]},
},
{
{NINJA_JUMP_R1 + 1, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[1][1]},
{NINJA_JUMP_R1 + 2, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[1][1]},
},
{
{NINJA_JUMP_R2 + 1, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[2][1]},
{NINJA_JUMP_R2 + 2, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[2][1]},
},
{
{NINJA_JUMP_R3 + 1, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[3][1]},
{NINJA_JUMP_R3 + 2, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[3][1]},
},
{
{NINJA_JUMP_R4 + 1, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[4][1]},
{NINJA_JUMP_R4 + 2, NINJA_FALL_RATE, DoNinjaMove, &s_NinjaFall[4][1]},
},
};
STATEp sg_NinjaFall[] =
{
s_NinjaFall[0],
s_NinjaFall[1],
s_NinjaFall[2],
s_NinjaFall[3],
s_NinjaFall[4]
};
//////////////////////
//
// NINJA SWIM
//
//////////////////////
#define NINJA_SWIM_RATE 18
STATE s_NinjaSwim[5][3] =
{
{
{NINJA_SWIM_R0 + 1, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[0][1]},
{NINJA_SWIM_R0 + 2, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[0][2]},
{NINJA_SWIM_R0 + 3, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[0][0]},
},
{
{NINJA_SWIM_R1 + 1, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[1][1]},
{NINJA_SWIM_R1 + 2, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[1][2]},
{NINJA_SWIM_R1 + 3, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[1][0]},
},
{
{NINJA_SWIM_R2 + 1, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[2][1]},
{NINJA_SWIM_R2 + 2, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[2][2]},
{NINJA_SWIM_R2 + 3, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[2][0]},
},
{
{NINJA_SWIM_R3 + 1, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[3][1]},
{NINJA_SWIM_R3 + 2, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[3][2]},
{NINJA_SWIM_R3 + 3, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[3][0]},
},
{
{NINJA_SWIM_R4 + 1, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[4][1]},
{NINJA_SWIM_R4 + 2, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[4][2]},
{NINJA_SWIM_R4 + 3, NINJA_SWIM_RATE, DoNinjaMove, &s_NinjaSwim[4][0]},
},
};
STATEp sg_NinjaSwim[] =
{
s_NinjaSwim[0],
s_NinjaSwim[1],
s_NinjaSwim[2],
s_NinjaSwim[3],
s_NinjaSwim[4]
};
//////////////////////
//
// NINJA DIVE
//
//////////////////////
#define NINJA_DIVE_RATE 23
STATE s_NinjaDive[5][4] =
{
{
{NINJA_SWIM_R0 + 0, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[0][1]},
{NINJA_SWIM_R0 + 1, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[0][2]},
{NINJA_SWIM_R0 + 2, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[0][3]},
{NINJA_SWIM_R0 + 3, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[0][0]},
},
{
{NINJA_SWIM_R1 + 0, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[1][1]},
{NINJA_SWIM_R1 + 1, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[1][2]},
{NINJA_SWIM_R1 + 2, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[1][3]},
{NINJA_SWIM_R1 + 3, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[1][0]},
},
{
{NINJA_SWIM_R2 + 0, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[2][1]},
{NINJA_SWIM_R2 + 1, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[2][2]},
{NINJA_SWIM_R2 + 2, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[2][3]},
{NINJA_SWIM_R2 + 3, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[2][0]},
},
{
{NINJA_SWIM_R3 + 0, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[3][1]},
{NINJA_SWIM_R3 + 1, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[3][2]},
{NINJA_SWIM_R3 + 2, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[3][3]},
{NINJA_SWIM_R3 + 3, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[3][0]},
},
{
{NINJA_SWIM_R4 + 0, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[4][1]},
{NINJA_SWIM_R4 + 1, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[4][2]},
{NINJA_SWIM_R4 + 2, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[4][3]},
{NINJA_SWIM_R4 + 3, NINJA_DIVE_RATE, DoNinjaMove, &s_NinjaDive[4][0]},
},
};
STATEp sg_NinjaDive[] =
{
s_NinjaDive[0],
s_NinjaDive[1],
s_NinjaDive[2],
s_NinjaDive[3],
s_NinjaDive[4]
};
//////////////////////
//
// NINJA CLIMB
//
//////////////////////
#define NINJA_CLIMB_RATE 20
STATE s_NinjaClimb[5][4] =
{
{
{NINJA_CLIMB_R0 + 0, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[0][1]},
{NINJA_CLIMB_R0 + 1, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[0][2]},
{NINJA_CLIMB_R0 + 2, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[0][3]},
{NINJA_CLIMB_R0 + 3, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[0][0]},
},
{
{NINJA_CLIMB_R1 + 0, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[1][1]},
{NINJA_CLIMB_R1 + 1, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[1][2]},
{NINJA_CLIMB_R1 + 2, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[1][3]},
{NINJA_CLIMB_R1 + 3, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[1][0]},
},
{
{NINJA_CLIMB_R4 + 0, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[2][1]},
{NINJA_CLIMB_R4 + 1, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[2][2]},
{NINJA_CLIMB_R4 + 2, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[2][3]},
{NINJA_CLIMB_R4 + 3, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[2][0]},
},
{
{NINJA_CLIMB_R3 + 0, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[3][1]},
{NINJA_CLIMB_R3 + 1, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[3][2]},
{NINJA_CLIMB_R3 + 2, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[3][3]},
{NINJA_CLIMB_R3 + 3, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[3][0]},
},
{
{NINJA_CLIMB_R2 + 0, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[4][1]},
{NINJA_CLIMB_R2 + 1, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[4][2]},
{NINJA_CLIMB_R2 + 2, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[4][3]},
{NINJA_CLIMB_R2 + 3, NINJA_CLIMB_RATE, DoNinjaMove, &s_NinjaClimb[4][0]},
},
};
STATEp sg_NinjaClimb[] =
{
s_NinjaClimb[0],
s_NinjaClimb[1],
s_NinjaClimb[2],
s_NinjaClimb[3],
s_NinjaClimb[4]
};
//////////////////////
//
// NINJA FLY
//
//////////////////////
#define NINJA_FLY_RATE 12
STATE s_NinjaFly[5][1] =
{
{
{NINJA_FLY_R0 + 0, NINJA_FLY_RATE, DoNinjaMove, &s_NinjaFly[0][0]},
},
{
{NINJA_FLY_R1 + 0, NINJA_FLY_RATE, DoNinjaMove, &s_NinjaFly[1][0]},
},
{
{NINJA_FLY_R2 + 0, NINJA_FLY_RATE, DoNinjaMove, &s_NinjaFly[2][0]},
},
{
{NINJA_FLY_R3 + 0, NINJA_FLY_RATE, DoNinjaMove, &s_NinjaFly[3][0]},
},
{
{NINJA_FLY_R4 + 0, NINJA_FLY_RATE, DoNinjaMove, &s_NinjaFly[4][0]},
},
};
STATEp sg_NinjaFly[] =
{
s_NinjaFly[0],
s_NinjaFly[1],
s_NinjaFly[2],
s_NinjaFly[3],
s_NinjaFly[4]
};
//////////////////////
//
// NINJA PAIN
//
//////////////////////
#define NINJA_PAIN_RATE 15
ANIMATOR DoNinjaPain;
STATE s_NinjaPain[5][2] =
{
{
{NINJA_PAIN_R0 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[0][1]},
{NINJA_PAIN_R0 + 1, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[0][1]},
},
{
{NINJA_STAND_R1 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[1][1]},
{NINJA_STAND_R1 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[1][1]},
},
{
{NINJA_STAND_R2 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[2][1]},
{NINJA_STAND_R2 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[2][1]},
},
{
{NINJA_STAND_R3 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[3][1]},
{NINJA_STAND_R3 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[3][1]},
},
{
{NINJA_STAND_R4 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[4][1]},
{NINJA_STAND_R4 + 0, NINJA_PAIN_RATE, DoNinjaPain, &s_NinjaPain[4][1]},
},
};
STATEp sg_NinjaPain[] =
{
s_NinjaPain[0],
s_NinjaPain[1],
s_NinjaPain[2],
s_NinjaPain[3],
s_NinjaPain[4]
};
//////////////////////
//
// NINJA STAR
//
//////////////////////
#define NINJA_STAR_RATE 18
ANIMATOR InitEnemyStar;
STATE s_NinjaStar[5][6] =
{
{
{NINJA_THROW_R0 + 0, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[0][1]},
{NINJA_THROW_R0 + 0, NINJA_STAR_RATE, NullNinja, &s_NinjaStar[0][2]},
{NINJA_THROW_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyStar, &s_NinjaStar[0][3]},
{NINJA_THROW_R0 + 1, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[0][4]},
{NINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaStar[0][5]},
{NINJA_THROW_R0 + 2, NINJA_STAR_RATE, DoNinjaMove, &s_NinjaStar[0][5]},
},
{
{NINJA_THROW_R1 + 0, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[1][1]},
{NINJA_THROW_R1 + 0, NINJA_STAR_RATE, NullNinja, &s_NinjaStar[1][2]},
{NINJA_THROW_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyStar, &s_NinjaStar[1][3]},
{NINJA_THROW_R1 + 1, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[1][4]},
{NINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaStar[1][5]},
{NINJA_THROW_R1 + 2, NINJA_STAR_RATE, DoNinjaMove, &s_NinjaStar[1][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[2][1]},
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE, NullNinja, &s_NinjaStar[2][2]},
{NINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyStar, &s_NinjaStar[2][3]},
{NINJA_THROW_R2 + 1, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[2][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaStar[2][5]},
{NINJA_THROW_R2 + 2, NINJA_STAR_RATE, DoNinjaMove, &s_NinjaStar[2][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[3][1]},
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE, NullNinja, &s_NinjaStar[3][2]},
{NINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyStar, &s_NinjaStar[3][3]},
{NINJA_THROW_R2 + 1, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[3][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaStar[3][5]},
{NINJA_THROW_R2 + 2, NINJA_STAR_RATE, DoNinjaMove, &s_NinjaStar[3][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[4][1]},
{NINJA_THROW_R2 + 0, NINJA_STAR_RATE, NullNinja, &s_NinjaStar[4][2]},
{NINJA_THROW_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyStar, &s_NinjaStar[4][3]},
{NINJA_THROW_R2 + 1, NINJA_STAR_RATE * 2, NullNinja, &s_NinjaStar[4][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaStar[4][5]},
{NINJA_THROW_R2 + 2, NINJA_STAR_RATE, DoNinjaMove, &s_NinjaStar[4][5]},
},
};
STATEp sg_NinjaStar[] =
{
s_NinjaStar[0],
s_NinjaStar[1],
s_NinjaStar[2],
s_NinjaStar[3],
s_NinjaStar[4]
};
//////////////////////
//
// NINJA MIRV
//
//////////////////////
#define NINJA_MIRV_RATE 18
ANIMATOR InitEnemyMirv;
STATE s_NinjaMirv[5][6] =
{
{
{NINJA_THROW_R0 + 0, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[0][1]},
{NINJA_THROW_R0 + 1, NINJA_MIRV_RATE, NullNinja, &s_NinjaMirv[0][2]},
{NINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitEnemyMirv, &s_NinjaMirv[0][3]},
{NINJA_THROW_R0 + 2, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[0][4]},
{NINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaMirv[0][5]},
{NINJA_THROW_R0 + 2, NINJA_MIRV_RATE, DoNinjaMove, &s_NinjaMirv[0][5]},
},
{
{NINJA_THROW_R1 + 0, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[1][1]},
{NINJA_THROW_R1 + 1, NINJA_MIRV_RATE, NullNinja, &s_NinjaMirv[1][2]},
{NINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitEnemyMirv, &s_NinjaMirv[1][3]},
{NINJA_THROW_R1 + 2, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[1][4]},
{NINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaMirv[1][5]},
{NINJA_THROW_R1 + 2, NINJA_MIRV_RATE, DoNinjaMove, &s_NinjaMirv[1][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[2][1]},
{NINJA_THROW_R2 + 1, NINJA_MIRV_RATE, NullNinja, &s_NinjaMirv[2][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyMirv, &s_NinjaMirv[2][3]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[2][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaMirv[2][5]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE, DoNinjaMove, &s_NinjaMirv[2][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[3][1]},
{NINJA_THROW_R2 + 1, NINJA_MIRV_RATE, NullNinja, &s_NinjaMirv[3][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyMirv, &s_NinjaMirv[3][3]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[3][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaMirv[3][5]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE, DoNinjaMove, &s_NinjaMirv[3][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[4][1]},
{NINJA_THROW_R2 + 1, NINJA_MIRV_RATE, NullNinja, &s_NinjaMirv[4][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyMirv, &s_NinjaMirv[4][3]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE * 2, NullNinja, &s_NinjaMirv[4][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaMirv[4][5]},
{NINJA_THROW_R2 + 2, NINJA_MIRV_RATE, DoNinjaMove, &s_NinjaStar[4][5]},
},
};
STATEp sg_NinjaMirv[] =
{
s_NinjaMirv[0],
s_NinjaMirv[1],
s_NinjaMirv[2],
s_NinjaMirv[3],
s_NinjaMirv[4]
};
//////////////////////
//
// NINJA NAPALM
//
//////////////////////
#define NINJA_NAPALM_RATE 18
ANIMATOR InitEnemyNapalm;
STATE s_NinjaNapalm[5][6] =
{
{
{NINJA_THROW_R0 + 0, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[0][1]},
{NINJA_THROW_R0 + 1, NINJA_NAPALM_RATE, NullNinja, &s_NinjaNapalm[0][2]},
{NINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitEnemyNapalm, &s_NinjaNapalm[0][3]},
{NINJA_THROW_R0 + 2, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[0][4]},
{NINJA_THROW_R0 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaNapalm[0][5]},
{NINJA_THROW_R0 + 2, NINJA_NAPALM_RATE, DoNinjaMove, &s_NinjaNapalm[0][5]},
},
{
{NINJA_THROW_R1 + 0, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[1][1]},
{NINJA_THROW_R1 + 1, NINJA_NAPALM_RATE, NullNinja, &s_NinjaNapalm[1][2]},
{NINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitEnemyNapalm, &s_NinjaNapalm[1][3]},
{NINJA_THROW_R1 + 2, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[1][4]},
{NINJA_THROW_R1 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaNapalm[1][5]},
{NINJA_THROW_R1 + 2, NINJA_NAPALM_RATE, DoNinjaMove, &s_NinjaNapalm[1][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[2][1]},
{NINJA_THROW_R2 + 1, NINJA_NAPALM_RATE, NullNinja, &s_NinjaNapalm[2][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyNapalm, &s_NinjaNapalm[2][3]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[2][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaNapalm[2][5]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE, DoNinjaMove, &s_NinjaNapalm[2][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[3][1]},
{NINJA_THROW_R2 + 1, NINJA_NAPALM_RATE, NullNinja, &s_NinjaNapalm[3][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyNapalm, &s_NinjaNapalm[3][3]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[3][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaNapalm[3][5]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE, DoNinjaMove, &s_NinjaNapalm[3][5]},
},
{
{NINJA_THROW_R2 + 0, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[4][1]},
{NINJA_THROW_R2 + 1, NINJA_NAPALM_RATE, NullNinja, &s_NinjaNapalm[4][2]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitEnemyNapalm, &s_NinjaNapalm[4][3]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE * 2, NullNinja, &s_NinjaNapalm[4][4]},
{NINJA_THROW_R2 + 2, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaNapalm[4][5]},
{NINJA_THROW_R2 + 2, NINJA_NAPALM_RATE, DoNinjaMove, &s_NinjaNapalm[4][5]},
},
};
STATEp sg_NinjaNapalm[] =
{
s_NinjaNapalm[0],
s_NinjaNapalm[1],
s_NinjaNapalm[2],
s_NinjaNapalm[3],
s_NinjaNapalm[4]
};
//////////////////////
//
// NINJA ROCKET
//
//////////////////////
#define NINJA_ROCKET_RATE 14
ANIMATOR InitEnemyRocket;
STATE s_NinjaRocket[5][5] =
{
{
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaRocket[0][1]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyRocket, &s_NinjaRocket[0][2]},
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaRocket[0][3]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaRocket[0][4]},
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaRocket[0][4]},
},
{
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaRocket[1][1]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitEnemyRocket, &s_NinjaRocket[1][2]},
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaRocket[1][3]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaRocket[1][4]},
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaRocket[1][4]},
},
{
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaRocket[2][1]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitEnemyRocket, &s_NinjaRocket[2][2]},
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaRocket[2][3]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaRocket[2][4]},
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaRocket[2][4]},
},
{
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaRocket[3][1]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitEnemyRocket, &s_NinjaRocket[3][2]},
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaRocket[3][3]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaRocket[3][4]},
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaRocket[3][4]},
},
{
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaRocket[4][1]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitEnemyRocket, &s_NinjaRocket[4][2]},
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaRocket[4][3]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaRocket[4][4]},
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaRocket[4][4]},
},
};
STATEp sg_NinjaRocket[] =
{
s_NinjaRocket[0],
s_NinjaRocket[1],
s_NinjaRocket[2],
s_NinjaRocket[3],
s_NinjaRocket[4]
};
//////////////////////
//
// NINJA ROCKET
//
//////////////////////
#define NINJA_ROCKET_RATE 14
ANIMATOR InitSpriteGrenade;
STATE s_NinjaGrenade[5][5] =
{
{
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaGrenade[0][1]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitSpriteGrenade, &s_NinjaGrenade[0][2]},
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaGrenade[0][3]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaGrenade[0][4]},
{NINJA_STAND_R0 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaGrenade[0][4]},
},
{
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaGrenade[1][1]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitSpriteGrenade, &s_NinjaGrenade[1][2]},
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaGrenade[1][3]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaGrenade[1][4]},
{NINJA_STAND_R1 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaGrenade[1][4]},
},
{
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaGrenade[2][1]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitSpriteGrenade, &s_NinjaGrenade[2][2]},
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaGrenade[2][3]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaGrenade[2][4]},
{NINJA_STAND_R2 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaGrenade[2][4]},
},
{
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaGrenade[3][1]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitSpriteGrenade, &s_NinjaGrenade[3][2]},
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaGrenade[3][3]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaGrenade[3][4]},
{NINJA_STAND_R3 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaGrenade[3][4]},
},
{
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE * 2, NullNinja, &s_NinjaGrenade[4][1]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitSpriteGrenade, &s_NinjaGrenade[4][2]},
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE, NullNinja, &s_NinjaGrenade[4][3]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaGrenade[4][4]},
{NINJA_STAND_R4 + 0, NINJA_ROCKET_RATE, DoNinjaMove, &s_NinjaGrenade[4][4]},
},
};
STATEp sg_NinjaGrenade[] =
{
s_NinjaGrenade[0],
s_NinjaGrenade[1],
s_NinjaGrenade[2],
s_NinjaGrenade[3],
s_NinjaGrenade[4]
};
//////////////////////
//
// NINJA FLASHBOMB
//
//////////////////////
#define NINJA_FLASHBOMB_RATE 14
ANIMATOR InitFlashBomb;
STATE s_NinjaFlashBomb[5][5] =
{
{
{NINJA_STAND_R0 + 0, NINJA_FLASHBOMB_RATE * 2, NullNinja, &s_NinjaFlashBomb[0][1]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitFlashBomb, &s_NinjaFlashBomb[0][2]},
{NINJA_STAND_R0 + 0, NINJA_FLASHBOMB_RATE, NullNinja, &s_NinjaFlashBomb[0][3]},
{NINJA_STAND_R0 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaFlashBomb[0][4]},
{NINJA_STAND_R0 + 0, NINJA_FLASHBOMB_RATE, DoNinjaMove, &s_NinjaFlashBomb[0][4]},
},
{
{NINJA_STAND_R1 + 0, NINJA_FLASHBOMB_RATE * 2, NullNinja, &s_NinjaFlashBomb[1][1]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitFlashBomb, &s_NinjaFlashBomb[1][2]},
{NINJA_STAND_R1 + 0, NINJA_FLASHBOMB_RATE, NullNinja, &s_NinjaFlashBomb[1][3]},
{NINJA_STAND_R1 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaFlashBomb[1][4]},
{NINJA_STAND_R1 + 0, NINJA_FLASHBOMB_RATE, DoNinjaMove, &s_NinjaFlashBomb[1][4]},
},
{
{NINJA_STAND_R2 + 0, NINJA_FLASHBOMB_RATE * 2, NullNinja, &s_NinjaFlashBomb[2][1]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitFlashBomb, &s_NinjaFlashBomb[2][2]},
{NINJA_STAND_R2 + 0, NINJA_FLASHBOMB_RATE, NullNinja, &s_NinjaFlashBomb[2][3]},
{NINJA_STAND_R2 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaFlashBomb[2][4]},
{NINJA_STAND_R2 + 0, NINJA_FLASHBOMB_RATE, DoNinjaMove, &s_NinjaFlashBomb[2][4]},
},
{
{NINJA_STAND_R3 + 0, NINJA_FLASHBOMB_RATE * 2, NullNinja, &s_NinjaFlashBomb[3][1]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitFlashBomb, &s_NinjaFlashBomb[3][2]},
{NINJA_STAND_R3 + 0, NINJA_FLASHBOMB_RATE, NullNinja, &s_NinjaFlashBomb[3][3]},
{NINJA_STAND_R3 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaFlashBomb[3][4]},
{NINJA_STAND_R3 + 0, NINJA_FLASHBOMB_RATE, DoNinjaMove, &s_NinjaFlashBomb[3][4]},
},
{
{NINJA_STAND_R4 + 0, NINJA_FLASHBOMB_RATE * 2, NullNinja, &s_NinjaFlashBomb[4][1]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitFlashBomb, &s_NinjaFlashBomb[4][2]},
{NINJA_STAND_R4 + 0, NINJA_FLASHBOMB_RATE, NullNinja, &s_NinjaFlashBomb[4][3]},
{NINJA_STAND_R4 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaFlashBomb[4][4]},
{NINJA_STAND_R4 + 0, NINJA_FLASHBOMB_RATE, DoNinjaMove, &s_NinjaFlashBomb[4][4]},
},
};
STATEp sg_NinjaFlashBomb[] =
{
s_NinjaFlashBomb[0],
s_NinjaFlashBomb[1],
s_NinjaFlashBomb[2],
s_NinjaFlashBomb[3],
s_NinjaFlashBomb[4]
};
//////////////////////
//
// NINJA UZI
//
//////////////////////
#define NINJA_UZI_RATE 8
ANIMATOR InitEnemyUzi,CheckFire;
STATE s_NinjaUzi[5][17] =
{
{
{NINJA_FIRE_R0 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][1]},
{NINJA_FIRE_R0 + 0, 0 | SF_QUICK_CALL, CheckFire, &s_NinjaUzi[0][2]},
{NINJA_FIRE_R0 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][3]},
{NINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][4]},
{NINJA_FIRE_R0 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][5]},
{NINJA_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][6]},
{NINJA_FIRE_R0 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][7]},
{NINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][8]},
{NINJA_FIRE_R0 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][9]},
{NINJA_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][10]},
{NINJA_FIRE_R0 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][11]},
{NINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][12]},
{NINJA_FIRE_R0 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][13]},
{NINJA_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][14]},
{NINJA_FIRE_R0 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[0][15]},
{NINJA_FIRE_R0 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[0][16]},
{NINJA_FIRE_R0 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaUzi[0][16]},
},
{
{NINJA_FIRE_R1 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][1]},
{NINJA_FIRE_R1 + 0, 0 | SF_QUICK_CALL, CheckFire, &s_NinjaUzi[1][2]},
{NINJA_FIRE_R1 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][3]},
{NINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][4]},
{NINJA_FIRE_R1 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][5]},
{NINJA_FIRE_R1 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][6]},
{NINJA_FIRE_R1 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][7]},
{NINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][8]},
{NINJA_FIRE_R1 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][9]},
{NINJA_FIRE_R1 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][10]},
{NINJA_FIRE_R1 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][11]},
{NINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][12]},
{NINJA_FIRE_R1 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][13]},
{NINJA_FIRE_R1 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][14]},
{NINJA_FIRE_R1 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[1][15]},
{NINJA_FIRE_R1 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[1][16]},
{NINJA_FIRE_R1 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaUzi[1][16]},
},
{
{NINJA_FIRE_R2 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][1]},
{NINJA_FIRE_R2 + 0, 0 | SF_QUICK_CALL, CheckFire, &s_NinjaUzi[2][2]},
{NINJA_FIRE_R2 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][3]},
{NINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][4]},
{NINJA_FIRE_R2 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][5]},
{NINJA_FIRE_R2 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][6]},
{NINJA_FIRE_R2 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][7]},
{NINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][8]},
{NINJA_FIRE_R2 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][9]},
{NINJA_FIRE_R2 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][10]},
{NINJA_FIRE_R2 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][11]},
{NINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][12]},
{NINJA_FIRE_R2 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][13]},
{NINJA_FIRE_R2 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][14]},
{NINJA_FIRE_R2 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[2][15]},
{NINJA_FIRE_R2 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[2][16]},
{NINJA_FIRE_R2 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaUzi[2][16]},
},
{
{NINJA_FIRE_R3 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][1]},
{NINJA_FIRE_R3 + 0, 0 | SF_QUICK_CALL, CheckFire, &s_NinjaUzi[3][2]},
{NINJA_FIRE_R3 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][3]},
{NINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][4]},
{NINJA_FIRE_R3 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][5]},
{NINJA_FIRE_R3 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][6]},
{NINJA_FIRE_R3 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][7]},
{NINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][8]},
{NINJA_FIRE_R3 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][9]},
{NINJA_FIRE_R3 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][10]},
{NINJA_FIRE_R3 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][11]},
{NINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][12]},
{NINJA_FIRE_R3 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][13]},
{NINJA_FIRE_R3 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][14]},
{NINJA_FIRE_R3 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[3][15]},
{NINJA_FIRE_R3 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[3][16]},
{NINJA_FIRE_R3 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaUzi[3][16]},
},
{
{NINJA_FIRE_R4 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][1]},
{NINJA_FIRE_R4 + 0, 0 | SF_QUICK_CALL, CheckFire, &s_NinjaUzi[4][2]},
{NINJA_FIRE_R4 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][3]},
{NINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][4]},
{NINJA_FIRE_R4 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][5]},
{NINJA_FIRE_R4 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][6]},
{NINJA_FIRE_R4 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][7]},
{NINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][8]},
{NINJA_FIRE_R4 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][9]},
{NINJA_FIRE_R4 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][10]},
{NINJA_FIRE_R4 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][11]},
{NINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][12]},
{NINJA_FIRE_R4 + 0, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][13]},
{NINJA_FIRE_R4 + 0, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][14]},
{NINJA_FIRE_R4 + 1, NINJA_UZI_RATE, NullNinja, &s_NinjaUzi[4][15]},
{NINJA_FIRE_R4 + 1, 0 | SF_QUICK_CALL, InitEnemyUzi, &s_NinjaUzi[4][16]},
{NINJA_FIRE_R4 + 0, 0 | SF_QUICK_CALL, InitActorDecide, &s_NinjaUzi[4][16]},
},
};
STATEp sg_NinjaUzi[] =
{
s_NinjaUzi[0],
s_NinjaUzi[1],
s_NinjaUzi[2],
s_NinjaUzi[3],
s_NinjaUzi[4]
};
//////////////////////
//
// NINJA HARI KARI
//
//////////////////////
#define NINJA_HARI_KARI_WAIT_RATE 200
#define NINJA_HARI_KARI_FALL_RATE 16
ANIMATOR DoHariKariBlood;
ANIMATOR DoNinjaSpecial;
STATE s_NinjaHariKari[] =
{
{NINJA_HARI_KARI_R0 + 0, NINJA_HARI_KARI_FALL_RATE, NullNinja, &s_NinjaHariKari[1]},
{NINJA_HARI_KARI_R0 + 0, SF_QUICK_CALL, DoNinjaSpecial, &s_NinjaHariKari[2]},
{NINJA_HARI_KARI_R0 + 1, NINJA_HARI_KARI_WAIT_RATE, NullNinja, &s_NinjaHariKari[3]},
{NINJA_HARI_KARI_R0 + 2, SF_QUICK_CALL, DoNinjaHariKari, &s_NinjaHariKari[4]},
{NINJA_HARI_KARI_R0 + 2, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[5]},
{NINJA_HARI_KARI_R0 + 3, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[6]},
{NINJA_HARI_KARI_R0 + 4, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[7]},
{NINJA_HARI_KARI_R0 + 5, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[8]},
{NINJA_HARI_KARI_R0 + 6, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[9]},
{NINJA_HARI_KARI_R0 + 7, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[10]},
{NINJA_HARI_KARI_R0 + 7, NINJA_HARI_KARI_FALL_RATE, NullAnimator, &s_NinjaHariKari[10]},
};
STATEp sg_NinjaHariKari[] =
{
s_NinjaHariKari,
s_NinjaHariKari,
s_NinjaHariKari,
s_NinjaHariKari,
s_NinjaHariKari
};
//////////////////////
//
// NINJA GRAB THROAT
//
//////////////////////
#define NINJA_GRAB_THROAT_RATE 32
#define NINJA_GRAB_THROAT_R0 4237
ANIMATOR DoNinjaGrabThroat;
STATE s_NinjaGrabThroat[] =
{
{NINJA_GRAB_THROAT_R0 + 0, NINJA_GRAB_THROAT_RATE, NullNinja, &s_NinjaGrabThroat[1]},
{NINJA_GRAB_THROAT_R0 + 0, SF_QUICK_CALL, DoNinjaSpecial, &s_NinjaGrabThroat[2]},
{NINJA_GRAB_THROAT_R0 + 1, NINJA_GRAB_THROAT_RATE, NullNinja, &s_NinjaGrabThroat[3]},
{NINJA_GRAB_THROAT_R0 + 2, SF_QUICK_CALL, DoNinjaGrabThroat, &s_NinjaGrabThroat[4]},
{NINJA_GRAB_THROAT_R0 + 2, NINJA_GRAB_THROAT_RATE, NullNinja, &s_NinjaGrabThroat[5]},
{NINJA_GRAB_THROAT_R0 + 1, NINJA_GRAB_THROAT_RATE, NullNinja, &s_NinjaGrabThroat[0]},
};
STATEp sg_NinjaGrabThroat[] =
{
s_NinjaGrabThroat,
s_NinjaGrabThroat,
s_NinjaGrabThroat,
s_NinjaGrabThroat,
s_NinjaGrabThroat
};
//////////////////////
//
// NINJA DIE
//
//////////////////////
#define NINJA_DIE_RATE 14
STATE s_NinjaDie[] =
{
{NINJA_DIE + 0, NINJA_DIE_RATE, NullNinja, &s_NinjaDie[1]},
{NINJA_DIE + 1, NINJA_DIE_RATE, NullNinja, &s_NinjaDie[2]},
{NINJA_DIE + 2, NINJA_DIE_RATE, NullNinja, &s_NinjaDie[3]},
{NINJA_DIE + 3, NINJA_DIE_RATE, NullNinja, &s_NinjaDie[4]},
{NINJA_DIE + 4, NINJA_DIE_RATE, NullNinja, &s_NinjaDie[5]},
{NINJA_DIE + 5, NINJA_DIE_RATE-4, NullNinja, &s_NinjaDie[6]},
{NINJA_DIE + 6, NINJA_DIE_RATE-6, NullNinja, &s_NinjaDie[7]},
{NINJA_DIE + 6, SF_QUICK_CALL, DoNinjaSpecial, &s_NinjaDie[8]},
{NINJA_DIE + 6, NINJA_DIE_RATE-10, NullNinja, &s_NinjaDie[9]},
{NINJA_DIE + 7, SF_QUICK_CALL, QueueFloorBlood, &s_NinjaDie[10]},
{NINJA_DIE + 7, NINJA_DIE_RATE-12, DoActorDebris, &s_NinjaDie[10]},
};
#define NINJA_DIESLICED_RATE 20
ANIMATOR DoCutInHalf;
STATE s_NinjaDieSliced[] =
{
{NINJA_SLICED + 0, NINJA_DIESLICED_RATE*6, NullNinja, &s_NinjaDieSliced[1]},
{NINJA_SLICED + 1, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSliced[2]},
{NINJA_SLICED + 2, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSliced[3]},
{NINJA_SLICED + 3, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSliced[4]},
{NINJA_SLICED + 4, NINJA_DIESLICED_RATE-1, NullNinja, &s_NinjaDieSliced[5]},
{NINJA_SLICED + 5, NINJA_DIESLICED_RATE-2, NullNinja, &s_NinjaDieSliced[6]},
{NINJA_SLICED + 6, NINJA_DIESLICED_RATE-3, NullNinja, &s_NinjaDieSliced[7]},
{NINJA_SLICED + 7, NINJA_DIESLICED_RATE-4, NullNinja, &s_NinjaDieSliced[8]},
{NINJA_SLICED + 7, SF_QUICK_CALL, DoNinjaSpecial, &s_NinjaDieSliced[9]},
{NINJA_SLICED + 8, NINJA_DIESLICED_RATE-5, NullNinja, &s_NinjaDieSliced[10]},
{NINJA_SLICED + 9, SF_QUICK_CALL, QueueFloorBlood, &s_NinjaDieSliced[11]},
{NINJA_SLICED + 9, NINJA_DIESLICED_RATE, DoActorDebris, &s_NinjaDieSliced[11]},
};
STATE s_NinjaDieSlicedHack[] =
{
{NINJA_SLICED_HACK + 0, NINJA_DIESLICED_RATE*6, NullNinja, &s_NinjaDieSlicedHack[1]},
{NINJA_SLICED_HACK + 1, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSlicedHack[2]},
{NINJA_SLICED_HACK + 2, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSlicedHack[3]},
{NINJA_SLICED_HACK + 3, NINJA_DIESLICED_RATE, NullNinja, &s_NinjaDieSlicedHack[4]},
{NINJA_SLICED_HACK + 4, NINJA_DIESLICED_RATE-1, NullNinja, &s_NinjaDieSlicedHack[5]},
{NINJA_SLICED_HACK + 4, NINJA_DIESLICED_RATE-2, NullNinja, &s_NinjaDieSlicedHack[6]},
{NINJA_SLICED_HACK + 5, NINJA_DIESLICED_RATE-3, NullNinja, &s_NinjaDieSlicedHack[7]},
{NINJA_SLICED_HACK + 5, NINJA_DIESLICED_RATE-4, NullNinja, &s_NinjaDieSlicedHack[8]},
{NINJA_SLICED_HACK + 6, SF_QUICK_CALL , DoNinjaSpecial, &s_NinjaDieSlicedHack[9]},
{NINJA_SLICED_HACK + 6, NINJA_DIESLICED_RATE-5, NullNinja, &s_NinjaDieSlicedHack[10]},
{NINJA_SLICED_HACK + 7, SF_QUICK_CALL , QueueFloorBlood, &s_NinjaDieSlicedHack[11]},
{NINJA_SLICED_HACK + 7, NINJA_DIESLICED_RATE-6, DoActorDebris, &s_NinjaDieSlicedHack[11]},
};
STATE s_NinjaDead[] =
{
{NINJA_DIE + 5, NINJA_DIE_RATE, DoActorDebris, &s_NinjaDead[1]},
{NINJA_DIE + 6, SF_QUICK_CALL, DoNinjaSpecial, &s_NinjaDead[2]},
{NINJA_DIE + 6, NINJA_DIE_RATE, DoActorDebris, &s_NinjaDead[3]},
{NINJA_DIE + 7, SF_QUICK_CALL, QueueFloorBlood,&s_NinjaDead[4]},
{NINJA_DIE + 7, NINJA_DIE_RATE, DoActorDebris, &s_NinjaDead[4]},
};
STATE s_NinjaDeathJump[] =
{
{NINJA_DIE + 0, NINJA_DIE_RATE, DoActorDeathMove, &s_NinjaDeathJump[1]},
{NINJA_DIE + 1, NINJA_DIE_RATE, DoActorDeathMove, &s_NinjaDeathJump[2]},
{NINJA_DIE + 2, NINJA_DIE_RATE, DoActorDeathMove, &s_NinjaDeathJump[2]},
};
STATE s_NinjaDeathFall[] =
{
{NINJA_DIE + 3, NINJA_DIE_RATE, DoActorDeathMove, &s_NinjaDeathFall[1]},
{NINJA_DIE + 4, NINJA_DIE_RATE, DoActorDeathMove, &s_NinjaDeathFall[1]},
};
/*
STATEp *Stand[MAX_WEAPONS];
STATEp *Run;
STATEp *Jump;
STATEp *Fall;
STATEp *Crawl;
STATEp *Swim;
STATEp *Fly;
STATEp *Rise;
STATEp *Sit;
STATEp *Look;
STATEp *Climb;
STATEp *Pain;
STATEp *Death1;
STATEp *Death2;
STATEp *Dead;
STATEp *DeathJump;
STATEp *DeathFall;
STATEp *CloseAttack[2];
STATEp *Attack[6];
STATEp *Special[2];
*/
STATEp sg_NinjaDie[] =
{
s_NinjaDie
};
STATEp sg_NinjaDieSliced[] =
{
s_NinjaDieSliced
};
STATEp sg_NinjaDieSlicedHack[] =
{
s_NinjaDieSlicedHack
};
STATEp sg_NinjaDead[] =
{
s_NinjaDead
};
STATEp sg_NinjaDeathJump[] =
{
s_NinjaDeathJump
};
STATEp sg_NinjaDeathFall[] =
{
s_NinjaDeathFall
};
/*
!AIC - Collection of states that connect action to states
*/
ACTOR_ACTION_SET NinjaSniperActionSet =
{
sg_NinjaDuck,
sg_NinjaCrawl,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaUzi,
sg_NinjaDuck,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi},
{1024},
{sg_NinjaUzi},
{1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
ACTOR_ACTION_SET NinjaActionSet =
{
sg_NinjaStand,
sg_NinjaRun,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi, sg_NinjaStar},
{1000, 1024},
{sg_NinjaUzi, sg_NinjaStar},
{800, 1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
ACTOR_ACTION_SET NinjaRedActionSet =
{
sg_NinjaStand,
sg_NinjaRun,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi, sg_NinjaUzi},
{812, 1024},
{sg_NinjaUzi, sg_NinjaRocket},
{812, 1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
ACTOR_ACTION_SET NinjaSeekerActionSet =
{
sg_NinjaStand,
sg_NinjaRun,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi, sg_NinjaStar},
{812, 1024},
{sg_NinjaUzi, sg_NinjaRocket},
{812, 1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
ACTOR_ACTION_SET NinjaGrenadeActionSet =
{
sg_NinjaStand,
sg_NinjaRun,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi, sg_NinjaUzi},
{812, 1024},
{sg_NinjaUzi, sg_NinjaGrenade},
{812, 1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
ACTOR_ACTION_SET NinjaGreenActionSet =
{
sg_NinjaStand,
sg_NinjaRun,
sg_NinjaJump,
sg_NinjaFall,
sg_NinjaKneelCrawl,
sg_NinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_NinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaUzi, sg_NinjaFlashBomb},
{912, 1024},
{sg_NinjaFlashBomb, sg_NinjaUzi, sg_NinjaMirv, sg_NinjaNapalm},
{150, 500, 712, 1024},
{NULL},
sg_NinjaDuck,
sg_NinjaDive
};
extern STATEp sg_PlayerNinjaRun[];
extern STATEp sg_PlayerNinjaStand[];
extern STATEp sg_PlayerNinjaJump[];
extern STATEp sg_PlayerNinjaFall[];
extern STATEp sg_PlayerNinjaClimb[];
extern STATEp sg_PlayerNinjaCrawl[];
extern STATEp sg_PlayerNinjaSwim[];
ACTOR_ACTION_SET PlayerNinjaActionSet =
{
sg_PlayerNinjaStand,
sg_PlayerNinjaRun,
sg_PlayerNinjaJump,
sg_PlayerNinjaFall,
//sg_NinjaJump,
//sg_NinjaFall,
sg_PlayerNinjaCrawl,
sg_PlayerNinjaSwim,
sg_NinjaFly,
sg_NinjaRise,
sg_NinjaSit,
NULL,
sg_PlayerNinjaClimb,
sg_NinjaPain,
sg_NinjaDie,
sg_NinjaHariKari,
sg_NinjaDead,
sg_NinjaDeathJump,
sg_NinjaDeathFall,
{sg_NinjaStar, sg_NinjaUzi},
{1000, 1024},
{sg_NinjaStar, sg_NinjaUzi},
{800, 1024},
{NULL},
sg_NinjaDuck,
sg_PlayerNinjaSwim
};
int
DoHariKariBlood(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum].Data();
return 0;
}
/*
!AIC - Every actor has a setup where they are initialized
*/
int
SetupNinja(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u;
ANIMATOR DoActorDecide;
short pic = sp->picnum;
// Fake some skill settings in case the lower skills are empty.
int RedNinjaHealth = MinEnemySkill <= Skill ? HEALTH_RED_NINJA : HEALTH_NINJA;
if (Skill < MinEnemySkill - 1) sp->pal = 0;
if (TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
{
u = User[SpriteNum].Data();
ASSERT(u);
}
else
{
u = SpawnUser(SpriteNum, NINJA_RUN_R0, s_NinjaRun[0]);
u->Health = HEALTH_NINJA;
}
u->StateEnd = s_NinjaDie;
u->Rot = sg_NinjaRun;
sp->xrepeat = 46;
sp->yrepeat = 46;
if (sp->pal == PALETTE_PLAYER5)
{
u->Attrib = &InvisibleNinjaAttrib;
EnemyDefaults(SpriteNum, &NinjaGreenActionSet, &NinjaPersonality);
if (!TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
u->Health = RedNinjaHealth;
SET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
sp->shade = 127;
sp->pal = u->spal = PALETTE_PLAYER5;
sp->hitag = 9998;
if (pic == NINJA_CRAWL_R0)
{
if (TEST(sp->cstat, CSTAT_SPRITE_YFLIP))
{
u->Attrib = &NinjaAttrib;
u->ActorActionSet = &NinjaActionSet;
u->Personality = &NinjaPersonality;
ChangeState(SpriteNum, s_NinjaCeiling[0]);
}
else
{
u->Attrib = &NinjaAttrib;
u->ActorActionSet = &NinjaSniperActionSet;
u->Personality = &NinjaSniperPersonality;
ChangeState(SpriteNum, s_NinjaDuck[0]);
}
}
}
else if (sp->pal == PALETTE_PLAYER3)
{
u->Attrib = &NinjaAttrib;
EnemyDefaults(SpriteNum, &NinjaRedActionSet, &NinjaPersonality);
if (!TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
u->Health = RedNinjaHealth;
sp->pal = u->spal = PALETTE_PLAYER3;
if (pic == NINJA_CRAWL_R0)
{
if (TEST(sp->cstat, CSTAT_SPRITE_YFLIP))
{
u->Attrib = &NinjaAttrib;
u->ActorActionSet = &NinjaActionSet;
u->Personality = &NinjaPersonality;
ChangeState(SpriteNum, s_NinjaCeiling[0]);
}
else
{
u->Attrib = &NinjaAttrib;
u->ActorActionSet = &NinjaSniperActionSet;
u->Personality = &NinjaSniperPersonality;
ChangeState(SpriteNum, s_NinjaDuck[0]);
}
}
}
else if (sp->pal == PAL_XLAT_LT_TAN)
{
u->Attrib = &NinjaAttrib;
EnemyDefaults(SpriteNum, &NinjaSeekerActionSet, &NinjaPersonality);
if (!TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
u->Health = RedNinjaHealth;
sp->pal = u->spal = PAL_XLAT_LT_TAN;
u->Attrib = &NinjaAttrib;
}
else if (sp->pal == PAL_XLAT_LT_GREY)
{
u->Attrib = &NinjaAttrib;
EnemyDefaults(SpriteNum, &NinjaGrenadeActionSet, &NinjaPersonality);
if (!TEST(sp->cstat, CSTAT_SPRITE_RESTORE))
u->Health = RedNinjaHealth;
sp->pal = u->spal = PAL_XLAT_LT_GREY;
u->Attrib = &NinjaAttrib;
}
else
{
u->Attrib = &NinjaAttrib;
sp->pal = u->spal = PALETTE_PLAYER0;
EnemyDefaults(SpriteNum, &NinjaActionSet, &NinjaPersonality);
if (pic == NINJA_CRAWL_R0)
{
u->Attrib = &NinjaAttrib;
u->ActorActionSet = &NinjaSniperActionSet;
u->Personality = &NinjaSniperPersonality;
ChangeState(SpriteNum, s_NinjaDuck[0]);
}
}
ChangeState(SpriteNum, s_NinjaRun[0]);
DoActorSetSpeed(SpriteNum, NORM_SPEED);
u->Radius = 280;
SET(u->Flags, SPR_XFLIP_TOGGLE);
return 0;
}
int
DoNinjaHariKari(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
SPRITEp sp = User[SpriteNum]->SpriteP;
short cnt,i;
UpdateSinglePlayKills(SpriteNum);
change_sprite_stat(SpriteNum, STAT_DEAD_ACTOR);
RESET(sprite[SpriteNum].cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
SET(u->Flags, SPR_DEAD);
RESET(u->Flags, SPR_FALLING | SPR_JUMPING);
u->floor_dist = Z(40);
u->RotNum = 0;
u->ActorActionFunc = NULL;
SET(sp->extra, SPRX_BREAKABLE);
SET(sp->cstat, CSTAT_SPRITE_BREAKABLE);
PlaySound(DIGI_NINJAUZIATTACK, sp, v3df_follow);
SpawnBlood(SpriteNum, SpriteNum, -1, -1, -1, -1);
cnt = RANDOM_RANGE(4)+1;
for (i=0; i<=cnt; i++)
InitBloodSpray(SpriteNum,true,-2);
return 0;
}
int
DoNinjaGrabThroat(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
SPRITEp sp = User[SpriteNum]->SpriteP;
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
{
UpdateSinglePlayKills(SpriteNum);
RESET(u->Flags2, SPR2_DYING);
RESET(sp->cstat, CSTAT_SPRITE_YFLIP);
change_sprite_stat(SpriteNum, STAT_DEAD_ACTOR);
RESET(sprite[SpriteNum].cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
SET(u->Flags, SPR_DEAD);
RESET(u->Flags, SPR_FALLING | SPR_JUMPING);
u->floor_dist = Z(40);
u->RotNum = 0;
u->ActorActionFunc = NULL;
SET(sp->extra, SPRX_BREAKABLE);
SET(sp->cstat, CSTAT_SPRITE_BREAKABLE);
//SpawnBlood(SpriteNum, SpriteNum, -1, -1, -1, -1);
ChangeState(SpriteNum, u->StateEnd);
sp->xvel = 0;
//u->jump_speed = -300;
//DoActorBeginJump(SpriteNum);
PlaySound(DIGI_NINJASCREAM, sp, v3df_follow);
}
return 0;
}
/*
!AIC - Most actors have one of these and the all look similar
*/
int
DoNinjaMove(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
if (TEST(u->Flags2, SPR2_DYING))
{
if (sw_ninjahack)
NewStateGroup(SpriteNum, sg_NinjaHariKari);
else
NewStateGroup(SpriteNum, sg_NinjaGrabThroat);
return 0;
}
// jumping and falling
if (TEST(u->Flags, SPR_JUMPING | SPR_FALLING) && !TEST(u->Flags, SPR_CLIMBING))
{
if (TEST(u->Flags, SPR_JUMPING))
DoActorJump(SpriteNum);
else if (TEST(u->Flags, SPR_FALLING))
DoActorFall(SpriteNum);
}
// sliding
if (TEST(u->Flags, SPR_SLIDING) && !TEST(u->Flags, SPR_CLIMBING))
DoActorSlide(SpriteNum);
// !AIC - do track or call current action function - such as DoActorMoveCloser()
if (u->track >= 0)
ActorFollowTrack(SpriteNum, ACTORMOVETICS);
else
{
(*u->ActorActionFunc)(SpriteNum);
}
// stay on floor unless doing certain things
if (!TEST(u->Flags, SPR_JUMPING | SPR_FALLING | SPR_CLIMBING))
{
KeepActorOnFloor(SpriteNum);
}
// take damage from environment
DoActorSectorDamage(SpriteNum);
return 0;
}
int
NinjaJumpActionFunc(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
SPRITEp sp = User[SpriteNum]->SpriteP;
int nx, ny;
// Move while jumping
nx = MulScale(sp->xvel, bcos(sp->ang), 14);
ny = MulScale(sp->xvel, bsin(sp->ang), 14);
// if cannot move the sprite
if (!move_actor(SpriteNum, nx, ny, 0L))
{
return 0;
}
if (!TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
{
InitActorDecide(SpriteNum);
}
return 0;
}
/*
!AIC - Short version of DoNinjaMove without the movement code. For times when
the actor is doing something but not moving.
*/
int
NullNinja(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
if (u->WaitTics > 0) u->WaitTics -= ACTORMOVETICS;
if (TEST(u->Flags, SPR_SLIDING) && !TEST(u->Flags, SPR_CLIMBING) && !TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
DoActorSlide(SpriteNum);
if (!TEST(u->Flags, SPR_CLIMBING) && !TEST(u->Flags, SPR_JUMPING|SPR_FALLING))
KeepActorOnFloor(SpriteNum);
DoActorSectorDamage(SpriteNum);
return 0;
}
int DoNinjaPain(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
NullNinja(SpriteNum);
if (TEST(u->Flags2, SPR2_DYING))
{
if (sw_ninjahack)
NewStateGroup(SpriteNum, sg_NinjaHariKari);
else
NewStateGroup(SpriteNum, sg_NinjaGrabThroat);
return 0;
}
if ((u->WaitTics -= ACTORMOVETICS) <= 0)
InitActorDecide(SpriteNum);
return 0;
}
int DoNinjaSpecial(short SpriteNum)
{
SPRITEp sp = &sprite[SpriteNum];
USERp u = User[SpriteNum].Data();
if (u->spal == PALETTE_PLAYER5)
{
RESET(sp->cstat,CSTAT_SPRITE_TRANSLUCENT);
sp->hitag = 0;
sp->shade = -10;
}
return 0;
}
int CheckFire(short SpriteNum)
{
if (!CanSeePlayer(SpriteNum))
InitActorDuck(SpriteNum);
return 0;
}
int
DoNinjaCeiling(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
SPRITEp sp = User[SpriteNum]->SpriteP;
DoActorSectorDamage(SpriteNum);
return 0;
}
//
// !AIC - Stuff from here down is really Player related. Should be moved but it was
// too convienent to put it here.
//
void
InitAllPlayerSprites(void)
{
short i;
TRAVERSE_CONNECT(i)
{
InitPlayerSprite(Player + i);
}
}
void
PlayerLevelReset(PLAYERp pp)
{
SPRITEp sp = &sprite[pp->PlayerSprite];
USERp u = User[pp->PlayerSprite].Data();
if (gNet.MultiGameType == MULTI_GAME_COMMBAT)
{
PlayerDeathReset(pp);
return;
}
if (TEST(pp->Flags, PF_DIVING))
DoPlayerStopDiveNoWarp(pp);
COVER_SetReverb(0); // Turn off any echoing that may have been going before
pp->Reverb = 0;
pp->SecretsFound = 0;
pp->WpnFirstType = WPN_SWORD;
//PlayerUpdateHealth(pp, 500);
//pp->Armor = 0;
//PlayerUpdateArmor(pp, 0);
pp->Kills = 0;
pp->Killer = -1;
pp->NightVision = false;
pp->StartColor = 0;
pp->FadeAmt = 0;
pp->DeathType = 0;
RESET(sp->cstat, CSTAT_SPRITE_YCENTER);
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
RESET(pp->Flags, PF_WEAPON_DOWN|PF_WEAPON_RETRACT);
RESET(pp->Flags, PF_DEAD);
pp->sop_control = NULL;
pp->sop_riding = NULL;
pp->sop_remote = NULL;
pp->sop = NULL;
DoPlayerResetMovement(pp);
DamageData[u->WeaponNum].Init(pp);
}
void
PlayerDeathReset(PLAYERp pp)
{
SPRITEp sp = &sprite[pp->PlayerSprite];
USERp u = User[pp->PlayerSprite].Data();
if (TEST(pp->Flags, PF_DIVING))
DoPlayerStopDiveNoWarp(pp);
COVER_SetReverb(0); // Turn off any echoing that may have been going before
pp->Reverb = 0;
// second weapon - whatever it is
u->WeaponNum = WPN_SWORD;
pp->WpnFirstType = u->WeaponNum;
pp->WpnRocketType = 0;
pp->WpnRocketHeat = 0; // 5 to 0 range
pp->WpnRocketNuke = 0; // 1, you have it, or you don't
pp->WpnFlameType = 0; // Guardian weapons fire
pp->WpnUziType = 2;
pp->WpnShotgunType = 0; // Shotgun has normal or fully automatic fire
pp->WpnShotgunAuto = 0; // 50-0 automatic shotgun rounds
pp->WpnShotgunLastShell = 0; // Number of last shell fired
pp->Bloody = false;
pp->TestNukeInit = false;
pp->InitingNuke = false;
pp->NukeInitialized = false;
pp->WpnReloadState = 2;
memset(pp->WpnAmmo,0,sizeof(pp->WpnAmmo));
memset(pp->InventoryTics,0,sizeof(pp->InventoryTics));
memset(pp->InventoryPercent,0,sizeof(pp->InventoryPercent));
memset(pp->InventoryAmount,0,sizeof(pp->InventoryAmount));
memset(pp->InventoryActive,0,sizeof(pp->InventoryActive));
pp->WpnAmmo[WPN_STAR] = 30;
pp->WpnAmmo[WPN_SWORD] = pp->WpnAmmo[WPN_FIST] = 30;
pp->WpnFlags = 0;
pp->WpnGotOnceFlags = 0;
SET(pp->WpnFlags, BIT(WPN_SWORD));
SET(pp->WpnFlags, BIT(WPN_FIST) | BIT(u->WeaponNum));
SET(pp->WpnFlags, BIT(WPN_STAR) | BIT(u->WeaponNum));
RESET(pp->Flags, PF_PICKED_UP_AN_UZI);
RESET(pp->Flags, PF_TWO_UZI);
u->Health = 100;
pp->MaxHealth = 100;
//PlayerUpdateHealth(pp, 500);
puser[pp->pnum].Health = u->Health;
pp->Armor = 0;
PlayerUpdateArmor(pp, 0);
pp->Killer = -1;
pp->NightVision = false;
pp->StartColor = 0;
pp->FadeAmt = 0;
pp->DeathType = 0;
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
RESET(pp->Flags, PF_WEAPON_DOWN|PF_WEAPON_RETRACT);
RESET(pp->Flags, PF_DEAD);
pp->sop_control = NULL;
pp->sop_riding = NULL;
pp->sop_remote = NULL;
pp->sop = NULL;
DoPlayerResetMovement(pp);
//if (pp->CurWpn)
// RESET(pp->CurWpn->flags, PANF_DEATH_HIDE);
DamageData[u->WeaponNum].Init(pp);
}
void
PlayerPanelSetup(void)
{
short pnum;
PLAYERp pp;
USERp u;
// For every player setup the panel weapon stuff
//for (pp = Player; pp < &Player[numplayers]; pp++)
TRAVERSE_CONNECT(pnum)
{
pp = Player + pnum;
u = User[pp->PlayerSprite].Data();
ASSERT(u != NULL);
//u->WeaponNum = WPN_STAR;
//pp->WpnFirstType = WPN_SWORD;
PlayerUpdateWeapon(pp, u->WeaponNum);
}
}
void
PlayerGameReset(PLAYERp pp)
{
SPRITEp sp = &sprite[pp->PlayerSprite];
USERp u = User[pp->PlayerSprite].Data();
COVER_SetReverb(0); // Turn off any echoing that may have been going before
pp->Reverb = 0;
u->WeaponNum = WPN_SWORD;
pp->WpnFirstType = u->WeaponNum;
pp->WpnRocketType = 0;
pp->WpnRocketHeat = 0; // 5 to 0 range
pp->WpnRocketNuke = 0; // 1, you have it, or you don't
pp->WpnFlameType = 0; // Guardian weapons fire
pp->WpnUziType = 2;
pp->WpnShotgunType = 0; // Shotgun has normal or fully automatic fire
pp->WpnShotgunAuto = 0; // 50-0 automatic shotgun rounds
pp->WpnShotgunLastShell = 0; // Number of last shell fired
pp->Bloody = false;
pp->TestNukeInit = false;
pp->InitingNuke = false;
pp->NukeInitialized = false;
pp->SecretsFound = 0;
pp->WpnReloadState = 2;
pp->WpnAmmo[WPN_STAR] = 30;
pp->WpnAmmo[WPN_SWORD] = pp->WpnAmmo[WPN_FIST] = 30;
pp->WpnFlags = 0;
pp->WpnGotOnceFlags = 0;
SET(pp->WpnFlags, BIT(WPN_SWORD));
SET(pp->WpnFlags, BIT(WPN_FIST) | BIT(u->WeaponNum));
SET(pp->WpnFlags, BIT(WPN_STAR) | BIT(u->WeaponNum));
RESET(pp->Flags, PF_PICKED_UP_AN_UZI);
RESET(pp->Flags, PF_TWO_UZI);
pp->MaxHealth = 100;
PlayerUpdateHealth(pp, 500);
pp->Armor = 0;
PlayerUpdateArmor(pp, 0);
pp->Killer = -1;
if (pp == Player+screenpeek)
{
videoFadePalette(0,0,0,0);
}
pp->NightVision = false;
pp->StartColor = 0;
pp->FadeAmt = 0;
pp->DeathType = 0;
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
pp->sop_control = NULL;
pp->sop_riding = NULL;
pp->sop_remote = NULL;
pp->sop = NULL;
DoPlayerResetMovement(pp);
DamageData[u->WeaponNum].Init(pp);
}
extern ACTOR_ACTION_SET PlayerNinjaActionSet;
void
PlayerSpriteLoadLevel(short SpriteNum)
{
USERp u = User[SpriteNum].Data();
ChangeState(SpriteNum, s_NinjaRun[0]);
u->Rot = sg_NinjaRun;
u->ActorActionSet = &PlayerNinjaActionSet;
}
void
InitPlayerSprite(PLAYERp pp)
{
short sp_num;
SPRITE *sp;
USERp u;
int pnum = int(pp - Player);
extern bool NewGame;
COVER_SetReverb(0); // Turn off any echoing that may have been going before
pp->Reverb = 0;
sp_num = pp->PlayerSprite = SpawnSprite(STAT_PLAYER0 + pnum, NINJA_RUN_R0, NULL, pp->cursectnum, pp->posx,
pp->posy, pp->posz, pp->angle.ang.asbuild(), 0);
pp->SpriteP = sp = &sprite[sp_num];
pp->pnum = pnum;
SET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
SET(sp->extra, SPRX_PLAYER_OR_ENEMY);
RESET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT);
u = User[sp_num].Data();
// Grouping items that need to be reset after a LoadLevel
ChangeState(sp_num, s_NinjaRun[0]);
u->Rot = sg_NinjaRun;
u->ActorActionSet = &PlayerNinjaActionSet;
u->RotNum = 5;
u->Radius = 400;
u->PlayerP = pp;
//u->Health = pp->MaxHealth;
SET(u->Flags, SPR_XFLIP_TOGGLE);
sp->picnum = u->State->Pic;
sp->shade = -60; // was 15
sp->clipdist = (char)(256L >> 2);
sp->xrepeat = PLAYER_NINJA_XREPEAT;
sp->yrepeat = PLAYER_NINJA_YREPEAT;
sp->pal = PALETTE_PLAYER0 + pp->pnum;
u->spal = sp->pal;
NewStateGroup(sp_num, u->ActorActionSet->Run);
pp->PlayerUnderSprite = -1;
pp->UnderSpriteP = NULL;
DoPlayerZrange(pp);
if (NewGame)
{
PlayerGameReset(pp);
}
else
{
// restore stuff from last level
puser[pnum].CopyToUser(u);
PlayerLevelReset(pp);
}
memset(pp->InventoryTics,0,sizeof(pp->InventoryTics));
if (pp == Player+screenpeek)
{
videoFadePalette(0,0,0,0);
}
pp->NightVision = false;
pp->StartColor = 0;
pp->FadeAmt = 0;
pp->DeathType = 0;
}
void
SpawnPlayerUnderSprite(PLAYERp pp)
{
USERp pu = User[pp->PlayerSprite].Data(), u;
SPRITEp psp = &sprite[pp->PlayerSprite];
SPRITEp sp;
int pnum = int(pp - Player), sp_num;
sp_num = pp->PlayerUnderSprite = SpawnSprite(STAT_PLAYER_UNDER0 + pnum,
NINJA_RUN_R0, NULL, pp->cursectnum, pp->posx, pp->posy, pp->posz, pp->angle.ang.asbuild(), 0);
sp = &sprite[sp_num];
u = User[sp_num].Data();
pp->UnderSpriteP = sp;
SET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
SET(sp->extra, SPRX_PLAYER_OR_ENEMY);
u->Rot = sg_NinjaRun;
u->RotNum = pu->RotNum;
NewStateGroup(sp_num, pu->Rot);
u->Radius = pu->Radius;
u->PlayerP = pp;
u->Health = pp->MaxHealth;
SET(u->Flags, SPR_XFLIP_TOGGLE);
u->ActorActionSet = pu->ActorActionSet;
sp->picnum = psp->picnum;
sp->clipdist = psp->clipdist;
sp->xrepeat = psp->xrepeat;
sp->yrepeat = psp->yrepeat;
//sp->pal = psp->pal;
//u->spal = pu->spal;
}
#include "saveable.h"
static saveable_code saveable_ninja_code[] =
{
SAVE_CODE(DoHariKariBlood),
SAVE_CODE(SetupNinja),
SAVE_CODE(DoNinjaHariKari),
SAVE_CODE(DoNinjaGrabThroat),
SAVE_CODE(DoNinjaMove),
SAVE_CODE(NinjaJumpActionFunc),
SAVE_CODE(NullNinja),
SAVE_CODE(DoNinjaPain),
SAVE_CODE(DoNinjaSpecial),
SAVE_CODE(CheckFire),
SAVE_CODE(DoNinjaCeiling)
};
static saveable_data saveable_ninja_data[] =
{
SAVE_DATA(NinjaBattle),
SAVE_DATA(NinjaOffense),
SAVE_DATA(NinjaBroadcast),
SAVE_DATA(NinjaSurprised),
SAVE_DATA(NinjaEvasive),
SAVE_DATA(NinjaLostTarget),
SAVE_DATA(NinjaCloseRange),
SAVE_DATA(NinjaSniperRoam),
SAVE_DATA(NinjaSniperBattle),
SAVE_DATA(NinjaPersonality),
SAVE_DATA(NinjaSniperPersonality),
SAVE_DATA(NinjaAttrib),
SAVE_DATA(InvisibleNinjaAttrib),
SAVE_DATA(DefaultAttrib),
SAVE_DATA(s_NinjaRun),
SAVE_DATA(sg_NinjaRun),
SAVE_DATA(s_NinjaStand),
SAVE_DATA(sg_NinjaStand),
SAVE_DATA(s_NinjaRise),
SAVE_DATA(sg_NinjaRise),
SAVE_DATA(s_NinjaCrawl),
SAVE_DATA(sg_NinjaCrawl),
SAVE_DATA(s_NinjaKneelCrawl),
SAVE_DATA(sg_NinjaKneelCrawl),
SAVE_DATA(s_NinjaDuck),
SAVE_DATA(sg_NinjaDuck),
SAVE_DATA(s_NinjaSit),
SAVE_DATA(sg_NinjaSit),
SAVE_DATA(s_NinjaCeiling),
SAVE_DATA(sg_NinjaCeiling),
SAVE_DATA(s_NinjaJump),
SAVE_DATA(sg_NinjaJump),
SAVE_DATA(s_NinjaFall),
SAVE_DATA(sg_NinjaFall),
SAVE_DATA(s_NinjaSwim),
SAVE_DATA(sg_NinjaSwim),
SAVE_DATA(s_NinjaDive),
SAVE_DATA(sg_NinjaDive),
SAVE_DATA(s_NinjaClimb),
SAVE_DATA(sg_NinjaClimb),
SAVE_DATA(s_NinjaFly),
SAVE_DATA(sg_NinjaFly),
SAVE_DATA(s_NinjaPain),
SAVE_DATA(sg_NinjaPain),
SAVE_DATA(s_NinjaStar),
SAVE_DATA(sg_NinjaStar),
SAVE_DATA(s_NinjaMirv),
SAVE_DATA(sg_NinjaMirv),
SAVE_DATA(s_NinjaNapalm),
SAVE_DATA(sg_NinjaNapalm),
SAVE_DATA(s_NinjaRocket),
SAVE_DATA(sg_NinjaRocket),
SAVE_DATA(s_NinjaGrenade),
SAVE_DATA(sg_NinjaGrenade),
SAVE_DATA(s_NinjaFlashBomb),
SAVE_DATA(sg_NinjaFlashBomb),
SAVE_DATA(s_NinjaUzi),
SAVE_DATA(sg_NinjaUzi),
SAVE_DATA(s_NinjaHariKari),
SAVE_DATA(sg_NinjaHariKari),
SAVE_DATA(s_NinjaGrabThroat),
SAVE_DATA(sg_NinjaGrabThroat),
SAVE_DATA(s_NinjaDie),
SAVE_DATA(s_NinjaDieSliced),
SAVE_DATA(s_NinjaDieSlicedHack),
SAVE_DATA(s_NinjaDead),
SAVE_DATA(s_NinjaDeathJump),
SAVE_DATA(s_NinjaDeathFall),
SAVE_DATA(sg_NinjaDie),
SAVE_DATA(sg_NinjaDieSliced),
SAVE_DATA(sg_NinjaDieSlicedHack),
SAVE_DATA(sg_NinjaDead),
SAVE_DATA(sg_NinjaDeathJump),
SAVE_DATA(sg_NinjaDeathFall),
SAVE_DATA(NinjaSniperActionSet),
SAVE_DATA(NinjaActionSet),
SAVE_DATA(NinjaRedActionSet),
SAVE_DATA(NinjaSeekerActionSet),
SAVE_DATA(NinjaGrenadeActionSet),
SAVE_DATA(NinjaGreenActionSet),
SAVE_DATA(PlayerNinjaActionSet),
};
saveable_module saveable_ninja =
{
// code
saveable_ninja_code,
SIZ(saveable_ninja_code),
// data
saveable_ninja_data,
SIZ(saveable_ninja_data)
};
END_SW_NS