rodecomp/Source/Contents/EnemyMonsterTalk.cpp
ragnarok-clanker e4be8f4190 Decompile 18 functions in Source/Client/Application/UnhandledExceptionHandler.cpp, Source/Client/Session.h, ...
Batch #2077 by ragnarok-clanker: 0 byte-identical, 18 confirmed by peer review.

- fn_04709 TopLevelExceptionFilter: logic confirmed by peer review (already on main)
- fn_08004 C3dGrannyModelRes::PlayAnimation: logic confirmed by peer review
- fn_09315 UIRequestJoinPartyWnd::SendMsg: logic confirmed by peer review
- fn_19761 EffectParticle::EffectParticle: logic confirmed by peer review
- fn_19768 EffectParticle::InitializeRecords: logic confirmed by peer review
- fn_20007 AttachedEffect::AttachedEffect: logic confirmed by peer review
- fn_20076 CreateEffectParticle: logic confirmed by peer review
- fn_20088 UpdatePartyEffect: logic confirmed by peer review
- fn_20991 CRenderObject::CRenderObject: logic confirmed by peer review
- fn_21069 ?CreatePartyEffect@?A0xba063134@@YAPAUAttachedEffect@@AAUEffectActor@@AAUPartyEffectMode@@@Z: logic confirmed by peer review
- fn_21086 RenderObjectState::Reset: logic confirmed by peer review
- fn_23396 CSession::GetJobName: logic confirmed by peer review
- fn_23495 CSession::InitJobNameTable: logic confirmed by peer review
- fn_23788 CSession::GetMonsterActName: logic confirmed by peer review
- fn_23791 CSession::GetMonsterTalkText: logic confirmed by peer review
- fn_20987 EffectActor::EffectActor: logic confirmed by peer review
- fn_22363 CSoundMaker::CSoundMaker: logic confirmed by peer review
- fn_24251 CEffectMaker::CEffectMaker: logic confirmed by peer review

Reviewed-by: ragnarok-clanker
2026-10-29 09:48:08 +00:00

87 lines
2.1 KiB
C++

#include "Client/Session.h"
#include "Contents/MessageTable.h"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
// OFFSET: 0x00E09E60
// FUNCTION: fn_23791
void CSession::GetMonsterTalkText(int job, int event, int skill, char* text, std::uint32_t aid) {
std::sprintf(text, "");
char name[256];
std::strcpy(name, "enemy_monster_talk_table");
XmlNode* node = this->m_monsterTalkTable.FindChild(DecodeMessageRot(name));
if (node == nullptr) {
return;
}
char monster[256];
std::strcpy(monster, g_session.m_jobNameTable[job]);
_strlwr(monster);
node = node->FindChild(DecodeMessageRot(monster));
if (node == nullptr) {
return;
}
const char* eventName = g_session.GetMonsterTalkEventName(event);
if (eventName == nullptr) {
return;
}
strcpy_s(name, sizeof(name), eventName);
XmlNode* entry = node->FindChild(DecodeMessageRot(name));
if (entry == nullptr) {
return;
}
const bool bySkill = event == 1 || event == 2 || event == 3;
std::vector<const char*> talks;
if (bySkill) {
char skillName[16];
_itoa(skill, skillName, 10);
entry = entry->FindChild(DecodeMessageRot(skillName));
while (entry != nullptr) {
talks.push_back(DecodeMessageRot(const_cast<char*>(entry->Text().c_str())));
entry = entry->FindSibling(DecodeMessageRot(skillName));
}
} else {
do {
talks.push_back(DecodeMessageRot(const_cast<char*>(entry->Text().c_str())));
strcpy_s(name, sizeof(name), eventName);
entry = entry->FindSibling(DecodeMessageRot(name));
} while (entry != nullptr);
}
const int count = static_cast<int>(talks.size());
if (count != 0) {
char line[256];
std::sprintf(line, talks[std::rand() % count]);
g_session.FormatMonsterSpeech(line, text, aid, 0);
}
}
// OFFSET: 0x00E19090
// FUNCTION: fn_23834
const char* CSession::GetMonsterTalkEventName(int event) {
switch (event) {
case 0:
return "attack";
case 1:
return "castskill";
case 2:
return "useskill";
case 3:
return "skillattacked";
case 4:
return "hp50";
case 5:
return "hp25";
case 6:
return "dead";
default:
return nullptr;
}
}