fallout2-ce/src/combat_defs.h

157 lines
4.0 KiB
C
Raw Normal View History

2022-05-19 01:51:26 -07:00
#ifndef COMBAT_DEFS_H
#define COMBAT_DEFS_H
#include "obj_types.h"
#define EXPLOSION_TARGET_COUNT (6)
#define CRTICIAL_EFFECT_COUNT (6)
#define WEAPON_CRITICAL_FAILURE_TYPE_COUNT (7)
#define WEAPON_CRITICAL_FAILURE_EFFECT_COUNT (5)
typedef enum CombatState {
COMBAT_STATE_0x01 = 0x01,
COMBAT_STATE_0x02 = 0x02,
COMBAT_STATE_0x08 = 0x08,
} CombatState;
typedef enum HitMode {
HIT_MODE_LEFT_WEAPON_PRIMARY = 0,
HIT_MODE_LEFT_WEAPON_SECONDARY = 1,
HIT_MODE_RIGHT_WEAPON_PRIMARY = 2,
HIT_MODE_RIGHT_WEAPON_SECONDARY = 3,
HIT_MODE_PUNCH = 4,
HIT_MODE_KICK = 5,
HIT_MODE_LEFT_WEAPON_RELOAD = 6,
HIT_MODE_RIGHT_WEAPON_RELOAD = 7,
// Punch Level 2
HIT_MODE_STRONG_PUNCH = 8,
// Punch Level 3
HIT_MODE_HAMMER_PUNCH = 9,
// Punch Level 4 aka 'Lightning Punch'
HIT_MODE_HAYMAKER = 10,
// Punch Level 5 aka 'Chop Punch'
HIT_MODE_JAB = 11,
// Punch Level 6 aka 'Dragon Punch'
HIT_MODE_PALM_STRIKE = 12,
// Punch Level 7 aka 'Force Punch'
HIT_MODE_PIERCING_STRIKE = 13,
// Kick Level 2
HIT_MODE_STRONG_KICK = 14,
// Kick Level 3
HIT_MODE_SNAP_KICK = 15,
// Kick Level 4 aka 'Roundhouse Kick'
HIT_MODE_POWER_KICK = 16,
// Kick Level 5
HIT_MODE_HIP_KICK = 17,
// Kick Level 6 aka 'Jump Kick'
HIT_MODE_HOOK_KICK = 18,
// Kick Level 7 aka 'Death Blossom Kick'
HIT_MODE_PIERCING_KICK = 19,
HIT_MODE_COUNT,
FIRST_ADVANCED_PUNCH_HIT_MODE = HIT_MODE_STRONG_PUNCH,
LAST_ADVANCED_PUNCH_HIT_MODE = HIT_MODE_PIERCING_STRIKE,
FIRST_ADVANCED_KICK_HIT_MODE = HIT_MODE_STRONG_KICK,
LAST_ADVANCED_KICK_HIT_MODE = HIT_MODE_PIERCING_KICK,
FIRST_ADVANCED_UNARMED_HIT_MODE = FIRST_ADVANCED_PUNCH_HIT_MODE,
LAST_ADVANCED_UNARMED_HIT_MODE = LAST_ADVANCED_KICK_HIT_MODE,
} HitMode;
typedef enum HitLocation {
HIT_LOCATION_HEAD,
HIT_LOCATION_LEFT_ARM,
HIT_LOCATION_RIGHT_ARM,
HIT_LOCATION_TORSO,
HIT_LOCATION_RIGHT_LEG,
HIT_LOCATION_LEFT_LEG,
HIT_LOCATION_EYES,
HIT_LOCATION_GROIN,
HIT_LOCATION_UNCALLED,
HIT_LOCATION_COUNT,
HIT_LOCATION_SPECIFIC_COUNT = HIT_LOCATION_COUNT - 1,
} HitLocation;
typedef struct STRUCT_510948 {
Object* field_0;
Object* field_4;
Object* field_8;
int field_C;
} STRUCT_510948;
typedef struct STRUCT_664980 {
Object* attacker;
Object* defender;
int actionPointsBonus;
int accuracyBonus;
int damageBonus;
int minDamage;
int maxDamage;
int field_1C; // probably bool, indicating field_20 and field_24 used
int field_20; // flags on attacker
int field_24; // flags on defender
} STRUCT_664980;
static_assert(sizeof(STRUCT_664980) == 40, "wrong size");
typedef struct Attack {
Object* attacker;
int hitMode;
Object* weapon;
int attackHitLocation;
int attackerDamage;
int attackerFlags;
int ammoQuantity;
int criticalMessageId;
Object* defender;
int tile;
int defenderHitLocation;
int defenderDamage;
int defenderFlags;
int defenderKnockback;
Object* oops;
int extrasLength;
Object* extras[EXPLOSION_TARGET_COUNT];
int extrasHitLocation[EXPLOSION_TARGET_COUNT];
int extrasDamage[EXPLOSION_TARGET_COUNT];
int extrasFlags[EXPLOSION_TARGET_COUNT];
int extrasKnockback[EXPLOSION_TARGET_COUNT];
} Attack;
static_assert(sizeof(Attack) == 184, "wrong size");
// Provides metadata about critical hit effect.
typedef struct CriticalHitDescription {
int damageMultiplier;
// Damage flags that will be applied to defender.
int flags;
// Stat to check to upgrade this critical hit to massive critical hit or
// -1 if there is no massive critical hit.
int massiveCriticalStat;
// Bonus/penalty to massive critical stat.
int massiveCriticalStatModifier;
// Additional damage flags if this critical hit become massive critical.
int massiveCriticalFlags;
int messageId;
int massiveCriticalMessageId;
} CriticalHitDescription;
#endif /* COMBAT_DEFS_H */