Skip to content

Commit a06c362

Browse files
committed
LoadEventIndices
1 parent 8b191f7 commit a06c362

File tree

2 files changed

+50
-18
lines changed

2 files changed

+50
-18
lines changed

source/game_sa/DecisionMakers/DecisionMakerTypes.cpp

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ void CDecisionMakerTypes::InjectHooks() {
88

99
RH_ScopedGlobalInstall(GetInstance, 0x4684F0, { .reversed = false });
1010

11-
//RH_ScopedOverloadedInstall(LoadEventIndices, "", 0x5BB9F0, int32(CDecisionMakerTypes::*)(int32 *, const char*), { .reversed = false });
12-
RH_ScopedOverloadedInstall(LoadEventIndices, "", 0x600840, void(CDecisionMakerTypes::*)(), { .reversed = false });
11+
RH_ScopedOverloadedInstall(LoadEventIndices, "", 0x5BB9F0, void(CDecisionMakerTypes::*)(EventIndicesArray &, const char*));
12+
RH_ScopedOverloadedInstall(LoadEventIndices, "", 0x600840, void(CDecisionMakerTypes::*)());
1313
//RH_ScopedInstall(HasResponse, 0x6042B0, { .reversed = false });
1414
RH_ScopedInstall(RemoveDecisionMaker, 0x6043A0, { .reversed = false });
1515
RH_ScopedInstall(FlushDecisionMakerEventResponse, 0x604490, { .reversed = false });
@@ -56,8 +56,36 @@ void CDecisionMakerTypes::FlushDecisionMakerEventResponse(int32 decisionMakerInd
5656
plugin::CallMethod<0x604490>(this, decisionMakerIndex, eventId);
5757
}
5858

59+
// 0x5BB9F0
60+
void CDecisionMakerTypes::LoadEventIndices(EventIndicesArray& out, const char* filepath) {
61+
out.fill(0);
62+
63+
CFileMgr::SetDir("");
64+
CFileMgr::SetDir("data\\decision\\");
65+
const auto file = CFileMgr::OpenFile(filepath, "r");
66+
CFileMgr::SetDir("");
67+
if (!file) {
68+
NOTSA_LOG_WARN("Failed to open decision maker event indices file: {}", filepath);
69+
return;
70+
}
71+
for (int32 count = 0;;) {
72+
char line[256];
73+
if (!CFileMgr::ReadLine(file, line, sizeof(line))) {
74+
break;
75+
}
76+
if (line[0] && line[0] != '\n') {
77+
int32 index{};
78+
char name[256]{};
79+
VERIFY(sscanf_s(line, "%s %d", SCANF_S_STR(name), index) == 2);
80+
out[index] = count++;
81+
}
82+
}
83+
CFileMgr::CloseFile(file);
84+
}
85+
86+
// 0x600840
5987
void CDecisionMakerTypes::LoadEventIndices() {
60-
plugin::CallMethod<0x600840>(this);
88+
LoadEventIndices(m_EventIndices, "PedEvent.txt");
6189
}
6290

6391
// 0x6070F0

source/game_sa/DecisionMakers/DecisionMakerTypes.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ enum class eDecisionMakerType : int32 {
3939
};
4040

4141
class CDecisionMakerTypes {
42+
private:
43+
using EventIndicesArray = std::array<int32, +eEventType::EVENT_TOTAL_NUM_EVENTS>;
44+
4245
public:
4346
static constexpr auto NUM_TYPES = 20u;
4447

@@ -49,22 +52,23 @@ class CDecisionMakerTypes {
4952

5053
static CDecisionMakerTypes* GetInstance();
5154

52-
int32 AddDecisionMaker(CDecisionMaker* decisionMaker, eDecisionTypes decisionMakerType, bool bDecisionMakerForMission);
53-
void MakeDecision(CPed* ped, eEventType eventType, int32 eventSourceType, bool bIsPedInVehicle, eTaskType taskTypeToAvoid1, eTaskType taskTypeToAvoid2, eTaskType taskTypeToAvoid3, eTaskType taskTypeToSeek, bool bUseInGroupDecisionMaker, int16& taskType, int16& facialTaskType);
54-
void RemoveDecisionMaker(eDecisionTypes dm);
55+
int32 AddDecisionMaker(CDecisionMaker* decisionMaker, eDecisionTypes decisionMakerType, bool bDecisionMakerForMission);
56+
void MakeDecision(CPed* ped, eEventType eventType, int32 eventSourceType, bool bIsPedInVehicle, eTaskType taskTypeToAvoid1, eTaskType taskTypeToAvoid2, eTaskType taskTypeToAvoid3, eTaskType taskTypeToSeek, bool bUseInGroupDecisionMaker, int16& taskType, int16& facialTaskType);
57+
void RemoveDecisionMaker(eDecisionTypes dm);
5558
eTaskType MakeDecision(CPedGroup* pedGroup, eEventType eventType, int32 eventSourceType, bool bIsPedInVehicle, eTaskType taskId1, eTaskType taskId2, eTaskType taskId3, eTaskType taskId4);
56-
void AddEventResponse(int32 decisionMakerIndex, eEventType eventType, eTaskType taskId, float* responseChances, int32* flags);
57-
void FlushDecisionMakerEventResponse(int32 decisionMakerIndex, eEventType eventId);
58-
void LoadEventIndices();
59-
int32 CopyDecisionMaker(int32 index, eDecisionTypes type, bool isDecisionMakerForMission);
59+
void AddEventResponse(int32 decisionMakerIndex, eEventType eventType, eTaskType taskId, float* responseChances, int32* flags);
60+
void FlushDecisionMakerEventResponse(int32 decisionMakerIndex, eEventType eventId);
61+
void LoadEventIndices(EventIndicesArray& out, const char* filepath);
62+
void LoadEventIndices();
63+
int32 CopyDecisionMaker(int32 index, eDecisionTypes type, bool isDecisionMakerForMission);
6064

6165
public:
62-
int32 m_NoOfDecisionMakers{};
63-
CDecisionMaker m_DecisionMakers[+eDecisionMakerType::COUNT_TOTAL]{};
64-
int32 m_EventIndices[+eEventType::EVENT_TOTAL_NUM_EVENTS]{};
65-
CDecisionMaker m_DefaultRandomPedDecisionMaker{};
66-
CDecisionMaker m_DefaultMissionPedDecisionMaker{};
67-
CDecisionMaker m_DefaultPlayerPedDecisionMaker{};
68-
CDecisionMaker m_DefaultRandomPedGroupDecisionMaker{};
69-
CDecisionMaker m_DefaultMissionPedGroupDecisionMaker{};
66+
int32 m_NoOfDecisionMakers{};
67+
CDecisionMaker m_DecisionMakers[+eDecisionMakerType::COUNT_TOTAL]{};
68+
EventIndicesArray m_EventIndices{};
69+
CDecisionMaker m_DefaultRandomPedDecisionMaker{};
70+
CDecisionMaker m_DefaultMissionPedDecisionMaker{};
71+
CDecisionMaker m_DefaultPlayerPedDecisionMaker{};
72+
CDecisionMaker m_DefaultRandomPedGroupDecisionMaker{};
73+
CDecisionMaker m_DefaultMissionPedGroupDecisionMaker{};
7074
};

0 commit comments

Comments
 (0)