rodecomp/Source/Contents/MapInfoMgr.cpp
ragnarok-clanker 0a3ad74ac3 Decompile 4 functions in Source/Contents/MapInfoMgr.cpp, Source/Contents/MapInfoMgr.h
Batch #3524 by Yommy: 0 byte-identical, 4 confirmed by peer review.

- fn_06480 MapNameDisplay::MapNameDisplay: logic confirmed by peer review
- fn_06487 CMapInfoMgr::ShowMapName: logic confirmed by peer review
- fn_06492 CMapInfoMgr::LoadScript: logic confirmed by peer review
- fn_06493 CMapInfoMgr::DrawMapName: logic confirmed by peer review

Peer-reviewed-by: eAthena, meitogi, superintelligence
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
2026-10-29 22:45:06 +00:00

322 lines
9.5 KiB
C++

#include "Contents/MapInfoMgr.h"
#include "Contents/Configuration/ServiceConfiguration.h"
#include "Contents/MessageTable.h"
#include "Render/DeviceContext/DCBitmap.h"
#include "Render/DeviceContext/DeviceContext.h"
#include "Render/Renderer.h"
#include "Render/Text/TextContext.h"
#include "Render/TextureQuad.h"
#include "Render/Textures/Texture.h"
#include "Render/Textures/TextureCache.h"
#include "Script/NLuaState.h"
#include "Utility/Text/FormatString.h"
extern "C" {
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
}
#include <timeapi.h>
#include <algorithm>
#include <cstring>
#include <new>
#include <utility>
// GLOBAL: gl_24842
CMapInfoMgr* g_mapInfoMgr;
// OFFSET: 0x006CDE30
// FUNCTION: fn_06480
MapNameDisplay::MapNameDisplay(std::string name, std::string subName, std::string bmp) {
const std::string path = FormatOwnedString("유저인터페이스\\display_mapname\\%s.png", bmp.c_str());
this->m_texture = g_texMgr.Load(path.c_str(), 0, false, true, false);
if (this->m_texture != nullptr) {
this->m_width = static_cast<unsigned short>(g_renderer->viewport.width);
this->m_height = static_cast<unsigned short>(static_cast<float>(g_renderer->viewport.height) * 0.2f);
const float scale = static_cast<float>(this->m_height) / static_cast<float>(this->m_texture->Height());
this->m_dc = CreateBitmapDC(this->m_width, this->m_height, false);
this->m_dc->Fill(nullptr, 0);
static_cast<CDCBitmap*>(this->m_dc)->SetAlpha(true);
TextContext text(*this->m_dc);
text.SetColor(0xFFFFFF);
const int family = g_serviceType == 0 ? 29 : 0;
text.SetFont(family, static_cast<int>(scale * 16.0f), 1, 0);
SIZE size = text.Measure(name.c_str(), static_cast<int>(std::strlen(name.c_str())));
text.Draw(
static_cast<int>(static_cast<float>(this->m_width - size.cx) * 0.5f), static_cast<int>(scale * 72.0f), name.c_str(),
static_cast<int>(std::strlen(name.c_str()))
);
text.SetFont(family, static_cast<int>(scale * 44.0f), 1, 0);
size = text.Measure(subName.c_str(), static_cast<int>(std::strlen(subName.c_str())));
text.Draw(
static_cast<int>(static_cast<float>(this->m_width - size.cx) * 0.5f), static_cast<int>(scale * 95.0f), subName.c_str(),
static_cast<int>(std::strlen(subName.c_str()))
);
static_cast<CDCBitmap*>(this->m_dc)->SetAlpha(static_cast<unsigned char>(0xFF));
this->m_startTime = timeGetTime();
}
}
// OFFSET: 0x006CE6A0
// FUNCTION: fn_06483
CMapInfoMgr::~CMapInfoMgr() {
this->m_maps.clear();
if (this->m_display != nullptr) {
delete this->m_display;
this->m_display = nullptr;
}
}
// OFFSET: 0x006CE820
// FUNCTION: fn_06484
void CMapInfoMgr::AddMapDisplayName(std::string map, std::string name, bool show) {
this->m_maps[map].m_displayName = name;
this->m_maps[map].m_showDisplayName = show;
}
// OFFSET: 0x006CE8C0
// FUNCTION: fn_06485
void CMapInfoMgr::AddMapSignName(std::string map, std::string name, std::string subName) {
this->m_maps[map].m_sign = MapSignName{name, subName};
}
// OFFSET: 0x006CEAA0
// FUNCTION: fn_06486
bool CMapInfoMgr::Create() {
if (g_mapInfoMgr == nullptr) {
g_mapInfoMgr = new (std::nothrow) CMapInfoMgr();
if (g_mapInfoMgr != nullptr) {
if (g_mapInfoMgr->m_initialized) {
return true;
}
delete g_mapInfoMgr;
g_mapInfoMgr = nullptr;
}
}
return false;
}
// OFFSET: 0x006CEBB0
// FUNCTION: fn_06487
void CMapInfoMgr::ShowMapName(std::string map) {
const MapInfo* info = this->FindMapInfo(map);
if (info == nullptr || !info->m_showDisplayName) {
return;
}
std::string bmp = info->m_backgroundBmp;
if (bmp.size() == 0) {
bmp.assign("noname", 6);
}
std::string name = info->m_sign.m_name;
std::string subName = info->m_sign.m_subName;
if (name.size() == 0 && subName.size() == 0) {
subName = this->m_emptyName;
}
if (this->m_display != nullptr) {
delete this->m_display;
this->m_display = nullptr;
}
this->m_display = new MapNameDisplay(name, subName, bmp);
}
// OFFSET: 0x006CED70
// FUNCTION: fn_06488
void CMapInfoMgr::Destroy() {
if (g_mapInfoMgr != nullptr) {
delete g_mapInfoMgr;
g_mapInfoMgr = nullptr;
}
}
// OFFSET: 0x006CED90
// FUNCTION: fn_06489
const char* CMapInfoMgr::GetDisplayName(std::string map) {
const MapInfo* info = this->FindMapInfo(map);
if (info == nullptr) {
return this->m_emptyName.c_str();
}
return info->m_displayName.c_str();
}
// OFFSET: 0x006CEE20
// FUNCTION: fn_06490
MapInfo* CMapInfoMgr::FindMapInfo(std::string map) {
std::string name = map;
const std::size_t at = name.rfind('@');
if (at != std::string::npos && at > 3) {
name.erase(at - 4, 3);
}
const auto found = std::find_if(this->m_maps.begin(), this->m_maps.end(), [name](std::pair<std::string, MapInfo> entry) {
return entry.first.compare(name) == 0;
});
if (found == this->m_maps.end()) {
return nullptr;
}
return &found->second;
}
// OFFSET: 0x006CEF60
// FUNCTION: fn_06491
const char* CMapInfoMgr::GetSignSubName(std::string map) {
const MapInfo* info = this->FindMapInfo(map);
if (info == nullptr) {
return this->m_emptyName.c_str();
}
return info->m_sign.m_subName.c_str();
}
// OFFSET: 0x006CEFF0
// FUNCTION: fn_06492
bool CMapInfoMgr::LoadScript() {
this->m_emptyName = LookupMessage(187);
NLuaState lua;
if (lua.IsValid()) {
luaL_openlibs(lua.GetState());
lua_register(lua.GetState(), "AddMapDisplayName", CMapInfoMgr::L_AddMapDisplayName);
lua_register(lua.GetState(), "AddMapSignName", CMapInfoMgr::L_AddMapSignName);
lua_register(lua.GetState(), "AddMapBackgroundBmp", CMapInfoMgr::L_AddMapBackgroundBmp);
if (luaL_loadfile(lua.GetState(), "system\\mapInfo_true.lub") == 0 && lua_pcall(lua.GetState(), 0, 0, 0) == 0) {
lua_getglobal(lua.GetState(), "main");
if (lua_pcall(lua.GetState(), 0, 2, 0) == 0) {
return true;
}
}
MessageBoxA(nullptr, lua_tostring(lua.GetState(), -1), "CMapInfoMgr", MB_OK);
}
return false;
}
// OFFSET: 0x006CF290
// FUNCTION: fn_06493
void CMapInfoMgr::DrawMapName(CRenderSystemBase& system) {
MapNameDisplay* display = this->m_display;
if (display == nullptr) {
return;
}
if (display->m_texture == nullptr) {
delete this->m_display;
this->m_display = nullptr;
return;
}
int alpha = 255;
const DWORD elapsed = timeGetTime() - display->m_startTime;
if (elapsed > 5000) {
alpha = 5255 - elapsed;
if (alpha <= 0) {
delete this->m_display;
this->m_display = nullptr;
return;
}
}
const std::uint32_t color = (alpha << 24) | 0xFFFFFF;
const float scale = static_cast<float>(display->m_height) / static_cast<float>(display->m_texture->Height());
const int width = static_cast<int>(static_cast<float>(display->m_texture->Width()) * scale);
display->m_texture->StretchTintedTo(
g_renderer->primitives, g_renderer->queues, static_cast<int>(static_cast<float>(display->m_width - width) * 0.5f),
static_cast<int>(static_cast<float>(g_renderer->viewport.height) * 0.12f), width, display->m_height, color, g_renderer->fog.supported != 0,
g_depthStart, g_depthEnd
);
display->m_dc->Draw(system, 0, static_cast<int>(static_cast<float>(g_renderer->viewport.height) * 0.12f), display->m_width, display->m_height, color);
}
// OFFSET: 0x006CF600
// FUNCTION: fn_06495
int CMapInfoMgr::L_AddMapBackgroundBmp(lua_State* state) {
if (!lua_isstring(state, -2)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 1nd is must string");
} else {
const std::string map = lua_tostring(state, -2);
if (!lua_isstring(state, -1)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 2st is must string");
} else {
const std::string bmp = lua_tostring(state, -1);
lua_pushboolean(state, 1);
lua_pushstring(state, "good");
g_mapInfoMgr->AddMapBackgroundBmp(map, bmp);
}
}
return 2;
}
// OFFSET: 0x006CF860
// FUNCTION: fn_06496
int CMapInfoMgr::L_AddMapDisplayName(lua_State* state) {
if (!lua_isstring(state, -3)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 1st is must string");
} else {
const std::string map = lua_tostring(state, -3);
if (!lua_isstring(state, -2)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 2nd is must string");
} else {
const std::string name = lua_tostring(state, -2);
if (lua_type(state, -1) != LUA_TBOOLEAN) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 3th is must boolean");
} else {
const bool show = lua_toboolean(state, -1) > 0;
lua_pushboolean(state, 1);
lua_pushstring(state, "good");
g_mapInfoMgr->AddMapDisplayName(map, name, show);
}
}
}
return 2;
}
// OFFSET: 0x006CFB10
// FUNCTION: fn_06497
int CMapInfoMgr::L_AddMapSignName(lua_State* state) {
if (!lua_isstring(state, -3)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 1st is must string");
} else {
const std::string map = lua_tostring(state, -3);
if (!lua_isstring(state, -2)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 2nd is must string");
} else {
const std::string name = lua_tostring(state, -2);
if (!lua_isstring(state, -1)) {
lua_pushboolean(state, 0);
lua_pushstring(state, "argument 3st is must string");
} else {
const std::string subName = lua_tostring(state, -1);
lua_pushboolean(state, 1);
lua_pushstring(state, "good");
g_mapInfoMgr->AddMapSignName(map, name, subName);
}
}
}
return 2;
}