#include "Contents/Effects/EZ2STREffect.h" #include "Client/Mode/CGameMode.h" #include "Client/Mode/ModeMgr.h" #include "Client/Session.h" #include "Contents/Actors/GameActor.h" #include "Contents/Actors/RenderObject.h" #include "Contents/Camera/Camera.h" #include "Contents/Effects/EffectLists.h" #include "Contents/Effects/EffectMemoryMgr.h" #include "Contents/Effects/EffectTypes.h" #include "Contents/Skills/ClientSkills.h" #include "Contents/Sound/SoundMgr.h" #include "Contents/World/World.h" #include "Render/Renderer.h" #include "Render/ScreenRectangle.h" #include "Render/TextureQuad.h" #include "Script/LuaScript.h" #include "Utility/Text/FormatString.h" #include // OFFSET: 0x00B51810 // FUNCTION: fn_19030 CEZ2STRScreenEffect::CEZ2STRScreenEffect() : CEffect(-1), particle(nullptr), name("빨간포션.str"), fadePulse(0), overlayColor(0), followCamera(0), cameraAngle(0.0), jobScaled(0) { } // OFFSET: 0x00B51D60 // FUNCTION: fn_19036 float GetHatEffectOffsetX(int id, const char* name) { float offset = 0.0f; float result = 0.0f; switch (id) { case 0x40B: case 0x40C: offset = 5.0f; result = offset; break; case 0x43E: offset = 8.0f; result = offset; break; case 0x4C3: offset = 0.5f; result = offset; break; case 0x4CD: case 0x4CE: case 0x543: case 0x544: case 0x545: case 0x546: case 0x5CE: case 0x5CF: offset = 1.0f; result = offset; break; case 0x4F2: case 0x4F5: offset = -0.5f; result = offset; break; case 0x547: case 0x548: case 0x549: case 0x54A: case 0x5D0: case 0x5D1: offset = -1.0f; result = offset; break; } std::string text(name); if (text.find("strangelights") != std::string::npos) { offset = 5.0f; result = offset; } else if (text.find("superstar") != std::string::npos) { offset = 5.0f; result = offset; } else if (text.find("ljosalfar") != std::string::npos) { offset = 8.0f; result = offset; } if (id >= 0x9B5) { double position = 0.0; g_luaScript->Call("GetHatEfPosX", "d>l", id - 0x9B5, &position); result = static_cast(offset + position); } return result; } // OFFSET: 0x00B52060 // FUNCTION: fn_19037 int GetHatEffectOffsetY(int id, CGameActor* actor) { bool ignored = false; if (id >= 0x9B5) { g_luaScript->Call("IsIgnoredRidingState_Include_AttachedToHead", "d>b", id - 0x9B5, &ignored); } else { ignored = id == 0x719; } int offset = 0; if (actor) { if (ignored == true) { offset = 18; } else { offset = static_cast(actor->GetNameHeight()); } } switch (id) { case 0x40B: case 0x45F: case 0x7D6: offset += 5; break; case 0x42C: case 0x43B: case 0x442: case 0x463: case 0x46E: case 0x470: case 0x472: case 0x473: case 0x955: offset -= 8; break; case 0x43C: case 0x7E2: offset -= 7; break; case 0x43D: case 0x441: case 0x443: case 0x447: case 0x4ED: case 0x552: case 0x75E: case 0x805: case 0x853: offset -= 5; break; case 0x44A: case 0x44E: case 0x44F: case 0x451: case 0x453: case 0x454: case 0x455: case 0x45C: case 0x765: case 0x766: offset -= 8; break; case 0x464: case 0x467: offset += 8; break; case 0x425: case 0x46D: case 0x476: case 0x4C2: case 0x4C5: case 0x63F: case 0x6C9: case 0x6CC: case 0x6D0: case 0x6F8: case 0x722: case 0x726: case 0x752: case 0x756: case 0x75A: case 0x77A: case 0x7B2: case 0x802: case 0x859: case 0x86C: case 0x870: offset -= 6; break; case 0x475: case 0x4C3: case 0x522: case 0x5C5: case 0x6D5: case 0x6DF: case 0x6E3: case 0x6EF: case 0x6F4: case 0x707: case 0x72E: case 0x742: case 0x74A: case 0x753: case 0x757: case 0x75B: case 0x76A: case 0x771: case 0x7AF: case 0x7B6: case 0x7CA: case 0x7D5: case 0x7EB: case 0x800: case 0x843: case 0x889: case 0x900: case 0x904: case 0x91E: case 0x921: case 0x923: case 0x924: case 0x926: offset -= 4; break; case 0x4C4: case 0x4D7: case 0x4DB: offset -= 10; break; case 0x4CC: offset -= 16; break; case 0x4CD: case 0x4CE: case 0x4D6: case 0x545: case 0x546: case 0x547: case 0x548: case 0x5CF: case 0x5D0: case 0x64B: case 0x64C: case 0x64D: case 0x64E: case 0x64F: case 0x650: offset -= 6; break; case 0x4EC: case 0x747: case 0x755: case 0x7A1: case 0x7E9: case 0x810: case 0x854: case 0x888: case 0x966: case 0x967: case 0x968: offset -= 2; break; case 0x4EE: case 0x4EF: case 0x4F0: case 0x4F1: offset -= 10; break; case 0x4F2: case 0x4F3: case 0x4F4: case 0x4F6: case 0x4F7: case 0x4F8: case 0x4F9: case 0x4FD: case 0x63B: case 0x63C: case 0x63D: case 0x63E: case 0x686: case 0x687: case 0x688: case 0x689: case 0x68A: case 0x6AE: case 0x6AF: case 0x6B0: case 0x6B1: case 0x6B2: case 0x6B3: case 0x6B4: case 0x6B5: case 0x6B6: case 0x6B7: case 0x6B8: case 0x6B9: case 0x6BA: case 0x6BB: case 0x6BC: case 0x6BD: case 0x6BE: case 0x6BF: case 0x6C0: case 0x6C1: case 0x6C2: case 0x6C3: case 0x6C4: case 0x6C5: case 0x6C6: case 0x6C7: case 0x6C8: case 0x6CA: case 0x6CB: case 0x6CD: case 0x6CE: case 0x6CF: case 0x6D1: case 0x6D2: case 0x6D3: case 0x6D4: case 0x6D9: case 0x6DA: case 0x6DD: case 0x6DE: case 0x6E1: case 0x6E2: case 0x6E9: case 0x6EA: case 0x6EB: case 0x6EC: case 0x6ED: case 0x6EE: case 0x6F0: case 0x6F1: case 0x6F2: case 0x6F3: case 0x701: case 0x702: case 0x703: case 0x704: case 0x705: case 0x709: case 0x70A: case 0x70B: case 0x70D: case 0x70E: case 0x70F: case 0x748: case 0x749: case 0x758: case 0x759: case 0x762: case 0x763: case 0x764: case 0x767: case 0x768: case 0x76B: case 0x76C: case 0x7B1: case 0x7B3: case 0x7C8: case 0x7C9: case 0x7D3: case 0x7D4: case 0x7DA: case 0x7DC: case 0x7DD: case 0x7E3: case 0x7E4: case 0x7E5: case 0x7E6: case 0x7E7: case 0x7E8: case 0x7EC: case 0x7ED: case 0x7EE: case 0x7EF: case 0x7F0: case 0x7F1: case 0x7F2: case 0x7F3: case 0x7F4: case 0x7F5: case 0x7F6: case 0x7F7: case 0x7F8: case 0x7F9: case 0x7FA: case 0x7FB: case 0x7FC: case 0x7FD: case 0x807: case 0x808: case 0x809: case 0x80A: case 0x80B: case 0x80C: case 0x80D: case 0x80E: case 0x80F: case 0x811: case 0x812: case 0x813: case 0x814: case 0x815: case 0x816: case 0x81B: case 0x81C: case 0x829: case 0x82A: case 0x832: case 0x833: case 0x834: case 0x835: case 0x836: case 0x837: case 0x838: case 0x839: case 0x83A: case 0x83B: case 0x83C: case 0x844: case 0x845: case 0x846: case 0x847: case 0x848: case 0x849: case 0x84A: case 0x84B: case 0x84C: case 0x84D: case 0x855: case 0x856: case 0x857: case 0x858: case 0x85A: case 0x85B: case 0x85C: case 0x85D: case 0x85E: case 0x85F: case 0x860: case 0x861: case 0x862: case 0x863: case 0x864: case 0x865: case 0x866: case 0x867: case 0x868: case 0x869: case 0x86D: case 0x86E: case 0x86F: case 0x871: case 0x872: case 0x873: case 0x874: case 0x876: case 0x877: case 0x878: case 0x879: case 0x87A: case 0x87B: case 0x87C: case 0x87D: case 0x87E: case 0x87F: case 0x880: case 0x881: case 0x882: case 0x883: case 0x884: case 0x885: case 0x886: case 0x88A: case 0x88B: case 0x88C: case 0x88D: case 0x88E: case 0x88F: case 0x890: case 0x891: case 0x892: case 0x894: case 0x895: case 0x896: case 0x897: case 0x898: case 0x899: case 0x89A: case 0x8BC: case 0x8BD: case 0x8BE: case 0x8BF: case 0x8C1: case 0x8C2: case 0x8C3: case 0x8C4: case 0x8C5: case 0x8C6: case 0x8C7: case 0x8C8: case 0x8CA: case 0x8CB: case 0x8CC: case 0x8CD: case 0x8D2: case 0x8D3: case 0x8D4: case 0x8D5: case 0x8D6: case 0x8D7: case 0x8D8: case 0x8D9: case 0x8DA: case 0x8DB: case 0x8DC: case 0x8DD: case 0x8DE: case 0x8DF: case 0x8E1: case 0x8E2: case 0x8E8: offset -= 2; break; case 0x543: case 0x544: case 0x549: case 0x54A: case 0x5CE: case 0x5D1: case 0x736: case 0x737: case 0x738: case 0x77F: case 0x782: case 0x79E: case 0x7A0: case 0x7A2: case 0x7A3: case 0x7D9: case 0x7DB: case 0x7E0: case 0x7E1: case 0x827: case 0x828: case 0x82B: case 0x82C: case 0x82D: case 0x913: case 0x914: case 0x915: case 0x916: case 0x917: case 0x918: case 0x919: case 0x91A: case 0x91B: case 0x91C: case 0x91D: case 0x91F: case 0x920: case 0x943: case 0x944: case 0x948: case 0x949: case 0x94A: case 0x94B: case 0x94C: case 0x94D: case 0x94F: case 0x950: case 0x951: case 0x952: case 0x953: case 0x954: offset -= 4; break; case 0x639: case 0x657: case 0x676: case 0x774: offset -= 3; break; case 0x672: case 0x673: case 0x6A7: case 0x6A8: case 0x6A9: case 0x71A: case 0x71B: case 0x72F: case 0x730: case 0x732: case 0x89C: case 0x89D: case 0x89F: case 0x8A0: case 0x8A1: case 0x8A2: case 0x8A3: case 0x8A4: case 0x8A5: case 0x8A7: case 0x8A8: case 0x8A9: case 0x8AA: case 0x8AB: case 0x8AC: case 0x8AD: case 0x8AF: case 0x8B0: case 0x8B1: case 0x8B2: case 0x8B3: case 0x8B4: case 0x8B5: case 0x8B7: case 0x8B8: case 0x8B9: case 0x8BA: case 0x8BB: offset -= 3; break; case 0x6F5: case 0x6F6: case 0x6F7: case 0x739: case 0x73A: case 0x73C: case 0x73D: case 0x7AC: case 0x7AD: case 0x7D0: case 0x7D1: case 0x7D2: case 0x851: case 0x852: --offset; break; case 0x788: ++offset; break; case 0x743: offset += 4; break; case 0x746: case 0x75F: case 0x7B4: case 0x7C3: case 0x7CF: --offset; break; case 0x803: case 0x806: case 0x81E: case 0x821: case 0x83E: case 0x83F: offset -= 5; break; case 0x7DE: case 0x7DF: ++offset; break; case 0x94E: offset += 16; break; } if (id >= 0x9B5) { int position = 0; g_luaScript->Call("GetHatEfPos", "d>d", id - 0x9B5, &position); offset += position; } return offset - 7; } // OFFSET: 0x00B56210 // FUNCTION: fn_19041 bool CEZ2STRScreenEffect::IsAttachedToHead() const { switch (this->id) { case 0x425: case 0x42C: case 0x442: case 0x446: case 0x44A: case 0x44E: case 0x44F: case 0x451: case 0x453: case 0x454: case 0x455: case 0x45C: case 0x45F: case 0x463: case 0x464: case 0x467: case 0x46D: case 0x46E: case 0x470: case 0x472: case 0x473: case 0x475: case 0x476: case 0x4C2: case 0x4C3: case 0x4C4: case 0x4C5: case 0x4CC: case 0x4CD: case 0x4CE: case 0x4D6: case 0x4D7: case 0x4DB: case 0x4EA: case 0x4EB: case 0x4EC: case 0x4ED: case 0x4EE: case 0x4EF: case 0x4F0: case 0x4F1: case 0x4F2: case 0x4F3: case 0x4F4: case 0x4F5: case 0x4F6: case 0x4F7: case 0x4F8: case 0x4F9: case 0x4FA: case 0x4FB: case 0x4FD: case 0x522: case 0x543: case 0x544: case 0x545: case 0x546: case 0x547: case 0x548: case 0x549: case 0x54A: case 0x552: case 0x590: case 0x591: case 0x592: case 0x593: case 0x5C5: case 0x5CE: case 0x5CF: case 0x5D0: case 0x5D1: case 0x62D: case 0x62E: case 0x62F: case 0x631: case 0x632: case 0x633: case 0x634: case 0x635: case 0x636: case 0x637: case 0x638: case 0x639: case 0x63B: case 0x63C: case 0x63D: case 0x63E: case 0x63F: case 0x64B: case 0x64C: case 0x64D: case 0x64E: case 0x64F: case 0x650: case 0x657: case 0x658: case 0x659: case 0x65A: case 0x65B: case 0x65C: case 0x65D: case 0x65E: case 0x65F: case 0x660: case 0x663: case 0x664: case 0x665: case 0x666: case 0x667: case 0x668: case 0x669: case 0x66A: case 0x66B: case 0x66C: case 0x66D: case 0x66E: case 0x66F: case 0x670: case 0x671: case 0x672: case 0x673: case 0x674: case 0x675: case 0x676: case 0x686: case 0x687: case 0x688: case 0x689: case 0x68A: case 0x6A2: case 0x6A3: case 0x6A4: case 0x6A5: case 0x6A6: case 0x6A7: case 0x6A8: case 0x6A9: case 0x6AC: case 0x6AE: case 0x6AF: case 0x6B0: case 0x6B1: case 0x6B2: case 0x6B3: case 0x6B4: case 0x6B5: case 0x6B6: case 0x6B7: case 0x6B8: case 0x6B9: case 0x6BA: case 0x6BB: case 0x6BC: case 0x6BD: case 0x6BE: case 0x6BF: case 0x6C0: case 0x6C1: case 0x6C2: case 0x6C3: case 0x6C4: case 0x6C5: case 0x6C6: case 0x6C7: case 0x6C8: case 0x6C9: case 0x6CA: case 0x6CB: case 0x6CC: case 0x6CD: case 0x6CE: case 0x6CF: case 0x6D0: case 0x6D1: case 0x6D2: case 0x6D3: case 0x6D4: case 0x6D5: case 0x6D6: case 0x6D7: case 0x6D9: case 0x6DA: case 0x6DD: case 0x6DE: case 0x6DF: case 0x6E1: case 0x6E2: case 0x6E3: case 0x6E9: case 0x6EA: case 0x6EB: case 0x6EC: case 0x6ED: case 0x6EE: case 0x6EF: case 0x6F0: case 0x6F1: case 0x6F2: case 0x6F3: case 0x6F4: case 0x6F5: case 0x6F6: case 0x6F7: case 0x6F8: case 0x6F9: case 0x6FA: case 0x6FB: case 0x6FC: case 0x6FD: case 0x6FE: case 0x6FF: case 0x700: case 0x701: case 0x702: case 0x703: case 0x704: case 0x705: case 0x707: case 0x709: case 0x70A: case 0x70B: case 0x70D: case 0x70E: case 0x70F: case 0x710: case 0x711: case 0x712: case 0x714: case 0x716: case 0x718: case 0x719: case 0x71A: case 0x71B: case 0x71C: case 0x71D: case 0x71E: case 0x71F: case 0x720: case 0x721: case 0x722: case 0x723: case 0x724: case 0x726: case 0x727: case 0x728: case 0x729: case 0x72A: case 0x72B: case 0x72C: case 0x72E: case 0x72F: case 0x730: case 0x732: case 0x736: case 0x737: case 0x738: case 0x739: case 0x73A: case 0x73C: case 0x73D: case 0x73E: case 0x73F: case 0x740: case 0x741: case 0x742: case 0x743: case 0x744: case 0x745: case 0x746: case 0x747: case 0x748: case 0x749: case 0x74A: case 0x751: case 0x752: case 0x753: case 0x755: case 0x756: case 0x757: case 0x758: case 0x759: case 0x75A: case 0x75B: case 0x75C: case 0x75D: case 0x75E: case 0x75F: case 0x760: case 0x761: case 0x762: case 0x763: case 0x764: case 0x765: case 0x766: case 0x767: case 0x768: case 0x76A: case 0x76B: case 0x76C: case 0x76D: case 0x76F: case 0x770: case 0x771: case 0x772: case 0x773: case 0x774: case 0x775: case 0x77A: case 0x77B: case 0x77C: case 0x77D: case 0x77F: case 0x782: case 0x784: case 0x785: case 0x786: case 0x787: case 0x788: case 0x789: case 0x78A: case 0x78B: case 0x78E: case 0x78F: case 0x790: case 0x791: case 0x793: case 0x794: case 0x795: case 0x796: case 0x797: case 0x798: case 0x799: case 0x79A: case 0x79B: case 0x79C: case 0x79D: case 0x79E: case 0x7A0: case 0x7A1: case 0x7A2: case 0x7A3: case 0x7AC: case 0x7AD: case 0x7AE: case 0x7AF: case 0x7B1: case 0x7B2: case 0x7B3: case 0x7B4: case 0x7B6: case 0x7B7: case 0x7B8: case 0x7B9: case 0x7BA: case 0x7BB: case 0x7BC: case 0x7BD: case 0x7BE: case 0x7BF: case 0x7C0: case 0x7C1: case 0x7C3: case 0x7C4: case 0x7C5: case 0x7C6: case 0x7C7: case 0x7C8: case 0x7C9: case 0x7CA: case 0x7CB: case 0x7CC: case 0x7CD: case 0x7CF: case 0x7D0: case 0x7D1: case 0x7D2: case 0x7D3: case 0x7D4: case 0x7D5: case 0x7D6: case 0x7D7: case 0x7D8: case 0x7D9: case 0x7DA: case 0x7DB: case 0x7DC: case 0x7DD: case 0x7DE: case 0x7DF: case 0x7E0: case 0x7E1: case 0x7E2: case 0x7E3: case 0x7E4: case 0x7E5: case 0x7E6: case 0x7E7: case 0x7E8: case 0x7E9: case 0x7EB: case 0x7EC: case 0x7ED: case 0x7EE: case 0x7EF: case 0x7F0: case 0x7F1: case 0x7F2: case 0x7F3: case 0x7F4: case 0x7F5: case 0x7F6: case 0x7F7: case 0x7F8: case 0x7F9: case 0x7FA: case 0x7FB: case 0x7FC: case 0x7FD: case 0x7FE: case 0x7FF: case 0x800: case 0x801: case 0x802: case 0x803: case 0x804: case 0x805: case 0x806: case 0x807: case 0x808: case 0x809: case 0x80A: case 0x80B: case 0x80C: case 0x80D: case 0x80E: case 0x80F: case 0x810: case 0x811: case 0x812: case 0x813: case 0x814: case 0x815: case 0x816: case 0x817: case 0x818: case 0x819: case 0x81B: case 0x81C: case 0x81E: case 0x81F: case 0x821: case 0x823: case 0x824: case 0x825: case 0x826: case 0x827: case 0x828: case 0x829: case 0x82A: case 0x82B: case 0x82C: case 0x82D: case 0x82E: case 0x82F: case 0x830: case 0x831: case 0x832: case 0x833: case 0x834: case 0x835: case 0x836: case 0x837: case 0x838: case 0x839: case 0x83A: case 0x83B: case 0x83C: case 0x83E: case 0x83F: case 0x840: case 0x841: case 0x843: case 0x844: case 0x845: case 0x846: case 0x847: case 0x848: case 0x849: case 0x84A: case 0x84B: case 0x84C: case 0x84D: case 0x84E: case 0x84F: case 0x850: case 0x851: case 0x852: case 0x853: case 0x854: case 0x855: case 0x856: case 0x857: case 0x858: case 0x859: case 0x85A: case 0x85B: case 0x85C: case 0x85D: case 0x85E: case 0x85F: case 0x860: case 0x861: case 0x862: case 0x863: case 0x864: case 0x865: case 0x866: case 0x867: case 0x868: case 0x869: case 0x86B: case 0x86C: case 0x86D: case 0x86E: case 0x86F: case 0x870: case 0x871: case 0x872: case 0x873: case 0x874: case 0x876: case 0x877: case 0x878: case 0x879: case 0x87A: case 0x87B: case 0x87C: case 0x87D: case 0x87E: case 0x87F: case 0x880: case 0x881: case 0x882: case 0x883: case 0x884: case 0x885: case 0x886: case 0x888: case 0x889: case 0x88A: case 0x88B: case 0x88C: case 0x88D: case 0x88E: case 0x88F: case 0x890: case 0x891: case 0x892: case 0x894: case 0x895: case 0x896: case 0x897: case 0x898: case 0x899: case 0x89A: case 0x89C: case 0x89D: case 0x89F: case 0x8A0: case 0x8A1: case 0x8A2: case 0x8A3: case 0x8A4: case 0x8A5: case 0x8A7: case 0x8A8: case 0x8A9: case 0x8AA: case 0x8AB: case 0x8AC: case 0x8AD: case 0x8AF: case 0x8B0: case 0x8B1: case 0x8B2: case 0x8B3: case 0x8B4: case 0x8B5: case 0x8B7: case 0x8B8: case 0x8B9: case 0x8BA: case 0x8BB: case 0x8BC: case 0x8BD: case 0x8BE: case 0x8BF: case 0x8C1: case 0x8C2: case 0x8C3: case 0x8C4: case 0x8C5: case 0x8C6: case 0x8C7: case 0x8C8: case 0x8CA: case 0x8CB: case 0x8CC: case 0x8CD: case 0x8CE: case 0x8D0: case 0x8D1: case 0x8D2: case 0x8D3: case 0x8D4: case 0x8D5: case 0x8D6: case 0x8D7: case 0x8D8: case 0x8D9: case 0x8DA: case 0x8DB: case 0x8DC: case 0x8DD: case 0x8DE: case 0x8DF: case 0x8E1: case 0x8E2: case 0x8E7: case 0x8E8: case 0x900: case 0x904: case 0x910: case 0x911: case 0x912: case 0x913: case 0x914: case 0x915: case 0x916: case 0x917: case 0x918: case 0x919: case 0x91A: case 0x91B: case 0x91C: case 0x91D: case 0x91E: case 0x91F: case 0x920: case 0x921: case 0x923: case 0x924: case 0x926: case 0x943: case 0x944: case 0x948: case 0x949: case 0x94A: case 0x94B: case 0x94C: case 0x94D: case 0x94E: case 0x94F: case 0x950: case 0x951: case 0x952: case 0x953: case 0x954: case 0x955: case 0x95B: case 0x95C: case 0x95D: case 0x95E: case 0x95F: case 0x963: case 0x965: case 0x966: case 0x967: case 0x968: case 0x969: case 0x96A: case 0x975: case 0x976: return true; default: return false; } } // OFFSET: 0x00B51A60 // FUNCTION: fn_19032 bool CEZ2STRScreenEffect::ApplyHeadOffset(CEZ2STRParticle* particle) { if (this->unknown_00C8 != 1 && this->IsAttachedToHead() != true) { return false; } CGameActor* actor = static_cast(FindRenderObject(this->actor)); if (!actor) { return false; } float offsetX = GetHatEffectOffsetX(this->id, particle->m_name.c_str()); float offsetY = static_cast(GetHatEffectOffsetY(this->id, actor)); if (this->jobScaled == 1 && g_session.IsDoramJob(actor->GetEffectiveJob(-1)) == true) { offsetY -= 3.0f; } float factor = GetSkillFactor(actor->GetEffectiveJob(-1)); if (((actor->render.flags >> 4) & 1) != 0 && this->fadePulse == 1) { float scale = 1.0f; actor->ScaleByFadePulse(scale); factor = scale * factor; } float shiftX = offsetX * factor; float shiftY = factor * offsetY; if (shiftX < 0.0f && shiftY < 0.0f) { return false; } vector3d position = particle->position; const matrix& view = static_cast(g_modeMgr.GetGameMode())->camera->frame.view; const matrix& inverse = static_cast(g_modeMgr.GetGameMode())->camera->frame.inverse; float x = position.y * view.values[3] + position.x * view.values[0] + position.z * view.values[6] + view.values[9] + shiftX; float y = position.y * view.values[4] + position.x * view.values[1] + position.z * view.values[7] + view.values[10] - shiftY; float z = position.y * view.values[5] + position.x * view.values[2] + position.z * view.values[8] + view.values[11]; float worldX = y * inverse.values[3] + x * inverse.values[0] + z * inverse.values[6] + inverse.values[9]; float worldY = y * inverse.values[4] + x * inverse.values[1] + z * inverse.values[7] + inverse.values[10]; float worldZ = y * inverse.values[5] + x * inverse.values[2] + z * inverse.values[8] + inverse.values[11]; particle->position.x = worldX; particle->position.y = worldY; particle->position.z = worldZ; return true; } // OFFSET: 0x00B51CC0 // FUNCTION: fn_19033 void CEZ2STRScreenEffect::Close() { FreeParticle(this->particle); } // OFFSET: 0x00B51CD0 // FUNCTION: fn_19034 vector3d CEZ2STRScreenEffect::Slot25() { if (CEZ2STRParticle* particle = this->particle) { return particle->m_windowOffset; } return vector3d{}; } // OFFSET: 0x00B51D20 // FUNCTION: fn_19035 bool CEZ2STRScreenEffect::Slot33() { if (this->id != 0x76C) { return CEffect::Slot33(); } CGameActor* actor = static_cast(FindRenderObject(this->actor)); if (!actor) { return false; } if (actor->unknown_0304 != 0) { return actor->EffectVisible(); } return true; } // OFFSET: 0x00B56790 // FUNCTION: fn_19042 bool CEZ2STRScreenEffect::Slot06() { if (this->unknown_00C8 == 1) { return this->ActorExists(); } switch (this->id) { case 0x8D: case 0x3E6: case 0x45F: case 0x470: case 0x473: case 0x4C5: case 0x4EE: case 0x4EF: case 0x4F0: case 0x4F1: case 0x514: case 0x515: case 0x516: case 0x517: case 0x518: case 0x519: case 0x51A: case 0x51B: case 0x51C: case 0x51D: case 0x552: case 0x5BB: case 0x5BC: case 0x5BD: case 0x5BE: case 0x5BF: case 0x5C0: case 0x5C1: case 0x5C2: case 0x5C3: case 0x5C4: case 0x63F: case 0x64B: case 0x64C: case 0x64D: case 0x64E: case 0x64F: case 0x650: case 0x676: case 0x6AE: case 0x6BE: case 0x6BF: case 0x6CD: case 0x6D7: case 0x6EB: case 0x6EC: case 0x6F0: case 0x6F1: case 0x701: case 0x702: case 0x703: case 0x719: case 0x72F: case 0x752: case 0x756: case 0x75A: case 0x765: case 0x766: case 0x76C: case 0x77F: case 0x7AA: case 0x7B7: case 0x7BA: case 0x7BD: case 0x7BE: case 0x7C1: case 0x7C7: case 0x7D2: case 0x7EF: case 0x7F9: case 0x7FA: case 0x803: case 0x804: case 0x807: case 0x808: case 0x80C: case 0x81E: case 0x81F: case 0x84E: case 0x851: case 0x852: case 0x876: case 0x881: case 0x886: case 0x8A2: case 0x8A3: case 0x8AA: case 0x8AB: case 0x8B2: case 0x8B3: case 0x8BA: case 0x8BB: case 0x8DC: case 0x8DD: case 0x8DE: case 0x8E1: case 0x8E8: case 0x8FE: case 0x948: case 0x949: case 0x94A: case 0x94B: case 0x94C: case 0x94D: case 0x94F: case 0x950: case 0x951: case 0x952: case 0x953: case 0x954: case 0x955: case 0x963: return this->ActorExists(); } CEZ2STRParticle* particle = this->particle; if (particle->life == 0.0f) { return true; } return particle->life * 60.0f > static_cast(particle->unknown_00E8); } // OFFSET: 0x00B65EE0 // FUNCTION: fn_19044 void CEZ2STRScreenEffect::Slot03() { if (this->followCamera == 1 && this->particle) { double yaw = static_cast(g_modeMgr.GetGameMode())->camera->camera.yaw; if (yaw != this->cameraAngle) { CEZ2STRParticle* particle = this->particle; double angle = this->cameraAngle - yaw + particle->m_angle; if (angle < 0.0) { angle += 360.0; } else if (angle > 360.0) { angle -= 360.0; } particle->m_angle = static_cast(angle); this->cameraAngle = yaw; } } this->particle->position.x = this->position[0]; this->particle->position.y = this->position[1]; this->particle->position.z = this->position[2]; if (CEZ2STRParticle* particle = this->particle) { if (this->ApplyHeadOffset(particle) || this->id == 0x584) { particle->Process(0.0f, 0.0f, 0.0f); } else { particle->Process(0.0f, -80.0f, 0.0f); } } ++this->particle->unknown_00E8; if (this->id == 0x851) { int frame = this->particle->unknown_00E8 - 30; if (frame >= 0 && frame % 64 == 0) { CRenderObject* player = reinterpret_cast(static_cast(g_modeMgr.GetGameMode())->scene->player); g_soundMgr->PlayWave( "effect\\ABC_ABYSS_SQUARE.wav", player->render.position.x - this->position[0], 0.0f, player->render.position.z - this->position[2], 250, 40, 1.0f, 0 ); } } CGameActor* actor = static_cast(FindRenderObject(this->actor)); if (!actor) { return; } if (this->jobScaled == 1 && actor->Slot55() <= 0) { float factor = GetSkillFactor(actor->GetEffectiveJob(-1)); if (this->fadePulse == 1) { actor->ScaleByFadePulse(factor); } CEZ2STRParticle* particle = this->particle; float extent[2]; const float* shift = actor->GetExtent(extent); particle->m_shiftX = factor * shift[0]; particle->m_shiftY = factor * shift[1]; } this->particle->m_lift = *reinterpret_cast(&actor->render.unknown_0128); } // OFFSET: 0x00B661B0 // FUNCTION: fn_19045 void CEZ2STRScreenEffect::Slot04() { CEZ2STRParticle* particle = this->particle; if (!particle) { return; } switch (this->id) { case 0x647: case 0x907: case 0x908: case 0x909: case 0x90A: case 0x90B: case 0x90D: case 0x90E: case 0x90F: this->overlayColor += 0x2000000; break; case 0x95B: case 0x95C: case 0x95F: this->overlayColor += 0x10000000; break; default: goto draw; } if (this->overlayColor >= 0xAA000000u) { this->overlayColor = 0xAA000000u; } DrawBlendedRectangle( g_renderer->primitives, g_renderer->queues, 0, 0, g_renderer->viewport.width, g_renderer->viewport.height, this->overlayColor, g_renderer->fog.supported != 0, g_depthStart, g_depthEnd ); draw: particle->DrawScreen(static_cast(g_modeMgr.GetGameMode())->camera->frame.view); } // OFFSET: 0x00B66460 // FUNCTION: fn_19046 void CEZ2STRScreenEffect::Slot00(int argument) { this->particle->submit = reinterpret_cast(argument); } // OFFSET: 0x00B66480 // FUNCTION: fn_19047 void CEZ2STRScreenEffect::Slot23(float argument) { if (this->particle) { this->particle->m_alpha = argument; } } // OFFSET: 0x00B664A0 // FUNCTION: fn_19048 void CEZ2STRScreenEffect::Slot29(int id) { CEffect::Slot29(id); switch (id) { case 0x3F4: case 0x40A: case 0x40B: case 0x40C: case 0x433: case 0x437: case 0x43B: case 0x43C: case 0x43D: case 0x43E: case 0x43F: case 0x441: case 0x443: case 0x444: case 0x445: case 0x447: this->unknown_00C8 = 1; break; default: if (id >= 0x9B5) { this->unknown_00C8 = 1; } break; } } // OFFSET: 0x00B66540 // FUNCTION: fn_19049 void CEZ2STRScreenEffect::Slot24(int argument1, int argument2, int argument3, int argument4, int argument5) { if (!this->particle) { return; } const vector3d offset = *reinterpret_cast(&argument1); this->particle->m_windowOffset = offset; if (static_cast(argument4) == 1) { this->particle->m_attachToWindow = true; this->particle->m_windowId = argument5; } } // OFFSET: 0x00B665B0 // FUNCTION: fn_19050 void CEZ2STRScreenEffect::Slot21(int argument) { this->particle->flags = argument; } // OFFSET: 0x00B665D0 // FUNCTION: fn_19051 void CEZ2STRScreenEffect::Slot15(int argument) { if (this->particle) { this->particle->m_repeat = argument - 1; } } // OFFSET: 0x00B665F0 // FUNCTION: fn_19052 void CEZ2STRScreenEffect::Slot14(int argument) { if (this->particle) { this->particle->m_lifeTime = argument; } } // OFFSET: 0x00B66610 // FUNCTION: fn_19053 void CEZ2STRScreenEffect::Slot17(float argument) { if (this->particle) { this->particle->m_angle = argument; } } // OFFSET: 0x00B66630 // FUNCTION: fn_19054 void CEZ2STRScreenEffect::Slot22(float argument) { if (this->particle) { this->particle->m_scale = argument; } } // OFFSET: 0x00B66650 // FUNCTION: fn_19055 void CEZ2STRScreenEffect::Slot13(int argument) { if (this->particle) { this->particle->Advance(*reinterpret_cast(&argument)); } } // OFFSET: 0x00B66680 // FUNCTION: fn_19056 void CEZ2STRScreenEffect::Slot16(int argument) { if (this->particle) { this->particle->m_delay = argument; } } // OFFSET: 0x00B666A0 // FUNCTION: fn_19057 void CEZ2STRScreenEffect::Slot20(int argument) { this->name = reinterpret_cast(argument); FreeParticle(this->particle); this->Slot01(); } // OFFSET: 0x00B52970 // FUNCTION: fn_19038 int CEZ2STRScreenEffect::Slot28() { return this->particle->m_frame; } // OFFSET: 0x00B52980 // FUNCTION: fn_19039 void CEZ2STRScreenEffect::Slot01() { CEZ2STRParticle* particle = static_cast( CreateEZ2STRParticle(reinterpret_cast(this->position), 5) ); if (!particle) { return; } particle->m_actorId = this->actor; if (this->unknown_00C8 == 1) { this->retained = 1; particle->m_loop = true; bool adjustSize = false; g_luaScript->Call("IsAdjustSizeWhenShrinkState", "d>b", this->id - 0x9B5, &adjustSize); particle->m_followActor = adjustSize; bool adjustPosition = false; g_luaScript->Call("IsAdjustPositionWhenShrinkState", "d>b", this->id - 0x9B5, &adjustPosition); this->fadePulse = adjustPosition; } switch (this->id) { case 0x3E6: case 0x442: case 0x45F: case 0x470: case 0x473: case 0x4C5: case 0x4DC: case 0x4DD: case 0x4DE: case 0x4DF: case 0x4E0: case 0x4E1: case 0x4E2: case 0x4E3: case 0x4E4: case 0x4E5: case 0x4EE: case 0x4EF: case 0x4F0: case 0x4F1: particle->m_loop = true; break; case 0x552: case 0x584: case 0x5A6: case 0x607: case 0x63F: case 0x64B: case 0x64C: case 0x64D: case 0x64E: case 0x64F: case 0x650: case 0x676: case 0x6AE: case 0x6BE: case 0x6BF: case 0x6CD: case 0x6D7: case 0x6EB: case 0x6F1: case 0x701: case 0x702: case 0x703: case 0x712: case 0x719: case 0x72F: case 0x73C: case 0x73D: case 0x752: case 0x756: case 0x75A: case 0x765: case 0x766: case 0x76C: case 0x77F: case 0x7AA: case 0x7B7: case 0x7BA: case 0x7BD: case 0x7BE: case 0x7C1: case 0x7C7: case 0x7D2: case 0x7EF: case 0x7F9: case 0x7FA: case 0x803: case 0x804: case 0x807: case 0x808: case 0x80C: case 0x81E: case 0x81F: case 0x84E: case 0x851: case 0x852: case 0x876: case 0x881: case 0x886: case 0x8A2: case 0x8A3: case 0x8AA: case 0x8AB: case 0x8B2: case 0x8B3: case 0x8BA: case 0x8BB: case 0x8DC: case 0x8DD: case 0x8DE: case 0x8E1: case 0x8E8: case 0x8FE: case 0x948: case 0x949: case 0x94A: case 0x94B: case 0x94C: case 0x94D: case 0x94F: case 0x950: case 0x951: case 0x952: case 0x953: case 0x954: case 0x955: case 0x963: this->retained = 1; particle->m_loop = true; break; case 0x6EC: this->AddEvent(0, "effect\\AG_MYSTERY_ILLUSION.wav", 0, 0); this->retained = 1; particle->m_loop = true; break; case 0x6F0: this->AddEvent(0, "effect\\AG_TORNADO_STORM.wav", 0, 0); this->retained = 1; particle->m_loop = true; break; case 0x710: this->AddEvent(0, "effect\\CD_MEDIALE_VOTUM.wav", 0, 0); break; default: break; } if (this->unknown_00C4 > 0) { particle->m_loop = true; } InitParticleQuad(particle->vertices); this->particle = particle; this->Slot34(particle, this->id); CGameMode* mode = static_cast(g_modeMgr.GetGameMode()); this->cameraAngle = static_cast(mode->camera->camera.yaw); if (this->id >= 0x9B5) { g_luaScript->Call("IsAttachedToHead", "d>b", this->id - 0x9B5, &this->jobScaled); } } // OFFSET: 0x00B531E0