Skip to content

Commit

Permalink
Added VATS menu check
Browse files Browse the repository at this point in the history
  • Loading branch information
adm244 committed Jun 30, 2018
1 parent 5e580d5 commit befce98
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 6 deletions.
60 changes: 60 additions & 0 deletions code/f4/functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,26 @@ typedef TESCell * (__fastcall *_TESWorldSpace_FindExteriorCellByCoordinates)
internal _TESWorldSpace_FindExteriorCellByCoordinates TESWorldSpace_FindExteriorCellByCoordinates;
// ------ #TESWorldSpace ------

// ------ BSFixedString ------
typedef BSFixedString * (__fastcall *_BSFixedString_Constructor)
(BSFixedString *ptr, char *str);

typedef BSFixedString * (__fastcall *_BSFixedString_Set)
(BSFixedString *ptr, char *str);

typedef void (__fastcall *_BSFixedString_Release)(BSFixedString *ptr);

internal _BSFixedString_Constructor BSFixedString_Constructor;
internal _BSFixedString_Set BSFixedString_Set;
internal _BSFixedString_Release BSFixedString_Release;
// ------ #BSFixedString ------

// ------ TESUI ------
typedef bool (__fastcall *_TESUI_IsMenuOpen)(void *TESUIObject, BSFixedString *str);

internal _TESUI_IsMenuOpen TESUI_IsMenuOpen;
// ------ #TESUI ------

// ------ Utils ------
//NOTE(adm244): prints out a c-style formated string into the game console
typedef void (__fastcall *_TESConsolePrint)
Expand Down Expand Up @@ -243,6 +263,13 @@ extern "C" {
uint64 TESConsolePrintAddress;
uint64 TESConsoleObjectAddress;

uint64 TESUIObjectAddress;
uint64 TESUIIsMenuOpenAddress;

uint64 BSFixedStringConstructorAddress;
uint64 BSFixedStringSetAddress;
uint64 BSFixedStringReleaseAddress;

uint64 TESFormConstructorAddress;

uint64 TESGlobalScriptCompileAddress;
Expand Down Expand Up @@ -291,6 +318,13 @@ internal void DefineAddresses()
TESConsolePrintAddress = 0x01262830;
TESConsoleObjectAddress = 0x0591AB30;

TESUIObjectAddress = 0x0590A918;
TESUIIsMenuOpenAddress = 0x020420E0;

BSFixedStringConstructorAddress = 0x01B416E0;
BSFixedStringSetAddress = 0x01B41810;
BSFixedStringReleaseAddress = 0x01B42970;

TESFormConstructorAddress = 0x00151E30;

TESGlobalScriptCompileAddress = 0x004E7B30;
Expand Down Expand Up @@ -335,6 +369,13 @@ internal void DefineAddresses()
TESConsolePrintAddress = 0x01260EE0;
TESConsoleObjectAddress = 0x058FEEB0;

TESUIObjectAddress = 0x058EEC98;
TESUIIsMenuOpenAddress = 0x02040780;

BSFixedStringConstructorAddress = 0x01B3FD80;
BSFixedStringSetAddress = 0x01B3FEB0;
BSFixedStringReleaseAddress = 0x01B41010;

TESFormConstructorAddress = 0x00151E30;

TESGlobalScriptCompileAddress = 0x004E7B10;
Expand Down Expand Up @@ -387,6 +428,13 @@ internal void ShiftAddresses()
TESConsolePrint = (_TESConsolePrint)(TESConsolePrintAddress + baseAddress);
TESConsoleObjectAddress += baseAddress;

TESUIObjectAddress += baseAddress;
TESUI_IsMenuOpen = (_TESUI_IsMenuOpen)(TESUIIsMenuOpenAddress + baseAddress);

BSFixedString_Constructor = (_BSFixedString_Constructor)(BSFixedStringConstructorAddress + baseAddress);
BSFixedString_Set = (_BSFixedString_Set)(BSFixedStringSetAddress + baseAddress);
BSFixedString_Release = (_BSFixedString_Release)(BSFixedStringReleaseAddress + baseAddress);

TESForm_Constructor = (_TESForm_Constructor)(TESFormConstructorAddress + baseAddress);

TESGlobalScript_Compile = (_TESGlobalScript_Compile)(TESGlobalScriptCompileAddress + baseAddress);
Expand Down Expand Up @@ -556,6 +604,18 @@ internal inline bool IsPlayerInDialogue()
{
return IsInDialogueWithPlayer((TESActor *)TES_GetPlayer());
}

internal inline bool IsMenuOpen(char *str)
{
bool result = false;

BSFixedString bsString = {0};
BSFixedString_Constructor(&bsString, str);
result = TESUI_IsMenuOpen(*((void **)TESUIObjectAddress), &bsString);
BSFixedString_Release(&bsString);

return result;
}
// ------ #Functions ------

#endif
11 changes: 8 additions & 3 deletions code/f4/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,19 +255,24 @@ struct TESWeather {

#pragma warning(push)
#pragma warning(disable : 4200)
struct TESTextureData {
struct BSFixedStringData {
void *unk00;
uint16 unk08;
uint16 unk0A;
uint32 unk0C;
uint64 strLength; // 0x10
uint32 strLength; // 0x10
uint32 unk14;
char str[0]; // 0x18
};
#pragma warning(pop)

struct BSFixedString {
BSFixedStringData *data; // 0x0
};

struct TESTextureDataObject {
void *unk00;
TESTextureData *textureData;
BSFixedStringData *textureName;
};

struct TESWeatherType {
Expand Down
15 changes: 12 additions & 3 deletions code/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,10 @@ OTHER DEALINGS IN THE SOFTWARE.
- Remove random counters clear timer
- Implement @timeout command to delay batch lines execution
- Check if player is in dialogue
- Check if menu is opened
- Check if vats is active
TODO:
- Add comments support to batch files
- Rewrite hooking mechanism (detours)
- Rewrite batch file structure (meta data + actual commands)
- Draw game overlay
Expand Down Expand Up @@ -253,9 +256,15 @@ internal DWORD WINAPI QueueHandler(LPVOID data)
}

if( IsActivated(&CommandRandom) ) {
int index = RandomInt(0, batches_count - 1);
/*int index = RandomInt(0, batches_count - 1);
QueuePut(&BatchQueue, (pointer)&batches[index]);
DisplayRandomSuccessMessage(batches[index].description);
DisplayRandomSuccessMessage(batches[index].description);*/

/*if (IsMenuOpen("VATSMenu")) {
DisplayMessage("Menu IS opened.");
} else {
DisplayMessage("Menu is NOT opened.");
}*/

/*if (IsInMenuMode()) {
DisplayMessage("IS menu mode.");
Expand Down Expand Up @@ -283,7 +292,7 @@ internal DWORD WINAPI QueueHandler(LPVOID data)

internal bool IsActivationPaused()
{
return IsPlayerInDialogue() || IsInMenuMode();
return IsPlayerInDialogue() || IsInMenuMode() || IsMenuOpen("VATSMenu");
}

extern "C" void GameLoop()
Expand Down

0 comments on commit befce98

Please sign in to comment.