Compare commits

...
118 Commits
Author SHA1 Message Date
NovaRain e105b8c328 Merge branch 'develop' 2019-05-31 09:34:22 +08:00
NovaRain e5e2ef5ab0 Minor edit to gl_ammomod example script. 2019-05-31 09:10:36 +08:00
NovaRain 8778d1c695 Improved the fix for the removal of PM corpses.
* to prevent save file corruption (one of bugs listed in #228). Now
party member's corpse is removed in the same way as all other critter
corpses.

Simplified the ASM code of combat_ai_hack (take 2).
2019-05-30 10:30:25 +08:00
NovaRain 4ee20e06b4 Fixed the code for removal of party member's corpse when loading the map. 2019-05-29 09:35:38 +08:00
NovaRain aa5bd95dfe Fixed AI not checking min HP properly for using stims.
Edited the code of InventoryApCost in Inventory.cpp.
Minor edits to some other code.
2019-05-28 13:51:40 +08:00
NovaRain aa221adea3 Fix for fake perks related functions.
* now fake perks are no longer added to all controlled critters.

Added alternative functions that allow to add fake perks to party
member NPC.

Rewrote set_fake_perk/trait, set_selectable_perk, has_fake_perk/trait
functions in C++.
2019-05-27 12:01:09 +08:00
NovaRain 22cdc32d26 Simplified the ASM code of combat_ai_hack. 2019-05-24 20:00:07 +08:00
NovaRain fca3307bd9 Rewrote the fix to allow fleeing NPC to use drugs.
Code edits to Perks.cpp.
2019-05-24 10:35:50 +08:00
NovaRain 04d7f4aefa Removed LoadProtoMaxLimit option from ddraw.ini.
* now the proto limit is always handled by set_proto_data function when
needed, since the related issue was originally from using it to process
lots of protos at once.
2019-05-23 17:04:51 +08:00
NovaRain f5317ad5ee Rewrote NPC fleeing fix.
Removed DialogOptions9Lines option from ddraw.ini.
2019-05-22 10:41:37 +08:00
NovaRain 119b0afacd Fixed getting perks and traits of real_dude_obj while controlling other NPCs.
* When switching control to party members, their own table of perks is
copied into player's current perk table.

Fixed the position of the items in active item slots after ending the
NPC control (NPC's wielded weapon should always be in the right slot).
2019-05-22 10:32:43 +08:00
NovaRain 10a6b76d5b Increased the max text width of the info card in the char screen.
* the increased the width is according to the max width of one char in
font (uppercase A seems to be the widest with 8 px).
2019-05-20 11:25:42 +08:00
NovaRain 3a86f1d134 Added two fixes for NPC fleeing in combat.
* added fix to allow fleeing NPC to use drugs.
* fixed NPC stuck in fleeing mode when the hit chance of a target was
too low.
2019-05-19 15:38:54 +08:00
NovaRain 30ac2a9690 Slightly simplified the code of NPCStage6Fix.
Moved NPCsTryToSpendExtraAP to AI.cpp.
2019-05-19 08:15:45 +08:00
NovaRain 16a0ef3bdf Improved the fix in previous commit.
* now ignoring the inv capacity only happens in combat for preventing
AI inf loop. The vanilla behavior still applies outside of combat.
* added a correct message for NPC not being able to pick up an item.
2019-05-18 10:55:38 +08:00
NovaRain 58d5271d49 Fixed two item pickup issues for NPC.
* message for the player is displayed when the NPC cannot pick up item.
* if in combat, NPC will also be stuck in a loop of picking up item.

Fixed HideObjIsNullMsg option.
2019-05-17 09:55:09 +08:00
NovaRain 6a226aef34 Added a tweak to op_use_obj_on_obj_hack in BugFixes (from Mr.Stalin)
Minor edits to code/documents.
2019-05-14 07:16:23 +08:00
NovaRain 6ac9949feb Added "dropping item on the character portrait" event to HOOK_INVENTORYMOVE.
Rewrote get_ini_setting/string script functions in C++.
Rewrote Ray's combat_p_proc fix.
Minor code edits.
2019-05-13 11:29:24 +08:00
NovaRain d2cf728131 Refactored code in Tiles.cpp and EngineUtils.cpp.
Moved RegAnimCombatCheck code from ScriptExtender.cpp to Anims.cpp.
2019-05-11 09:56:58 +08:00
NovaRain a63ea24572 Added aspect ratio scaling to draw_image_scaled.
Rewrote create_message_window script function in C++.
2019-05-11 08:49:30 +08:00
NovaRain 4b221b5367 Improved the error handling for previous commit.
Reverted the change in Tiles.cpp from commit 4bc1a422c3.
2019-05-10 10:38:51 +08:00
NovaRain 02c2df50ac Added "draw_image" and "draw_image_scaled" script functions. 2019-05-09 22:22:02 +08:00
NovaRain 4bc1a422c3 Changed the names of FRM structures.
Added some functions for later use.
Fixed get FID type.
2019-05-09 10:11:26 +08:00
NovaRain 88cf6dcd32 Moved Test_ForceFloats to [Debugging] section.
* Since it's never mentioned anywhere, should be OK moving it before
the formal release.
2019-05-07 23:04:00 +08:00
NovaRain 943cd5d2dc Code edits on ScriptShaders & OpcodeContext.cpp.
Minor edits on some other code.
Added the missing Test_ForceFloats option to ddraw.ini.
2019-05-07 13:49:26 +08:00
NovaRain bc47c87583 Moved script shader functions code from Graphics.cpp to a separate module. 2019-05-05 10:53:50 +08:00
NovaRain 0f98591b77 Code refactoring in Arrays.cpp.
Added a new example mod gl_ammomod to modderspack.
2019-05-05 08:47:08 +08:00
NovaRain 42cf5ded97 Unset the read-only attribute for party member's .sav proto files 2019-05-02 14:23:02 +08:00
NovaRain edac0ba393 Fixed the issue with read-only party member base protos.
* the protos being placed in the proto\critters\ directory will cause
party member's stats reset after loading a saved game.
2019-05-01 20:56:35 +08:00
NovaRain 045926c860 Reordered the execution of functions before exiting the map
* partyMemberSaveProtos and queue_leaving_map are now called after
executing map_exit_p_proc procedure.

Replaced some obsolete implementation in ScriptExtender/Worldmap.
2019-05-01 09:45:51 +08:00
NovaRain c65e1ec6d3 Fixed the argument value of dialogue_reaction script function 2019-04-30 11:17:37 +08:00
NovaRain 6a38fd0794 Replaced opcode/metarule names in error messages
* before they are explicitly specified in text. Now the names are taken
from the opcode/metarule tables.
2019-04-30 10:09:34 +08:00
NovaRain f788246283 Reordered sfall modules to fix the issue #235
Unified the directory separator in documents.
Updated version number.
2019-04-30 06:45:22 +08:00
NovaRain 428ac62883 Merge branch 'develop' 2019-04-24 20:27:26 +08:00
NovaRain 1b1b85c3b4 Rewrote Force Encounter script function code.
Added two functions to Utils.cpp.
Minor edits to BugFixes.cpp and ddraw.ini.
2019-04-24 10:05:47 +08:00
NovaRain 28493432db Replaced ASM code in various opcodes with macros (from Mr.Stalin)
* The two macros are from sfall 3.x.
2019-04-23 11:38:21 +08:00
NovaRain 1d6150e341 Fixed the previous TalkingHeads.cpp commit.
* Now textures for all animation sets will be displayed correctly.

Some code edits to AI.cpp, MainMenu.cpp, Movies.cpp.
2019-04-22 10:37:34 +08:00
NovaRain 3798e5239d Fixed and improved Use32BitHeadGraphics option:
* Fixed the position of the talking head texture when the game res is
larger than 640x480.

* Added the support to use textures without the need of patching
talking head FRM files.

Fixed a bug in item highlighting that item keeps its outline if player
picked it up while holding the highlight key.
2019-04-20 22:49:02 +08:00
NovaRain 533020cd8b Renamed AmmoMod module to DamageMod. 2019-04-19 09:10:31 +08:00
NovaRain 69e3faeb7d Reverted some changes in previous commit.
* Now weapons with knockback modifiers applied still stack with others
in the inventory.

Rewrote the code of set/remove_*_knockback functions in C++.
2019-04-17 10:28:14 +08:00
NovaRain 4cdc028cb7 Further implementation of unique ID.
* weapons with knockback modifiers applied will have a special ID
(negative value) that work as a temporary UID for the current game
session.

Added checks on object types to functions in Combat module.
Added the second argument to set_unique_id script function.
2019-04-16 20:33:00 +08:00
NovaRain e92b8021c0 Fixed the start procedure not being called correctly
* If the required standard script procedure is missing, the procedure
above the start proc is called instead of the start (from Crafty)

Added a id reversion mechanism to remove_weapon_knockback.
2019-04-15 12:57:44 +08:00
NovaRain 601d25be97 Fixed adding fake perks to the player (#232) 2019-04-14 07:36:57 +08:00
NovaRain 7a2b7dee6a Added "picking up item" event to HOOK_INVENTORYMOVE.
Added "set_unique_id" script function.
2019-04-12 12:15:55 +08:00
NovaRain dcf0561653 Added new HOOK_SNEAK (from Mr.Stalin) 2019-04-10 17:13:00 +08:00
NovaRain 5c3f10db91 Edited/reorganized some code.
Updated proto offsets in define_extra.h.
2019-04-10 09:46:31 +08:00
NovaRain 3e49922898 Extended the number of simultaneously displayed notification boxes
(now it depends on on the resolution of the game.)
2019-04-09 11:03:17 +08:00
NovaRain 564202f225 Re-fixed CheckWeaponAmmoCost option. 2019-04-08 00:32:04 +08:00
NovaRain 143f6895a4 Fixed a bug in CheckWeaponAmmoCost (from Mr.Stalin)
It caused NPCs to not switch to other weapons when there is not enough
ammo to shoot.
Moved CheckWeaponAmmoCost code from Inventory.cpp to Combat.cpp.
Now the debug editor starts at the center of the screen.
Updated the previous fix in NPC combat control mod.
2019-04-07 10:59:02 +08:00
NovaRain d946850af4 Fixed the weapon duplication bug in NPC combat control mod. 2019-04-06 09:33:27 +08:00
NovaRain ae7245579e Fixed setting array values in the debug editor.
Some code corrections.
2019-04-06 08:24:49 +08:00
NovaRain 563fdddc7e Added setting array values for the debug editor. 2019-04-05 12:03:25 +08:00
NovaRain 06bbe3ceb5 Updates to sfall debug editor (part 1) 2019-04-05 09:17:43 +08:00
NovaRain 56083c3bc6 Updated sfall debug editor (from Mr.Stalin)
Formatted the code of sfall debug editor.
2019-04-04 10:22:02 +08:00
NovaRain dee0065863 Removed PipBoyAutomaps from ddraw.ini.
* By default nothing will change with the option enabled, because all
data is copied from the vanilla map list, and modders still need to add
the new 'automap' parameter to override the engine values to add/remove
areas in the automap list. Basically the option itself is redundant.
2019-04-03 22:01:53 +08:00
NovaRain 3614ee355f Added an option to add support for the new 'automap=yes/no' parameter to maps.txt (from Mr.Stalin)
Fixed "out of bounds" bug when printing the automap list.
2019-04-02 10:31:08 +08:00
NovaRain 7c05a0fea9 Fixed a duplicate obj_dude script being created when loading a saved game.
Added a fix to prevent the reserved object IDs of the player and party members from being generated for other objects.
Removed a redundant line in MiscPatches.cpp.
2019-03-31 22:50:48 +08:00
NovaRain dd87a83025 Added DisableSpecialMapIDs option (from Mr.Stalin)
Fixed the overflow of the automap tables when the number of maps in maps.txt is more than 160.
2019-03-30 11:07:16 +08:00
NovaRain da3fd5c671 Replaced the fix in the previous commit with a fix for unexplored areas being revealed on the automap when entering a map. 2019-03-28 12:01:41 +08:00
NovaRain acc51cae03 Fixed player's position when entering a map.
This also fixed the issue with getting player's position in the map_enter_p_proc procedure.
2019-03-27 20:07:40 +08:00
NovaRain 8332a2bba7 Fixed incorrect use of emplace_back() method for the vector.
Replaced some push_back() with emplace_back() method.
Changed BlockCall to use the long NOP.
2019-03-26 22:33:05 +08:00
NovaRain 2cfa20ed47 Implemented the critter individualization (from Mr.Stalin):
* each critter has its own independent base/bonus stats, separated from other critters sharing the same PID.
* get/set_critter_base/extra_stat script functions now only set stats for a specific critter.

Rewrote get/set_pc_base/extra_stat and get/set_critter_base/extra_stat script functions in C++.
Fixed the argument numbering in error messages when validating arguments.
Minor edits on some code.
Update solution files and version number.
2019-03-26 12:29:28 +08:00
NovaRain 9911eb5f01 Changed hero_select_win function to require an AppHeroWin.frm file in the art\intrface\ folder (from Mr.Stalin) 2019-03-25 20:55:39 +08:00
NovaRain 77f2542919 Merge branch 'develop' 2019-03-18 20:19:53 +08:00
NovaRain 18649329ec Added SpecialDeathGVAR option to override the global variable number for special death.
Minor fix for Stats.ini.
2019-03-17 10:35:12 +08:00
NovaRain aa91e9fad4 Fixed range for object ID.
Added checks for FID in NPC armor appearance mod.
Minor edits to documents.
2019-03-16 08:47:37 +08:00
NovaRain 1fd93ba13f Added CorpseDeleteTime option (from Mr.Stalin)
Fixed some code in Perks.cpp.
2019-03-15 19:17:37 +08:00
NovaRain 04eba05e53 Fixed the removal of party member's corpse (from Mr.Stalin)
Now items in party member's inventory are not removed along with the corpse.
2019-03-14 13:42:48 +08:00
NovaRain 3cef4784d3 Fixed critters not being healed over time when entering the map if 'dead_bodies_age=No' is set in maps.txt.
Added additional checks for the amounts to properly compare the effects of drugs.
2019-03-13 11:54:16 +08:00
NovaRain 656b4c5291 Tweaked the code of the fix in previous commit. 2019-03-13 00:08:10 +08:00
NovaRain 82a11d30b2 Fixed NPC stuck in a loop of reloading melee/unarmed weapons when out of ammo (from Mr.Stalin) 2019-03-12 11:45:18 +08:00
NovaRain 0f036b26ae Added support for extra perks to has_fake_perk/get_perk_available script functions.
Fixed broken get_perk_available script function.
Some code corrections for Perks.cpp.
2019-03-11 10:07:44 +08:00
NovaRain 967e642908 Added the ability to add extra non-scripted perks to the PerksFile (from Mr.Stalin)
Fixed some functionality for fake perks.
2019-03-10 11:55:41 +08:00
NovaRain 9eefb6e042 Fixed some issues in the previous commit.
* the game failed to start if there are more drug items than the specified "Count" number in Drugs.ini.
* setting vanilla drugs in Drugs.ini broke their NumEffects limit, even if it's not set (-1).
2019-03-09 07:45:56 +08:00
NovaRain f289723431 Added "set_drugs_data" script function (from Mr.Stalin)
Fixed vanilla drugs in Drugs.ini not getting loaded.
2019-03-08 21:37:36 +08:00
NovaRain 2d38b4bac1 Moved the list of active drug pids to sfallgv.sav.
Fixed item_d_load_subfix in the previous commit.
2019-03-06 09:30:24 +08:00
NovaRain 3934a804f4 Added new Drugs module and DrugsFile option (from Mr.Stalin)
Fixed a bug in the party control module with the 'addict' notification box not getting hidden after the addiction ends.
Removed DrugsSaveFix option, now the list of active drug pids will be saved to sfalldb.sav.
2019-03-05 12:36:38 +08:00
NovaRain ab03186a1d Fixed the screen not returning to the player when moving a controlled critter to another elevation of the map.
Added DrugSaveFix option to fix saving the active effects of drugs.
Refactored some code in BugFixes.cpp.
2019-03-04 15:27:00 +08:00
NovaRain 15d762deb0 Fixed the lighting of controlled critters in NPC combat control mod. 2019-03-03 11:48:42 +08:00
NovaRain d8bb5848f7 Fixed the return FID in NPC armor appearance mod. 2019-03-02 09:55:40 +08:00
NovaRain f84578e84b Added displaying the NPC's addictions in the character screen when controlled by the player (from Mr.Stalin)
Added "npc_engine_level_up" script function.
Moved the code of set_map_time_multi to Worldmap handler, and NPCAutoLevel to PartyControl module.
Removed validate_test example function from release builds.
2019-02-27 12:06:06 +08:00
NovaRain aa36d54b27 Fixed a crash bug when trying to use explosives if using a books ini file.
Fixed some bugs in BugFixes.cpp.
2019-02-25 23:48:54 +08:00
NovaRain 627c0df484 Added a new argument to REMOVEINVENOBJ hook (from Mr.Stalin)
Fixed inconsistent return value of get_npc_level.
2019-02-25 12:26:42 +08:00
NovaRain ae3d4fcb69 Expanded get/inc_npc_level functions to accept party member PIDs (from Mr.Stalin)
Some code correction in Skills.cpp.
2019-02-24 19:26:42 +08:00
NovaRain fb31357e3d Fixed incorrect skill point cost for negative skill levels when using a skills ini file (from Mr.Stalin) 2019-02-23 22:17:53 +08:00
NovaRain 1687e50729 Fixed the negative skill points of a skill not being taken into account when calculating the skill level (from Mr.Stalin, #202)
Fixed the return value of has_skill function for incorrect skill numbers.
2019-02-21 10:53:55 +08:00
NovaRain 36e3a2bd5f Updated NPC combat control mod to be able to automatically set the number for the notification box.
Updated item highlighting mod to also be disabled while in the barter screen.
2019-02-20 21:26:23 +08:00
NovaRain 99664dfa8a Fixed the reserved item FRM being displayed in the top-left corner when in the loot/barter screens. 2019-02-20 10:02:54 +08:00
NovaRain 0980967cee Changed the implementation of BarBoxes.cpp (from Mr.Stalin)
Added "add_iface_tag" script function.
2019-02-19 21:33:42 +08:00
NovaRain 8613a4fb8b Added ExtraPatches section to ddraw.ini for setting multiple custom paths for game files (from Mr.Stalin, #206)
Refactored some code of DataLoadOrderPatch to work with new ExtraPatches.
Removed MultiPatches from ddraw.ini, now it's always enabled.
Minor edits to MiscPatches.cpp and Arrays.cpp.
Updated version number.
2019-02-19 11:55:38 +08:00
NovaRain 6fdf3ac0b0 Merge branch 'develop' 2019-02-12 09:22:18 +08:00
NovaRain fe5a148d7f Moved DontDeleteProtos option from MiscPatches.cpp to DebugEditor.cpp.
Updated Auto Doors script mod from Mr.Stalin and ddraw.ini.
2019-02-11 13:58:21 +08:00
NovaRain d64b33a946 Minor edits to SpeedPatch and documents. 2019-02-10 09:53:03 +08:00
NovaRain 1294d27a96 Formatted code in Arrays.cpp and added checks for the integrity of sfallgv.sav when loading a saved game.
Fixed unregistering hook procedure.
2019-02-09 09:36:57 +08:00
NovaRain 41171bbb87 Fixed crash when saving the game with speed tweak enabled. 2019-02-09 08:08:34 +08:00
NovaRain 170322648e Reverted the change of DataType values in ScriptValue.h.
(reason: inefficiency)
2019-02-09 02:12:57 +08:00
NovaRain af531a3e1d Refactored and fixed SpeedPatch module (from Mr.Stalin) 2019-02-08 10:31:03 +08:00
NovaRain d13f33e2ff Refactored OpcodeContext/ScriptValue and some script function handlers (from Mr.Stalin) 2019-02-06 11:28:50 +08:00
NovaRain 0ed346380f Refactored error handling of saving/loading sfall data files. 2019-02-05 10:43:17 +08:00
NovaRain 664643d83c Rewrote ASM code of WorldMapFpsPatch functions.
(with fix for infinite loop of elapsed time)
2019-02-04 10:19:46 +08:00
NovaRain 89dbbb9238 Refactored code in Worldmap module (from Mr.Stalin)
Fixed TimeLimit option and removed the pointless value of -2 (now it's the same as -3).
Fixed the slow mouse cursor on the world map when WorldMapFPSPatch is enabled.
2019-02-03 00:57:00 +08:00
NovaRain 5daebd18d8 Added note on effect flags to CriticalOverrides.ini.
Minor edits to Criticals/Elevators.cpp.
2019-01-31 09:18:24 +08:00
NovaRain 4e38eab905 Removed some unnecessary memset code.
Minor code corrections.
2019-01-30 00:09:11 +08:00
NovaRain 7f8d805a9f Refactored code in the Books module.
Increased the maximum number of books in BooksFile to 50.
2019-01-29 06:32:12 +08:00
NovaRain 0e91aed2e2 Added HideObjIsNullMsg option to [Debugging].
Moved DebugEditor option from MiscPatches.cpp to DebugEditor.cpp.
2019-01-27 10:39:59 +08:00
NovaRain 3eba5c3054 Added two bug fixes for loading a game saved in combat mode (from Mr.Stalin) 2019-01-27 09:20:44 +08:00
NovaRain 80afdae7ba Fixed pickup_obj/drop_obj/use_obj script functions (from Mr.Stalin)
Fixed a crash when calling use_obj/use_obj_on_obj functions without using set_self in global scripts.
2019-01-25 00:30:34 +08:00
NovaRain 9db3c79c40 Added AttackComplexFix option (from Mr.Stalin) 2019-01-23 09:32:28 +08:00
NovaRain 274223a4ce Fixed bugs in attack_complex and critter_mod_skill script functions.
Minor edits to ScriptExtender.cpp.
2019-01-22 16:53:08 +08:00
NovaRain 7dbbb8230e Added error message when the name for sfall global variable is not equal to 8 characters.
Updated version number.
2019-01-21 11:24:54 +08:00
NovaRain a95f26a02d Fixed set_self function for use_obj_on_obj, attack, attack_complex vanilla functions (from Mr.Stalin) (#214) 2019-01-21 09:56:06 +08:00
NovaRain 46850a353b Corrected code in FileSystem.cpp (from Mr.Stalin)
Added fix for db_freadInt_ engine function from BugFixes.cpp when enabling UseFileSystemOverride.
2019-01-20 22:13:30 +08:00
NovaRain e379e71410 Added "art_cache_clear" script function. 2019-01-20 08:54:33 +08:00
NovaRain 774e31b9f6 Fixed and refactored code in FileSystem.cpp (from Mr.Stalin) 2019-01-20 00:18:32 +08:00
NovaRain 82f068c3e7 Refactored ASM code in FileSystem.cpp (from Mr.Stalin) 2019-01-17 10:06:04 +08:00
NovaRain 68e8ce8d41 Added support for integer values to abs() math function.
Minor code refactoring in Skills.cpp.
2019-01-16 11:07:56 +08:00
NovaRain a0437304a9 Merge branch 'develop' 2019-01-14 09:37:58 +08:00
NovaRain 34caa1cbbd Fixed a bug that broke the calculation of the skill point cost for increasing skill levels (#226)
Removed /Gw option from the release configuration.
Updated version number for hot fix.
2019-01-14 09:32:59 +08:00
151 changed files with 8845 additions and 5795 deletions
+94 -69
View File
@@ -24,16 +24,17 @@
/// </summary>
private void InitializeComponent() {
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.Column0 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.bGlobals = new System.Windows.Forms.Button();
this.bMapVars = new System.Windows.Forms.Button();
this.bCritters = new System.Windows.Forms.Button();
this.bSGlobals = new System.Windows.Forms.Button();
this.bArrays = new System.Windows.Forms.Button();
this.Column0 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.bEdit = new System.Windows.Forms.Button();
this.bCrittersLvar = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
@@ -41,84 +42,38 @@
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.AllowUserToResizeRows = false;
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.ColumnHeadersHeight = 22;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column0,
this.Column1,
this.Column2,
this.Column3});
this.dataGridView1.Location = new System.Drawing.Point(12, 12);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(444, 215);
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.Size = new System.Drawing.Size(561, 354);
this.dataGridView1.TabIndex = 0;
this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
this.dataGridView1.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit);
//
// bGlobals
//
this.bGlobals.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bGlobals.Location = new System.Drawing.Point(12, 233);
this.bGlobals.Name = "bGlobals";
this.bGlobals.Size = new System.Drawing.Size(100, 23);
this.bGlobals.TabIndex = 1;
this.bGlobals.Text = "Globals";
this.bGlobals.UseVisualStyleBackColor = true;
this.bGlobals.Click += new System.EventHandler(this.bGlobals_Click);
//
// bMapVars
//
this.bMapVars.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bMapVars.Location = new System.Drawing.Point(118, 233);
this.bMapVars.Name = "bMapVars";
this.bMapVars.Size = new System.Drawing.Size(100, 23);
this.bMapVars.TabIndex = 2;
this.bMapVars.Text = "Map variables";
this.bMapVars.UseVisualStyleBackColor = true;
this.bMapVars.Click += new System.EventHandler(this.bMapVars_Click);
//
// bCritters
//
this.bCritters.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bCritters.Location = new System.Drawing.Point(118, 262);
this.bCritters.Name = "bCritters";
this.bCritters.Size = new System.Drawing.Size(100, 23);
this.bCritters.TabIndex = 3;
this.bCritters.Text = "Critters";
this.bCritters.UseVisualStyleBackColor = true;
this.bCritters.Click += new System.EventHandler(this.bCritters_Click);
//
// bSGlobals
//
this.bSGlobals.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bSGlobals.Location = new System.Drawing.Point(225, 233);
this.bSGlobals.Name = "bSGlobals";
this.bSGlobals.Size = new System.Drawing.Size(100, 23);
this.bSGlobals.TabIndex = 4;
this.bSGlobals.Text = "sfall globals";
this.bSGlobals.UseVisualStyleBackColor = true;
this.bSGlobals.Click += new System.EventHandler(this.bSGlobals_Click);
//
// bArrays
//
this.bArrays.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bArrays.Location = new System.Drawing.Point(12, 262);
this.bArrays.Name = "bArrays";
this.bArrays.Size = new System.Drawing.Size(100, 23);
this.bArrays.TabIndex = 5;
this.bArrays.Text = "sfall arrays";
this.bArrays.UseVisualStyleBackColor = true;
this.bArrays.Click += new System.EventHandler(this.bArrays_Click);
this.dataGridView1.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(this.dataGridView1_RowsAdded);
//
// Column0
//
this.Column0.HeaderText = "ID";
this.Column0.Name = "Column0";
this.Column0.ReadOnly = true;
this.Column0.Width = 50;
//
// Column1
//
this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.Column1.HeaderText = "Name";
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
@@ -133,10 +88,65 @@
this.Column3.HeaderText = "Value (Float)";
this.Column3.Name = "Column3";
//
// bGlobals
//
this.bGlobals.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bGlobals.Location = new System.Drawing.Point(12, 372);
this.bGlobals.Name = "bGlobals";
this.bGlobals.Size = new System.Drawing.Size(100, 23);
this.bGlobals.TabIndex = 1;
this.bGlobals.Text = "Globals";
this.bGlobals.UseVisualStyleBackColor = true;
this.bGlobals.Click += new System.EventHandler(this.bGlobals_Click);
//
// bMapVars
//
this.bMapVars.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bMapVars.Location = new System.Drawing.Point(118, 372);
this.bMapVars.Name = "bMapVars";
this.bMapVars.Size = new System.Drawing.Size(100, 23);
this.bMapVars.TabIndex = 2;
this.bMapVars.Text = "Map variables";
this.bMapVars.UseVisualStyleBackColor = true;
this.bMapVars.Click += new System.EventHandler(this.bMapVars_Click);
//
// bCritters
//
this.bCritters.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bCritters.Location = new System.Drawing.Point(12, 401);
this.bCritters.Name = "bCritters";
this.bCritters.Size = new System.Drawing.Size(100, 23);
this.bCritters.TabIndex = 3;
this.bCritters.Text = "Critters";
this.bCritters.UseVisualStyleBackColor = true;
this.bCritters.Click += new System.EventHandler(this.bCritters_Click);
//
// bSGlobals
//
this.bSGlobals.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bSGlobals.Location = new System.Drawing.Point(367, 372);
this.bSGlobals.Name = "bSGlobals";
this.bSGlobals.Size = new System.Drawing.Size(100, 23);
this.bSGlobals.TabIndex = 4;
this.bSGlobals.Text = "sfall globals";
this.bSGlobals.UseVisualStyleBackColor = true;
this.bSGlobals.Click += new System.EventHandler(this.bSGlobals_Click);
//
// bArrays
//
this.bArrays.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bArrays.Location = new System.Drawing.Point(473, 372);
this.bArrays.Name = "bArrays";
this.bArrays.Size = new System.Drawing.Size(100, 23);
this.bArrays.TabIndex = 5;
this.bArrays.Text = "sfall arrays";
this.bArrays.UseVisualStyleBackColor = true;
this.bArrays.Click += new System.EventHandler(this.bArrays_Click);
//
// bEdit
//
this.bEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bEdit.Location = new System.Drawing.Point(225, 262);
this.bEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bEdit.Location = new System.Drawing.Point(473, 401);
this.bEdit.Name = "bEdit";
this.bEdit.Size = new System.Drawing.Size(100, 23);
this.bEdit.TabIndex = 6;
@@ -144,11 +154,23 @@
this.bEdit.UseVisualStyleBackColor = true;
this.bEdit.Click += new System.EventHandler(this.bEdit_Click);
//
// bCrittersLvar
//
this.bCrittersLvar.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bCrittersLvar.Enabled = false;
this.bCrittersLvar.Location = new System.Drawing.Point(119, 401);
this.bCrittersLvar.Name = "bCrittersLvar";
this.bCrittersLvar.Size = new System.Drawing.Size(99, 23);
this.bCrittersLvar.TabIndex = 7;
this.bCrittersLvar.Text = "Local variables";
this.bCrittersLvar.UseVisualStyleBackColor = true;
//
// DebugEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(468, 297);
this.ClientSize = new System.Drawing.Size(585, 436);
this.Controls.Add(this.bCrittersLvar);
this.Controls.Add(this.bEdit);
this.Controls.Add(this.bArrays);
this.Controls.Add(this.bSGlobals);
@@ -156,8 +178,10 @@
this.Controls.Add(this.bMapVars);
this.Controls.Add(this.bGlobals);
this.Controls.Add(this.dataGridView1);
this.MinimumSize = new System.Drawing.Size(450, 300);
this.Name = "DebugEditor";
this.Text = "DebugEditor";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "sfall Debug Editor";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DebugEditor_FormClosing);
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
@@ -172,11 +196,12 @@
private System.Windows.Forms.Button bCritters;
private System.Windows.Forms.Button bSGlobals;
private System.Windows.Forms.Button bArrays;
private System.Windows.Forms.Button bEdit;
private System.Windows.Forms.DataGridViewTextBoxColumn Column0;
private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
private System.Windows.Forms.Button bEdit;
private System.Windows.Forms.Button bCrittersLvar;
}
}
+183 -139
View File
@@ -4,14 +4,16 @@ using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using File=System.IO.File;
using StreamReader=System.IO.StreamReader;
using MemoryStream=System.IO.MemoryStream;
using BinaryReader=System.IO.BinaryReader;
using BinaryWriter=System.IO.BinaryWriter;
using File = System.IO.File;
using StreamReader = System.IO.StreamReader;
using MemoryStream = System.IO.MemoryStream;
using BinaryReader = System.IO.BinaryReader;
using BinaryWriter = System.IO.BinaryWriter;
namespace FalloutClient {
public partial class DebugEditor : Form {
public partial class DebugEditor : Form
{
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)]
private struct ByteConverter {
[System.Runtime.InteropServices.FieldOffset(0)]
@@ -20,86 +22,84 @@ namespace FalloutClient {
private float f;
public int GetAsInt(float f) {
this.f=f;
this.f = f;
return i;
}
public float GetAsFloat(int i) {
this.i=i;
this.i = i;
return f;
}
public byte[] GetAsBytes(ulong ul) {
byte[] b=new byte[8];
for(int i=0;i<8;i++) b[i]=(byte)((ul&((ulong)0xff<<(i*8)))>>(i*8));
byte[] b = new byte[8];
for (int i = 0; i < 8; i++) b[i] = (byte)((ul & ((ulong)0xff << (i * 8))) >> (i * 8));
return b;
}
}
private static ByteConverter converter=new ByteConverter();
private static ByteConverter converter = new ByteConverter();
private enum Mode { Globals, MapVars, SGlobals, Arrays, Critters }
private readonly EditorConnection connection;
private Mode mode;
private readonly Dictionary<int, string> GlobNames=new Dictionary<int, string>();
private readonly Dictionary<uint, string> CritNames=new Dictionary<uint, string>();
private readonly Dictionary<int, string> GlobNames = new Dictionary<int, string>();
private readonly Dictionary<uint, string> CritNames = new Dictionary<uint, string>();
private void Redraw() {
bEdit.Enabled = false;
Column2.ReadOnly = false;
Column3.ReadOnly = false;
Column2.HeaderText = "Value (Int)";
Column3.HeaderText = "Value (Float)";
dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
dataGridView1.SuspendLayout();
dataGridView1.Rows.Clear();
switch(mode) {
switch (mode) {
case Mode.Globals:
Column2.ReadOnly=false;
Column3.ReadOnly=false;
Column2.HeaderText="Value (Int)";
Column3.HeaderText="Value (Float)";
bEdit.Enabled=false;
for(int i=0;i<connection.Globals.Length;i++) {
string name=GlobNames.ContainsKey(i)?GlobNames[i]:"";
for (int i = 0; i < connection.Globals.Length; i++) {
string name = GlobNames.ContainsKey(i) ? GlobNames[i] : "";
dataGridView1.Rows.Add(i, name, connection.Globals[i], converter.GetAsFloat(connection.Globals[i]));
}
break;
case Mode.MapVars:
Column2.ReadOnly=false;
Column3.ReadOnly=false;
Column2.HeaderText="Value (Int)";
Column3.HeaderText="Value (Float)";
bEdit.Enabled=false;
for(int i=0;i<connection.MapVars.Length;i++) {
for (int i = 0; i < connection.MapVars.Length; i++) {
dataGridView1.Rows.Add(i, "", connection.MapVars[i], converter.GetAsFloat(connection.MapVars[i]));
}
break;
case Mode.SGlobals:
Column2.ReadOnly=false;
Column3.ReadOnly=false;
Column2.HeaderText="Value (Int)";
Column3.HeaderText="Value (Float)";
bEdit.Enabled=false;
for(int i=0;i<connection.SGlobalKeys.Length;i++) {
string s=connection.SGlobalKeys[i]>0xffffffff?new string(System.Text.ASCIIEncoding.ASCII.GetChars(converter.GetAsBytes(connection.SGlobalKeys[i]))):("0x"+connection.SGlobalKeys[i].ToString("x"));
for (int i = 0; i < connection.SGlobalKeys.Length; i++) {
string s = connection.SGlobalKeys[i] > 0xffffffff
? new string(System.Text.ASCIIEncoding.ASCII.GetChars(converter.GetAsBytes(connection.SGlobalKeys[i])))
: (connection.SGlobalKeys[i].ToString());
dataGridView1.Rows.Add(s, "", connection.sGlobals[i], converter.GetAsFloat(connection.sGlobals[i]));
}
break;
case Mode.Arrays:
Column2.ReadOnly=true;
Column3.ReadOnly=true;
Column2.HeaderText="Array length";
Column3.HeaderText="Element size";
bEdit.Enabled=true;
for(int i=0;i<connection.Arrays.Length;i++) {
dataGridView1.Rows.Add(connection.Arrays[i], "", connection.ArrayLengths[i], connection.ArrayDataSizes[i]);
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
Column2.ReadOnly = true;
Column3.ReadOnly = true;
Column2.HeaderText = "Array size";
Column3.HeaderText = "Array flags";
bEdit.Enabled = true;
for (int i = 0; i < connection.Arrays.Length; i++) {
bool isMap = connection.ArrayIsMap[i];
int arrlen = connection.ArrayLengths[i];
if (isMap) arrlen /= 2;
dataGridView1.Rows.Add(connection.Arrays[i], isMap ? "Map" : "", arrlen, "0x" + connection.ArrayFlag[i].ToString("x").ToUpper());
}
break;
case Mode.Critters:
Column2.ReadOnly=true;
Column3.ReadOnly=true;
Column2.HeaderText="pid";
Column3.HeaderText="";
bEdit.Enabled=true;
for(int i=0;i<connection.Critters.Length;i++) {
uint modcrit=(connection.Critters[i]&0xfffff);
string name=CritNames.ContainsKey(modcrit)?CritNames[modcrit]:"";
dataGridView1.Rows.Add(i+1, name, connection.Critters[i].ToString("x"), "");
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
Column2.ReadOnly = true;
Column3.ReadOnly = true;
Column2.HeaderText = "PID";
Column3.HeaderText = "Pointer";
bEdit.Enabled = true;
for (int i = 0; i < connection.Critters.Length / 2; i++) {
uint modcrit = (connection.Critters[i, 0] & 0xfffff);
string name = CritNames.ContainsKey(modcrit) ? CritNames[modcrit] : "";
dataGridView1.Rows.Add(i + 1, name, connection.Critters[i, 0].ToString("x").ToUpper(), connection.Critters[i, 1].ToString());
}
break;
}
@@ -108,21 +108,29 @@ namespace FalloutClient {
internal DebugEditor(EditorConnection connection) {
InitializeComponent();
this.connection=connection;
mode=Mode.Globals;
if(File.Exists("globals.txt")) {
StreamReader sr=new StreamReader("globals.txt");
while(!sr.EndOfStream) {
string[] line=sr.ReadLine().Split(' ');
GlobNames[int.Parse(line[0])]=line[1];
this.connection = connection;
mode = Mode.Globals;
if (File.Exists(".\\data\\data\\vault13.gam")) {
StreamReader sr=new StreamReader(".\\data\\data\\vault13.gam");
int gvar = 0;
while (!sr.EndOfStream) {
string line = sr.ReadLine().TrimStart();
if (line.StartsWith("GVAR_")) GlobNames[gvar++] = line.Remove(line.IndexOf(':')).TrimEnd();
}
sr.Close();
} else if (File.Exists("globals.txt")) {
StreamReader sr = new StreamReader("globals.txt");
while (!sr.EndOfStream) {
string[] line = sr.ReadLine().Split(' ');
GlobNames[int.Parse(line[0])] = line[1];
}
sr.Close();
}
if(File.Exists("critters.txt")) {
StreamReader sr=new StreamReader("critters.txt");
while(!sr.EndOfStream) {
string line=sr.ReadLine();
CritNames[uint.Parse(line.Remove(line.IndexOf(' ')))]=line.Substring(line.IndexOf(' ')+1);
if (File.Exists("critters.txt")) {
StreamReader sr = new StreamReader("critters.txt");
while (!sr.EndOfStream) {
string line = sr.ReadLine();
CritNames[uint.Parse(line.Remove(line.IndexOf(' ')))] = line.Substring(line.IndexOf(' ') + 1);
}
sr.Close();
}
@@ -135,65 +143,67 @@ namespace FalloutClient {
}
private void bGlobals_Click(object sender, EventArgs e) {
mode=Mode.Globals;
mode = Mode.Globals;
Redraw();
}
private void bMapVars_Click(object sender, EventArgs e) {
mode=Mode.MapVars;
mode = Mode.MapVars;
Redraw();
}
private void bSGlobals_Click(object sender, EventArgs e) {
mode=Mode.SGlobals;
mode = Mode.SGlobals;
Redraw();
}
private void bArrays_Click(object sender, EventArgs e) {
mode=Mode.Arrays;
mode = Mode.Arrays;
Redraw();
}
private void bCritters_Click(object sender, EventArgs e) {
mode=Mode.Critters;
mode = Mode.Critters;
Redraw();
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
int[] array=null;
int[] array = null;
DataTypeSend dts;
switch(mode) {
switch (mode) {
case Mode.Globals:
array=connection.Globals;
dts=DataTypeSend.SetGlobal;
array = connection.Globals;
dts = DataTypeSend.SetGlobal;
break;
case Mode.MapVars:
array=connection.MapVars;
dts=DataTypeSend.SetMapVar;
array = connection.MapVars;
dts = DataTypeSend.SetMapVar;
break;
case Mode.SGlobals:
array=connection.sGlobals;
dts=DataTypeSend.SetSGlobal;
array = connection.sGlobals;
dts = DataTypeSend.SetSGlobal;
break;
default:
return;
}
if(e.ColumnIndex==2) {
if (e.ColumnIndex == 2) {
string str = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
int val;
if(!int.TryParse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(), out val)) {
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value=array[e.RowIndex];
if (str == null || !int.TryParse(str, out val)) {
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = array[e.RowIndex];
} else {
array[e.RowIndex]=val;
array[e.RowIndex] = val;
connection.WriteDataType(dts);
connection.WriteInt(e.RowIndex);
connection.WriteInt(val);
}
} else {
string str = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
float val;
if(!float.TryParse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(), out val)) {
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value=array[e.RowIndex];
if (str == null || !float.TryParse(str, out val)) {
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = array[e.RowIndex];
} else {
array[e.RowIndex]=converter.GetAsInt(val);
array[e.RowIndex] = converter.GetAsInt(val);
connection.WriteDataType(dts);
connection.WriteInt(e.RowIndex);
connection.WriteInt(converter.GetAsInt(val));
@@ -202,43 +212,50 @@ namespace FalloutClient {
}
private void bEdit_Click(object sender, EventArgs e) {
if(dataGridView1.SelectedRows.Count!=1) return;
int i=dataGridView1.SelectedRows[0].Index;
switch(mode) {
if (dataGridView1.SelectedRows.Count == 0) return;
int i = (int)dataGridView1.SelectedRows[0].Tag;
switch (mode) {
case Mode.Arrays: {
DataType[] types=new DataType[connection.ArrayLengths[i]];
string[] strings=new string[connection.ArrayLengths[i]];
connection.WriteDataType(DataTypeSend.GetArray);
connection.WriteInt(i);
for(int j=0;j<strings.Length;j++) types[j]=(DataType)connection.ReadInt();
byte[] buf=connection.ReadBytes(connection.ArrayLengths[i]*connection.ArrayDataSizes[i]);
MemoryStream ms=new MemoryStream(buf);
BinaryReader br=new BinaryReader(ms);
for(int j=0;j<strings.Length;j++) {
ms.Position=j*connection.ArrayDataSizes[i];
switch(types[j]) {
DataType[] types = new DataType[connection.ArrayLengths[i]];
int[] lenType = new int[connection.ArrayLengths[i]];
string[] strings = new string[connection.ArrayLengths[i]];
connection.WriteDataType(DataTypeSend.GetArray); // code
connection.WriteInt(i); // index
int lenData = 0;
for (int j = 0; j < strings.Length; j++) {
types[j] = (DataType)connection.ReadInt();
lenType[j] = connection.ReadInt(); // len data of type
lenData += lenType[j];
}
byte[] buf = connection.ReadBytes(lenData); // read data
BinaryReader br = new BinaryReader(new MemoryStream(buf));
for (int j = 0; j < strings.Length; j++) {
switch (types[j]) {
case DataType.None:
br.BaseStream.Position += 4;
break;
case DataType.Int:
strings[j]=br.ReadInt32().ToString();
strings[j] = br.ReadInt32().ToString();
break;
case DataType.Float:
strings[j]=br.ReadSingle().ToString();
strings[j] = br.ReadSingle().ToString();
break;
case DataType.String:
byte[] bytes=br.ReadBytes(connection.ArrayDataSizes[i]);
strings[j]=System.Text.Encoding.ASCII.GetString(bytes, 0, Array.IndexOf<byte>(bytes, 0));
byte[] bytes = br.ReadBytes(lenType[j]);
strings[j] = System.Text.Encoding.ASCII.GetString(bytes, 0, Array.IndexOf<byte>(bytes, 0));
break;
}
}
br.Close();
strings=EditorWindow.ShowEditor(null, types, strings);
if(strings!=null) {
connection.WriteDataType(DataTypeSend.SetArray);
connection.WriteInt(i);
ms=new MemoryStream(connection.ArrayLengths[i]*connection.ArrayDataSizes[i]);
BinaryWriter bw=new BinaryWriter(ms);
for(int j=0;j<strings.Length;j++) {
ms.Position=j*connection.ArrayDataSizes[i];
switch(types[j]) {
strings = EditorWindow.ShowEditor(this, null, types, strings, connection.ArrayIsMap[i]);
if (strings != null) { // save
MemoryStream ms = new MemoryStream(lenData);
BinaryWriter bw = new BinaryWriter(ms);
for (int j = 0; j < strings.Length; j++) {
switch (types[j]) {
case DataType.None:
bw.BaseStream.Position += 4;
break;
case DataType.Int:
bw.Write(int.Parse(strings[j]));
break;
@@ -246,55 +263,82 @@ namespace FalloutClient {
bw.Write(float.Parse(strings[j]));
break;
case DataType.String:
byte[] bytes=System.Text.Encoding.ASCII.GetBytes(strings[j]);
if(bytes.Length<connection.ArrayDataSizes[i]) bw.Write(bytes);
else bw.Write(bytes, 0, connection.ArrayDataSizes[i]-1);
bw.Write(0);
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(strings[j]);
if (bytes.Length < lenType[j])
bw.Write(bytes);
else
bw.Write(bytes, 0, lenType[j] - 1);
bw.Write((byte)0);
break;
}
}
connection.WriteBytes(ms.GetBuffer(), 0, connection.ArrayLengths[i]*connection.ArrayDataSizes[i]);
// send data to sfall
connection.WriteDataType(DataTypeSend.SetArray);
connection.WriteInt(i); // index
connection.WriteInt(lenData);
connection.WriteBytes(ms.GetBuffer(), 0, lenData);
bw.Close();
}
}
break;
case Mode.Critters: {
DataType[] types=new DataType[29];
string[] strings=new string[29];
string[] names=new string[29];
DataType[] types = new DataType[33];
string[] strings = new string[33];
string[] names = new string[33];
connection.WriteDataType(DataTypeSend.RetrieveCritter);
connection.WriteInt(i);
BinaryReader br=new BinaryReader(new System.IO.MemoryStream(connection.ReadBytes(29*4)));
for(int j=0;j<29;j++) {
types[j]=DataType.Int;
strings[j]=br.ReadInt32().ToString();
names[j]="0x"+(j*4).ToString("x");
BinaryReader br = new BinaryReader(new System.IO.MemoryStream(connection.ReadBytes(33 * 4)));
for (int j = 0; j < 33; j++) {
types[j] = DataType.Int;
strings[j] = br.ReadInt32().ToString();
}
br.Close();
names[1]="Tile";
names[10]="Elevation";
names[11]="Inventory count";
names[13]="Inventory pointer";
names[16]="Current AP";
names[17]="Crippled limbs";
names[22]="HP";
names[23]="Rads";
names[24]="Poison";
names[25]="Proto ID";
strings=EditorWindow.ShowEditor(names, types, strings);
if(strings!=null) {
MemoryStream ms=new MemoryStream(29*4);
BinaryWriter bw=new BinaryWriter(ms);
for(int j=0;j<29;j++) bw.Write(int.Parse(strings[j]));
names[0] = " ID";
names[1] = " Tile";
names[6] = " Current frame";
names[7] = " Rotation";
names[8] = " FID";
names[9] = " Flags";
names[10] = " Elevation";
names[11] = " Inventory count";
names[13] = " Inventory pointer";
names[14] = " Reaction";
names[15] = " Combat state";
names[16] = " Current AP";
names[17] = " Combat flags";
names[18] = " Last Turn Damage";
names[19] = " AI Packet";
names[20] = " Team";
names[21] = " Who hit me";
names[22] = " HP";
names[23] = " Rads";
names[24] = " Poison";
names[25] = " Proto ID";
names[26] = " Combat ID";
names[29] = " Outline flags";
names[30] = " Script ID";
names[32] = " Script index";
strings = EditorWindow.ShowEditor(this, names, types, strings);
if (strings != null) {
MemoryStream ms = new MemoryStream(33 * 4);
BinaryWriter bw = new BinaryWriter(ms);
for (int j = 0; j < 33; j++) bw.Write(int.Parse(strings[j]));
connection.WriteDataType(DataTypeSend.SetCritter);
connection.WriteInt(i);
connection.WriteBytes(ms.GetBuffer(), 0, 29*4);
connection.WriteBytes(ms.GetBuffer(), 0, 33 * 4);
bw.Close();
}
}
break;
}
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) {
bEdit.PerformClick();
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
dataGridView1.Rows[e.RowIndex].Tag = e.RowIndex;
}
}
}
+43 -33
View File
@@ -3,7 +3,9 @@ using System.Net.Sockets;
using System.IO;
namespace FalloutClient {
class EditorConnection {
class EditorConnection
{
private TcpClient client;
private NetworkStream stream;
private BinaryReader br;
@@ -11,73 +13,81 @@ namespace FalloutClient {
public readonly int[] Globals;
public readonly int[] MapVars;
public readonly uint[] Critters;
public readonly uint[,] Critters;
public readonly ulong[] SGlobalKeys;
public readonly int[] sGlobals;
public readonly uint[] Arrays;
public readonly int[] ArrayLengths;
public readonly int[] ArrayDataSizes;
public readonly int[] ArrayFlag;
public readonly bool[] ArrayIsMap;
public EditorConnection() {
System.Threading.Thread.Sleep(1000);
client=new TcpClient("127.0.0.1", 4245);
stream=client.GetStream();
br=new BinaryReader(stream);
bw=new BinaryWriter(stream);
Globals=new int[br.ReadInt32()];
MapVars=new int[br.ReadInt32()];
SGlobalKeys=new ulong[br.ReadInt32()];
sGlobals=new int[SGlobalKeys.Length];
Arrays=new uint[br.ReadInt32()];
ArrayLengths=new int[Arrays.Length];
ArrayDataSizes=new int[Arrays.Length];
Critters=new uint[br.ReadInt32()];
client = new TcpClient("127.0.0.1", 4245);
stream = client.GetStream();
br = new BinaryReader(stream);
bw = new BinaryWriter(stream);
Globals = new int[br.ReadInt32()];
MapVars = new int[br.ReadInt32()];
SGlobalKeys = new ulong[br.ReadInt32()];
sGlobals = new int[SGlobalKeys.Length];
Arrays = new uint[br.ReadInt32()];
ArrayLengths = new int[Arrays.Length];
ArrayFlag = new int[Arrays.Length];
ArrayIsMap = new bool[Arrays.Length];
Critters = new uint[br.ReadInt32(), 2];
for(int i=0;i<Globals.Length;i++) Globals[i]=br.ReadInt32();
for(int i=0;i<MapVars.Length;i++) MapVars[i]=br.ReadInt32();
for(int i=0;i<sGlobals.Length;i++) {
SGlobalKeys[i]=br.ReadUInt64();
sGlobals[i]=br.ReadInt32();
for (int i = 0; i < Globals.Length; i++) Globals[i] = br.ReadInt32();
for (int i = 0; i < MapVars.Length; i++) MapVars[i] = br.ReadInt32();
for (int i = 0; i < sGlobals.Length; i++) {
SGlobalKeys[i] = br.ReadUInt64();
sGlobals[i] = br.ReadInt32();
br.ReadInt32();
}
for(int i=0;i<Arrays.Length;i++) {
Arrays[i]=br.ReadUInt32();
ArrayLengths[i]=br.ReadInt32();
ArrayDataSizes[i]=br.ReadInt32();
for (int i = 0; i < Arrays.Length; i++) {
Arrays[i] = br.ReadUInt32();
ArrayIsMap[i] = (br.ReadInt32() != 0);
ArrayLengths[i] = br.ReadInt32();
ArrayFlag[i] = br.ReadInt32();
}
for (int i = 0; i < Critters.Length / 2; i++) {
Critters[i, 0] = br.ReadUInt32();
Critters[i, 1] = br.ReadUInt32();
}
for(int i=0;i<Critters.Length;i++) Critters[i]=br.ReadUInt32();
}
public void Close() {
stream.Close();
client.Close();
stream=null;
client=null;
stream = null;
client = null;
}
public void WriteDataType(DataTypeSend type) {
stream.WriteByte((byte)type);
//bw.Write((byte)type);
}
public void WriteByte(byte b) { bw.Write(b); }
public void WriteInt16(short value) { bw.Write(value); }
public void WriteInt(int value) { bw.Write(value); }
public void WriteBytes(byte[] buf) { bw.Write(buf); }
public void WriteBytes(byte[] buf, int start, int len) {
bw.Write(buf, start, len);
}
public void Read(byte[] buffer) {
int upto=0;
while(upto<buffer.Length) {
upto+=stream.Read(buffer, upto, buffer.Length-upto);
int upto = 0;
while (upto < buffer.Length) {
upto += stream.Read(buffer, upto, buffer.Length - upto);
}
}
public void Read(byte[] buffer, int offset, int length) {
int upto=0;
int upto = 0;
//System.Diagnostics.Debug.WriteLine("Read - offset: "+offset+" length: "+length);
while(upto<length) {
upto+=stream.Read(buffer, offset+upto, length-upto);
while (upto < length) {
upto += stream.Read(buffer, offset + upto, length - upto);
}
}
public int ReadByte() {
+25 -11
View File
@@ -34,8 +34,8 @@
//
// bSave
//
this.bSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bSave.Location = new System.Drawing.Point(281, 265);
this.bSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.bSave.Location = new System.Drawing.Point(12, 336);
this.bSave.Name = "bSave";
this.bSave.Size = new System.Drawing.Size(75, 23);
this.bSave.TabIndex = 0;
@@ -46,7 +46,7 @@
// bCancel
//
this.bCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bCancel.Location = new System.Drawing.Point(200, 265);
this.bCancel.Location = new System.Drawing.Point(371, 336);
this.bCancel.Name = "bCancel";
this.bCancel.Size = new System.Drawing.Size(75, 23);
this.bCancel.TabIndex = 1;
@@ -58,47 +58,61 @@
//
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.AllowUserToDeleteRows = false;
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.AllowUserToResizeRows = false;
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.ColumnHeadersHeight = 22;
this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column1,
this.Column2,
this.Column3});
this.dataGridView1.Location = new System.Drawing.Point(12, 12);
this.dataGridView1.MultiSelect = false;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(344, 247);
this.dataGridView1.RowHeadersVisible = false;
this.dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing;
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect;
this.dataGridView1.Size = new System.Drawing.Size(434, 318);
this.dataGridView1.TabIndex = 2;
this.dataGridView1.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit);
//
// Column1
//
this.Column1.HeaderText = "Name";
this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.Column1.HeaderText = "Element";
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.HeaderText = "Type";
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column2.Width = 75;
//
// Column3
//
this.Column3.HeaderText = "Value";
this.Column3.Name = "Column3";
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column3.Width = 150;
//
// EditorWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(368, 300);
this.ClientSize = new System.Drawing.Size(458, 371);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.bCancel);
this.Controls.Add(this.bSave);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.MinimumSize = new System.Drawing.Size(300, 200);
this.Name = "EditorWindow";
this.Text = "EditorWindow";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Edit Values";
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
+29 -16
View File
@@ -3,31 +3,42 @@ using System.Collections.Generic;
using System.Windows.Forms;
namespace FalloutClient {
public enum DataType : int { None=0, Int=1, Float=2, String=3 }
public partial class EditorWindow : Form {
public enum DataType : int { None = 0, Int = 1, Float = 2, String = 3 }
public partial class EditorWindow : Form
{
private readonly DataType[] types;
private readonly string[] values;
private bool save;
private EditorWindow(string[] names, DataType[] types, string[] values) {
this.types=types;
this.values=values;
private EditorWindow(string[] names, DataType[] types, string[] values, bool isMap) {
this.types = types;
this.values = values;
InitializeComponent();
dataGridView1.SuspendLayout();
if(names==null) for(int i=0;i<types.Length;i++) dataGridView1.Rows.Add(i.ToString(), types[i].ToString(), values[i]);
else for(int i=0;i<types.Length;i++) dataGridView1.Rows.Add(names[i], types[i].ToString(), values[i]);
if (names == null)
for (int i = 0; i < types.Length; i++) {
string element = i.ToString();
if (isMap && (i % 2) == 0) element += " - Key";
dataGridView1.Rows.Add(element, types[i].ToString(), values[i]);
}
else
for (int i = 0; i < types.Length; i++) dataGridView1.Rows.Add("[0x" + (i * 4).ToString("x").ToUpper() + "]" + names[i], types[i].ToString(), values[i]);
dataGridView1.ResumeLayout();
}
public static string[] ShowEditor(string[] names, DataType[] types, string[] values) {
EditorWindow editor=new EditorWindow(names, types, values);
public static string[] ShowEditor(DebugEditor form, string[] names, DataType[] types, string[] values, bool isMap = false) {
EditorWindow editor = new EditorWindow(names, types, values, isMap);
editor.ShowDialog();
if(editor.save) return editor.values;
else return null;
if (editor.save)
return editor.values;
else
return null;
}
private bool CheckInput(DataType type, string str) {
switch(type) {
switch (type) {
case DataType.Int:
int i;
return int.TryParse(str, out i);
@@ -39,9 +50,11 @@ namespace FalloutClient {
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
string str=(string)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if(CheckInput(types[e.RowIndex], str)) values[e.RowIndex]=str;
else dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value=values[e.RowIndex];
string str = (string)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (str != null && CheckInput(types[e.RowIndex], str))
values[e.RowIndex] = str;
else
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = values[e.RowIndex];
}
private void bCancel_Click(object sender, EventArgs e) {
@@ -49,7 +62,7 @@ namespace FalloutClient {
}
private void bSave_Click(object sender, EventArgs e) {
save=true;
save = true;
Close();
}
}
+12 -6
View File
@@ -12,17 +12,23 @@ namespace FalloutClient {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if(args.Length==1&&args[0]=="-debugedit") {
if (args.Length == 1 && args[0] == "-debugedit") {
Application.Run(new DebugEditor(new EditorConnection()));
} else {
throw new Exception("Multiplayer is no longer supported");
MessageBox.Show("The debug editor can only be run from the game.",
"sfall Debug Editor", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
}
enum DataTypeSend {
Mouse=0, LMouseDown=1, LMouseUp=2, RMouseDown=3, RMouseUp=4, TakeChar=5, ReleaseChar=6,
SetGlobal=0, SetMapVar=1, RetrieveCritter=2, SetCritter=3, SetSGlobal=4, GetArray=9, SetArray=10,
Exit=254
}
SetGlobal = 0,
SetMapVar = 1,
RetrieveCritter = 2,
SetCritter = 3,
SetSGlobal = 4,
GetArray = 9,
SetArray = 10,
Exit = 254
}
}
+5 -5
View File
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("FalloutClient")]
[assembly: AssemblyTitle("sfall Debug Editor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FalloutClient")]
[assembly: AssemblyCopyright("Copyright © 2009")]
[assembly: AssemblyProduct("sfall")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("4.1.7.0")]
[assembly: AssemblyFileVersion("4.1.7.0")]
@@ -16,6 +16,21 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>false</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -33,6 +48,8 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@@ -62,6 +79,18 @@
<DependentUpon>EditorWindow.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
@@ -71,6 +100,7 @@
</Target>
-->
<PropertyGroup>
<PostBuildEvent>copy "$(TargetPath)" "C:\Games\Fallout2\$(TargetName)$(TargetExt)"</PostBuildEvent>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MPClient", "MPClient.csproj", "{80ED0DCE-100E-4EC9-A79D-2FBFA4CAD1E3}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SfallDebugEditor", "SfallDebugEditor.csproj", "{80ED0DCE-100E-4EC9-A79D-2FBFA4CAD1E3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
+6 -5
View File
@@ -14,17 +14,18 @@ Part_0=1 ; Tell sfall that we want to modify the head entries
[c_00_0] ; The entries for the head table of the men critter type.
e0_DamageMultiplier=100 ;First level critical
e0_EffectFlags=0
e0_EffectFlags=0 ; The value of the flags (see DAM_* in Define.h)
; For multiple effects, use the sum of the flags (e.g. 2050 = knocked down + bypass armor)
e0_StatCheck=0
e0_StatMod=0
e0_FailureEffect=0
e0_Message=0 ; This is an index into the msg file, not a string
e0_FailMessage=0
e1_... ; Second level critical
... ; And so on up to the hardest hitting level 5 critical
e5_...
;e1_... ; Second level critical
;... ; And so on up to the hardest hitting level 5 critical
;e5_...
;You can skip any entries from this section to leave them at their defaults
;Any missing entries for critters 19-37 will be replaced by a 0, since they have no default
;Note that the UOP fixes are included in the defaults, and do not need to be
; added manually when using this override format, as opposed to the old one
; added manually when using this override format, as opposed to the old one
+30
View File
@@ -0,0 +1,30 @@
; Allows you to configure advanced settings for drugs.
; Maximum 50 drugs are allowed
; Note: for vanilla drugs, you can only override the values of NumEffect and AddictTime parameters
[main]
; set to 1 to change Jet addiction to be removed after the time expires
JetWithdrawal=0
; total number of drugs in this file
Count=0
; count starts from 1
[1]
; drug item PID
PID=0
; set a limit on the count of first and second delayed effects when using the drug, i.e. if the queue has delayed effects from the drug,
; and their count is greater or equal to NumEffects, it is not possible to obtain new effects from using the drug
; this count is 4 for Buffout/Mentats/Psycho/Jet
; set -1 to leave this parameter unchanged
NumEffects=-1
; the duration of the addiction effect in game minutes (i.e. 1440 = 24 game hours)
; set to 0 to use the default time (7 days for all drugs except Jet)
AddictTime=0
; the number of the global variable from vault13.gam responsible for displaying addiction in the character screen
; set to 0 if the addiction is not required
GvarID=0
; the index number from editor.msg to display the title of the addiction (the description uses the index number of TextID + 100)
TextID=-1
; the line number (0-indexed) of the corresponding FRM in skilldex.lst
FrmID=-1
+45 -4
View File
@@ -8,7 +8,7 @@
; be used to remove their hardcoded effects, and add new stat/skill effects
;Name=The name of the perk (max 63 characters)
;Desc=The description of the perk (max 1023 characters)
;Desc=The description of the perk (max 255 characters)
;Image=The line number (0-indexed) of the corresponding FRM in skilldex.lst
;Ranks=The number of perk levels
;Level=The minimum required level
@@ -35,10 +35,18 @@
;If the value is set to -99999, the variable will be ignored (similar to comment out that line)
;This is a modification to perk 119
[119]
;You can add simple extra perks with ID numbers from 119 to 255
; that do not require using scripting functions to change player stats, and can also be used for Armor perks
;These parameters are only for extra perks
;Stat1-Stat2 = same as Stat
;Stat1Mag-Stat2Mag = same as StatMag
;Skill3-Skill5 = The skill to be modified (or -1 for none)
;Skill3Mod-Skill5Mod = The increased/decreased value to the modified skill
;This is a modification to vanilla perk 0
[0]
Name=Example
Desc=This is an example perk~Second line
Desc=This is an example perk description
Image=72
Ranks=1
Level=1
@@ -57,6 +65,39 @@ INT=0
AGL=0
LCK=0
;Example for creating extra perks
[119]
Name=Extra Perk
Desc=This perk can change player stats and skills
Image=72
Ranks=1
Level=2
Type=0
Stat=-1
StatMag=0
Skill1=-1
Skill1Mag=0
Skill2=-1
Skill2Mag=0
STR=0
PER=0
END=0
CHR=0
INT=0
AGL=0
LCK=0
; for extra perks only
Stat1=-1
Stat1Mag=0
Stat2=-1
Stat2Mag=0
Skill3=-1
Skill3Mod=0
Skill4=-1
Skill4Mod=0
Skill5=-1
Skill5Mod=0
;This is a modification to trait 0
[t0]
NoHardcode=0
+2 -1
View File
@@ -10,8 +10,9 @@ SaveSfallDataFail=ERROR saving extended savegame information! Check if other pro
PartyLvlMsg=Lvl:
PartyACMsg=AC:
PartyAddictMsg=Addict
NPCPickupFail=%s cannot pick up the item.
[AppearanceMod]
RaceText=Race
StyleText=Style
MainButtonText=Appearance
DoneBtn=Done
+6 -5
View File
@@ -1,12 +1,13 @@
; Allows to reassign books to different object PIDs, text messages.
; Maximum 30 books are allowed (25 if overrideVanilla is 0)
; Allows to reassign books to different object PIDs, text messages, and skills.
; Maximum 50 books are allowed
[main]
; total number of books in this file
count=5
count=1
; set to 1 to override all vanilla books, so you will have to define ALL books in this file;
; otherwise only new books are defined here
; set to 1 to override all vanilla books, so you will have to define ALL the necessary books in this file;
; otherwise only new books are defined here. To just override the text/skill of a vanilla book,
; specify its PID in the new book and set the parameters
overrideVanilla=0
; count starts from 1
+2
View File
@@ -41,6 +41,7 @@ Mode=0
;Choose a notification box to display the name of the controlled critter above the interface bar
;Must be between 5 and (4 + the value of BoxBarCount in ddraw.ini)
;For sfall 4.1.6+ the number for the notification box is set automatically, so just use any value
;Set to 0 to disable
DisplayName=0
@@ -52,4 +53,5 @@ DisplayName=0
;4 - dark yellow
;5 - blue
;6 - purple
;7 - dull pink
DisplayNameColor=0
+75 -42
View File
@@ -1,12 +1,20 @@
;sfall configuration settings
;v4.1.4
;v4.1.8
[Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
UseCommandLine=0
;Uncomment and point to a file to get alternate translations for some sfall messages
;TranslationsINI=./Translations.ini
;TranslationsINI=.\Translations.ini
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[ExtraPatches]
;This section allows you to set multiple paths to folders containing mods or patches that will be loaded by the game
;The priority of read files will be higher than the files in patchXXX.dat. If DataLoadOrderPatch is enabled, the data load order will be:
;master_patches > critter_patches > PatchFile99 - PatchFile0 > patchXXX.dat > ...
;Paths to folders and Fallout .dat files are supported. The available range for PatchFile option names is from 0 to 99
;PatchFile0=mods\RP_data
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Sound]
@@ -22,7 +30,7 @@ AllowSoundForFloats=1
;This does not effect the play_sfall_sound and stop_sfall_sound script functions
AllowDShowSound=0
;Set to 1 to override the music path used by default if not present in the cfg
;Set to 1 to override the music path used by default (i.e. data\sound\music\) if not present in the cfg
;Set to 2 to overwrite all occurances of the music path
OverrideMusicDir=2
@@ -34,18 +42,21 @@ Enable=1
;The speeds corresponding to each slot in percent. (i.e. 100 is normal speed)
SpeedMulti0=50
SpeedMulti1=100
SpeedMulti2=150
SpeedMulti3=200
SpeedMulti4=300
SpeedMulti2=200
SpeedMulti3=300
SpeedMulti4=400
SpeedMulti5=500
SpeedMulti6=1000
SpeedMulti7=100
SpeedMulti8=100
SpeedMulti9=100
SpeedMulti6=600
SpeedMulti7=700
SpeedMulti8=800
SpeedMulti9=900
;The initial speed at game startup
SpeedMultiInitial=100
;Set to 1 to also affect the playback speed of mve video files without an audio track
AffectPlayback=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Graphics]
;Set to 0 for 8 bit fullscreen
@@ -67,8 +78,11 @@ GraphicsHeight=0
;GPU is faster, but requires v2.0 pixel shader support
GPUBlt=0
;Set to 1 to allow using 32 bit graphics for talking heads
;Requires graphics mode 4 or 5, and GPUBlt set to 1
;Set to 1 to allow using 32-bit textures for talking heads
;The texture files should be placed in art\heads\<name of the talking head FRM file>\ (w/o extension)
;The files in the folder should be numbered according to the number of frames in the talking head FRM file (0.png, 1.png, etc.)
;See the text file in the modders pack for a detailed description
;Requires DX9 graphics mode and v2.0 pixel shader support (see GPUBlt option)
Use32BitHeadGraphics=0
;Set to 1 to automatically search for alternative avi video files when Fallout tries to play the game movies
@@ -81,7 +95,7 @@ FadeMultiplier=100
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Input]
;Set to 1 to enable the mouse scroll wheel to scroll through inventory, barter, and loot screens
;Set to 1 to enable the mouse scroll wheel to scroll through the inventory, barter, and loot screens
UseScrollWheel=1
;The mouse Z position is divided by this modifier to calculate the number of inventory
@@ -155,12 +169,10 @@ DebugEditorKey=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Misc]
;Time limit in years. Must be between -3 and 13
;Set to 0 if you want to die the instant you leave arroyo
;Set to -1 to remove the time limit, and automatically reset the date back to 2241 each time you would have reached it
;Set to -2 to remove the time limit without resetting the date. The game will lock up on 8th of March 2255
;Set to -3 to remove the time limit, automatically reset the date, but override Fallout's GetDate function to return the correct year
;Set to -2 or -3 to remove the time limit, automatically reset the date, but override Fallout's GetDate function to return the correct year
TimeLimit=13
;World map travel time percentage modifier
@@ -168,9 +180,6 @@ TimeLimit=13
;100 is normal speed, 0 stops time from passing
WorldMapTimeMod=100
;Set to 1 to enable functions relating to overriding the file system
UseFileSystemOverride=0
;Set to 1 to use the Fallout 1 code to control world map speed
WorldMapFPSPatch=1
@@ -197,20 +206,20 @@ WorldMapSlots=0
;To use a config file other than fallout2.cfg, uncomment the next line and add the name of your new file
;ConfigFile=
;Set to 1 to enable functions relating to overriding the file system
UseFileSystemOverride=0
;To use a patch file other than patch000.dat, uncomment the next line and add your new file name
;If you want to check for multiple patch files, you can include a %d in the file name (sprintf syntax)
;By default, only the first patch file found will be used.
;If you want to load multiple patch files (up to 1000) at once, uncomment the MultiPatches line and set it to 1
;If you want to load multiple patch files (up to 1000) at once, you can include a %d in the file name (sprintf syntax)
;PatchFile=patch%03d.dat
;MultiPatches=0
;Set to 1 to use the modified data load order for the engine to find game data
;Original: patchXXX.dat > critter_patches > critter_dat > f2_res_patches > f2_res_dat > master_patches > master_dat
;Modified: master_patches > critter_patches > patchXXX.dat > critter_dat > f2_res_patches > f2_res_dat > master_dat
DataLoadOrderPatch=0
;Set to 1 to enable loading alternative dialog msg files from text/language/dialog_female/ for female PC
;Set to 2 to also load subtitle files from text/language/cuts_female/ for female PC
;Set to 1 to enable loading alternative dialog msg files from text\<language>\dialog_female\ for female PC
;Set to 2 to also load subtitle files from text\<language>\cuts_female\ for female PC
FemaleDialogMsgs=0
;To change the default and starting player models, uncomment the next four lines.
@@ -247,7 +256,7 @@ Movie17=credits.mve
;StartDay=-1
;To change the limit of the distance away from the player to which you're allowed to scroll the local maps, uncomment the next two lines
;Defaults are 0x1E0 in the x direction and 0x190 in the y direction.
;Defaults are 480 in the x direction and 400 in the y direction.
;Not compatible with the res patch!
;LocalMapXLimit=480
;LocalMapYLimit=400
@@ -346,18 +355,19 @@ PlayIdleAnimOnReload=0
;Set to 1 to prevent corpses from blocking line of fire
CorpseLineOfFireFix=0
;Changes the timer (in days) for deleting corpses on a map after you leave (valid range: 0..13)
;The corpses of critters with 'Ages' flag or on maps with 'dead_bodies_age=No' set in maps.txt will not disappear
;Default is 6. Set to 0 for a 12-hour timer
CorpseDeleteTime=6
;Set a number of milliseconds to idle each input loop
;Set to -1 to disable
;Set to 0 to idle only if other processes are waiting for processor time
;Set to 1 (or some higher number if needed, the maximum is 127) to prevent 100% CPU use
ProcessorIdle=-1
;Set a number of how many protos per type can be loaded into memory at once (valid range: 512..4096)
;Set to -1 to let set_proto_data script function automatically increase the limit when needed
LoadProtoMaxLimit=-1
;Set to 1 if using the hero appearance mod
;You can add AppChCrt.frm and AppChEdt.frm files to art/intrface/ to set a custom background for the character screen
;You can add AppChCrt.frm and AppChEdt.frm files to art\intrface\ to set a custom background for the character screen
EnableHeroAppearanceMod=0
;Set to 1 to skip the 3 opening movies
@@ -377,7 +387,7 @@ AIDrugUsePerfFix=0
;Allows the use of tiles over 80*36 in size. sfall will just split and resave them at startup
;Set to 1 to check all tiles on started (slow)
;Set to 2 if you provide a XLtiles.lst file in art/tiles/ containing a list of the tile ids that need checking
;Set to 2 if you provide a XLtiles.lst file in art\tiles\ containing a list of the tile ids that need checking
AllowLargeTiles=0
;Set to 1 to boost the maximum number of tile FRMs from 4096 to 16383
@@ -477,17 +487,21 @@ NPCStage6Fix=0
;2 - Restoring the -1 AP bonus for HtH attacks (i.e. Fallout 1 behaviour)
FastShotFix=1
;Set to 1 to boost the maximum number of script names from 1450 to 10000
BoostScriptDialogLimit=0
;Allows you to edit the skill tables
;Point the next line at an ini file containing the replacement skill data
;SkillsFile=Skills.ini
;Set to 1 to boost the maximum number of script names from 1450 to 10000
BoostScriptDialogLimit=0
;To change the relationship between SPECIAL stats and derived stats, uncomment the next line
;See the Stats.ini in the modders pack for an example file
;DerivedStats=Stats.ini
;Allows you to change some parameters for drugs and their addictions
;See the Drugs.ini in the modders pack for an example file
;DrugsFile=Drugs.ini
;These options modify the checks to see if a critter can carry an additional item, changing which items are counted towards the weight limit and adding an additional size check
;Set the mode to 0 to disable the size check, 1 to apply to the PC only, 2 to apply to the PC and party members, or 3 to apply to all critters
;Only the PC uses CritterInvSizeLimit. Other critters will use the unused stat (STAT_unused = 10) or have the size limit of 100 if the stat is not set
@@ -532,6 +546,13 @@ ObjCanHearObjFix=0
;If the argument value is -1, the mood will be determined by the local variable 0 of the script (vanilla behavior)
StartGDialogFix=0
;Set to 1 to fix and repurpose the unused called_shot/num_attacks arguments of attack_complex script function
;This also changes the behavior of the result flags arguments
;called_shot - additional damage, when the damage received by the target is above the specified minimum damage
;num_attacks - the number of free action points on the first turn only
;attacker_results - unused, must be 0 or not equal to the target_results argument when specifying result flags for the target
AttackComplexFix=0
;Set to 1 to enable the balanced bullet distribution formula for burst attacks
ComputeSprayMod=0
@@ -592,9 +613,6 @@ ReloadReserve=-1
;Set to 1 to change the counter in the 'Move Items' window to start at the maximum number of items
ItemCounterDefaultMax=0
;Allows 9 options (lines of text) to be displayed correctly in a dialog window
DialogOptions9Lines=1
;Set to 1 to leave the music playing in dialogue with talking heads
EnableMusicInDialogue=0
@@ -605,7 +623,7 @@ DontTurnOffSneakIfYouRun=0
;Set to 0 to disable switching. (Default is 3)
UseWalkDistance=3
;Set to 1 to fix the bug that unable to sell used geiger counters or stealth boys
;Set to 1 to fix the bug of being unable to sell used geiger counters or stealth boys
CanSellUsedGeiger=1
;Set to 1 to fix the issue with being able to charge the car by using cells on other scenary/critters
@@ -631,7 +649,7 @@ WorldMapFontPatch=0
;Set to 1 to keep the selected attack mode when moving the weapon between active item slots
KeepWeaponSelectMode=1
;Set to 1 to display full item description for weapon/ammo in barter screen
;Set to 1 to display full item description for weapon/ammo in the barter screen
FullItemDescInBarter=0
;Set to 1 to display experience points with the bonus from Swift Learner perk when gained from non-scripted situations
@@ -654,13 +672,21 @@ SkipLoadingGameSettings=0
;Set to 1 to prevent the inventory/loot/automap interfaces from being placed on top of other script-created windows
InterfaceDontMoveOnTop=0
;Overrides the global variable number used to show the special death message of the Modoc toilet explosion
;Set to -1 to disable the special death message when the global variable is set
SpecialDeathGVAR=491
;Set to 1 to disable the special handling of map IDs 19 and 37 in the engine when entering the maps
;Note that enabling this option can break the map changes in Modoc and Vault 15
DisableSpecialMapIDs=0
;Set to 1 to display sfall built-in credits at the bottom of credits.txt contents instead of at the top
CreditsAtBottom=0
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[Scripts]
;Comma-separated list of masked paths to load global scripts from
;Only use single slash \ as directory separator
;Only use single backslash \ as the directory separator
;Paths outside of scripts folder are supported
GlobalScriptPaths=scripts\gl*.int,scripts\sfall\gl*.int
@@ -700,7 +726,7 @@ SkipSizeCheck=0
;Does not require sfall debugging mode
;ExtraCRC=0x00000000,0x00000000
;Set to 1 to stop Fallout from deleting non readonly protos at startup
;Set to 1 to stop Fallout from deleting non read-only protos at startup
;Has pretty nasty side effects when saving/reloading, so don't use for regular gameplay
DontDeleteProtos=0
@@ -713,6 +739,13 @@ AlwaysFindScripts=0
;Set to 1 to force sfall to inject all hooks code into the game, even if corresponding hook scripts don't exist
InjectAllGameHooks=0
;Set to 1 to hide error messages in debug output when a null value is passed to the function as an object
HideObjIsNullMsg=0
;Set to 1 to force critters to display combat float messages
;Requires AllowSoundForFloats to be enabled
Test_ForceFloats=0
;These options control what output is saved in the debug log (sfall-log.txt)
;Prints messages duing sfall initialization
@@ -0,0 +1,201 @@
;Glovz's Damage Fix
; PID_EXPLOSIVE_ROCKET
[1]
pid=14
ac_adjust=-10
dr_adjust=0
dam_mult=1
dam_div=1
; PID_10MM_JHP
[2]
pid=29
ac_adjust=0
dr_adjust=0
dam_mult=2
dam_div=1
; PID_10MM_AP
[3]
pid=30
ac_adjust=-5
dr_adjust=0
dam_mult=1
dam_div=2
; PID_44_MAGNUM_JHP
[4]
pid=31
ac_adjust=0
dr_adjust=-10
dam_mult=2
dam_div=1
; PID_FLAMETHROWER_FUEL
[5]
pid=32
ac_adjust=-20
dr_adjust=0
dam_mult=1
dam_div=1
; PID_14MM_AP
[6]
pid=33
ac_adjust=-5
dr_adjust=-30
dam_mult=1
dam_div=2
; PID_223_FMJ
[7]
pid=34
ac_adjust=-15
dr_adjust=-15
dam_mult=2
dam_div=2
; PID_5MM_JHP
[8]
pid=35
ac_adjust=0
dr_adjust=-15
dam_mult=2
dam_div=1
; PID_5MM_AP
[9]
pid=36
ac_adjust=-5
dr_adjust=-15
dam_mult=1
dam_div=2
; PID_ROCKET_AP
[10]
pid=37
ac_adjust=-10
dr_adjust=0
dam_mult=1
dam_div=2
; PID_SMALL_ENERGY_CELL
[11]
pid=38
ac_adjust=-20
dr_adjust=0
dam_mult=2
dam_div=1
; PID_MICRO_FUSION_CELL
[12]
pid=39
ac_adjust=-20
dr_adjust=0
dam_mult=2
dam_div=1
; PID_SHOTGUN_SHELLS
[13]
pid=95
ac_adjust=-15
dr_adjust=0
dam_mult=3
dam_div=1
; PID_44_FMJ_MAGNUM
[14]
pid=111
ac_adjust=-5
dr_adjust=-10
dam_mult=2
dam_div=2
; PID_9MM_BALL
[15]
pid=121
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_BBS
[16]
pid=163
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_ROBO_ROCKET_AMMO
[17]
pid=274
ac_adjust=-10
dr_adjust=-10
dam_mult=1
dam_div=1
; PID_45_CALIBER_AMMO
[18]
pid=357
ac_adjust=0
dr_adjust=-5
dam_mult=2
dam_div=1
; PID_2MM_EC_AMMO
[19]
pid=358
ac_adjust=-25
dr_adjust=-20
dam_mult=1
dam_div=3
; PID_4_7MM_CASELESS
[20]
pid=359
ac_adjust=-5
dr_adjust=-25
dam_mult=1
dam_div=2
; PID_9MM_AMMO
[21]
pid=360
ac_adjust=0
dr_adjust=0
dam_mult=2
dam_div=1
; PID_HN_NEEDLER_CARTRIDGE
[22]
pid=361
ac_adjust=-20
dr_adjust=-5
dam_mult=1
dam_div=1
; PID_HN_AP_NEEDLER_CARTRIDGE
[23]
pid=362
ac_adjust=-20
dr_adjust=-5
dam_mult=1
dam_div=2
; PID_7_62MM_AMMO
[24]
pid=363
ac_adjust=-10
dr_adjust=-20
dam_mult=2
dam_div=2
; PID_FLAMETHROWER_FUEL_MK_II
[25]
pid=382
ac_adjust=-20
dr_adjust=-15
dam_mult=1
dam_div=1
+201
View File
@@ -0,0 +1,201 @@
;YAAM
; PID_EXPLOSIVE_ROCKET
[1]
pid=14
ac_adjust=0
dr_adjust=0
dam_mult=3
dam_div=2
; PID_10MM_JHP
[2]
pid=29
ac_adjust=0
dr_adjust=0
dam_mult=3
dam_div=2
; PID_10MM_AP
[3]
pid=30
ac_adjust=0
dr_adjust=4
dam_mult=1
dam_div=1
; PID_44_MAGNUM_JHP
[4]
pid=31
ac_adjust=0
dr_adjust=0
dam_mult=3
dam_div=2
; PID_FLAMETHROWER_FUEL
[5]
pid=32
ac_adjust=-20
dr_adjust=0
dam_mult=3
dam_div=4
; PID_14MM_AP
[6]
pid=33
ac_adjust=0
dr_adjust=8
dam_mult=1
dam_div=1
; PID_223_FMJ
[7]
pid=34
ac_adjust=-20
dr_adjust=5
dam_mult=1
dam_div=1
; PID_5MM_JHP
[8]
pid=35
ac_adjust=0
dr_adjust=0
dam_mult=3
dam_div=2
; PID_5MM_AP
[9]
pid=36
ac_adjust=0
dr_adjust=4
dam_mult=1
dam_div=1
; PID_ROCKET_AP
[10]
pid=37
ac_adjust=0
dr_adjust=20
dam_mult=1
dam_div=1
; PID_SMALL_ENERGY_CELL
[11]
pid=38
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_MICRO_FUSION_CELL
[12]
pid=39
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_SHOTGUN_SHELLS
[13]
pid=95
ac_adjust=-10
dr_adjust=0
dam_mult=1
dam_div=1
; PID_44_FMJ_MAGNUM
[14]
pid=111
ac_adjust=0
dr_adjust=5
dam_mult=1
dam_div=1
; PID_9MM_BALL
[15]
pid=121
ac_adjust=0
dr_adjust=2
dam_mult=3
dam_div=2
; PID_BBS
[16]
pid=163
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_ROBO_ROCKET_AMMO
[17]
pid=274
ac_adjust=0
dr_adjust=10
dam_mult=1
dam_div=1
; PID_45_CALIBER_AMMO
[18]
pid=357
ac_adjust=0
dr_adjust=0
dam_mult=1
dam_div=1
; PID_2MM_EC_AMMO
[19]
pid=358
ac_adjust=-30
dr_adjust=9
dam_mult=3
dam_div=2
; PID_4_7MM_CASELESS
[20]
pid=359
ac_adjust=-5
dr_adjust=7
dam_mult=3
dam_div=2
; PID_9MM_AMMO
[21]
pid=360
ac_adjust=0
dr_adjust=2
dam_mult=1
dam_div=1
; PID_HN_NEEDLER_CARTRIDGE
[22]
pid=361
ac_adjust=-10
dr_adjust=2
dam_mult=1
dam_div=1
; PID_HN_AP_NEEDLER_CARTRIDGE
[23]
pid=362
ac_adjust=-10
dr_adjust=5
dam_mult=2
dam_div=1
; PID_7_62MM_AMMO
[24]
pid=363
ac_adjust=-5
dr_adjust=2
dam_mult=1
dam_div=1
; PID_FLAMETHROWER_FUEL_MK_II
[25]
pid=382
ac_adjust=-20
dr_adjust=0
dam_mult=1
dam_div=1
Binary file not shown.
@@ -0,0 +1,63 @@
/*
Ammo INI Loader mod for Fallout 2 by NovaRain
---------------------------------------------
- modifies ammo protos with data from an INI file:
* AmmoGlovz.ini if DamageFormula=1 or 2 in ddraw.ini
* AmmoYAAM.ini if DamageFormula=5 in ddraw.ini
* AmmoMod.ini if not using any bulit-in damage formula
Requires sfall 3.5 or higher
*/
#include "..\headers\define_extra.h"
procedure set_ammo_mod;
procedure start;
procedure map_enter_p_proc;
variable ammoIni;
variable enabled;
procedure set_ammo_mod begin
variable pid, dmg_mod, i := 1;
while (i > 0) do begin
pid := get_ini_setting(ammoIni + "|" + i + "|pid");
if (pid < 1) then break;
set_proto_data(pid, PROTO_AM_AC_MOD, get_ini_setting(ammoIni + "|" + i + "|ac_adjust"));
set_proto_data(pid, PROTO_AM_DR_MOD, get_ini_setting(ammoIni + "|" + i + "|dr_adjust"));
// dam_mult and dam_div must be positive integers
dmg_mod := get_ini_setting(ammoIni + "|" + i + "|dam_mult");
if (dmg_mod < 1) then dmg_mod := 1;
set_proto_data(pid, PROTO_AM_DMG_MULT, dmg_mod);
dmg_mod := get_ini_setting(ammoIni + "|" + i + "|dam_div");
if (dmg_mod < 1) then dmg_mod := 1;
set_proto_data(pid, PROTO_AM_DMG_DIV, dmg_mod);
i++;
end
//debug_msg("AmmoMod: " + ammoIni + " - set " + (i - 1) + " ammo protos.");
end
procedure start begin
if game_loaded then begin
ammoIni := get_ini_setting("ddraw.ini|Misc|DamageFormula");
if (ammoIni == 1 or ammoIni == 2) then
ammoIni := "AmmoGlovz.ini";
else if (ammoIni == 5) then
ammoIni := "AmmoYAAM.ini";
else
ammoIni := "AmmoMod.ini";
enabled := get_ini_setting(ammoIni + "|1|pid");
if (enabled > 0) then call set_ammo_mod;
end
end
procedure map_enter_p_proc begin
if (enabled > 0) then call set_ammo_mod;
end

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