Replaced 'Take All' hotkey mod with UI hotkeys mod

Minor edits to documents.
This commit is contained in:
NovaRain
2019-08-26 21:47:52 +08:00
parent ab5d7fdf97
commit b2fa359e3c
11 changed files with 87 additions and 41 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
Master Theif cheat for fallout 2 by phobos2077
----------------------------------------
Master Thief cheat for fallout 2 by phobos2077
----------------------------------------------
- forces all steal attempts to succeed
@@ -1,20 +0,0 @@
procedure start;
// adjust include paths if needed
#include "..\..\scripting_docs\headers\sfall.h"
#include "..\..\scripting_docs\headers\dik.h"
procedure start begin
if game_loaded then begin
register_hook(HOOK_KEYPRESS);
end else begin
variable
event := get_sfall_arg,
keyDX := get_sfall_arg;
if (event == 1) and (keyDX == DIK_SEMICOLON) then begin
tap_key(DIK_CAPITAL);
tap_key(DIK_A);
tap_key(DIK_CAPITAL);
end
end
end
@@ -1,9 +0,0 @@
"Take All" Hotkey mod for Fallout 2 by NovaRain
----------------------------------------
- makes pressing the semicolon key send an uppercase A after a semicolon.
- Note: the uppercase A (shift + A if Caps Lock is off) is the built-in hotkey for the TAKE ALL button on the loot screen.
To use, copy *.int file to your scripts folder.
This mod is a simple example of how you can use HOOK_KEYPRESS hooks.
Binary file not shown.
@@ -0,0 +1,52 @@
/*
UI Hotkeys mod for Fallout 2 by NovaRain
----------------------------------------
- closes some game interfaces by pressing their hotkeys again:
* 'I' key for Inventory
* 'S' key for Skilldex
* 'Z' key for Pip-Boy
- extends the functionality of the 'Space' key (Caps Lock must be off):
* takes all items in the loot screen
* makes the offer in the barter screen
Requires sfall 3.5 or higher
*/
#include "..\headers\sfall\sfall.h"
#include "..\headers\sfall\dik.h"
procedure start;
procedure start begin
if game_loaded then begin
register_hook(HOOK_KEYPRESS);
end else begin
variable
event := get_sfall_arg,
keyDX := get_sfall_arg,
mode;
if (event) then begin
mode := get_game_mode;
if (keyDX == DIK_I and (mode bwand INVENTORY)) then begin
tap_key(DIK_ESCAPE);
end else if (keyDX == DIK_S and (mode bwand SKILLDEX)) then begin
tap_key(DIK_ESCAPE);
end else if (keyDX == DIK_Z and (mode bwand PIPBOY)) then begin
tap_key(DIK_ESCAPE);
end else if (keyDX == DIK_SPACE) then begin
if (mode bwand INTFACELOOT) then begin
tap_key(DIK_CAPITAL);
tap_key(DIK_A);
tap_key(DIK_CAPITAL);
end else if (mode bwand BARTER) then begin
tap_key(DIK_M);
end
end
end
end
end
@@ -0,0 +1,22 @@
UI Hotkeys mod for Fallout 2 by NovaRain
----------------------------------------
- closes some game interfaces by pressing their hotkeys again:
* 'I' key for Inventory
* 'S' key for Skilldex
* 'Z' key for Pip-Boy
- extends the functionality of the 'Space' key (Caps Lock must be off):
* takes all items in the loot screen
* makes the offer in the barter screen
- Note:
* the uppercase 'A' (shift + A if Caps Lock is off) is the built-in hotkey for the TAKE ALL button on the loot screen
* the lowercase 'm' is the built-in hotkey for the OFFER button on the barter screen
Requires sfall 3.5 or higher
To use, copy gl_uihotkeys.int to your scripts folder.
This mod is a simple example of how you can use HOOK_KEYPRESS hooks.
+1 -1
View File
@@ -47,7 +47,7 @@ Changes argument value. The argument number (argnum) is 0-indexed. This is usefu
> void register_hook(int hooktype)
Used from a normal global script if you want to run it at the same point a full hook script would normally run. In case of this function, "start" proc will be executed in a current global script. You can use all above functions like normal.
> void register_hook_proc(int hooktype, proc procedure)
> void register_hook_proc(int hook, procedure proc)
The same as register_hook, except that you specifically define which procedure in the current script should be called as a hook (instead of "start"). Pass procedure the same as how you use dialog option functions. This IS the recommended way to use hook scripts, as it gives both modularity (each mod logic in a separate global script, no conflicts if you don't use "hs_*.int" scripts) and flexibility (you can place all related hook scripts for specific mod in a single script!).
NOTE: you can hook several scripts to a single hook point, for example if it's different mods from different authors or just some different aspects of one larger mod. In this case scripts are executed in reverse order of how they were registered. When one of the scripts in a chain returns value with "set_sfall_return", the next script may override this value if calls "set_sfall_return" again. Sometimes you need to multiply certain value in a chain of hook scripts.
+1
View File
@@ -90,6 +90,7 @@ DWORD _stdcall GetHSArg();
DWORD* _stdcall GetHSArgs();
void _stdcall SetHSArg(DWORD id, DWORD value);
void _stdcall SetHSReturn(DWORD d);
// register hook by proc num (special values: -1 - use default (start) procedure, 0 - unregister)
void _stdcall RegisterHook(fo::Program* script, int id, int procNum);
+8 -8
View File
@@ -103,7 +103,7 @@ static void __declspec(naked) gnw_main_hack() {
}
static fo::PathNode* __fastcall RemoveDatabase(const char* pathPatches) {
auto paths = fo::var::paths; // curr.node (beginning of the load order)
auto paths = fo::var::paths; // curr.node (beginning of the chain of paths)
auto _paths = paths; // prev.node
while (paths) {
@@ -111,9 +111,9 @@ static fo::PathNode* __fastcall RemoveDatabase(const char* pathPatches) {
fo::PathNode* nextPaths = paths->next; // pointer to the node of the next path
// TODO: need to check if this condition is used correctly
if (paths != _paths)
_paths->next = nextPaths; // replace the pointer in the previous node, removing the current(found) path from the load order
_paths->next = nextPaths; // replace the pointer in the previous node, removing the current(found) path from the chain
else // if the current node is equal to the previous node
fo::var::paths = nextPaths; // set the next node at the beginning of the load order
fo::var::paths = nextPaths; // set the next node at the beginning of the chain
return paths; // return the pointer of the current removed node (save the pointer)
}
_paths = paths; // prev.node <- curr.node
@@ -122,7 +122,7 @@ static fo::PathNode* __fastcall RemoveDatabase(const char* pathPatches) {
return nullptr; // it's possible that this will create an exceptional situation for the game, although such a situation should not arise
}
// Remove master_patches from the load order
// Remove master_patches from the chain
static void __declspec(naked) game_init_databases_hack1() {
__asm {
cmp eax, -1;
@@ -135,7 +135,7 @@ skip:
}
}
// Remove critter_patches from the load order
// Remove critter_patches from the chain
static void __declspec(naked) game_init_databases_hack2() {
__asm {
cmp eax, -1;
@@ -169,14 +169,14 @@ static void __fastcall game_init_databases_hook() {
if (!patchFiles.empty()) InitExtraPatches();
fo::PathNode* critter_patches = (fo::PathNode*)fo::var::critter_db_handle;
fo::PathNode* paths = fo::var::paths; // beginning of the load order
// insert master_patches/critter_patches at the beginning of the load order
fo::PathNode* paths = fo::var::paths; // beginning of the chain of paths
// insert master_patches/critter_patches at the beginning of the chain of paths
if (critter_patches) {
critter_patches->next = paths; // critter_patches.next -> paths
paths = critter_patches;
}
master_patches->next = paths; // master_patches.next -> paths
fo::var::paths = master_patches; // set master_patches node at the beginning of the load order
fo::var::paths = master_patches; // set master_patches node at the beginning of the chain of paths
}
static bool NormalizePath(std::string &path) {
+1 -1
View File
@@ -94,7 +94,7 @@ static long GetGlobalVarNameString(OpcodeContext& ctx) {
}
static void GetGlobalVar(OpcodeContext& ctx, DataType type) {
long result;
long result;
if (ctx.arg(0).isString()) {
result = GetGlobalVarNameString(ctx);
} else {