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