#ifndef ONI_H
#error Do not include this file directly, include Oni/Oni.h instead!
#endif

#ifndef GAMESTATE_H
#define GAMESTATE_H

typedef struct {
	float X;
	float Y;
	float Z;	
} Vector3; //probably move to utilities...

typedef struct {
	float X;
	float Y;
	float Z;
	float W;
} Quaternion;

typedef struct {
	float RotationScale[9];
	Vector3 Translation;
} Matrix4x3;

typedef struct {
	Vector3 Center;
	float Radius;
} Sphere;

typedef struct 
{
  int StartTime;
  int field_4;
  char Active;
  char field_9;
} Letterbox;

typedef struct 
{
  __int16 Count;
  __int16 field_2;
  int Memory;
} DoorArray;

typedef struct 
{
  int Count;
  int Head;
}PHNodeList;

typedef struct
{
  PHNodeList OutList;
  PHNodeList InList;
  int AKVA;
  int field_14;
  int XTiles;
  int ZTiles;
  int GridSize;
  char field_24;
  char NoGrid;
  char gap_26[2];
  int GridData;
  int field_2D;
  __int16 field_31;
  char gap_32[2];
  int DynamicGrid;
  int field_39;
  int field_3D;
  int field_41;
  int field_45;
  int field_49;
  int field_4D;
  int field_51;
  int field_55;
  int field_59;
  int field_5D;
  int field_61;
  int field_65;
  int field_69;
  int field_6D;
  int field_71;
  int field_75;
  __int16 Visited;
  __int16 field_7A;
  int TraverseQueueNext;
  int field_81;
  int field_85;
  int field_89;
  int field_8D;
  int field_91;
  int field_95;
  int field_99;
} PHGraphNode;
typedef struct 
{
  int field_0;
  int field_4;
  int field_8;
  int field_C;
  int field_10;
  int field_14;
  int field_18;
  int field_1C;
  int field_20;
  int field_24;
  int field_28;
  int field_2C;
  int field_30;
  int field_34;
  int field_38;
  int field_3C;
  int field_40;
} MotionBlur;

typedef struct 
{
  char field_0[2052];
} Shadow;

typedef struct
{
  int ONSK;
  Vector3 PlanetPositions[8];
  int StarSpriteArray;
  int Skybox;
  int field_6C;
  int field_70;
  int field_74;
  int field_78;
  int field_7C;
  int field_80;
  int field_84;
  int field_88;
  int field_8C;
  int field_90;
  int field_94;
  int field_98;
  int field_9C;
  int field_A0;
  int field_A4;
  int field_A8;
  int field_AC;
  int field_B0;
  int field_B4;
  int field_B8;
  int field_BC;
  int field_C0;
  int field_C4;
  int field_C8;
  int field_CC;
  int field_D0;
  int field_D4;
  int field_D8;
  int field_DC;
  float field_E0;
  int field_E4;
  int field_E8;
  int field_EC;
  int field_F0;
  int field_F4;
  int field_F8;
  int field_FC;
  int field_100;
  int field_104;
  int field_108;
  int field_10C;
  int field_110;
  int field_114;
  int field_118;
  int field_11C;
  int field_120;
  int field_124;
  int field_128;
  int field_12C;
  int field_130;
  int field_134;
  int field_138;
  int field_13C;
  int field_140;
  int field_144;
  int field_148;
  int field_14C;
  int field_150;
  int field_154;
  int field_158;
  int field_15C;
  int field_160;
  float field_164;
  int field_168;
  int field_16C;
  int field_170;
  int field_174;
  int field_178;
  int field_17C;
  int field_180;
  int field_184;
  int field_188;
  int field_18C;
  int field_190;
  int field_194;
  int field_198;
  int field_19C;
  int field_1A0;
  int field_1A4;
  int field_1A8;
  int field_1AC;
  int field_1B0;
  int field_1B4;
  int field_1B8;
  int field_1BC;
  int field_1C0;
  int field_1C4;
  int field_1C8;
  int field_1CC;
  int field_1D0;
  int field_1D4;
  int field_1D8;
  int field_1DC;
  int field_1E0;
  int field_1E4;
  int field_1E8;
  int field_1EC;
  int field_1F0;
  int field_1F4;
  int field_1F8;
  int field_1FC;
  int field_200;
  float field_204;
  int field_208;
  int field_20C;
  int field_210;
  int field_214;
  int field_218;
  int field_21C;
  int field_220;
  int field_224;
  int field_228;
  int field_22C;
  int field_230;
  int field_234;
  int field_238;
  int field_23C;
  int field_240;
  int field_244;
  int field_248;
  Vector3 SunFlarePosition;
  Vector3 field_258;
  int field_264;
  int field_268;
  int field_26C;
  int field_270;
  Vector3 field_274;
  int field_280;
  int field_284;
  int field_288;
  int field_28C;
} Sky;



typedef struct {
	Sphere Sphere_; //fix this name
	int Child1;
	int Child2;	
} SphereTreeNode;

typedef struct {
	Vector3 Min;
	Vector3 Max;
} BoundingBox;


/*  202 */ typedef struct 
{
  char Name[32];
  __int16 Id;
  __int16 field_22;
  int Length;
} PatrolPathOSD;

/*  396 */ typedef struct 
{
  int Type;
  int field_4;
  int field_8;
  int field_C;
  int field_10;
} PatrolPathPoint;

enum { //action flags
	Action_Escape                    = 1,
	Action_Console                   = 2,
	Action_PauseScreen               = 4,
	Action_Cutscene_1                = 8,
	Action_Cutscene_2                = 0x10,
	Action_F4                        = 0x20,
	Action_F5                        = 0x40,
	Action_F6                        = 0x80,
	Action_F7                        = 0x100,
	Action_F8                        = 0x200,
	Action_StartRecord               = 0x400,
	Action_StopRecord                = 0x800,
	Action_PlayRecord                = 0x1000,
	Action_F12                       = 0x2000,
	Action_LookMode                  = 0x8000,
	Action_Screenshot                = 0x10000,
	Action_Forward                   = 0x200000,
	Action_Backward                  = 0x400000,
	Action_TurnLeft                  = 0x800000,
	Action_TurnRight                 = 0x1000000,
	Action_StepLeft                  = 0x2000000,
	Action_StepRight                 = 0x4000000,
	Action_Jump                      = 0x8000000,
	Action_Crouch                    = 0x10000000,
	Action_Punch                     = 0x20000000,
	Action_Kick                      = 0x40000000,
	Action_Block                     = 0x80000000,
	Action_Walk                      = 0x100000000ull,
	Action_Action                    = 0x200000000ull,
	Action_Hypo                      = 0x400000000ull,
	Action_Reload                    = 0x800000000ull,
	Action_Swap                      = 0x1000000000ull,
	Action_Drop                      = 0x2000000000ull,
	Action_Fire1                     = 0x4000000000ull,
	Action_Fire2                     = 0x8000000000ull,
	Action_Fire3                     = 0x10000000000ull,
};

typedef struct {
	float MouseDeltaX;
	float MouseDeltaY;
	float unknown1;
	int unknown2;
	uint64_t ActionsDown;
	uint64_t ActionsUp;
	uint64_t ActionsPressed;
	uint64_t ActionsReleased;
} GameInput;

typedef struct {
	int Type;				//'CHAR' etc.
	int ObjectId;			//not needed
	int Flags;				//The flags of the object...not used for CHAR
	Vector3 Position;		//Position of Object
	Vector3 Rotation;		//Rotation of Object
	int EditorCallbacks;	//Lets try not to mess with it for now. :P
	int field_28;			//unknown
} OSD_Header;

typedef struct 
{
	short ID;	
	short flags;

	short keys;
	short open_time;

	float activate_radius_squared;

	short state;	
	short blocked_frames;						

	short open_time_left;						
	short some_timer;

	Vector3 center_offset;						
	char name[63];
	char pad;
	void *class;
} DoorOSD;

typedef struct {
	OSD_Header OSD;
	DoorOSD Door; //incomplete
} DoorObject;

typedef struct {
	int32_t Flags;
	int32_t Frame;
	int32_t field_8;
	int32_t field_C;
	int32_t field_10;
	int32_t field_14;
	int32_t field_18;
	int32_t field_1C;
	int32_t FILMInstance;
} PlayingFilm;

typedef enum {
	chr_isplayer          = 1 << 0,
	chr_randomskin        = 1 << 1,
	chr_notprespawned     = 1 << 2,
	chr_noncombatant      = 1 << 3,
	chr_multispawnable    = 1 << 4,
	chr_unkillable        = 1 << 5,
	chr_superammo         = 1 << 6,
	chr_omniscient        = 1 << 8,
	chr_haslsi            = 1 << 9,
	chr_boss              = 1 << 10,
	chr_upgradedifficulty = 1 << 11,
	chr_noautodrop        = 1 << 12,
	chr_dontaim           = 1 << 13,
	chr_nocollision       = 1 << 17,
	chr_noshadow          = 1 << 24,
	chr_invincible        = 1 << 25,
	chr_bossshield        = 1 << 30,
	chr_weaponimmune      = 1 << 31,
} chr_flags;


typedef struct {
	uint32_t Options;				//A bitset. Someone had better define these
	char Class[64];					//Name of the ONCC we use. ONCCName in idb
	char Name[32];					//Name of the character. ie: ai2_spawn Muro
	char Weapon[64];				//Name of the weapon he holds. ONWCName in idb
	char ScriptSpawn[32];			//Script function called when char spawns
	char ScriptDie[32];				//Script function called when char dies
	char ScriptAware[32];			//Script function called when char detects something
	char ScriptAlarm[32];			//Script function called when char is alarmed at something
	char ScriptHurt[32];			//Script function called when char is hurt for the first time
	char ScriptDefeat[32];			//Script function called when char is at 1 HP
	char ScriptNoPath[32];			//Script function called when char loses path. Broken.
	char ScriptNoAmmo[32];			//Script function called when char is out of ammo for the first time. Char must have ammo at spawn.
	int32_t AdditionalHealth;		//Additional Health given to the character
	int16_t AmmoUsed;				//Ammo given for the char to use
	int16_t AmmoDropped;			//Ammo the char drops
	int16_t CellsUsed;				//Cells given for the char to use
	int16_t CellsDropped;			//Cells the char drops
	int16_t HypoUsed;				//Hypo given for the char to use
	int16_t HypoDropped;			//Hypo the char drops
	int16_t ShieldUsed;				//Bullet shield given for the char to use
	int16_t ShieldDropped;			//Bullet shield the char drops
	int16_t CloakUsed;				//Phase Cloak given for the char to use
	int16_t CloakDropped;			//Phase Cloak the char drops
	int16_t NCIUsed;				//Don't use this...
	int16_t NCIDropped;				//Don't use this...
	int32_t TeamID;					//Team ID
	int32_t AmmoPercent;			//Percent of weapon ammo full
	int32_t JobID;					//Job ID...
									//0 - none 
									//1 - idle 
									//2 - guard (never used in Oni) 
									//3 - patrol 
									//4 - teambattle (never used in Oni)
	int16_t PatrolID;				//patrol path ID (reference to the Patrol_Path.BINA file)
	int16_t CombatID;				//combat ID (reference to the Combat.BINA file)
	int16_t	MeleeID;				//melee ID (reference to the Melee Profile.BINA file)
	int16_t NeutralID;				//neutral ID (reference to the Neutral.BINA file)
	int32_t	AlarmGroups;			//Bitset. http://wiki.oni2.net/CHAR
	int32_t InitialAlertLevel;		//0 - lull, 1 - low, 2 - medium, 3 - high, 4 - combat
	int32_t MinimalAlertLevel;		//0 - lull, 1 - low, 2 - medium, 3 - high, 4 - combat
	int32_t StartJobAlertLevel;		//0 - lull, 1 - low, 2 - medium, 3 - high, 4 - combat
	int32_t InvestigatingAlertLevel;//0 - lull, 1 - low, 2 - medium, 3 - high, 4 - combat
	int32_t PursuitStrongLow;
	int32_t PursuitWeakLow;
	int32_t PursuitStrongHigh;
	int32_t PursuitWeakHigh;
	int32_t Pursuit5;
	int32_t field_1FC;
} CharacterOSD;

typedef struct {
	OSD_Header Header;
	CharacterOSD OSD;
} CharacterObject;

typedef struct {
	Vector3 Center;
	float Radius;
} BoundingSphere;

typedef struct {
	int32_t ONCP; //probably pointer
	int32_t field_4;	//who knows?
	int32_t Instance; //probably link to actual particle
	int32_t Bone; //duh
} AttachedParticle;


typedef struct 
{
  __int16 Index;
  __int16 Flags;
  int Class;
  int Character;
  Matrix4x3 Matrix;
  int PhyContext;
  int Facing;
  __int16 FadeTimer;
  __int16 TimeToFade;
  int CreationTime;
  __int16 ShotDelay1;
  __int16 ShotDelay2;
  __int16 PauseBeforeReload;
  __int16 PauseAfterReload;
  __int16 ActiveFireModeLength;
  __int16 AmmoCount;
  __int16 field_58;
  __int16 FiringDelays[16];
  char gap_7a[2];
  int ParticleInstances[16];
  int field_BC[16];
  int field_FC;
  int DodgeFiringSpreadPtr;
  int field_104;
  int field_108;
  int field_10C;
  char gap_110[20];
  Vector3 Center;
  int NodeList[16];
} Weapon;

typedef struct { //Inventory
	Weapon* Weapons[3];
	int8_t z_forced_holster;
	int8_t z_forced_holster_is_magic;
	int16_t AmmoUsed;				//Ammo given for the char to use
	int16_t HypoUsed;				//Hypo given for the char to use
	int16_t CellsUsed;				//Cells given for the char to use
	int16_t AmmoDropped;			//Ammo the char drops
	int16_t HypoDropped;			//Hypo the char drops
	int16_t CellsDropped;			//Cells the char drops
	int16_t hypoRemaining;	//who knows? InverseHypoRegenRate?
	int16_t hypoTimer;	
	int16_t pad;
	char hasLSI;
	char field_1B5;
	int16_t	shieldDisplayAmount;
	int16_t ShieldUsed;				//Bullet shield given for the char to use
	int16_t CloakUsed;				//Phase Cloak given for the char to use
	int32_t numInvisibleFrames;			//probably bullet shield dropped
	int32_t DoorKeys;		//Lol. We can use this later for other sorts of items.
} Inventory;

typedef struct {
	uint32_t SphereTree;
	Vector3 ObBox[8];
	Vector3 * ObBowPtr;
	Vector3 Velocity;
	Quaternion field_74;
	Vector3 Position;
	Quaternion Rotation;
	float Scale;
	Matrix4x3 Matrix;
	Matrix4x3 InitMatrix;
	float field_104;
	float Gravity;
	float field_10C;
	float field_110;
	float Friction_1;
	float Friction_2;
	Vector3 Force;
	uint32_t Flags;
	uint32_t Type;
	char AnimState[0x18];
	void* Callbacks;
	void* Owner;
} PhyContext;
typedef struct
{
  int field_0;
  int NumContacts;
  int FirstContact;
  int NotifyKnowledgeCallback;
} AI2KnowledgeState;

typedef struct 
{
  char Name[128];
  __int16 ImpactId;
} ONCCImpact;

typedef struct 
{
  int RecoilCompensation;
  int BestAimingAngle;
  int ShotGroupError;
  int ShotGroupDecay;
  int ShotingInaccuracyMultiplier;
  __int16 MinDelayBetweenShots;
  __int16 MaxDelayBetweenShots;
} ONCCWeaponSkill;

typedef struct 
{
  __int16 field_0;
  __int16 field_2;
  __int16 field_4;
  __int16 field_6;
  __int16 field_8;
  __int16 field_A;
  __int16 field_C;
  __int16 field_E;
  __int16 field_10;
  __int16 field_12;
  __int16 field_14;
  char Loaded;
  char field_17;
  int field_18;
  char HurtLightSoundName[32];
  char HurtMediumSoundName[32];
  char HurtHeavySoundName[32];
  char DeathSoundName[32];
  int HurtLightSoundPtr;
  int HurtMediumSoundPtr;
  int HurtHeavySoundPtr;
  int DeathSoundPtr;
}HurtParams;


typedef struct
{
  int field_0;
  int Gravity;
  float JumpStartVelocity;
  float MaxFallingVelocity;
  float JumpAcceleration;
  __int16 field_14;
  __int16 JetpackTimer;
  float MaxFallingHeightWithoutDamage;
  float MaxFallingHeightWithDamage;
  int ShadowTexture;
  float ShadowMaxHeight;
  float ShadowFadeHeight;
  float ShadowSize1;
  float ShadowSize2;
  float ShadowSize3;
  __int16 field_38;
  __int16 field_3A;
  int field_3C;
  char field_40;
  char field_41;
  __int16 field_42;
  int field_44;
  int field_48;
  int field_4C;
  int field_50;
  int field_54;
  int field_58;
  __int16 InverseHypoRegenerationRate;
  __int16 field_5E;
  int field_60;
  int field_64;
  int field_68;
  int field_6C;
  int field_70;
  HurtParams HurtParams;
  int AIOptions;
  int AIRotationSpeed;
  __int16 MinimalDazeTime;
  __int16 MaximalDazeTime;
  __int16 MinimalRealiseFiringSpreadTime;
  __int16 MaximalRealiseFiringSpreadTime;
  int MinimalFiringSpreadDodge;
  int MaximalFiringSpreadDodge;
  int field_138;
  int field_13C;
  int field_140;
  int field_144;
  int field_148;
  int field_14C;
  int field_150;
  ONCCWeaponSkill WeaponSkills[13];
  int field_28C;
  int field_290;
  int field_294;
  int TauntChance;
  int GoForGunChance;
  int RunPickupChance;
  __int16 CombatId;
  __int16 MeleeId;
  char SoundProbabilities[10];
  char gap_2b2[2];
  char TauntSound[32];
  char AlertSound[32];
  char StartleSound[32];
  char CheckBodySound[32];
  char PursueSound[32];
  char CoverSound[32];
  char SuperpunchSound[32];
  char SuperKickSound[32];
  char Super3Sound[32];
  char Super4Sound[32];
  int CentralVisionRange;
  int PeripheralVisionRange;
  int HFov;
  int CentralVisionCurve;
  int CentralVFOV;
  int PeripheralVisionCurve;
  int PeripheralVFOV;
  int HostileThreatDefiniteTimer;
  int HostileThreatStrongTimer;
  int HostileThreatWeakTimer;
  int FriendlyThreadDefiniteTimer;
  int FriendlyThreatStrongTimer;
  int FriendlyThreatWeakTimer;
  int EarshotRadius;
  int ONCV;
  int ONCP;
  int ONIA;
  char ImpactsLoaded;
  char gap_439[1];
  __int16 ImpactModifier;
  char ImpactModifierName[16];
  ONCCImpact Impacts[15];
  char gap_bea[2];
  char DeathParticleName[64];
  int DeathParticlePtr;
  int BodySurfaceCache;
  int TRBS;
  int TRMA;
  int CBPM;
  int CBPI;
  int PeaceTimer;
  int IdleTimer1;
  int IdleTimer2;
  int BaseHealth;
  int field_C54;
  int MinBodySizeFactor;
  int MaxBodySizeFactor;
  int field_C60[7];
  int field_C7C;
  int TRAC;
  int TRSC;
  char gap_c88[2];
  __int16 DeathDeleteTimer;
  char WeaponHand;
  char HasDaodanPowers;
  char HasSuperShield;
  char CantTouchThis;
} ONCC;


/*  398 */ typedef struct 
{
  char Number;
  char gap_1[1];
  __int16 ActiveCharacterIndex;
  int Flags;
  int field_8;
  ONCC* ONCC;
  __int16 ONCCnumber;
  __int16 Team;
  char Name[32];
  int BodySize;
  int Health;
  int MaxHealth;
  __int16 AISA_ID;
  char gap_42[2];
  int field_44;
  char ScriptNew[32];
  char ScriptDie[32];
  char ScriptSeen[32];
  char ScriptAlarm[32];
  char ScriptHurt[32];
  char ScriptDefeat[32];
  char ScriptLowAmmo[32];
  //char ScriptNoPath[32];
  char ScriptNoPath[28];
  int RegenHax;
  Vector3 Position;
  Vector3 LastPosition;
  Vector3 Location;
  float Facing;
  float DesiredFacing;
  float CosmeticFacing;
  int field_178;
  int field_17C;
  int field_180;
  int BNV;
  int GraphNode;
  float PelvisHeight;
  int field_190;
  Inventory Inventory;
  Vector3 Velocity;
  int field_1D0;
  int field_1D4;
  int field_1D8;
  int field_1DC;
  int field_1E0;
  int IdleDelay;
  int charType;
  char gap_1ec[4];
  int CombatFlags;
  int JobId;
  int Goal;
  int field_1FC;
  __int16 field_200;
  char gap_202[6];
  int field_208;
  char gap_20c[588];
  char field_458;
  char gap_459[352];
  char field_5B9;
  char gap_5ba[14];
  char field_5C8;
  char gap_5c9[359];
  int field_730;
  int field_734;
  int field_738;
  char gap_73c[380];
  char CombatState;
  char gap_8b9[7];
  PatrolPathOSD PatrolPathOSD_;
  PatrolPathPoint PatrolPathPoints[64];
  char gap_de8[392];
  int Combat_StatePtr;
  AI2KnowledgeState KnowledgeState_;
  char gap_f84[4];
  int AlertDecayTimer;
  int field_F8C;
  int field_F90;
  int AlertLevel;
  int MinimalAlertLevel;
  int StartJobAlertLevel;
  int InvestigatingAlertLevel;
  int StartleTime;
  int field_FA8;
  int field_FAC;
  int field_FB0;
  int Pursue1;
  int Pursue2;
  int Pursue3;
  int Pursue4;
  int Pursue5;
  char field_FC8;
  char gap_fc9[3];
  int field_FCC;
  char gap_fd0[8];
  int AlarmGroups;
  int field_FDC;
  int field_FE0;
  int field_FE4;
  int field_FE8;
  int field_FEC;
  int field_FF0;
  int field_FF4;
  int field_FF8;
  int field_FFC;
  int field_1000;
  int field_1004;
  int field_1008;
  __int16 field_100C;
  __int16 field_100E;
  int field_1010;
  int field_1014;
  int field_1018;
  char field_101C;
  char gap_101d[3];
  int DazeTimer;
  __int16 field_1024;
  __int16 field_1026;
  __int16 field_1028;
  __int16 field_102A;
  int field_102C;
  int field_1030;
  int field_1034;
  char gap_1038[20];
  int field_104C;
  int field_1050;
  int field_1054;
  int field_1058;
  int field_105C;
  int field_1060;
  int field_1064;
  int MeleePtr;
  int field_106C;
  __int16 field_1070;
  char gap_1072[126];
  int Path_DestinationType;
  int Path_TypeSpecificInfo;
  char Path_MovementState;
  char gap_10f9[3];
  int Path_OrientTo;
  Vector3 Path_DestinationPoint;
  int field_110C;
  int field_1110;
  Vector3 field_1114;
  Vector3 field_1120;
  char Path_State;
  char field_112D;
  char field_112E;
  char gap_112f[1];
  Vector3 field_1130;
  int field_113C;
  int field_1140;
  int field_1144;
  char field_1148;
  char gap_1149[3];
  int Path_CurrentNodeNumber;
  int Path_NumNodes;
  Vector3 Path_From;
  Vector3 Path_To;
  int Path_GraphFromNodePtr;
  int Path_GraphToNodePtr;
  int field_1174;
  char gap_1178[12];
  int field_1184;
  char gap_1188[776];
  int Path_LastError;
  int Path_RepathDelay;
  int Path_Repaths;
  int Path_RepathDecayTimer;
  int field_14A0;
  int MovementMode;
  char field_14A8;
  char gap_14a9[3];
  int field_14AC;
  int MovementModifiers;
  int field_14B4;
  char gap_14b8[188];
  int field_1574;
  int FacingState;
  int FacingAt_Destination;
  char field_1580;
  char field_1581;
  char gap_1582[2];
  int Aiming_At_Type;
  Vector3 Aiming_At;
  int field_1594;
  int field_1598;
  int field_159C;
  int GlancingState;
  Vector3 GlancingDirOrPos;
  char field_15B0;
  char gap_15b1[3];
  int field_15B4;
  int field_15B8;
  int field_15BC;
  int field_15C0;
  int field_15C4;
  int field_15C8;
  int field_15CC;
  int field_15D0;
  int field_15D4;
  int field_15D8;
  int field_15DC;
  int field_15E0;
  int field_15E4;
  int field_15E8;
  int AIBlockFunction;
  char field_15F0;
  char field_15F1;
  char field_15F2;
  char gap_15f3[1];
  int field_15F4;
  int field_15F8;
  int field_15FC;
  int field_1600;
  char gap_1604[4];
  int field_1608;
  int field_160C;
  char gap_1610[4];
  int field_1614;
  char gap_1618[20];
  int field_162C;
  int field_1630;
  int field_1634;
  int field_1638;
  int field_163C;
  int field_1640;
  __int16 field_1644;
  char gap_1646[2];
  BoundingBox BoundingBox_;
  char gap_1660[4];
  int BossShieldPower;
  int field_1668;
  char gap_166c[4];
  uint32_t Kills;
  uint32_t Damage;
  int field_1678;
  int field_167C;
  int CurrentConsoleActionMarker;
  int field_1684;
  __int16 field_1688;
  __int16 field_168A;
  int field_168C;
  int field_1690;
  char field_1694;
  char field_1695;
  __int16 field_1696;
  int field_1698;
  int field_169C;
} Character;

typedef struct 
{
  int Nodes;
  int NodeCount;
  int field_8;
  int TraverseQueueHead;
  int field_10;
  int CacheLrar;
  int CacheMem;
  int field_1C;
  int field_20;
  int field_24;
}PHGraph
;

/*  388 */ typedef struct //activecharacter
{
  __int16 Number;
  __int16 field_2;
  PhyContext* PhyContext;
  SphereTreeNode SphereTree;
  SphereTreeNode SphereTree3[4];
  SphereTreeNode SphereTree2[2];
  __int16 field_B0;
  __int16 field_B2;
  __int16 field_B4;
  char field_B6;
  char gap_b7[1];
  Vector3 field_B8;
  Vector3 AccelerateWith;
  int field_D0;
  Vector3 field_D4;
  __int16 field_E0;
  char gap_e2[2];
  int field_E4;
  int field_E8;
  int field_EC;
  int field_F0;
  __int16 field_F4;
  __int16 IsInAir;
  Vector3 FallingVelocity;
  Vector3 JumpVelocity;
  char field_110;
  char field_111;
  __int16 field_112;
  __int16 field_114;
  char gap_116[2];
  int field_118;
  int field_11C;
  int field_120;
  int field_124;
  int field_128;
  int field_12C;
  BoundingSphere BoundingSphere;
  Vector3 field_140;
  Vector3 field_14C;
  int field_158;
  int field_15C;
  Vector3 Location;
  char gap_16c[24];
  int AkiraNode;
  int GraphNode;
  int PelvisHeight;
  int Movement_StatePtr;
  int ActiveWeapon;
  int field_198;
  int InventoryWeapon;
  char gap_1a0[2];
  __int16 RedAmmoClipCount;
  __int16 HypoCount;
  __int16 GreenAmmoClipCount;
  __int16 RedAmmoClipDropCount;
  __int16 HypoDropCount;
  __int16 GreenAmmoClipDropCount;
  __int16 field_1AE;
  __int16 InverseHypoRegenerationRate;
  char DropShield;
  char DropPhaseCloack;
  char field_1B4;
  char gap_1b5[1];
  __int16 field_1B6;
  __int16 Shield;
  __int16 PhaseCloacking;
  int field_1BC;
  char gap_1c0[4];
  __int16 field_1C4;
  char gap_1c6[10];
  int field_1D0;
  int field_1D4;
  char gap_1d8[4];
  int field_1DC;
  int NotIdleStartTime;
  int TimeToIdle;
  int field_1E8;
  char gap_1ec[4];
  int field_1F0;
  char gap_1f4[2048];
  int field_9F4;
  char gap_9f8[36];
  int field_A1C;
  char gap_a20[3020];
  int field_15EC;
  char gap_15f0[60];
  int field_162C;
  int field_1630;
  int field_1634;
  int field_1638;
  int field_163C;
  char gap_1640[8];
  BoundingBox BoundingBox;
  int field_1660;
  char gap_1664[4];
  int ShieldPower;
  char gap_166c[4];
  int NumberOfKills;
  int InflictedDamage;
  int field_1678;
  int field_167C;
  char gap_1680[8];
  __int16 field_1688;
  __int16 field_168A;
  int field_168C;
  int field_1690;
  char field_1694;
  char field_1695;
  __int16 field_1696;
  int field_1698;
  int field_169C;
  char gap_16a0[2];
  int field_16A2;
  char gap_16a6[994];
  char field_1A88;
  char field_1A89;
  char field_1A8A;
  char field_1A8B;
  Vector3 Executor_AimingDirection;
  int field_1A98;
  int field_1A9C;
  int Executor_ActualMovementMode;
  int field_1AA4;
  int field_1AA8;
  int field_1AAC;
  char Executor_HasFacingOverride;
  char gap_1ab1[3];
  int Executor_AimingSpeed;
  char field_1AB8;
  char Executor_HasMoveOverride;
  char gap_1aba[6];
  int field_1AC0;
  int field_1AC4;
  int Executor_FacingOverride;
  char Executor_HasAttackOverride;
  char gap_1acd[1];
  __int16 field_1ACE;
  __int16 field_1AD0;
  char gap_1ad2[6];
  int field_1AD8;
  int field_1ADC;
  int field_1AE0;
  int field_1AE4;
  char Executor_HasThrowOverride;
  char gap_1ae9[3];
  int field_1AEC;
  int field_1AF0;
  int field_1AF4;
  void* Animation;
  __int16 AnimationToState;
  __int16 AnimationFromState;
  __int16 AnimationType;
  __int16 NextAnimationType;
  __int16 PrevAnimationType;
  __int16 field_1B06;
  char Stitch;
  char gap_1b09[3];
  int StitchHeight;
  __int16 InterpolationFromState;
  char gap_1b12[2];
  Vector3 StitchVelocity;
  __int16 InterpolationCurrentFrame;
  __int16 InterpolationLength;
  Quaternion InterpolationStartRotations[19];
  char gap_1c54[4];
  int field_1C58;
  int field_1C5C;
  int field_1C60;
  int Overlay;
  __int16 field_1C68;
  __int16 field_1C6A;
  int field_1C6C;
  int field_1C70;
  __int16 field_1C74;
  char gap_1c76[2];
  int field_1C78;
  char gap_1c7c[12];
  __int16 Frame;
  __int16 SoftPause;
  __int16 HardPause;
  __int16 field_1C8E;
  int ForcedAnimationFrames;
  __int16 HitStun;
  __int16 BlockStun;
  __int16 Dizzy;
  __int16 field_1C9A;
  int field_1C9C;
  __int16 AnimationVariant;
  __int16 TimeToPeace;
  char NumAnimationAttachedParticles;
  char gap_1ca5[1];
  __int16 field_1CA6;
  AttachedParticle AnimationAttachedParticles[16];
  int TRAMParticles;
  char FixedParticlesAttached;
  char FixedParticlesStarted;
  __int16 NumFixedParticles;
  AttachedParticle FixedParticles[16];
  __int16 CurrentAnimationType;
  char gap_1eb2[2];
  int field_1EB4;
  char field_1EB8;
  char gap_1eb9[30];
  char field_1ED7;
  __int16 throwing;
  __int16 thrownBy;
  Character* ThrowTargetCharacter;
  void* targetThrow; //animation
  int field_1EE4;
  int field_1EE8;
  int field_1EEC;
  Quaternion Rotations[19];
  Quaternion OverlayRotations[19];
  int field_2150;
  char gap_2154[4];
  GameInput Input;
  int PrevActions1;
  int PrevActions2;
  int SprintTimer;
  char field_2194;
  char field_2195;
  char gap_2196[2];
  Vector3 AimTarget;
  Vector3 AimVector;
  Vector3 CamVector;
  float HeadFacing;
  float HeadPitch;
  int field_21C4;
  int field_21C8;
  int field_21CC;
  int field_21D0;
  char field_21D4;
  char gap_21d5[3];
  int field_21D8;
  char field_21DC;
  char field_21DD;
  char field_21DE;
  char field_21DF;
  char field_21E0;
  char HasAlternateTrigger;
  char field_21E2;
  char ReleaseTrigger;
  char ReleaseAlternateTrigger;
  char TurningLeft;
  char TurningRight;
  char gap_21e7[1];
  int field_21E8;
  int field_21EC;
  __int16 field_21F0;
  char gap_21f2[2];
  PlayingFilm PlayingFilm;
  char gap_2218[4];
  int field_221C;
  char gap_2220[8];
  Matrix4x3  * ExtraBody;
  char gap_222c[76];
  Matrix4x3 BoneMatrices[19];
  Matrix4x3 WeaponMatrix;
  char gap_2638[432];
  int field_27E8;
  char gap_27ec[4];
  __int16 field_27F0;
  __int16 field_27F2;
  int field_27F4;
  int field_27F8;
  __int16 ShadowIndex;
  char field_27FE;
  char gap_27ff[1];
  char field_2800;
  char field_2801;
  char ShieldParts[19];
  char field_2815;
  char gap_2816[2];
  int field_2818;
  __int16 field_281C;
  char gap_281e[2];
  int field_2820;
  int field_2824;
  int field_2828;
  int field_282C;
  __int16 field_2830;
  __int16 field_2832;
  char gap_2834[1];
  char field_2835;
  char field_2836;
  char field_2837;
} ActiveCharacter;

typedef struct
{
	char name[64];	// Must be same as ONcMaxLevelName above (for TE)
	
	void *env;
	void *objectsetup;
	void *markers;
	void *flags;
	void *triggers;
	
	void *Sky;
	float	SkyHeight;


} OniLevel;

typedef struct
{
  int TimerMode;
  char TimerName[32];
  int TimerDuration;
  char field_28;
  char gap_29[3];
  int field_2C;
  Letterbox Letterbox;
  char gap_3a[2];
  char field_3C;
  char gap_3d[3];
  int field_40;
  int CutsceneSyncMark;
  char field_48;
  char gap_49[3];
  int field_4C;
  int field_50;
  int field_54;
  int field_58;
  int field_5C;
  int field_60;
  int field_64;
  int field_68;
  int field_6C;
  int field_70;
  int FadeStartTime;
  int FadeEndTime;
  char field_7C;
  char gap_7d[3];
  int Camera;
  PHGraph PathFindingGraph;
  Character* PlayerCharacter;
  int field_B0;
  char gap_b4[4];
  GameInput Input;
  int field_E8;
  int field_EC;
  char ScreenShotEveryFrame;
  char gap_f1[7];
  char field_F8;
  char field_F9;
  char field_FA;
  char gap_fb[1];
  int field_FC;
  int field_100;
  char SlowMotion;
  char gap_105[3];
  int SlowMotionTimer;
  char gap_10c[4];
  int field_110;
  int field_114;
  char SplashScreenTextureName[32];
  char field_138;
  char gap_139[7];
  int LastSixtieths;
  int GameTime;
  int TargetGameTime;
  int field_14C;
  OniLevel* Level;
  int field_154;
  MotionBlur MotionBlur_[64];
  int MotionBlurCount;
  __int16 field_125C;
  __int16 field_125E;
  Character CharacterStorage[128];
  __int16 CharacterCount;
  char gap_b6262[2];
  int field_B6264;
  ActiveCharacter ActiveCharacters[64];
  __int16 ActiveCharacterCount;
  Shadow Shadows[32];
  __int16 field_1670EA;
  int ShadowCount;
  int ActiveCharacterList[128];
  int ActiveCharacterListCount;
  int ActiveCharacterListLock;
  int LivingCharacterList[128];
  int LivingCharacterListCount;
  int LivingCharacterListLock;
  Character* PresentCharacterList[128];
  int PresentCharacterListCount;
  int PresentCharacterListLock;
  int ObjectList;
  DoorArray DoorArray_;
  Sky Sky_;
  int field_1679A4;
  int Triggers;
  char IsGamePaused;
  char IsInputEnabled;
  char field_1679AE;
  char gap_1679af[1];
  int LastInputActions1;
  int LastInputActions2;
  int field_1679B8;
  int WinLose;
  int field_1679C0;
  int field_1679C4;
  int field_1679C8;
  int field_1679CC;
  int field_1679D0;
  int field_1679D4;
  __int16 field_1679D8;
  char gap_1679da[2];
  int field_1679DC;
} GameState;


typedef struct 
{
	int			priority;
	int timer;						// amount of time to display the text
	char				prefix[10];	// prefix for the line
	char				text[502];		// text on the line
	const char			*identifier;
	int			text_color;
	int			text_shadow;
} COtTextEntry;

typedef struct 
{
	void		*font_family;
	void *text_context;				// text context to do the drawing
	short			formatting;
	short			font_size;
	char				scale_font;
	char				bottom_justify;
	char				display_completion;
	char				fade_over_bounds;
	char				use_formatting_commands;

	short				bounds[4];
	short			num_text_entries;
	short max_text_entries;
	char pad[3];
	COtTextEntry		*text_entries;				// an array (num_text_entries long) of COtTextEntry
		int blah;
		int blah2;
			int blah3;
} COtTextArea;

#endif

