mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Added new HOOK_CARTRAVEL #90
This commit is contained in:
@@ -48,6 +48,7 @@
|
||||
#define HOOK_INVENWIELD (25)
|
||||
#define HOOK_ADJUSTFID (26)
|
||||
#define HOOK_COMBATTURN (27)
|
||||
#define HOOK_CARTRAVEL (28)
|
||||
|
||||
//Valid arguments to list_begin
|
||||
#define LIST_CRITTERS (0)
|
||||
|
||||
@@ -464,3 +464,17 @@ int arg3 - unknown boolean argument
|
||||
|
||||
int ret1 - pass 1 at the start of turn to skip the turn, pass -1 at the end of turn to force end of combat
|
||||
|
||||
|
||||
-------------------------------------------
|
||||
|
||||
HOOK_CARTRAVEL (hs_cartravel.int)
|
||||
|
||||
Runs continously during worldmap travel on car.
|
||||
|
||||
int arg1 - vanilla car speed (between 3 and 8 "steps")
|
||||
int arg2 - vanilla fuel consumption (100 and below)
|
||||
|
||||
int ret1 - car speed override (pass -1 if you just want to override fuel consumption)
|
||||
int ret2 - fuel consumption override
|
||||
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ WRAP_WATCOM_FUNC2(long, db_fwriteInt, DbFile*, file, long, value)
|
||||
// perform combat turn for a given critter
|
||||
WRAP_WATCOM_FUNC2(long, combat_turn, GameObject*, critter, long, isDudeTurn)
|
||||
WRAP_WATCOM_FUNC1(long, critter_is_dead, GameObject*, critter)
|
||||
WRAP_WATCOM_FUNC1(long, game_get_global_var, long, globalVar)
|
||||
WRAP_WATCOM_FUNC1(long, gmouse_set_cursor, long, picNum)
|
||||
WRAP_WATCOM_FUNC1(Window*, GNW_find, long, winRef)
|
||||
WRAP_WATCOM_FUNC0(long, intface_is_item_right_hand)
|
||||
@@ -87,5 +88,7 @@ WRAP_WATCOM_FUNC1(void, win_hide, DWORD, winRef)
|
||||
WRAP_WATCOM_FUNC1(BYTE*, win_get_buf, DWORD, winRef)
|
||||
WRAP_WATCOM_FUNC1(void, win_draw, DWORD, winRef)
|
||||
WRAP_WATCOM_FUNC1(void, win_delete, DWORD, winRef)
|
||||
WRAP_WATCOM_FUNC1(void, wmCarUseGas, long, gasAmount)
|
||||
WRAP_WATCOM_FUNC0(void, wmPartyWalkingStep)
|
||||
WRAP_WATCOM_FUNC2(DbFile*, xfopen, const char*, fileName, const char*, flags)
|
||||
WRAP_WATCOM_FUNC3(long, xfseek, DbFile*, file, long, fOffset, long, origin)
|
||||
|
||||
@@ -16,7 +16,7 @@ VAR_(bottom_line, DWORD)
|
||||
VAR_(btable, DWORD)
|
||||
VAR_(btncnt, DWORD)
|
||||
VAR_(carCurrentArea, DWORD)
|
||||
VAR_(carGasAmount, DWORD) // from 0 to 80000
|
||||
VAR_(carGasAmount, long) // from 0 to 80000
|
||||
VAR_(cmap, DWORD)
|
||||
VAR_(colorTable, DWORD)
|
||||
VAR_(combat_free_move, DWORD)
|
||||
|
||||
@@ -54,6 +54,7 @@ enum HookType
|
||||
HOOK_INVENWIELD = 25,
|
||||
HOOK_ADJUSTFID = 26,
|
||||
HOOK_COMBATTURN = 27,
|
||||
HOOK_CARTRAVEL = 28,
|
||||
HOOK_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -22,10 +22,10 @@ static void __declspec(naked) UseObjOnHook() {
|
||||
cmp cRet, 1;
|
||||
jl defaulthandler;
|
||||
mov eax, rets[0];
|
||||
jmp end
|
||||
defaulthandler :
|
||||
call fo::funcoffs::protinst_use_item_on_
|
||||
end :
|
||||
jmp end;
|
||||
defaulthandler:
|
||||
call fo::funcoffs::protinst_use_item_on_;
|
||||
end:
|
||||
hookend;
|
||||
retn;
|
||||
}
|
||||
@@ -44,8 +44,8 @@ static void __declspec(naked) UseObjOnHook_item_d_take_drug() {
|
||||
cmp cRet, 1;
|
||||
jl defaulthandler;
|
||||
mov eax, rets[0];
|
||||
jmp end
|
||||
defaulthandler :
|
||||
jmp end;
|
||||
defaulthandler:
|
||||
call fo::funcoffs::item_d_take_drug_;
|
||||
end:
|
||||
hookend;
|
||||
@@ -202,6 +202,61 @@ nevermind:
|
||||
}
|
||||
}
|
||||
|
||||
static constexpr long maxGasAmount = 80000;
|
||||
static void CarTravelHookScript() {
|
||||
BeginHook();
|
||||
argCount = 2;
|
||||
// calculate vanilla speed
|
||||
int carSpeed = 3;
|
||||
if (fo::func::game_get_global_var(fo::GVAR_CAR_BLOWER)) {
|
||||
carSpeed += 1;
|
||||
}
|
||||
if (fo::func::game_get_global_var(fo::GVAR_NEW_RENO_CAR_UPGRADE)) {
|
||||
carSpeed += 1;
|
||||
}
|
||||
if (fo::func::game_get_global_var(fo::GVAR_NEW_RENO_SUPER_CAR)) {
|
||||
carSpeed += 3;
|
||||
}
|
||||
// calculate vanilla fuel consumption
|
||||
int originalGas = fo::var::carGasAmount;
|
||||
fo::var::carGasAmount = maxGasAmount;
|
||||
fo::func::wmCarUseGas(100);
|
||||
int consumption = maxGasAmount - fo::var::carGasAmount;
|
||||
|
||||
// run script
|
||||
args[0] = carSpeed;
|
||||
args[1] = consumption;
|
||||
RunHookScript(HOOK_CARTRAVEL);
|
||||
|
||||
// override travel speed
|
||||
if (cRet > 0 && static_cast<long>(rets[0]) >= 0) {
|
||||
carSpeed = rets[0];
|
||||
}
|
||||
// move car on map
|
||||
for (int i = 0; i < carSpeed; ++i) {
|
||||
fo::func::wmPartyWalkingStep();
|
||||
}
|
||||
|
||||
// override fuel consumption
|
||||
if (cRet > 1) {
|
||||
consumption = static_cast<long>(rets[1]);
|
||||
}
|
||||
// consume fuel
|
||||
fo::var::carGasAmount = max(originalGas - consumption, 0);
|
||||
|
||||
EndHook();
|
||||
}
|
||||
|
||||
static const DWORD CarTravelHack_back = 0x4BFF43;
|
||||
static void __declspec(naked) CarTravelHack() {
|
||||
__asm {
|
||||
pushad;
|
||||
call CarTravelHookScript;
|
||||
popad;
|
||||
jmp CarTravelHack_back;
|
||||
}
|
||||
}
|
||||
|
||||
void InitMiscHookScripts() {
|
||||
LoadHookScript("hs_useobjon", HOOK_USEOBJON);
|
||||
HookCalls(UseObjOnHook, { 0x49C606, 0x473619 });
|
||||
@@ -240,6 +295,10 @@ void InitMiscHookScripts() {
|
||||
0x458403
|
||||
});
|
||||
MakeJump(0x456BA2, PerceptionRangeBonusHack);
|
||||
|
||||
LoadHookScript("hs_cartravel", HOOK_CARTRAVEL);
|
||||
MakeJump(0x4BFEF1, CarTravelHack);
|
||||
BlockCall(0x4BFF6E); // vanilla wnCarUseGas(100) call
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+12
-12
@@ -222,7 +222,7 @@ static __declspec(naked) void PathfinderFix() {
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyWorldLimitsPatches() {
|
||||
void WorldLimitsPatches() {
|
||||
DWORD date = GetConfigInt("Misc", "LocalMapXLimit", 0);
|
||||
if (date) {
|
||||
dlog("Applying local map x limit patch.", DL_INIT);
|
||||
@@ -268,7 +268,7 @@ void ApplyWorldLimitsPatches() {
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyTimeLimitPatch() {
|
||||
void TimeLimitPatch() {
|
||||
int limit = GetConfigInt("Misc", "TimeLimit", 13);
|
||||
if (limit == -2) {
|
||||
limit = 14;
|
||||
@@ -313,7 +313,7 @@ void ApplyTimeLimitPatch() {
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyTownMapsHotkeyFix() {
|
||||
void TownMapsHotkeyFix() {
|
||||
if (GetConfigInt("Misc", "TownMapHotkeysFix", 1)) {
|
||||
dlog("Applying town map hotkeys patch.", DL_INIT);
|
||||
MakeCall(0x4C4945, wmTownMapFunc_hack);
|
||||
@@ -321,7 +321,7 @@ void ApplyTownMapsHotkeyFix() {
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyWorldmapFpsPatch() {
|
||||
void WorldmapFpsPatch() {
|
||||
if (GetConfigInt("Misc", "WorldMapFPSPatch", 0)) {
|
||||
dlog("Applying world map fps patch.", DL_INIT);
|
||||
if (*(DWORD*)0x4BFE5E != 0x8d16) {
|
||||
@@ -349,7 +349,7 @@ void ApplyWorldmapFpsPatch() {
|
||||
}
|
||||
}
|
||||
|
||||
void ApplyPathfinderFix() {
|
||||
void PathfinderFixInit() {
|
||||
//if(GetConfigInt("Misc", "PathfinderFix", 0)) {
|
||||
dlog("Applying pathfinder patch.", DL_INIT);
|
||||
SafeWrite32(0x004C1FF2, ((DWORD)&PathfinderFix3) - 0x004c1ff6);
|
||||
@@ -359,7 +359,7 @@ void ApplyPathfinderFix() {
|
||||
//}
|
||||
}
|
||||
|
||||
void ApplyStartingStatePatches() {
|
||||
void StartingStatePatches() {
|
||||
int date = GetConfigInt("Misc", "StartYear", -1);
|
||||
if (date > 0) {
|
||||
dlog("Applying starting year patch.", DL_INIT);
|
||||
@@ -411,12 +411,12 @@ void ApplyStartingStatePatches() {
|
||||
}
|
||||
|
||||
void Worldmap::init() {
|
||||
ApplyPathfinderFix();
|
||||
ApplyStartingStatePatches();
|
||||
ApplyTimeLimitPatch();
|
||||
ApplyTownMapsHotkeyFix();
|
||||
ApplyWorldLimitsPatches();
|
||||
ApplyWorldmapFpsPatch();
|
||||
PathfinderFixInit();
|
||||
StartingStatePatches();
|
||||
TimeLimitPatch();
|
||||
TownMapsHotkeyFix();
|
||||
WorldLimitsPatches();
|
||||
WorldmapFpsPatch();
|
||||
|
||||
LoadGameHook::OnGameReset() += []() {
|
||||
SetCarInterfaceArt(0x1B1);
|
||||
|
||||
Reference in New Issue
Block a user