Compare commits

..
1 Commits
Author SHA1 Message Date
Mike Klaas 1c6fa29292 WIP MAIN_MENU_PANEL_OFFSET_X/Y 2026-07-24 23:34:02 -07:00
57 changed files with 774 additions and 1042 deletions
-6
View File
@@ -42,13 +42,7 @@ The following settings were moved into [`<DAT>/config/game.cfg`](files/ce.dat/co
| ddraw.ini section | ddraw.ini key | game.cfg section | game.cfg key |
| --- | --- | --- | --- |
| `Misc` | `StartingMap` | `start` | `map` |
| `Misc` | `StartXPos` | `start` | `worldmap_x` |
| `Misc` | `StartYPos` | `start` | `worldmap_y` |
| `Misc` | `ViewXPos` | `start` | `worldmap_view_x` |
| `Misc` | `ViewYPos` | `start` | `worldmap_view_y` |
| `Misc` | `StartGDialogFix` | `dialog` | `start_gdialog_fix` |
| `Misc` | `DisableSpecialMapIDs` | `maps` | `disable_special_map_ids` |
## Opcodes / Metarules
+3 -11
View File
@@ -11,12 +11,6 @@ month=6
day=24
; To start a new game somewhere other than artemple.map, set this to the map file name.
map=
; Starting worldmap marker position. -1 uses the starting map's world area.
worldmap_x=-1
worldmap_y=-1
; Starting worldmap viewport position. -1 uses the default upper-left view.
worldmap_view_x=-1
worldmap_view_y=-1
; Starting (tribal) and default (jumpsuit) player models. Can also be changed in-game via script.
model_male=hmwarr
model_male_default=hmjmps
@@ -26,11 +20,6 @@ model_female_default=hfjmps
; Set to 2 to make the pipboy available by only skipping the vault suit movie check.
pipboy=0
[maps]
; Set to 1 to apply transition tile, elevation, and rotation overrides on all maps,
; including Fallout 2 map IDs 19 and 37.
disable_special_map_ids=0
[karma]
; FRM numbers for karma icons on the character screen. Number of points entries should be 1 less than number of frms entries.
; Example: frms=47,48,49 points=-100,100
@@ -66,6 +55,9 @@ big_font_color=0
; Pixel offset for main menu buttons.
offset_x=0
offset_y=0
; Pixel offset for the high resolution main menu button panel.
main_menu_panel_offset_x=16
main_menu_panel_offset_y=15
; Pixel offset for the copyright text line.
credits_offset_x=0
credits_offset_y=0
-10
View File
@@ -165,16 +165,6 @@ main_menu_scale_mode=1
; Set to 1 to show a Help option in the in-game options menu which opens the F1 help screen.
in_game_menu_help=1
; Weight/size indicator for PC, critters and containers
; Set to 0 for vanilla behavior (no weight indicator)
; Set to 1 to show a simple weight indicator; works with all inventory_columns values
; Set to 2 to show a detailed weight indicator; works with inventory_columns > 1 only
loot_weight_indicator=1
; Set to 0 to show container indicator at all times
; Set to XX to show container indicator when size reaches XX%
; Set to 100 to show container indicator when full
loot_container_size_indicator_threshold=50
[qol]
; Automatically open doors that are unlocked and has no script attached.
+7 -7
View File
@@ -97,7 +97,7 @@ static int _compute_explosion_damage(int min, int max, Object* defender, int* kn
static int _can_talk_to(Object* obj, Object* critter);
static int _talk_to(Object* _, Object* critter);
static int _report_dmg(Attack* attack, Object* _);
static int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, DamageType damageType);
static int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, int damageType);
static int hideProjectile(void* _, void* projectile);
@@ -200,7 +200,7 @@ int pickDeathAnim(Object* attacker, Object* defender, Object* weapon, int damage
int normalViolenceLevelDamageThreshold = 15;
int maximumBloodViolenceLevelDamageThreshold = 45;
DamageType damageType = weaponGetDamageType(attacker, weapon);
int damageType = weaponGetDamageType(attacker, weapon);
if (weapon != nullptr && weapon->pid == PROTO_ID_MOLOTOV_COCKTAIL) {
normalViolenceLevelDamageThreshold = 5;
@@ -729,7 +729,7 @@ int _action_ranged(Attack* attack, int anim)
weaponGetRange(attack->attacker, attack->hitMode);
DamageType damageType = weaponGetDamageType(attack->attacker, attack->weapon);
int damageType = weaponGetDamageType(attack->attacker, attack->weapon);
tileGetTileInDirection(attack->attacker->tile, attack->attacker->rotation, 1);
@@ -1306,7 +1306,7 @@ int actionLootCritter(Object* critter, Object* target)
}
// 0x4124E0
int _action_skill_use(Skill skill)
int _action_skill_use(int skill)
{
if (skill == SKILL_SNEAK) {
reg_anim_clear(gDude);
@@ -1336,7 +1336,7 @@ static int _action_use_skill_in_combat_error(Object* critter)
// skill_use
// 0x41255C
int actionUseSkill(Object* user, Object* target, Skill skill)
int actionUseSkill(Object* user, Object* target, int skill)
{
UseSkillOnHookResult hookResult = scriptHooks_UseSkillOn(&user, target, skill);
if (!hookResult.shouldContinue) {
@@ -1907,7 +1907,7 @@ int _talk_to(Object* _, Object* critter)
}
// 0x413494
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, DamageType damageType, bool animated, bool bypassArmor)
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int damageType, bool animated, bool bypassArmor)
{
Attack* attack = (Attack*)internal_malloc(sizeof(*attack));
if (attack == nullptr) {
@@ -1988,7 +1988,7 @@ int _report_dmg(Attack* attack, Object* _)
// Calculate damage by applying threshold and resistances.
//
// 0x413660
int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, DamageType damageType)
int _compute_dmg_damage(int min, int max, Object* obj, int* knockbackDistancePtr, int damageType)
{
if (!critterFlagCheck(obj->pid, CRITTER_NO_KNOCKBACK)) {
knockbackDistancePtr = nullptr;
+3 -5
View File
@@ -3,8 +3,6 @@
#include "combat_defs.h"
#include "obj_types.h"
#include "proto_types.h"
#include "skill_defs.h"
namespace fallout {
@@ -15,14 +13,14 @@ int _action_use_an_item_on_object(Object* user, Object* targetObj, Object* item)
int _action_use_an_object(Object* user, Object* targetObj);
int actionPickUp(Object* critter, Object* item);
int actionLootCritter(Object* critter, Object* target);
int _action_skill_use(Skill skill);
int actionUseSkill(Object* user, Object* target, Skill skill);
int _action_skill_use(int skill);
int actionUseSkill(Object* user, Object* target, int skill);
bool _is_hit_from_front(const Object* attacker, const Object* defender);
bool _can_see(Object* source, Object* target);
bool _action_explode_running();
int actionExplode(int tile, int elevation, int minDamage, int maxDamage, Object* sourceObj, bool animate);
int actionTalk(Object* obj, Object* critter);
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, DamageType damageType, bool animated, bool bypassArmor);
void actionDamage(int tile, int elevation, int minDamage, int maxDamage, int damageType, bool animated, bool bypassArmor);
bool actionCheckPush(Object* obj, Object* target);
int actionPush(Object* obj, Object* target);
int _action_can_talk_to(Object* obj, Object* critter);
+1 -1
View File
@@ -1736,7 +1736,7 @@ static bool canUseDoor(Object* critter, Object* door)
return false;
}
BodyType bodyType = critterGetBodyType(critter);
int bodyType = critterGetBodyType(critter);
if (bodyType != BODY_TYPE_BIPED && bodyType != BODY_TYPE_ROBOTIC) {
return false;
}
+1 -3
View File
@@ -1789,13 +1789,11 @@ void FrmImage::resetInternal()
bool FrmImage::setFrame(const Art* art, int frame, int direction)
{
unsigned char* data = artGetFrameData(art, frame, direction, &_width, &_height, nullptr, nullptr);
unsigned char* data = artGetFrameData(art, frame, direction, &_width, &_height, &_xOffset, &_yOffset);
if (data == nullptr) {
return false;
}
_xOffset = art->xOffsets[direction];
_yOffset = art->yOffsets[direction];
_data = data;
return true;
}
+172 -203
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -827,7 +827,7 @@ static bool characterSelectorWindowRenderStats()
y += vh; // blank line
// SKILLS
Skill skills[DEFAULT_TAGGED_SKILLS];
int skills[DEFAULT_TAGGED_SKILLS];
skillsGetTagged(skills, DEFAULT_TAGGED_SKILLS);
for (int index = 0; index < DEFAULT_TAGGED_SKILLS; index++) {
+127 -129
View File
@@ -194,7 +194,7 @@ static int hit_location_penalty[HIT_LOCATION_COUNT];
// Critical hit tables for every kill type.
//
// 0x510978 crit_succ_eff
static CriticalHitDescription gCriticalHitTables[KILL_TYPE_OVERRIDE_COUNT][HIT_LOCATION_COUNT][CRITICAL_EFFECT_COUNT] = {
static CriticalHitDescription gCriticalHitTables[SFALL_KILL_TYPE_COUNT][HIT_LOCATION_COUNT][CRTICIAL_EFFECT_COUNT] = {
// KILL_TYPE_MAN
{
// HIT_LOCATION_HEAD
@@ -1796,7 +1796,7 @@ static CriticalHitDescription gCriticalHitTables[KILL_TYPE_OVERRIDE_COUNT][HIT_L
// Player's criticals effects.
//
// 0x5179B0 pc_crit_succ_eff
static CriticalHitDescription gPlayerCriticalHitTable[HIT_LOCATION_COUNT][CRITICAL_EFFECT_COUNT] = {
static CriticalHitDescription gPlayerCriticalHitTable[HIT_LOCATION_COUNT][CRTICIAL_EFFECT_COUNT] = {
{
{ 3, 0, -1, 0, 0, 6500, 5000 },
{ 3, DAM_BYPASS, STAT_ENDURANCE, 3, DAM_KNOCKED_DOWN, 6501, 6503 },
@@ -1972,8 +1972,8 @@ static Attack _shoot_ctd;
// 0x56D458 explosion_ctd
static Attack _explosion_ctd;
static CriticalHitDescription gBaseCriticalHitTables[KILL_TYPE_OVERRIDE_COUNT][HIT_LOCATION_COUNT][CRITICAL_EFFECT_COUNT];
static CriticalHitDescription gBasePlayerCriticalHitTable[HIT_LOCATION_COUNT][CRITICAL_EFFECT_COUNT];
static CriticalHitDescription gBaseCriticalHitTables[SFALL_KILL_TYPE_COUNT][HIT_LOCATION_COUNT][CRTICIAL_EFFECT_COUNT];
static CriticalHitDescription gBasePlayerCriticalHitTable[HIT_LOCATION_COUNT][CRTICIAL_EFFECT_COUNT];
static const char* gCritDataMemberKeys[CRIT_DATA_MEMBER_COUNT] = {
"DamageMultiplier",
@@ -2318,7 +2318,7 @@ static bool _combat_safety_invalidate_weapon_func(Object* attacker, Object* weap
int damageRadius = weaponGetDamageRadius(weapon, hitMode);
int maxDamage;
weaponGetDamageMinMax(weapon, nullptr, &maxDamage);
DamageType damageType = weaponGetDamageType(attacker, weapon);
int damageType = weaponGetDamageType(attacker, weapon);
if (damageRadius > 0) {
if (intelligence < 5) {
@@ -3946,7 +3946,7 @@ static int attackCompute(Attack* attack)
int accuracy = attackDetermineToHit(attack->attacker, attack->attacker->tile, attack->defender, attack->defenderHitLocation, attack->hitMode, true);
bool isGrenade = false;
DamageType damageType = weaponGetDamageType(attack->attacker, attack->weapon);
int damageType = weaponGetDamageType(attack->attacker, attack->weapon);
// SFALL
if (anim == ANIM_THROW_ANIM && (damageType == explosionGetDamageType() || damageType == DAMAGE_TYPE_PLASMA || damageType == DAMAGE_TYPE_EMP)) {
isGrenade = true;
@@ -4230,25 +4230,25 @@ static int attackComputeCriticalHit(Attack* attack)
chance += critterGetStat(attack->attacker, STAT_BETTER_CRITICALS);
CriticalEffect effect;
int effect;
if (chance <= 20)
effect = CRITICAL_EFFECT_1;
effect = 0;
else if (chance <= 45)
effect = CRITICAL_EFFECT_2;
effect = 1;
else if (chance <= 70)
effect = CRITICAL_EFFECT_3;
effect = 2;
else if (chance <= 90)
effect = CRITICAL_EFFECT_4;
effect = 3;
else if (chance <= 100)
effect = CRITICAL_EFFECT_5;
effect = 4;
else
effect = CRITICAL_EFFECT_6;
effect = 5;
CriticalHitDescription* criticalHitDescription;
if (defender == gDude) {
criticalHitDescription = &(gPlayerCriticalHitTable[attack->defenderHitLocation][effect]);
} else {
KillType killType = critterGetKillType(defender);
int killType = critterGetKillType(defender);
criticalHitDescription = &(gCriticalHitTables[killType][attack->defenderHitLocation][effect]);
}
@@ -4650,7 +4650,7 @@ static void attackComputeDamage(Attack* attack, int numRounds, int baseDamageMul
return;
}
DamageType damageType = weaponGetDamageType(attack->attacker, attack->weapon);
int damageType = weaponGetDamageType(attack->attacker, attack->weapon);
int damageThreshold = critterGetStat(critter, STAT_DAMAGE_THRESHOLD + damageType);
int damageResistance = critterGetStat(critter, STAT_DAMAGE_RESISTANCE + damageType);
@@ -4747,8 +4747,8 @@ static void attackComputeDamage(Attack* attack, int numRounds, int baseDamageMul
if (attack->attacker == gDude) {
if (perkGetRank(attack->attacker, PERK_LIVING_ANATOMY) != 0) {
KillType killType = critterGetKillType(attack->defender);
if (killType != KILL_TYPE_ROBOT && killType != KILL_TYPE_ALIEN) {
int kt = critterGetKillType(attack->defender);
if (kt != KILL_TYPE_ROBOT && kt != KILL_TYPE_ALIEN) {
*damagePtr += 5;
}
}
@@ -5903,8 +5903,6 @@ void _combat_attack_this(Object* target)
displayMonitorAddMessage(messageListItem.text);
}
return;
default:
break;
}
if (!isInCombat()) {
@@ -6162,135 +6160,135 @@ static void criticalsInit()
if (mode == 2 || mode == 3) {
// Men
criticalsSetValue(KILL_TYPE_MAN, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_MAN, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5019);
criticalsSetValue(KILL_TYPE_MAN, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_MAN, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5019);
// Children
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_RIGHT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, 0);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5216);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5000);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 4);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5212);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, 1, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 4);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_CHILD, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5212);
// Super Mutants
criticalsSetValue(KILL_TYPE_SUPER_MUTANT, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5306);
criticalsSetValue(KILL_TYPE_SUPER_MUTANT, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5306);
// Ghouls
criticalsSetValue(KILL_TYPE_GHOUL, HIT_LOCATION_HEAD, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_STAT, -1);
criticalsSetValue(KILL_TYPE_GHOUL, HIT_LOCATION_HEAD, 4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_STAT, -1);
// Brahmin
criticalsSetValue(KILL_TYPE_BRAHMIN, HIT_LOCATION_HEAD, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_STAT, -1);
criticalsSetValue(KILL_TYPE_BRAHMIN, HIT_LOCATION_HEAD, 4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_STAT, -1);
// Radscorpions
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5608);
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_RADSCORPION, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 5608);
// Centaurs
criticalsSetValue(KILL_TYPE_CENTAUR, HIT_LOCATION_TORSO, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_CENTAUR, HIT_LOCATION_TORSO, 3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_CENTAUR, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
criticalsSetValue(KILL_TYPE_CENTAUR, HIT_LOCATION_UNCALLED, 3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_KNOCKED_DOWN);
// Deathclaws
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, 3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, 4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
criticalsSetValue(KILL_TYPE_DEATH_CLAW, HIT_LOCATION_LEFT_LEG, 5, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_FLAGS, DAM_CRIP_LEG_LEFT);
// Geckos
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 6701);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 6701);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 6701);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 6701);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
criticalsSetValue(KILL_TYPE_GECKO, HIT_LOCATION_UNCALLED, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 6704);
// Aliens
criticalsSetValue(KILL_TYPE_ALIEN, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(16, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
// Giant Ants
criticalsSetValue(KILL_TYPE_GIANT_ANT, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
criticalsSetValue(17, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_FLAGS, DAM_KNOCKED_DOWN | DAM_BYPASS);
// Big Bad Boss
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 7105);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5001);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 7105);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 4, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_HEAD, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_ARM, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5008);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 5009);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_ARM, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7102);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_TORSO, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_TORSO, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_TORSO, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_TORSO, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5023);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5023);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_RIGHT_LEG, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5023);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5023);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_LEFT_LEG, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7103);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_EYES, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7104);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_1, CRIT_DATA_MEMBER_MESSAGE_ID, 5033);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_2, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_4, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 0, CRIT_DATA_MEMBER_MESSAGE_ID, 5033);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 1, CRIT_DATA_MEMBER_MESSAGE_ID, 5027);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 1, CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 2, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 3, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_GROIN, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_3, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 3);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 4);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, CRITICAL_EFFECT_6, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, 2, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 3);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, 4, CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER, 4);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, 4, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
criticalsSetValue(KILL_TYPE_BIG_BAD_BOSS, HIT_LOCATION_UNCALLED, 5, CRIT_DATA_MEMBER_MESSAGE_ID, 7101);
}
if (mode == 1 || mode == 3) {
@@ -6307,14 +6305,14 @@ static void criticalsInit()
char sectionKey[16];
// Read original kill types (19) plus one for the player.
for (KillType killType = KILL_TYPE_FIRST; killType < KILL_TYPE_DEFAULT_COUNT + 1; killType++) {
for (HitLocation hitLocation = HIT_LOCATION_FIRST; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
for (CriticalEffect effect = CRITICAL_EFFECT_FIRST; effect < CRITICAL_EFFECT_COUNT; effect++) {
for (int killType = 0; killType < KILL_TYPE_COUNT + 1; killType++) {
for (HitLocation hitLocation = HIT_LOCATION_HEAD; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
for (int effect = 0; effect < CRTICIAL_EFFECT_COUNT; effect++) {
snprintf(sectionKey, sizeof(sectionKey), "c_%02d_%d_%d", killType, hitLocation, effect);
// Update player kill type if needed.
KillType newKillType = killType == KILL_TYPE_DEFAULT_COUNT ? KILL_TYPE_PLAYER : killType;
for (CriticalHitDataMember dataMember = CRIT_DATA_MEMBER_FIRST; dataMember < CRIT_DATA_MEMBER_COUNT; dataMember++) {
int newKillType = killType == KILL_TYPE_COUNT ? SFALL_KILL_TYPE_COUNT : killType;
for (CriticalHitDataMember dataMember = CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER; dataMember < CRIT_DATA_MEMBER_COUNT; dataMember++) {
int value = criticalsGetValue(newKillType, hitLocation, effect, dataMember);
if (configGetInt(&criticalsConfig, sectionKey, gCritDataMemberKeys[dataMember], &value)) {
criticalsSetValue(newKillType, hitLocation, effect, dataMember, value);
@@ -6329,7 +6327,7 @@ static void criticalsInit()
char key[32];
// Read Sfall kill types (38) plus one for the player.
for (KillType killType = KILL_TYPE_FIRST; killType < KILL_TYPE_OVERRIDE_COUNT + 1; killType++) {
for (int killType = 0; killType < SFALL_KILL_TYPE_COUNT + 1; killType++) {
snprintf(ktSectionKey, sizeof(ktSectionKey), "c_%02d", killType);
int enabled = 0;
@@ -6338,7 +6336,7 @@ static void criticalsInit()
continue;
}
for (HitLocation hitLocation = HIT_LOCATION_FIRST; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
for (HitLocation hitLocation = HIT_LOCATION_HEAD; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
if (enabled < 2) {
bool hitLocationChanged = false;
@@ -6352,8 +6350,8 @@ static void criticalsInit()
snprintf(hitLocationSectionKey, sizeof(hitLocationSectionKey), "c_%02d_%d", killType, hitLocation);
for (CriticalEffect effect = CRITICAL_EFFECT_FIRST; effect < CRITICAL_EFFECT_COUNT; effect++) {
for (CriticalHitDataMember dataMember = CRIT_DATA_MEMBER_FIRST; dataMember < CRIT_DATA_MEMBER_COUNT; dataMember++) {
for (int effect = 0; effect < CRTICIAL_EFFECT_COUNT; effect++) {
for (CriticalHitDataMember dataMember = CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER; dataMember < CRIT_DATA_MEMBER_COUNT; dataMember++) {
int value = criticalsGetValue(killType, hitLocation, effect, dataMember);
snprintf(key, sizeof(key), "e%d_%s", effect, gCritDataMemberKeys[dataMember]);
if (configGetInt(&criticalsConfig, hitLocationSectionKey, key, &value)) {
@@ -6385,27 +6383,27 @@ static void criticalsExit()
criticalsReset();
}
int criticalsGetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember)
int criticalsGetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember)
{
if (killType == KILL_TYPE_PLAYER) {
if (killType == SFALL_KILL_TYPE_COUNT) {
return gPlayerCriticalHitTable[hitLocation][effect].values[dataMember];
} else {
return gCriticalHitTables[killType][hitLocation][effect].values[dataMember];
}
}
void criticalsSetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember, int value)
void criticalsSetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember, int value)
{
if (killType == KILL_TYPE_PLAYER) {
if (killType == SFALL_KILL_TYPE_COUNT) {
gPlayerCriticalHitTable[hitLocation][effect].values[dataMember] = value;
} else {
gCriticalHitTables[killType][hitLocation][effect].values[dataMember] = value;
}
}
void criticalsResetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember)
void criticalsResetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember)
{
if (killType == KILL_TYPE_PLAYER) {
if (killType == SFALL_KILL_TYPE_COUNT) {
gPlayerCriticalHitTable[hitLocation][effect].values[dataMember] = gBasePlayerCriticalHitTable[hitLocation][effect].values[dataMember];
} else {
gCriticalHitTables[killType][hitLocation][effect].values[dataMember] = gBaseCriticalHitTables[killType][hitLocation][effect].values[dataMember];
@@ -6654,7 +6652,7 @@ static void unarmedInitCustom()
char section[4];
char statKey[6];
for (HitMode hitMode = HIT_MODE_FIRST; hitMode < HIT_MODE_COUNT; hitMode++) {
for (HitMode hitMode = HIT_MODE_LEFT_WEAPON_PRIMARY; hitMode < HIT_MODE_COUNT; hitMode++) {
if (!isUnarmedHitMode(hitMode)) {
continue;
}
@@ -6963,7 +6961,7 @@ void combat_set_hit_location_penalty(HitLocation hitLocation, int penalty)
void combat_reset_hit_location_penalty()
{
for (HitLocation hitLocation = HIT_LOCATION_FIRST; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
for (HitLocation hitLocation = HIT_LOCATION_HEAD; hitLocation < HIT_LOCATION_COUNT; hitLocation++) {
hit_location_penalty[hitLocation] = hit_location_penalty_default[hitLocation];
}
}
+3 -3
View File
@@ -59,9 +59,9 @@ void _combat_delete_critter(Object* obj);
void _combatKillCritterOutsideCombat(Object* critter_obj, char* msg);
int combatGetTargetHighlight();
int criticalsGetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember);
void criticalsSetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember, int value);
void criticalsResetValue(KillType killType, HitLocation hitLocation, CriticalEffect effect, CriticalHitDataMember dataMember);
int criticalsGetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember);
void criticalsSetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember, int value);
void criticalsResetValue(int killType, HitLocation hitLocation, int effect, CriticalHitDataMember dataMember);
bool criticalsNoTimeLimits();
int unarmedGetDamage(HitMode hitMode, int* minDamagePtr, int* maxDamagePtr);
int unarmedGetBonusCriticalChance(HitMode hitMode);
+8 -8
View File
@@ -610,7 +610,7 @@ static int aiPacketRead(File* stream, AiPacket* ai)
if (fileReadInt32(stream, &(ai->miss.start)) == -1) return -1;
if (fileReadInt32(stream, &(ai->miss.end)) == -1) return -1;
for (int index = HIT_LOCATION_FIRST; index < HIT_LOCATION_SPECIFIC_COUNT; index++) {
for (int index = 0; index < HIT_LOCATION_SPECIFIC_COUNT; index++) {
AiMessageRange* range = &(ai->hit[index]);
if (fileReadInt32(stream, &(range->start)) == -1) return -1;
if (fileReadInt32(stream, &(range->end)) == -1) return -1;
@@ -654,7 +654,7 @@ static int aiPacketWrite(File* stream, AiPacket* ai)
if (fileWriteInt32(stream, ai->miss.start) == -1) return -1;
if (fileWriteInt32(stream, ai->miss.end) == -1) return -1;
for (int index = HIT_LOCATION_FIRST; index < HIT_LOCATION_SPECIFIC_COUNT; index++) {
for (int index = 0; index < HIT_LOCATION_SPECIFIC_COUNT; index++) {
AiMessageRange* range = &(ai->hit[index]);
if (fileWriteInt32(stream, range->start) == -1) return -1;
if (fileWriteInt32(stream, range->end) == -1) return -1;
@@ -1981,7 +1981,7 @@ static bool _ai_can_use_weapon(Object* critter, Object* weapon, HitMode hitMode)
AiPacket* ai = aiGetPacket(critter);
if (result) {
Skill skill = weaponGetSkillForHitMode(weapon, hitMode);
int skill = weaponGetSkillForHitMode(weapon, hitMode);
if (skillGetValue(critter, skill) < ai->min_to_hit) {
result = false;
}
@@ -1998,7 +1998,7 @@ static bool _ai_can_use_weapon(Object* critter, Object* weapon, HitMode hitMode)
// 0x4299A0
Object* _ai_search_inven_weap(Object* critter, bool checkRequiredActionPoints, Object* defender)
{
BodyType bodyType = critterGetBodyType(critter);
int bodyType = critterGetBodyType(critter);
if (bodyType != BODY_TYPE_BIPED
&& bodyType != BODY_TYPE_ROBOTIC
&& critter->pid != PROTO_ID_GORIS) {
@@ -2062,7 +2062,7 @@ Object* _ai_search_inven_armor(Object* critter)
if (armor != nullptr) {
armorScore = armorGetArmorClass(armor);
for (DamageType damageType = DAMAGE_TYPE_FIRST; damageType < DAMAGE_TYPE_COUNT; damageType++) {
for (int damageType = 0; damageType < DAMAGE_TYPE_COUNT; damageType++) {
armorScore += armorGetDamageResistance(armor, damageType);
armorScore += armorGetDamageThreshold(armor, damageType);
}
@@ -2081,7 +2081,7 @@ Object* _ai_search_inven_armor(Object* critter)
if (armor != candidate) {
int candidateScore = armorGetArmorClass(candidate);
for (DamageType damageType = DAMAGE_TYPE_FIRST; damageType < DAMAGE_TYPE_COUNT; damageType++) {
for (int damageType = 0; damageType < DAMAGE_TYPE_COUNT; damageType++) {
candidateScore += armorGetDamageResistance(candidate, damageType);
candidateScore += armorGetDamageThreshold(candidate, damageType);
}
@@ -2128,7 +2128,7 @@ static bool aiCanUseItem(Object* critter, Object* item)
return false;
}
KillType killType = critterGetKillType(critter);
int killType = critterGetKillType(critter);
if (killType != KILL_TYPE_MAN
&& killType != KILL_TYPE_WOMAN
&& killType != KILL_TYPE_SUPER_MUTANT
@@ -2661,7 +2661,7 @@ static HitLocation _ai_called_shot(Object* attacker, Object* defender, HitMode h
}
if (critterGetStat(attacker, STAT_INTELLIGENCE) >= intelligenceRequired) {
hitLocation = static_cast<HitLocation>(randomBetween(HIT_LOCATION_FIRST, HIT_LOCATION_SPECIFIC_COUNT));
hitLocation = static_cast<HitLocation>(randomBetween(HIT_LOCATION_HEAD, HIT_LOCATION_SPECIFIC_COUNT));
int chanceToHit = _determine_to_hit(attacker, defender, hitLocation, hitMode);
if (chanceToHit < ai->min_to_hit) {
hitLocation = HIT_LOCATION_TORSO;
-1
View File
@@ -6,7 +6,6 @@
#include "db.h"
#include "obj_types.h"
#include "sfall_script_hooks.h"
#include "skill_defs.h"
namespace fallout {
+5 -29
View File
@@ -5,34 +5,13 @@
#define EXPLOSION_TARGET_COUNT (6)
#define CRTICIAL_EFFECT_COUNT (6)
#define WEAPON_CRITICAL_FAILURE_TYPE_COUNT (7)
#define WEAPON_CRITICAL_FAILURE_EFFECT_COUNT (5)
namespace fallout {
enum CriticalEffect : int {
CRITICAL_EFFECT_1 = 0,
CRITICAL_EFFECT_2 = 1,
CRITICAL_EFFECT_3 = 2,
CRITICAL_EFFECT_4 = 3,
CRITICAL_EFFECT_5 = 4,
CRITICAL_EFFECT_6 = 5,
CRITICAL_EFFECT_COUNT = 6,
CRITICAL_EFFECT_FIRST = CRITICAL_EFFECT_1
};
inline CriticalEffect operator++(CriticalEffect& e, int)
{
CriticalEffect result = e;
e = static_cast<CriticalEffect>(static_cast<int>(e) + 1);
return result;
}
inline static bool criticalEffectIsValid(int effect)
{
return effect >= CRITICAL_EFFECT_FIRST && effect < CRITICAL_EFFECT_COUNT;
}
enum CombatState : unsigned int {
COMBAT_STATE_OUT_COMBAT = 0x00,
COMBAT_STATE_IN_COMBAT = 0x01,
@@ -116,12 +95,11 @@ enum HitMode : int {
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,
HIT_MODE_FIRST = HIT_MODE_LEFT_WEAPON_PRIMARY,
};
inline static bool hitModeIsValid(int hitMode)
{
return hitMode >= HIT_MODE_FIRST && hitMode < HIT_MODE_COUNT;
return hitMode >= HIT_MODE_LEFT_WEAPON_PRIMARY && hitMode < HIT_MODE_COUNT;
}
inline HitMode operator++(HitMode& e, int)
@@ -143,12 +121,11 @@ enum HitLocation : int {
HIT_LOCATION_UNCALLED = 8,
HIT_LOCATION_COUNT = 9,
HIT_LOCATION_SPECIFIC_COUNT = HIT_LOCATION_COUNT - 1,
HIT_LOCATION_FIRST = HIT_LOCATION_HEAD,
};
inline static bool hitLocationIsValid(int hitLocation)
{
return hitLocation >= HIT_LOCATION_FIRST && hitLocation < HIT_LOCATION_COUNT;
return hitLocation >= HIT_LOCATION_HEAD && hitLocation < HIT_LOCATION_COUNT;
}
inline HitLocation operator++(HitLocation& e, int)
@@ -204,12 +181,11 @@ enum CriticalHitDataMember : int {
CRIT_DATA_MEMBER_MESSAGE_ID = 5,
CRIT_DATA_MEMBER_MASSIVE_CRITICAL_MESSAGE_ID = 6,
CRIT_DATA_MEMBER_COUNT = 7,
CRIT_DATA_MEMBER_FIRST = CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER,
};
inline static bool criticalHitDataMemberIsValid(int criticalHitDataMember)
{
return criticalHitDataMember >= CRIT_DATA_MEMBER_FIRST && criticalHitDataMember < CRIT_DATA_MEMBER_COUNT;
return criticalHitDataMember >= CRIT_DATA_MEMBER_DAMAGE_MULTIPLIER && criticalHitDataMember < CRIT_DATA_MEMBER_COUNT;
}
inline CriticalHitDataMember operator++(CriticalHitDataMember& e, int)
+3 -2
View File
@@ -15,8 +15,9 @@ void contentConfigInit()
return;
}
// Try to migrate some settings from sfall.
// Try to migrate some settings from legacy config files.
contentConfigTryMigrateFromSfall(kConfigPatchPath);
contentConfigTryMigrateFromF2Res(kConfigPatchPath);
if (!configInit(&gContentConfig)) {
return;
@@ -35,4 +36,4 @@ void contentConfigExit()
configFree(&gContentConfig);
}
} // namespace fallout
} // namespace fallout
-1
View File
@@ -8,7 +8,6 @@ namespace fallout {
#define CONTENT_CONFIG_START_SECTION "start"
#define CONTENT_CONFIG_KARMA_SECTION "karma"
#define CONTENT_CONFIG_ITEMS_SECTION "items"
#define CONTENT_CONFIG_MAPS_SECTION "maps"
#define CONTENT_CONFIG_DIALOG_SECTION "dialog"
#define CONTENT_CONFIG_MAIN_MENU_SECTION "main_menu"
#define CONTENT_CONFIG_MOVIES_SECTION "movies"
+43 -35
View File
@@ -80,7 +80,7 @@ static int _critterClearObjDrugs(Object* obj, void* data);
static char _aCorpse[] = "corpse";
// 0x501494
static char empty[] = "";
static char byte_501494[] = "";
// 0x51833C name_critter
static char* _name_critter = _aCorpse;
@@ -152,7 +152,7 @@ static char gDudeName[DUDE_NAME_MAX_LENGTH];
static int _sneak_working;
// 0x56D780 pc_kill_counts
static int gKillsByType[KILL_TYPE_DEFAULT_COUNT];
static int gKillsByType[KILL_TYPE_COUNT];
// Something with radiation.
//
@@ -679,15 +679,15 @@ int radiationEventWrite(File* stream, void* data)
}
// 0x42D82C critter_get_base_damage_type
DamageType critterGetDamageType(Object* obj)
int critterGetDamageType(Object* obj)
{
if (PID_TYPE(obj->pid) != OBJ_TYPE_CRITTER) {
return DAMAGE_TYPE_NORMAL;
return 0;
}
Proto* proto;
if (protoGetProto(obj->pid, &proto) == -1) {
return DAMAGE_TYPE_NORMAL;
return 0;
}
return proto->critter.data.damageType;
@@ -703,9 +703,9 @@ static int critter_kill_count_clear()
}
// 0x42D878 critter_kill_count_inc
int killsIncByType(KillType killType)
int killsIncByType(int killType)
{
if (killTypeIsValid(killType)) {
if (killType != -1 && killType < KILL_TYPE_COUNT) {
gKillsByType[killType]++;
return 0;
}
@@ -714,9 +714,9 @@ int killsIncByType(KillType killType)
}
// 0x42D8A8 critter_kill_count
int killsGetByType(KillType killType)
int killsGetByType(int killType)
{
if (killTypeIsValid(killType)) {
if (killType != -1 && killType < KILL_TYPE_COUNT) {
return gKillsByType[killType];
}
@@ -726,7 +726,7 @@ int killsGetByType(KillType killType)
// 0x42D8C0 critter_kill_count_load
int killsLoad(File* stream)
{
if (fileReadInt32List(stream, gKillsByType, KILL_TYPE_DEFAULT_COUNT) == -1) {
if (fileReadInt32List(stream, gKillsByType, KILL_TYPE_COUNT) == -1) {
fileClose(stream);
return -1;
}
@@ -737,7 +737,7 @@ int killsLoad(File* stream)
// 0x42D8F0 critter_kill_count_save
int killsSave(File* stream)
{
if (fileWriteInt32List(stream, gKillsByType, KILL_TYPE_DEFAULT_COUNT) == -1) {
if (fileWriteInt32List(stream, gKillsByType, KILL_TYPE_COUNT) == -1) {
fileClose(stream);
return -1;
}
@@ -746,7 +746,7 @@ int killsSave(File* stream)
}
// 0x42D920 critter_kill_count_type
KillType critterGetKillType(Object* obj)
int critterGetKillType(Object* obj)
{
if (obj == gDude) {
int gender = critterGetStat(obj, STAT_GENDER);
@@ -757,7 +757,7 @@ KillType critterGetKillType(Object* obj)
}
if (PID_TYPE(obj->pid) != OBJ_TYPE_CRITTER) {
return KILL_TYPE_INVALID;
return -1;
}
Proto* proto;
@@ -767,25 +767,33 @@ KillType critterGetKillType(Object* obj)
}
// 0x42D974 critter_kill_name
char* killTypeGetName(KillType killType)
char* killTypeGetName(int killType)
{
if (killTypeIsValid(killType)) {
MessageListItem messageListItem;
return getmsg(&gProtoMessageList, &messageListItem, 1450 + killType);
if (killType != -1 && killType < KILL_TYPE_COUNT) {
if (killType >= 0 && killType < KILL_TYPE_COUNT) {
MessageListItem messageListItem;
return getmsg(&gProtoMessageList, &messageListItem, 1450 + killType);
} else {
return nullptr;
}
} else {
return byte_501494;
}
return empty;
}
// 0x42D9B4 critter_kill_info
char* killTypeGetDescription(KillType killType)
char* killTypeGetDescription(int killType)
{
if (killTypeIsValid(killType)) {
MessageListItem messageListItem;
return getmsg(&gProtoMessageList, &messageListItem, 1469 + killType);
if (killType != -1 && killType < KILL_TYPE_COUNT) {
if (killType >= 0 && killType < KILL_TYPE_COUNT) {
MessageListItem messageListItem;
return getmsg(&gProtoMessageList, &messageListItem, 1469 + killType);
} else {
return nullptr;
}
} else {
return byte_501494;
}
return empty;
}
// 0x42D9F4 critter_heal_hours
@@ -1000,15 +1008,15 @@ bool critterIsProne(Object* critter)
// critter_body_type
// 0x42DDC4 critter_body_type
BodyType critterGetBodyType(Object* critter)
int critterGetBodyType(Object* critter)
{
if (critter == nullptr) {
debugPrint("\nError: critter_body_type: pobj was NULL!");
return BODY_TYPE_BIPED;
return 0;
}
if (PID_TYPE(critter->pid) != OBJ_TYPE_CRITTER) {
return BODY_TYPE_BIPED;
return 0;
}
Proto* proto;
@@ -1083,9 +1091,9 @@ int gcdLoad(const char* path)
}
proto->critter.data.baseStats[STAT_DAMAGE_RESISTANCE_EMP] = 100;
proto->critter.data.bodyType = BODY_TYPE_BIPED;
proto->critter.data.bodyType = 0;
proto->critter.data.experience = 0;
proto->critter.data.killType = KILL_TYPE_MAN;
proto->critter.data.killType = 0;
fileClose(stream);
return 0;
@@ -1097,10 +1105,10 @@ int protoCritterDataRead(File* stream, CritterProtoData* critterData)
if (fileReadInt32(stream, &(critterData->flags)) == -1) return -1;
if (fileReadInt32List(stream, critterData->baseStats, SAVEABLE_STAT_COUNT) == -1) return -1;
if (fileReadInt32List(stream, critterData->bonusStats, SAVEABLE_STAT_COUNT) == -1) return -1;
if (fileReadInt32List(stream, reinterpret_cast<int*>(critterData->skills), SKILL_COUNT) == -1) return -1;
if (fileReadInt32(stream, reinterpret_cast<int*>(&(critterData->bodyType))) == -1) return -1;
if (fileReadInt32List(stream, critterData->skills, SKILL_COUNT) == -1) return -1;
if (fileReadInt32(stream, &(critterData->bodyType)) == -1) return -1;
if (fileReadInt32(stream, &(critterData->experience)) == -1) return -1;
if (fileReadInt32(stream, reinterpret_cast<int*>(&(critterData->killType))) == -1) return -1;
if (fileReadInt32(stream, &(critterData->killType)) == -1) return -1;
// NOTE: For unknown reason damage type is not present in two protos: Sentry
// Bot and Weak Brahmin. These two protos are 412 bytes, not 416.
@@ -1114,7 +1122,7 @@ int protoCritterDataRead(File* stream, CritterProtoData* critterData)
//
// Regardless of the reason, damage type is considered optional by original
// code as seen at 0x42E01B.
if (fileReadInt32(stream, reinterpret_cast<int*>(&(critterData->damageType))) == -1) {
if (fileReadInt32(stream, &(critterData->damageType)) == -1) {
critterData->damageType = DAMAGE_TYPE_NORMAL;
}
@@ -1164,7 +1172,7 @@ int protoCritterDataWrite(File* stream, CritterProtoData* critterData)
if (fileWriteInt32(stream, critterData->flags) == -1) return -1;
if (fileWriteInt32List(stream, critterData->baseStats, SAVEABLE_STAT_COUNT) == -1) return -1;
if (fileWriteInt32List(stream, critterData->bonusStats, SAVEABLE_STAT_COUNT) == -1) return -1;
if (fileWriteInt32List(stream, reinterpret_cast<int*>(critterData->skills), SKILL_COUNT) == -1) return -1;
if (fileWriteInt32List(stream, critterData->skills, SKILL_COUNT) == -1) return -1;
if (fileWriteInt32(stream, critterData->bodyType) == -1) return -1;
if (fileWriteInt32(stream, critterData->experience) == -1) return -1;
if (fileWriteInt32(stream, critterData->killType) == -1) return -1;
+7 -7
View File
@@ -39,14 +39,14 @@ void radiationProcess(Object* obj, int radiationLevel, bool direction);
int radiationEventProcess(Object* obj, void* data);
int radiationEventRead(File* stream, void** dataPtr);
int radiationEventWrite(File* stream, void* data);
DamageType critterGetDamageType(Object* critter);
int killsIncByType(KillType killType);
int killsGetByType(KillType killType);
int critterGetDamageType(Object* critter);
int killsIncByType(int killType);
int killsGetByType(int killType);
int killsLoad(File* stream);
int killsSave(File* stream);
KillType critterGetKillType(Object* critter);
char* killTypeGetName(KillType killType);
char* killTypeGetDescription(KillType killType);
int critterGetKillType(Object* critter);
char* killTypeGetName(int killType);
char* killTypeGetDescription(int killType);
int critterHealByHours(Object* obj, int hours);
void critterKill(Object* critter, int anim, bool refreshRect);
int critterGetExp(Object* critter);
@@ -54,7 +54,7 @@ bool critterIsActive(Object* critter);
bool critterIsDead(Object* critter);
bool critterIsCrippled(Object* critter);
bool critterIsProne(Object* critter);
BodyType critterGetBodyType(Object* critter);
int critterGetBodyType(Object* critter);
// Checks physical/art capability only. Callers that expose weapon usability
// decisions must still call scriptHooks_CanUseWeapon with the final result.
bool critterCanUseWeapon(Object* critter, Object* weapon, HitMode hitMode);
+100 -6
View File
@@ -16,6 +16,8 @@ namespace fallout {
namespace {
#define F2_RES_CONFIG_FILE_NAME "f2_res.ini"
#define F2_RES_MAIN_MENU_BUTTON_X 30
#define F2_RES_MAIN_MENU_BUTTON_Y 19
struct F2ResMigrationEntry {
const char* legacySection;
@@ -29,6 +31,7 @@ namespace {
static bool gameConfigMigrateMainMenuScaleModeKey(Config* legacyConfig, Config* gameConfig);
static bool gameConfigMigrateStringKey(Config* legacyConfig, Config* gameConfig, const F2ResMigrationEntry& entry);
static bool gameConfigMigrateScaleKey(Config* legacyConfig, Config* gameConfig);
static bool contentConfigMigrateF2ResMainMenuPanelOffsetKey(Config* legacyConfig, Config* contentConfig, const char* legacyKey, const char* targetKey, int baseValue, int defaultValue);
static constexpr F2ResMigrationEntry kF2ResMigrationEntries[] = {
{ "MAIN", "SCR_WIDTH", GAME_CONFIG_SCREEN_KEY, GAME_CONFIG_RESOLUTION_X_KEY },
@@ -110,6 +113,27 @@ namespace {
return configSetInt(gameConfig, GAME_CONFIG_SCREEN_KEY, GAME_CONFIG_SCALE_KEY, value + 1);
}
static bool contentConfigMigrateF2ResMainMenuPanelOffsetKey(Config* legacyConfig, Config* contentConfig, const char* legacyKey, const char* targetKey, int baseValue, int defaultValue)
{
assert(legacyConfig != nullptr && contentConfig != nullptr);
if (gameConfigHasKey(contentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, targetKey)) {
return false;
}
int value;
if (!configGetInt(legacyConfig, "MAINMENU", legacyKey, &value)) {
return false;
}
value += baseValue;
if (value == defaultValue) {
return false;
}
return configSetInt(contentConfig, CONTENT_CONFIG_MAIN_MENU_SECTION, targetKey, value);
}
} // namespace
// Migrate settings F2_RES.INI to fallout2.cfg
@@ -175,17 +199,11 @@ namespace {
constexpr SfallMigrationEntry kSfallMigrationEntries[] = {
// [start]
{ kSfallMisc, "StartingMap", CONTENT_CONFIG_START_SECTION, "map", "" },
{ kSfallMisc, "StartXPos", CONTENT_CONFIG_START_SECTION, "worldmap_x", "-1" },
{ kSfallMisc, "StartYPos", CONTENT_CONFIG_START_SECTION, "worldmap_y", "-1" },
{ kSfallMisc, "ViewXPos", CONTENT_CONFIG_START_SECTION, "worldmap_view_x", "-1" },
{ kSfallMisc, "ViewYPos", CONTENT_CONFIG_START_SECTION, "worldmap_view_y", "-1" },
{ kSfallMisc, "MaleStartModel", CONTENT_CONFIG_START_SECTION, "model_male", "hmwarr" },
{ kSfallMisc, "MaleDefaultModel", CONTENT_CONFIG_START_SECTION, "model_male_default", "hmjmps" },
{ kSfallMisc, "FemaleStartModel", CONTENT_CONFIG_START_SECTION, "model_female", "hfprim" },
{ kSfallMisc, "FemaleDefaultModel", CONTENT_CONFIG_START_SECTION, "model_female_default", "hfjmps" },
{ kSfallMisc, "PipBoyAvailableAtGameStart", CONTENT_CONFIG_START_SECTION, "pipboy", "0" },
// [maps]
{ kSfallMisc, "DisableSpecialMapIDs", CONTENT_CONFIG_MAPS_SECTION, "disable_special_map_ids", "0" },
// [karma]
{ kSfallMisc, "KarmaFRMs", CONTENT_CONFIG_KARMA_SECTION, "frms" },
{ kSfallMisc, "KarmaPoints", CONTENT_CONFIG_KARMA_SECTION, "points" },
@@ -307,6 +325,82 @@ static bool contentConfigMigrateFromSfall(Config* sfallConfig, const char* conte
return migrated;
}
static bool contentConfigEnsureDirectory(const char* contentConfigFilePath)
{
char drive[COMPAT_MAX_DRIVE];
char dirPart[COMPAT_MAX_DIR];
char pathWithoutFile[COMPAT_MAX_PATH];
compat_splitpath(contentConfigFilePath, drive, dirPart, nullptr, nullptr);
compat_makepath(pathWithoutFile, drive, dirPart, nullptr, nullptr);
return compat_mkdir_recursive(pathWithoutFile) == 0;
}
static bool contentConfigMigrateFromF2Res(Config* legacyConfig, const char* contentConfigFilePath)
{
assert(legacyConfig != nullptr && contentConfigFilePath != nullptr);
Config migratedConfig;
if (!configInit(&migratedConfig)) {
return false;
}
configRead(&migratedConfig, contentConfigFilePath, false);
bool migrated = false;
if (contentConfigMigrateF2ResMainMenuPanelOffsetKey(legacyConfig, &migratedConfig, "MENU_BG_OFFSET_X", "main_menu_panel_offset_x", F2_RES_MAIN_MENU_BUTTON_X, 16)) {
migrated = true;
}
if (contentConfigMigrateF2ResMainMenuPanelOffsetKey(legacyConfig, &migratedConfig, "MENU_BG_OFFSET_Y", "main_menu_panel_offset_y", F2_RES_MAIN_MENU_BUTTON_Y, 15)) {
migrated = true;
}
if (migrated) {
if (contentConfigEnsureDirectory(contentConfigFilePath)) {
if (!configWriteEx(&migratedConfig, contentConfigFilePath, CONFIG_RETAIN_ALL)) {
debugPrint("Failed to write migrated settings to %s!\n", contentConfigFilePath);
}
} else {
debugPrint("Failed to create directory for migrated settings at %s!\n", contentConfigFilePath);
}
}
configFree(&migratedConfig);
return migrated;
}
void contentConfigTryMigrateFromF2Res(const char* contentConfigPath)
{
const auto& masterPatches = settings.system.master_patches_path;
if (masterPatches.empty()) {
debugPrint("Failed to migrate from f2_res.ini: no master_patches is set.\n");
return;
}
if (!compat_is_dir(masterPatches.c_str())) {
return;
}
char f2ResFilePath[COMPAT_MAX_PATH];
char drive[COMPAT_MAX_DRIVE];
char dir[COMPAT_MAX_DIR];
compat_splitpath(gGameConfigFilePath, drive, dir, nullptr, nullptr);
compat_makepath(f2ResFilePath, drive, dir, F2_RES_CONFIG_FILE_NAME, nullptr);
Config legacyConfig;
if (!configInit(&legacyConfig)) {
return;
}
if (configRead(&legacyConfig, f2ResFilePath, false)) {
char contentCfgPath[COMPAT_MAX_PATH];
snprintf(contentCfgPath, sizeof(contentCfgPath), "%s\\%s", masterPatches.c_str(), contentConfigPath);
if (contentConfigMigrateFromF2Res(&legacyConfig, contentCfgPath)) {
debugPrint("Migrated settings from f2_res.ini to game.cfg.\n");
}
}
configFree(&legacyConfig);
}
void contentConfigTryMigrateFromSfall(const char* contentConfigPath)
{
if (!gSfallConfig.isInitialized() || gSfallConfig.entriesLength == 0) {
+1
View File
@@ -6,6 +6,7 @@
namespace fallout {
bool gameConfigMigrateFromF2Res(const char* gameConfigFilePath, Config* gameConfig);
void contentConfigTryMigrateFromF2Res(const char* contentConfigPath);
void contentConfigTryMigrateFromSfall(const char* contentConfigPath);
} // namespace fallout

Some files were not shown because too many files have changed in this diff Show More