From fab45b4d8dd95fb981aecd25d89eda87c9133ce4 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 30 Oct 2026 05:14:22 +0000 Subject: [PATCH] Decompile fn_23833 (CSession::GetEFSTImgFileName) Batch #4611 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_23833 CSession::GetEFSTImgFileName: logic confirmed by peer review Peer-reviewed-by: alisonrag, willerthal Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). Adds to the build: Source/Contents/StatusIconImages.cpp --- Source/Client/Session.h | 1 + Source/Contents/StatusIconImages.cpp | 699 +++++++++++++++++++++++++++ data/compile.json | 1 + 3 files changed, 701 insertions(+) create mode 100644 Source/Contents/StatusIconImages.cpp diff --git a/Source/Client/Session.h b/Source/Client/Session.h index 7a98129c..fa1b4007 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -522,6 +522,7 @@ public: bool HasItemCount(int itemId, int count) const; void NormalizeHead(int* head, int job); int GetDisplayJob(); + const char* GetEFSTImgFileName(int efstId, int type); bool IsTreeGroupThree(int job) const; std::string GetSexName(int sex); std::string GetHeadActName(int job, int sex, int* head); diff --git a/Source/Contents/StatusIconImages.cpp b/Source/Contents/StatusIconImages.cpp new file mode 100644 index 00000000..587bf736 --- /dev/null +++ b/Source/Contents/StatusIconImages.cpp @@ -0,0 +1,699 @@ +#include "Client/Session.h" +#include "Script/LuaScript.h" + +#include + +// INLINED +static __forceinline bool IsTaekwonDisplayJob() { + return (g_session.GetDisplayJob() >= 4046 && g_session.GetDisplayJob() <= 4049) || g_session.GetDisplayJob() == 4225 || + g_session.GetDisplayJob() == 4226 || g_session.GetDisplayJob() == 4238 || g_session.GetDisplayJob() == 4227 || + (g_session.GetDisplayJob() >= 4239 && g_session.GetDisplayJob() <= 4244) || g_session.GetDisplayJob() == 4302 || + g_session.GetDisplayJob() == 4303 || g_session.GetDisplayJob() == 4316; +} + +// OFFSET: 0x00E166E0 +// FUNCTION: fn_23833 +const char* CSession::GetEFSTImgFileName(int efstId, int type) { + const char* fileName = nullptr; + this->m_hotkeyScript->Call("GetEFSTImgFileName", "dd>s", efstId, type, &fileName); + if (strcmp(fileName, "") != 0) { + return fileName; + } + + switch (type) { + case 0: + switch (efstId) { + case 762: + return "effect\\SWORDCLAN.TGA"; + case 763: + return "effect\\ARCWANDCLAN.TGA"; + case 764: + return "effect\\GOLDENMACECLAN.TGA"; + case 765: + return "effect\\CROSSBOWCLAN.TGA"; + } + break; + case 1: + switch (efstId) { + case 8: + return "effect\\콰그마이어.tga"; + case 13: + return "effect\\민첩성감소.tga"; + case 32: + return "effect\\갑옷파괴.tga"; + case 33: + return "effect\\무기파괴.tga"; + case 34: + return "effect\\환각.tga"; + case 35: + return "effect\\무게50이상.tga"; + case 36: + return "effect\\무게90이상.tga"; + case 50: + return "effect\\스트립웨폰.tga"; + case 51: + return "effect\\스트립쉴드.tga"; + case 52: + return "effect\\스트립아머.tga"; + case 53: + return "effect\\스트립헬름.tga"; + case 90: + return IsTaekwonDisplayJob() ? "effect\\i_p_FIRE.tga" : "effect\\프레임런쳐.tga"; + case 241: + return "effect\\Str_gogi.tga"; + case 242: + return "effect\\Agi_gogi.tga"; + case 243: + return "effect\\Vit_gogi.tga"; + case 244: + return "effect\\Dex_gogi.tga"; + case 245: + return "effect\\Int_gogi.tga"; + case 246: + return "effect\\Luk_gogi.tga"; + case 247: + case 248: + case 249: + return "effect\\gogi.tga"; + case 250: + return "effect\\exp.tga"; + case 251: + return "effect\\death.tga"; + case 252: + return "effect\\item.tga"; + case 271: + return "effect\\Str_gogi.tga"; + case 272: + return "effect\\Agi_gogi.tga"; + case 273: + return "effect\\Vit_gogi.tga"; + case 274: + return "effect\\Dex_gogi.tga"; + case 275: + return "effect\\Int_gogi.tga"; + case 276: + return "effect\\Luk_gogi.tga"; + case 298: + return "effect\\멘탈포션.tga"; + case 312: + return "effect\\job.tga"; + case 313: + return "effect\\gogi.tga"; + case 401: + return "effect\\민첩성감소.tga"; + case 476: + return "effect\\npc_hellpower.tga"; + case 491: + return "effect\\Str_gogi.tga"; + case 492: + return "effect\\Int_gogi.tga"; + case 493: + return "effect\\Vit_gogi.tga"; + case 494: + return "effect\\Dex_gogi.tga"; + case 495: + return "effect\\Agi_gogi.tga"; + case 496: + return "effect\\Luk_gogi.tga"; + case 621: + return "effect\\변신.tga"; + case 636: + return "effect\\job.tga"; + case 637: + return "effect\\NORECOVER.TGA"; + case 662: + case 663: + return "effect\\icon02.tga"; + case 664: + return "effect\\rwcscroll.tga"; + case 721: + return "effect\\REBOUND.tga"; + case 730: + return "effect\\darkcrow.tga"; + } + break; + case 2: + switch (efstId) { + case 0: + return "effect\\프로보크.tga"; + case 1: + return "effect\\인듀어.tga"; + case 2: + return "effect\\투핸드퀴큰.tga"; + case 4: + return "effect\\하이딩.tga"; + case 5: + return "effect\\클로킹.tga"; + case 6: + return "effect\\인찬트포이즌.tga"; + case 7: + return "effect\\포이즌리액트.tga"; + case 23: + return "effect\\아드레날린러쉬.tga"; + case 24: + return "effect\\웨폰퍼펙션.tga"; + case 25: + return "effect\\오버트러스트.tga"; + case 26: + return "effect\\맥시마이즈파워.tga"; + case 58: + return "effect\\오토가드.tga"; + case 59: + return "effect\\리플렉트쉴드.tga"; + case 62: + return "effect\\디펜더.tga"; + case 65: + return "effect\\오토스펠.tga"; + case 68: + return "effect\\스피어퀴큰.tga"; + case 91: + return IsTaekwonDisplayJob() ? "effect\\i_p_WATER.tga" : "effect\\프로스트웨폰.tga"; + case 92: + return IsTaekwonDisplayJob() ? "effect\\i_p_WIND.tga" : "effect\\라이트닝로더.tga"; + case 97: + return "effect\\글로리아.tga"; + case 104: + return "effect\\ICON10.tga"; + case 106: + return "effect\\ICON08.tga"; + case 110: + return "effect\\ICON05.tga"; + case 112: + return "effect\\I_장판.tga"; + case 114: + return "effect\\I_치독.tga"; + case 115: + return "effect\\ICON09.tga"; + case 116: + return "effect\\ICON06.tga"; + case 117: + return "effect\\ICON03.tga"; + case 118: + return "effect\\ICON07.tga"; + case 120: + return "effect\\ICON04.tga"; + case 121: + case 122: + return "effect\\ICON01.tga"; + case 124: + return "effect\\출혈상태.tga"; + case 125: + return "effect\\관절공격.tga"; + case 130: + return "effect\\엄마아빠사랑해요.tga"; + case 132: + return "effect\\금강불괴.tga"; + case 135: + return "effect\\i_STORMKICK.tga"; + case 137: + return "effect\\i_DOWNKICK.tga"; + case 139: + return "effect\\i_TURNKICK.tga"; + case 141: + return "effect\\i_COUNTER.tga"; + case 143: + return "effect\\i_DODGE.tga"; + case 145: + return "effect\\i_RUN.tga"; + case 146: + return "effect\\i_p_DARK.tga"; + case 147: + return "effect\\아드레날린러쉬.tga"; + case 148: + return "effect\\i_p_TELE.tga"; + case 150: + return "effect\\PLUSATTACKPOWER.tga"; + case 156: + return "effect\\i_KAIZEL.tga"; + case 157: + return "effect\\i_KAAHI.tga"; + case 158: + return "effect\\i_KAUPE.tga"; + case 161: + return "effect\\i_ONEHAND.tga"; + case 169: + return "effect\\i_SUNCOMFORT.tga"; + case 170: + return "effect\\i_MOONCOMFORT.tga"; + case 171: + return "effect\\i_STARCOMFORT.tga"; + case 181: + return "effect\\I_프리저브.tga"; + case 182: + return "effect\\I_체이스힘.tga"; + case 186: + return "effect\\I_더블캐스팅.tga"; + case 188: + return "effect\\I_오버맥스.tga"; + case 191: + return "effect\\I_타로카드.tga"; + case 197: + return "effect\\i_shrink.tga"; + case 198: + return "effect\\i_sightblaster.tga"; + case 200: + case 201: + return "effect\\i_closeconfine.tga"; + case 203: + return "effect\\i_MADNESS.tga"; + case 204: + return "effect\\i_FEVER.tga"; + case 205: + return "effect\\글로리아.tga"; + case 206: + return "effect\\i_MAEMI.tga"; + case 207: + return "effect\\i_BUNSIN.tga"; + case 208: + return "effect\\i_NEN.tga"; + case 209: + return "effect\\i_ADJUSTMENT.tga"; + case 210: + return "effect\\i_ACCURACY.tga"; + case 212: + case 213: + case 214: + case 215: + case 216: + case 217: + case 218: + case 219: + case 220: + case 221: + case 222: + case 223: + case 224: + case 225: + case 226: + case 227: + case 228: + case 229: + case 230: + case 231: + case 232: + case 233: + case 234: + case 235: + case 236: + case 239: + case 240: + case 254: + case 255: + case 256: + case 257: + case 258: + case 259: + case 260: + case 261: + case 262: + return "effect\\글로리아.tga"; + case 263: + return "effect\\죽은척하기.tga"; + case 264: + case 265: + case 266: + case 267: + case 268: + case 269: + case 270: + return "effect\\글로리아.tga"; + case 282: + return "effect\\slowcast.tga"; + case 286: + return "effect\\criticalwound.tga"; + case 290: + return "effect\\물리방어포션.tga"; + case 291: + return "effect\\마법방어포션.tga"; + case 292: + return "effect\\회복력향상포션.tga"; + case 293: + return "effect\\소형생명수.tga"; + case 294: + return "effect\\중형생명수.tga"; + case 295: + return "effect\\연마제.tga"; + case 296: + return "effect\\환영의술잔.tga"; + case 297: + return "effect\\대환단.tga"; + case 299: + return "effect\\태청단.tga"; + case 300: + return "effect\\SP소모량감소포션.tga"; + case 301: + return "effect\\올상태저항포션.tga"; + case 302: + return "effect\\캐시갑옷속성부여.tga"; + case 304: + return "effect\\npc_hellpower.tga"; + case 314: + return "effect\\엄마아빠사랑해요.tga"; + case 316: + return "effect\\RK_ENCHANT.tga"; + case 318: + return "effect\\RK_NAUTHIZ.tga"; + case 319: + return "effect\\RK_TURISUSS.tga"; + case 320: + return "effect\\RK_HAGALAZ.tga"; + case 321: + return "effect\\RK_ISHA.tga"; + case 322: + return "effect\\RK_EISIR.tga"; + case 323: + return "effect\\RK_URUZ.tga"; + case 333: + return "effect\\포이즈닝웨폰.tga"; + case 334: + return "effect\\할루시네이션워크.tga"; + case 336: + return "effect\\레노바티오.tga"; + case 337: + return "effect\\웨폰블로킹.tga"; + case 341: + return "effect\\감각마비독.tga"; + case 342: + return "effect\\신경마비독.tga"; + case 343: + return "effect\\감각마비독.tga"; + case 344: + return "effect\\쇠약독.tga"; + case 345: + return "effect\\웃음버섯.tga"; + case 346: + return "effect\\상처오염독.tga"; + case 347: + return "effect\\열병독.tga"; + case 348: + return "effect\\망각의재.tga"; + case 349: + return "effect\\거머리.tga"; + case 351: + return "effect\\FROSTMISTY.tga"; + case 352: + return "effect\\RA_FEARBREEZE.tga"; + case 354: + return "effect\\MARSHOFABYSS.tga"; + case 355: + return "effect\\RECOGNIZEDSPELL.tga"; + case 361: + return "effect\\엑셀레이션.tga"; + case 362: + return "effect\\호버링.tga"; + case 368: + return "effect\\MVPCARD_TAOGUNKA.tga"; + case 369: + return "effect\\MVPCARD_MISTRESS.tga"; + case 370: + return "effect\\MVPCARD_ORCHERO.tga"; + case 371: + return "effect\\MVPCARD_ORCLORD.tga"; + case 373: + return "effect\\오버히트.tga"; + case 374: + return "effect\\셰이프쉬프트.tga"; + case 375: + return "effect\\인프라레드스캔.tga"; + case 377: + return "effect\\뉴트럴배리어.tga"; + case 379: + return "effect\\스텔스필드.tga"; + case 381: + return "effect\\EFST_ATK.tga"; + case 382: + return "effect\\EFST_DEF.tga"; + case 383: + return "effect\\EFST_ATK.tga"; + case 384: + return "effect\\EFST_DEF.tga"; + case 385: + return "effect\\리프로듀스.tga"; + case 386: + case 387: + return "effect\\EFST_MATK.tga"; + case 388: + return "effect\\str_gogi.tga"; + case 389: + return "effect\\int_gogi.tga"; + case 390: + return "effect\\LG_REFLECTDAMAGE.tga"; + case 391: + return "effect\\포스오브뱅가드.tga"; + case 393: + return "effect\\오토쉐도우스펠.tga"; + case 394: + return "effect\\쉐도우폼.tga"; + case 396: + return "effect\\LG_SHIELDSPELL_방.tga"; + case 397: + return "effect\\LG_SHIELDSPELL_마.tga"; + case 398: + return "effect\\LG_SHIELDSPELL_연.tga"; + case 399: + return "effect\\바디페인팅.tga"; + case 402: + return "effect\\LG_PRESTIGE.tga"; + case 403: + return "effect\\인비지빌리티.tga"; + case 404: + return "effect\\데들리인펙트.tga"; + case 405: + return "effect\\LG_BANDING.tga"; + case 407: + return "effect\\LG_INSPIRATION.tga"; + case 408: + return "effect\\Masquerade_ENERVATION.tga"; + case 409: + return "effect\\Masquerade_GROOMY.tga"; + case 410: + return "effect\\잠룡승천.tga"; + case 411: + return "effect\\Masquerade_IGNORANCE.tga"; + case 412: + return "effect\\Masquerade_LAZINESS.tga"; + case 413: + return "effect\\섬전보.tga"; + case 414: + return "effect\\i_ONEHAND.tga"; + case 415: + return "effect\\Masquerade_UNLUCKY.tga"; + case 418: + return "effect\\Masquerade_WEAKNESS.tga"; + case 421: + return "effect\\스트립액세서리.tga"; + case 423: + return "effect\\ICON02.tga"; + case 425: + return "effect\\점혈구.tga"; + case 426: + return "effect\\점혈반.tga"; + case 427: + return "effect\\점혈활.tga"; + case 429: + return "effect\\스윙댄스.tga"; + case 430: + return "effect\\연인들을위한심포니.tga"; + case 435: + return "effect\\안식의자장가.tga"; + case 436: + return "effect\\순환하는자연의소리.tga"; + case 437: + return "effect\\다이아몬드더스트.tga"; + case 438: + return "effect\\수줍은하루의우울.tga"; + case 439: + return "effect\\마나의노래.tga"; + case 440: + return "effect\\클라우드킬.tga"; + case 441: + return "effect\\워그와함께춤을.tga"; + case 442: + return "effect\\풍차를향해돌격.tga"; + case 443: + return "effect\\메아리의노래.tga"; + case 444: + return "effect\\하모나이즈.tga"; + case 445: + return "effect\\스트라이킹.tga"; + case 446: + return "effect\\워머.tga"; + case 447: + return "effect\\달빛의세레나데.tga"; + case 448: + return "effect\\새터데이나이트피버.tga"; + case 450: + return "effect\\애널라이즈.tga"; + case 451: + return "effect\\레라드의이슬.tga"; + case 452: + return "effect\\멜로디오브싱크.tga"; + case 453: + return "effect\\비욘드오브워크라이.tga"; + case 454: + return "effect\\언리미티드허밍보이스.tga"; + case 461: + return "effect\\카트부스트.tga"; + case 463: + return "effect\\가시나무덫.tga"; + case 472: + return "effect\\세크라멘트.tga"; + case 473: + return "effect\\ICON05.tga"; + case 573: + return "effect\\I_타로카드.tga"; + case 578: + return "effect\\중형생명수.tga"; + case 579: + return "effect\\ICON02.tga"; + case 583: + return "effect\\all_odins_power.tga"; + case 611: + return "effect\\EFST_MATK.tga"; + case 622: + return "effect\\앉기.tga"; + case 632: + case 633: + case 634: + case 635: + return "effect\\ICON08.tga"; + case 638: + case 640: + return "effect\\SETDEF.TGA"; + case 670: + return "effect\\소형생명수.tga"; + case 695: + return "effect\\ArrowN.tga"; + case 697: + return "effect\\EFST_ATK.tga"; + case 698: + return "effect\\EFST_MATK.tga"; + case 699: + return "effect\\EFST_DEF.tga"; + case 700: + return "effect\\EXP.tga"; + case 869: + return "effect\\할루시네이션워크.tga"; + case 1121: + return "effect\\ICON05.tga"; + } + break; + case 3: + switch (efstId) { + case 3: + return "effect\\집중력향상.tga"; + case 27: + return "effect\\라이딩.tga"; + case 28: + return "effect\\팔콘.tga"; + case 29: + return "effect\\죽은척하기.tga"; + case 30: + return "effect\\고성지르기.tga"; + case 31: + return "effect\\에너지코트.tga"; + case 37: + case 38: + case 39: + case 40: + return "effect\\공속물약.tga"; + case 54: + return "effect\\케미컬프로텍션[웨폰].tga"; + case 55: + return "effect\\케미컬프로텍션[쉴드].tga"; + case 56: + return "effect\\케미컬프로텍션[아머].tga"; + case 57: + return "effect\\케미컬프로텍션[헬름].tga"; + case 93: + return IsTaekwonDisplayJob() ? "effect\\i_p_EARTH.tga" : "effect\\사이즈믹웨폰.tga"; + case 151: + return "effect\\PLUSMAGICPOWER.tga"; + case 357: + return "effect\\wolfmount.tga"; + case 613: + return "effect\\라이딩.tga"; + case 639: + case 641: + return "effect\\SETMDEF.TGA"; + case 647: + return "effect\\ASPDCASH.TGA"; + case 650: + return "effect\\ELDICASTES.TGA"; + } + break; + case 4: + switch (efstId) { + case 9: + return "effect\\안젤루스.tga"; + case 10: + return "effect\\블레싱.tga"; + case 11: + return "effect\\시그넘크루시스.tga"; + case 12: + return "effect\\민첩성증가.tga"; + case 14: + return "effect\\슬로우포이즌.tga"; + case 15: + return "effect\\임포시티오마누스.tga"; + case 16: + return "effect\\수프라기움.tga"; + case 17: + return IsTaekwonDisplayJob() ? "effect\\i_p_SAINT.tga" : "effect\\아스페르시오.tga"; + case 18: + return "effect\\성체강복.tga"; + case 19: + return "effect\\기리에엘레이손.tga"; + case 20: + return "effect\\마니피캇.tga"; + case 21: + return "effect\\글로리아.tga"; + case 22: + return "effect\\렉스에테르나.tga"; + case 41: + case 42: + return "effect\\민첩성증가.tga"; + case 61: + return "effect\\신의뜻.tga"; + case 64: + return IsTaekwonDisplayJob() ? "effect\\i_p_SAINT.tga" : "effect\\아스페르시오.tga"; + case 87: + return "effect\\STEELBODY.tga"; + case 289: + return "effect\\민첩성증가.tga"; + case 577: + return "effect\\세라4.tga"; + case 580: + return "effect\\에이라1.tga"; + case 581: + return "effect\\에이라2.tga"; + case 584: + return "effect\\에레노아1_1.tga"; + case 605: + return "effect\\디이터1.tga"; + case 606: + return "effect\\디이터2.tga"; + case 607: + return "effect\\디이터4.tga"; + case 608: + return "effect\\디이터5.tga"; + case 618: + return "effect\\exp_말랑도_고양이캔.tga"; + case 658: + return "effect\\PHIDEMON.tga"; + case 715: + return "effect\\FRIGG_SONG.tga"; + case 716: + return "effect\\OFFERTORIUM.tga"; + case 717: + return "effect\\TELEKINESIS_INTENSE.tga"; + case 720: + return "effect\\FULL_THROTTLE.tga"; + case 723: + return "effect\\KINGS_GRACE.tga"; + } + break; + } + + return nullptr; +} diff --git a/data/compile.json b/data/compile.json index a8cad9a0..36044c99 100644 --- a/data/compile.json +++ b/data/compile.json @@ -597,6 +597,7 @@ "Source/Contents/SpriteRidingOffset.cpp": 4, "Source/Contents/SpriteRidingPolicy.cpp": 4, "Source/Contents/SpriteShadow.cpp": 4, + "Source/Contents/StatusIconImages.cpp": 4, "Source/Contents/Store/MCStoreInfoBackup.cpp": 4, "Source/Contents/Store/MCStoreInfoBackupAsyncWork.cpp": 4, "Source/Contents/Store/StoreBackupData.cpp": 4,