Compare commits

..
57 Commits
Author SHA1 Message Date
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
117 changed files with 5217 additions and 3226 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
+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
+1 -1
View File
@@ -14,4 +14,4 @@ PartyAddictMsg=Addict
[AppearanceMod]
RaceText=Race
StyleText=Style
MainButtonText=Appearance
DoneBtn=Done
+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
+37 -13
View File
@@ -1,5 +1,5 @@
;sfall configuration settings
;v4.1.5
;v4.1.7
[Main]
;Change to 1 if you want to use command line args to tell sfall to use another ini file.
@@ -8,6 +8,14 @@ UseCommandLine=0
;Uncomment and point to a file to get alternate translations for some sfall messages
;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]
;Sets the number of allowed simultaneous sound effects
@@ -70,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
@@ -84,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
@@ -158,7 +169,6 @@ 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
@@ -200,11 +210,8 @@ WorldMapSlots=0
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
@@ -348,6 +355,11 @@ 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
@@ -479,17 +491,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
@@ -640,7 +656,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
@@ -663,6 +679,14 @@ 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
+46
View File
@@ -0,0 +1,46 @@
/*
Example implementation of the algorithm of how the game engine checks the Sneak skill
*/
#include "..\headers\define.h"
#include "..\headers\command.h"
#include "..\headers\sfall\sfall.h"
procedure start;
procedure start begin
if game_loaded then begin
register_hook(HOOK_SNEAK);
end else begin
variable sneakIsSuccess, time, level;
level := critter_skill_level(dude_obj, SKILL_SNEAK);
if (roll_vs_skill(dude_obj, SKILL_SNEAK, 0) < ROLL_SUCCESS) then begin
sneakIsSuccess := false;
time := ONE_GAME_MINUTE;
if (level <= 250) then
if (level <= 200) then
if (level <= 170) then
if (level <= 135) then
if (level <= 100) then
if (level > 80) then
time := 400; // 40 secs
else
time := 300; // 30 secs
else
time := 200; // 20 secs
else
time := 150; // 15 secs
else
time := 120; // 12 secs
else
time := 100; // 10 secs for skill level > 250
end
else begin
sneakIsSuccess := true;
time := ONE_GAME_MINUTE;
end
set_sfall_return(sneakIsSuccess);
set_sfall_return(time);
end
end
Binary file not shown.
+9 -3
View File
@@ -13,7 +13,7 @@
NOTE: this script requires compiler from sfall modderspack with -s option
(short circuit evaluation)
version 1.0
version 1.1
**/
@@ -67,7 +67,7 @@ procedure KeyPressHandler begin
scanCode := get_sfall_arg,
scanner, charges;
if scanCode == highlightKey and not(get_game_mode bwand INTFACELOOT) then begin
if scanCode == highlightKey and not(get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
if pressed then begin
isHighlight := true;
if motionScanner then begin
@@ -106,12 +106,17 @@ procedure CombatTurnHandler begin
end
procedure GameModeChangeHandler begin
if isHighlight and (get_game_mode bwand INTFACELOOT) then begin
if isHighlight and (get_game_mode bwand (INTFACELOOT bwor BARTER)) then begin
isHighlight := false;
call ToggleHighlight(false);
end
end
procedure InventoryMoveHandler begin
// remove item outline when player picks up the item
if (isHighlight and get_sfall_arg == 7) then set_outline(get_sfall_arg, 0);
end
procedure start begin
if game_loaded and (sfall_ver_major >= 4) then begin
call InitConfigs;
@@ -130,5 +135,6 @@ procedure start begin
register_hook_proc(HOOK_KEYPRESS, KeyPressHandler);
register_hook_proc(HOOK_COMBATTURN, CombatTurnHandler);
register_hook_proc(HOOK_GAMEMODECHANGE, GameModeChangeHandler);
register_hook_proc(HOOK_INVENTORYMOVE, InventoryMoveHandler);
end
end
Binary file not shown.
+12 -2
View File
@@ -96,7 +96,11 @@ procedure invenwield_handler begin
if (critter and item and slot == INVEN_TYPE_WORN) then begin
fid := check_armor_change(critter, item, isWorn);
if (fid != -1) then begin
art_change_fid_num(critter, fid);
if art_exists(fid) then begin
art_change_fid_num(critter, fid);
end else begin
debug_msg("Error: NPC Armor mod: missing FID.");
end
end
return;
end
@@ -118,7 +122,13 @@ procedure adjustfid_handler begin
armor := critter_inven_obj(dude_obj, INVEN_TYPE_WORN);
fid := check_armor_change(dude_obj, armor, armor != 0);
if (fid != -1) then begin
set_sfall_return(fid);
variable weapAnim := get_sfall_arg bwand 0xF000;
variable newFid := fid bwand 0xFFFF0FFF bwor weapAnim;
if art_exists(newFid) then begin
set_sfall_return(newFid);
end else begin
debug_msg("Error: NPC Armor mod: missing FID.");
end
end
end
end
Binary file not shown.

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