Decompile 7 functions in Source/Client/Mode/GameMode.cpp, Source/Client/Mode/CGameMode.h

Batch #5885 by Yommy: 2 byte-identical, 5 confirmed by peer review.

- fn_21279 CGameMode::GetSkillAttackRange: logic confirmed by peer review
- fn_21280 CGameMode::TerrainHeight: byte-identical
- fn_21281 CGameMode::TerrainWidth: byte-identical
- fn_21283 CGameMode::LocationText: logic confirmed by peer review
- fn_21284 CGameMode::HasInventoryItem: logic confirmed by peer review
- fn_21285 CGameMode::HasResurrectionItem: logic confirmed by peer review
- fn_21287 CGameMode::SendMousePointerState: logic confirmed by peer review

Peer-reviewed-by: kyoshi, Romain, Snow, Qwenkler3.8, SapitoSucio
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
This commit is contained in:
ragnarok-clanker 2026-10-30 17:14:41 +00:00
commit 500bb53df9
2 changed files with 132 additions and 1 deletions

View file

@ -6,15 +6,22 @@
#include "Contents/Camera/Camera.h"
#include "Contents/Configuration/ServiceOptions.h"
#include "Contents/MessageTable.h"
#include "Contents/Actors/MousePointer.h"
#include "Contents/Actors/RenderObject.h"
#include "Contents/Items/ItemInfo.h"
#include "Contents/Skills/ClientSkills.h"
#include "Contents/Skills/SkillInfo.h"
#include "Contents/World/World.h"
#include "Network/Packets/PacketLengths.h"
#include "Render/Renderer.h"
#include "Resource/World/TerrainResource.h"
#include "Script/LuaScript.h"
#include "UI/Window/UIWindow.h"
#include "UI/Window/UIWindowMgr.h"
#include "Utility/Text/FormatString.h"
#include <cstdint>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
@ -77,6 +84,121 @@ void CGameMode::CompleteUnknown0194(std::uint32_t id, const std::string& text) {
}
}
// OFFSET: 0x00CD52F0
// FUNCTION: fn_21279
int CGameMode::GetSkillAttackRange(int id, int level) {
if (id == 10000) {
return 5;
}
int range = 1;
CSkillInfo skill = reinterpret_cast<const ClientSkills&>(g_session).Lookup(id);
if (!skill.available) {
skill = g_session.m_skillBundle.Pending(id);
if (!skill.available) {
return range;
}
level = skill.level;
}
int reduction = 0;
g_luaScript->Call("GetSkillAttackRange", "ddd>dd", id, level, skill.level, &range, &reduction);
range += skill.unknown_001C - reduction;
return range;
}
// OFFSET: 0x00CD54D0
// FUNCTION: fn_21280
int CGameMode::TerrainHeight() const {
if (!this->scene || !this->scene->terrain) {
return 0;
}
return this->scene->terrain->height;
}
// OFFSET: 0x00CD54F0
// FUNCTION: fn_21281
int CGameMode::TerrainWidth() const {
if (!this->scene || !this->scene->terrain) {
return 0;
}
return this->scene->terrain->width;
}
// OFFSET: 0x00CD5550
// FUNCTION: fn_21283
std::string CGameMode::LocationText() {
char text[120];
std::memset(text, 0, sizeof(text));
int column;
int row;
const auto* player = reinterpret_cast<const CRenderObject*>(this->scene->player);
this->WorldCell(player->render.position.x, player->render.position.z, column, row);
std::string name = this->mapName;
if (name.size() > 4) {
name.resize(name.size() - 4);
}
std::sprintf(text, "Location: %s ( %d , %d )", name.c_str(), column, row);
return text;
}
// OFFSET: 0x00CD5800
// FUNCTION: fn_21284
bool CGameMode::HasInventoryItem(int id) {
const ITEM_INFO item = LookupClientItem(g_session.m_inventoryItems, id, 0);
return item.unknown_0000[1] != 0 && item.quantity > 0;
}
// OFFSET: 0x00CD58B0
// FUNCTION: fn_21285
bool CGameMode::HasResurrectionItem() {
ITEM_INFO item = LookupClientItem(g_session.m_inventoryItems, 7621, 0);
const CWorld* world = this->scene;
if (world->unknown_0048 || world->unknown_004C || world->unknown_0054) {
return false;
}
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
return true;
}
item = LookupClientItem(g_session.m_inventoryItems, 6833, 0);
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
return true;
}
item = LookupClientItem(g_session.m_inventoryItems, 6316, 0);
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
return true;
}
item = LookupClientItem(g_session.m_inventoryItems, 6293, 0);
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
return true;
}
item = LookupClientItem(g_session.m_inventoryItems, 25310, 0);
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
return true;
}
return false;
}
// OFFSET: 0x00CD5CD0
// FUNCTION: fn_21287
void CGameMode::SendMousePointerState(int value) {
if (this->mousePointer) {
this->mousePointer->SendMsg(nullptr, 2, 0, value, value >> 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
}
// OFFSET: 0x00CECE00
// FUNCTION: fn_21360
void CGameMode::ClearUnknown0458() {