rodecomp/Source/Client/Stove/StoveMgr.cpp
ragnarok-clanker 0f561a5dca Maintenance: Source reorganisation, parts 2+3: Source/UI, Client, Render, Resource, Utility, Network, Archive, Interface and loose So
Batch #16644 by ragnarok-clanker: no function's compiled code changes; checked with 593 compiled unit(s), including every includer of Source/Client/Application/Registry.h, Source/Client/Application/RegistryKey.h, Source/Client/Application/Timer.h, Source/Client/Mode/ModeFade.h, Source/Client/Mode/ModeFadeOut.h, Source/Client/Mode/ModeScreenshot.h, Source/Client/Replay/Replay.h, Source/Client/Replay/ReplayRecordOption.h, Source/Client/Session/Session.h, Source/Contents/Actors/ActorPickNode.h, Source/Contents/Effects/Core/RagEffectState.h, Source/Contents/Effects/Particles/Particle.h, Source/Contents/Movies/BinkMovie.h, Source/Contents/Sprites/SpriteLayerDrawing.h, Source/File/NFileLog.h, Source/Network/NIPAddr.h, Source/Network/Packets/ActorNamePacket.h, Source/Network/Packets/ClientKeepalive.h, Source/Network/Packets/ClientOptionPacket.h, Source/Network/Packets/ExecutableDigestPacket.h, Source/Network/Packets/GameTickPacket.h, Source/Render/DX7/QueuedDrawingDX7.h, Source/Render/DX7/RendererDX7.h, Source/Render/DX9/RenderSystemDX9.h, Source/Render/Device/DeviceSelection.h, Source/Render/Device/Direct3DErrors.h, Source/Render/Device/DisplayMode.h, Source/Render/Device/RenderAdapter.h, Source/Render/Device/RenderBackends.h, Source/Render/Drawing/ActionSpriteDrawing.h, Source/Render/Drawing/BitmapDrawing.h, Source/Render/Drawing/BlendColor.h, Source/Render/Drawing/SpriteGeometry.h, Source/Render/Drawing/TextureStageModes.h, Source/Render/Primitives/AuxiliarySubmission.h, Source/Render/Primitives/SpriteQuad.h, Source/Render/Primitives/TextureQuad.h, Source/Render/Projection/ScreenGeometry.h, Source/Render/Projection/ScreenRectangle.h, Source/Resource/Audio/BinkRuntime.h, Source/Resource/Bitmap/EmblemResource.h, Source/Resource/Bitmap/GifLzw.h, Source/Resource/Bitmap/GifResource.h, Source/Resource/Bitmap/PaletteResource.h, Source/Resource/Bitmap/SkinPalette.h, Source/Resource/Bitmap/TextureNames.h, Source/Resource/Effects/EZeffectResource.h, Source/Resource/Json/JsonCppLoader.h, Source/Resource/Models/RmaResource.h, Source/Resource/Sprites/ImfResource.h, Source/Resource/Xml/XmlNode.h, Source/Security/FileSignatureVerifier.h, Source/Security/ProcessSecurity.h, Source/UI/Achievement/UIAchWnd.h, Source/UI/AdventureGuide/UIAdventureGuide.h, Source/UI/Buttons/UIBalloonOpenBtn.h, Source/UI/Buttons/UIMiniBtnWnd.h, Source/UI/Buttons/UISlotBitmap.h, Source/UI/Buttons/UIStaticBitmap.h, Source/UI/Buttons/UIStaticItem.h, Source/UI/Buttons/UIWindowCallBtnWnd.h, Source/UI/CashEmotion/UICashEmotionSprBtn.h, Source/UI/CashShop/UIMileageWnd.h, Source/UI/CashShop/UIPayConfirmWnd.h, Source/UI/Chat/UIChatRoomWnd.h, Source/UI/Dialogs/UIAccountLimitedToolWnd.h, Source/UI/Dialogs/UICntWnd.h, Source/UI/Dialogs/UILoadingWnd.h, Source/UI/Dialogs/UIMessageBox.h, Source/UI/Dialogs/UIMessageBoxAutoreturn.h, Source/UI/Dialogs/UINormalMB.h, Source/UI/Dialogs/UINoteWnd.h, Source/UI/Dialogs/UINoticeWnd.h, Source/UI/Dialogs/UIRPImageWnd.h, Source/UI/Dialogs/UIRPImageWnd2.h, Source/UI/Dialogs/UITalkboxTrapInputWnd.h, Source/UI/Dialogs/UITransMenuWnd.h, Source/UI/Dialogs/UIVideoWnd.h, Source/UI/Dialogs/UIWordDisplayWnd.h, Source/UI/Edit/UIItemTagCtrl.h, Source/UI/Enchant/EnchantUI.h, Source/UI/Events/UICheckAttendanceWnd.h, Source/UI/Events/UIOpenRoulletteWnd.h, Source/UI/Events/UIRoulletteWnd.h, Source/UI/Exchange/UIExchangeUI.h, Source/UI/GameSettings/GameSettingsUI.h, Source/UI/GameSettings/UIBattleMsgOptionWnd.h, Source/UI/GameSettings/UIEscOptionWnd.h, Source/UI/GameSettings/UIHotKeyWnd.h, Source/UI/GameSettings/UIHotkeyGuideWnd.h, Source/UI/GameSettings/UIViewCameraInfoWnd.h, Source/UI/Gauges/UIBarGraph.h, Source/UI/Guild/UIEmblemWnd.h, Source/UI/Guild/UIGuildWnd.h, Source/UI/Items/UIChangeMaterialWnd.h, Source/UI/Items/UICollectionSystemWnd.h, Source/UI/Items/UIEquipmentPropertiesWnd.h, Source/UI/Items/UIGradeEnchantWnd.h, Source/UI/Items/UIIngredientInfoWnd.h, Source/UI/Items/UIItemBaseWnd.h, Source/UI/Items/UIItemCollectionWnd.h, Source/UI/Items/UIItemMoveInfo.h, Source/UI/Items/UIItemPurchaseWnd.h, Source/UI/Items/UIItemReformWnd.h, Source/UI/Items/UIItemSellWnd.h, Source/UI/Items/UIItemSellWnd2.h, Source/UI/Items/UIItemShopWnd.h, Source/UI/Items/UIItemShopWnd2.h, Source/UI/Items/UIItemStoreComboBox.h, Source/UI/Items/UIItemStoreFindWnd.h, Source/UI/Items/UIItemStoreSubWnd.h, Source/UI/Items/UIItemStoreWnd.h, Source/UI/Items/UIItemWnd.h, Source/UI/Items/UILapineScrollBar.h, Source/UI/Items/UILapineUpgradeBoxWnd.h, Source/UI/Items/UIMerchantItemLogWnd.h, Source/UI/Items/UIParaItemShopWnd.h, Source/UI/Items/UIPreviewEquipWnd.h, Source/UI/Items/UIRefiningWnd.h, Source/UI/Items/UISecondCostumeWnd.h, Source/UI/Items/UISelectCartWnd.h, Source/UI/Lists/UIComboBoxEx.h, Source/UI/Lists/UIScrollBarVariants.h, Source/UI/Lists/UIScrollWnd.h, Source/UI/Lists/UITagListBox.h, Source/UI/Login/FuncDrawWNDChar.h, Source/UI/Login/UIChangeNameWnd.h, Source/UI/Login/UIDescriptRace.h, Source/UI/Login/UIEmailAddressWnd.h, Source/UI/Login/UILoginOTPWnd.h, Source/UI/Login/UILoginWnd.h, Source/UI/Login/UIMakeCharWnd.h, Source/UI/Login/UINewMakeCharWnd.h, Source/UI/Login/UINewSelectCharWnd.h, Source/UI/Login/UIPasswordWnd.h, Source/UI/Login/UISecondPasswordEditWnd.h, Source/UI/Login/UISelCharForUServerWnd.h, Source/UI/Login/UISelectServerWnd.h, Source/UI/Login/UIWaitDBSaveWnd.h, Source/UI/Macro/UICaptchaPreviewWnd.h, Source/UI/Macro/UICaptchaRegisterWnd.h, Source/UI/Macro/UIMacroBlackListCheckWnd.h, Source/UI/Macro/UIMacroDetectorWnd.h, Source/UI/Macro/UIMacroReport.h, Source/UI/Macro/UIMacroUserInfoWnd.h, Source/UI/Monster/UIMonsterDisplayWnd.h, Source/UI/Monster/UIMonsterInfoWnd.h, Source/UI/Navigation/NavigationLink.h, Source/UI/Navigation/UIChooseWarpWnd.h, Source/UI/Navigation/UIListBoxNavi.h, Source/UI/Navigation/UIListBoxNaviSearch.h, Source/UI/Navigation/UIMemorialDunWnd.h, Source/UI/Navigation/UIMiniMapWnd.h, Source/UI/Navigation/UIMinimapZoomWnd.h, Source/UI/Navigation/UINavigationHelpWnd.h, Source/UI/Navigation/UINavigationWnd.h, Source/UI/Navigation/UIRoMapWnd.h, Source/UI/Navigation/UIScrollBarNavi.h, Source/UI/Navigation/UIShowWarpWnd.h, Source/UI/Party/MiniPartyGrid.h, Source/UI/Party/MiniPartyPlacement.h, Source/UI/Party/MiniPartyWndAreaMgr.h, Source/UI/Party/UIJobSlotButton.h, Source/UI/Party/UIPartyBookingHelpWnd.h, Source/UI/Party/UISeekPartyListWnd.h, Source/UI/Party/UISeekPartyMBWnd.h, Source/UI/Party/UISeekPartyWnd.h, Source/UI/ProbabilityTable/UIProbabilityTable.h, Source/UI/Quest/UINotifyQuestWnd.h, Source/UI/Quest/UIOngoingQuestInfo.h, Source/UI/Quest/UIRecommendedQuestInfo.h, Source/UI/Quest/UIRenewQuestUI.h, Source/UI/Quest/UIRenewQuestWnd.h, Source/UI/Replay/UIReplayButton.h, Source/UI/Replay/UIReplayControlWnd.h, Source/UI/Replay/UIReplayListBox.h, Source/UI/Replay/UIReplayRECControlWnd.h, Source/UI/Replay/UISelectReplayDataWnd.h, Source/UI/Repute/UIReputeWnd.h, Source/UI/Rodex/UIOpenMailBoxWnd.h, Source/UI/Rodex/UIRodexContentsWnd.h, Source/UI/Rodex/UIRodexInboxWnd.h, Source/UI/RuneSystem/UIRuneSystemWindows.h, Source/UI/RuneSystem/UIRuneSystemWnd.h, Source/UI/SelectPackageItemBox/SelectPackageItemBox.h, Source/UI/SelectPackageItemBox/UIPackageBoxNameList.h, Source/UI/Shop/PriceCommission.h, Source/UI/Shop/UIBank_NewWnd.h, Source/UI/Shop/UIBartermarketWnd.h, Source/UI/Shop/UIMerchantItemMyShopWnd.h, Source/UI/Shop/UIMerchantItemPurchaseWnd.h, Source/UI/Shop/UIMerchantItemShopWnd.h, Source/UI/Shop/UIMerchantItemWnd.h, Source/UI/Shop/UIMerchantMirrorItemWnd.h, Source/UI/Shop/UISerachStoreInfoWnd.h, Source/UI/Shop/UInCash_CallWnd.h, Source/UI/Skill/UIDebuffRemoveWnd.h, Source/UI/Skill/UIGraffiStrboxWnd.h, Source/UI/Skill/UINewSkillListWnd.h, Source/UI/SkillDelayInfo/SkillDelayInfo.h, Source/UI/Status/UIBasicInfoWnd.h, Source/UI/Status/UIHomunInfoWnd.h, Source/UI/Status/UIJobListWnd.h, Source/UI/Status/UIMerInfoWnd.h, Source/UI/Status/UIPetEvolutionWnd.h, Source/UI/Status/UIPetInfoWnd.h, Source/UI/Status/UIPetTamingDeceiveWnd.h, Source/UI/Status/UIRebirthWnd.h, Source/UI/StylingShop/UIStylingShopWnd.h, Source/UI/Text/TextTags.h, Source/UI/Text/UIBroadcastBalloon.h, Source/UI/Text/UIRoundBoxTooltipWnd.h, Source/UI/Window/FrameSkin.h, Source/UI/Window/UIBasicCtrl.h, Source/UI/Window/UIControl.h, Source/UI/Window/UIWindowMgr.inl, Source/Utility/Cipher/EncryptedName.h, Source/Utility/Hash/CRC32.h, Source/Utility/Hash/GGHash.h, Source/Utility/Hash/GGHashMgr.h, Source/Utility/Hash/Md5State.h, Source/Utility/Hash/SHA3.h, Source/Utility/Hash/XxHash3.h, Source/Utility/Text/GuidParse.h, Source/Utility/Text/Tokenizer.h, Source/Utility/Zlib.h, Source/ActorPickNode.h, Source/Client/ModeFade.h, Source/Client/ModeFadeOut.h, Source/Client/ModeScreenshot.h, Source/Client/Registry.h, Source/Client/Replay.h, Source/Client/ReplayRecordOption.h, Source/Client/Session.h, Source/Client/Timer.h, Source/Network/ActorNamePacket.h, Source/Network/ClientKeepalive.h, Source/Network/ClientOptionPacket.h, Source/Network/ExecutableDigestPacket.h, Source/Network/GameTickPacket.h, Source/Render/ActionSpriteDrawing.h, Source/Render/AuxiliarySubmission.h, Source/Render/BitmapDrawing.h, Source/Render/BlendColor.h, Source/Render/DeviceSelection.h, Source/Render/Direct3DErrors.h, Source/Render/DisplayMode.h, Source/Render/RenderAdapter.h, Source/Render/RenderBackends.h, Source/Render/RendererDX7.h, Source/Render/ScreenGeometry.h, Source/Render/ScreenRectangle.h, Source/Render/SpriteGeometry.h, Source/Render/SpriteQuad.h, Source/Render/TextureQuad.h, Source/Render/TextureStageModes.h, Source/Resource/BinkRuntime.h, Source/Resource/EZeffectResource.h, Source/Resource/EmblemResource.h, Source/Resource/GifLzw.h, Source/Resource/GifResource.h, Source/Resource/ImfResource.h, Source/Resource/PaletteResource.h, Source/Resource/RmaResource.h, Source/Resource/SkinPalette.h, Source/Resource/TextureNames.h, Source/Resource/XmlNode.h, Source/UI/Buttons/UICashEmotionSprBtn.h, Source/UI/Buttons/UIDescriptRace.h, Source/UI/Buttons/UIItemMoveInfo.h, Source/UI/Buttons/UIJobSlotButton.h, Source/UI/Buttons/UIReplayButton.h, Source/UI/Dialogs/UIChooseWarpWnd.h, Source/UI/Dialogs/UIEmailAddressWnd.h, Source/UI/Dialogs/UIGraffiStrboxWnd.h, Source/UI/Dialogs/UIMemorialDunWnd.h, Source/UI/Dialogs/UIMiniMapWnd.h, Source/UI/Dialogs/UIMinimapZoomWnd.h, Source/UI/Dialogs/UINotifyQuestWnd.h, Source/UI/Dialogs/UIPasswordWnd.h, Source/UI/Dialogs/UIPetTamingDeceiveWnd.h, Source/UI/Dialogs/UISecondPasswordEditWnd.h, Source/UI/Dialogs/UISelectCartWnd.h, Source/UI/Dialogs/UIWaitDBSaveWnd.h, Source/UI/FrameSkin.h, Source/UI/Item/UIEquipmentPropertiesWnd.h, Source/UI/Item/UIItemBaseWnd.h, Source/UI/Item/UIItemPurchaseWnd.h, Source/UI/Item/UIItemSellWnd.h, Source/UI/Item/UIItemSellWnd2.h, Source/UI/Item/UIItemShopWnd.h, Source/UI/Item/UIItemShopWnd2.h, Source/UI/Item/UIItemStoreFindWnd.h, Source/UI/Item/UIItemStoreSubWnd.h, Source/UI/Item/UIItemStoreWnd.h, Source/UI/Item/UIItemWnd.h, Source/UI/Item/UIMerchantItemLogWnd.h, Source/UI/Item/UIParaItemShopWnd.h, Source/UI/Lists/UIItemStoreComboBox.h, Source/UI/Lists/UIListBoxNavi.h, Source/UI/Lists/UIListBoxNaviSearch.h, Source/UI/Lists/UIPackageBoxNameList.h, Source/UI/Lists/UIReplayListBox.h, Source/UI/Lists/UIScrollBarNavi.h, Source/UI/MiniPartyGrid.h, Source/UI/MiniPartyPlacement.h, Source/UI/PriceCommission.h, Source/UI/Text/NavigationLink.h, Source/UI/Text/UIAchWnd.h, Source/UI/TextTags.h, Source/UI/UIBarGraph.h, Source/UI/UIBartermarketWnd.h, Source/UI/UIBasicCtrl.h, Source/UI/UIBroadcastBalloon.h, Source/UI/UICaptchaPreviewWnd.h, Source/UI/UICaptchaRegisterWnd.h, Source/UI/UIChangeMaterialWnd.h, Source/UI/UICheckAttendanceWnd.h, Source/UI/UIGradeEnchantWnd.h, Source/UI/UIHotkeyGuideWnd.h, Source/UI/UIIngredientInfoWnd.h, Source/UI/UIItemReformWnd.h, Source/UI/UILapineScrollBar.h, Source/UI/UILapineUpgradeBoxWnd.h, Source/UI/UIMacroBlackListCheckWnd.h, Source/UI/UIMacroDetectorWnd.h, Source/UI/UIMacroReport.h, Source/UI/UIMacroUserInfoWnd.h, Source/UI/UIPreviewEquipWnd.h, Source/UI/UIRefiningWnd.h, Source/UI/UIReputeWnd.h, Source/UI/UIRoundBoxTooltipWnd.h, Source/UI/UIScrollWnd.h, Source/UI/UISlotBitmap.h, Source/UI/UIStaticBitmap.h, Source/UI/UIStaticItem.h, Source/UI/Window/FuncDrawWNDChar.h, Source/UI/Window/MiniPartyWndAreaMgr.h, Source/UI/Window/UIAccountLimitedToolWnd.h, Source/UI/Window/UIBalloonOpenBtn.h, Source/UI/Window/UIBank_NewWnd.h, Source/UI/Window/UIBasicInfoWnd.h, Source/UI/Window/UIBattleMsgOptionWnd.h, Source/UI/Window/UIChangeNameWnd.h, Source/UI/Window/UIChatRoomWnd.h, Source/UI/Window/UICntWnd.h, Source/UI/Window/UICollectionSystemWnd.h, Source/UI/Window/UIDebuffRemoveWnd.h, Source/UI/Window/UIEmblemWnd.h, Source/UI/Window/UIEscOptionWnd.h, Source/UI/Window/UIHomunInfoWnd.h, Source/UI/Window/UIHotKeyWnd.h, Source/UI/Window/UIJobListWnd.h, Source/UI/Window/UILoginOTPWnd.h, Source/UI/Window/UILoginWnd.h, Source/UI/Window/UIMakeCharWnd.h, Source/UI/Window/UIMerInfoWnd.h, Source/UI/Window/UIMessageBox.h, Source/UI/Window/UIMessageBoxAutoreturn.h, Source/UI/Window/UIMileageWnd.h, Source/UI/Window/UIMiniBtnWnd.h, Source/UI/Window/UIMonsterDisplayWnd.h, Source/UI/Window/UIMonsterInfoWnd.h, Source/UI/Window/UINavigationHelpWnd.h, Source/UI/Window/UINavigationWnd.h, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UINewSelectCharWnd.h, Source/UI/Window/UINewSkillListWnd.h, Source/UI/Window/UINormalMB.h, Source/UI/Window/UINoteWnd.h, Source/UI/Window/UINoticeWnd.h, Source/UI/Window/UIOpenMailBoxWnd.h, Source/UI/Window/UIOpenRoulletteWnd.h, Source/UI/Window/UIPartyBookingHelpWnd.h, Source/UI/Window/UIPayConfirmWnd.h, Source/UI/Window/UIPetEvolutionWnd.h, Source/UI/Window/UIPetInfoWnd.h, Source/UI/Window/UIRPImageWnd.h, Source/UI/Window/UIRPImageWnd2.h, Source/UI/Window/UIRebirthWnd.h, Source/UI/Window/UIReplayControlWnd.h, Source/UI/Window/UIReplayRECControlWnd.h, Source/UI/Window/UIRoMapWnd.h, Source/UI/Window/UIRodexContentsWnd.h, Source/UI/Window/UIRoulletteWnd.h, Source/UI/Window/UISecondCostumeWnd.h, Source/UI/Window/UISeekPartyListWnd.h, Source/UI/Window/UISeekPartyMBWnd.h, Source/UI/Window/UISeekPartyWnd.h, Source/UI/Window/UISelCharForUServerWnd.h, Source/UI/Window/UISelectReplayDataWnd.h, Source/UI/Window/UISelectServerWnd.h, Source/UI/Window/UISerachStoreInfoWnd.h, Source/UI/Window/UIShowWarpWnd.h, Source/UI/Window/UITalkboxTrapInputWnd.h, Source/UI/Window/UITransMenuWnd.h, Source/UI/Window/UIVideoWnd.h, Source/UI/Window/UIViewCameraInfoWnd.h, Source/UI/Window/UIWindowCallBtnWnd.h, Source/UI/Window/UIWordDisplayWnd.h, Source/Utility/CRC32.h, Source/Utility/Compression/Zlib.h, Source/Utility/EncryptedName.h, Source/Utility/FileSignatureVerifier.h, Source/Utility/GGHash.h, Source/Utility/GGHashMgr.h, Source/Utility/GuidParse.h, Source/Utility/JsonCppLoader.h, Source/Utility/Md5State.h, Source/Utility/NFileLog.h, Source/Utility/NIPAddr.h, Source/Utility/ProcessSecurity.h, Source/Utility/RegistryKey.h, Source/Utility/SHA3.h, Source/Utility/Tokenizer.h, Source/Utility/XxHash3.h.
Adds to the build: Source/Client/Application/ClientOptions.cpp, Source/Client/Application/Registry.cpp, Source/Client/Application/RegistryKey.cpp, Source/Client/Application/Timer.cpp, Source/Client/Mode/EntityInit.cpp, Source/Client/Mode/ModeBaseEvents.cpp, Source/Client/Mode/ModeCursorDrawing.cpp, Source/Client/Mode/ModeFade.cpp, Source/Client/Mode/ModeFadeOut.cpp, Source/Client/Mode/ModeScreenshot.cpp, Source/Client/Mode/ModeTransitions.cpp, Source/Client/Replay/Replay.cpp, Source/Client/Replay/ReplayControl.cpp, Source/Client/Replay/ReplayPacketRecorder.cpp, Source/Client/Session/Session.cpp, Source/Client/Session/SessionAchievements.cpp, Source/Client/Session/SessionParty.cpp, Source/Client/Session/SessionPredicates.cpp, Source/Client/Session/SessionState.cpp, Source/Contents/Actors/ActorPickNode.cpp, Source/File/NFileLog.cpp, Source/Network/NIPAddr.cpp, Source/Network/Packets/ActorNamePacket.cpp, Source/Network/Packets/ClientKeepalive.cpp, Source/Network/Packets/ClientOptionPacket.cpp, Source/Network/Packets/ExecutableDigestPacket.cpp, Source/Network/Packets/GameTickPacket.cpp, Source/Render/DX7/AlphaQueuesDX7.cpp, Source/Render/DX7/AuxiliaryQueuesDX7.cpp, Source/Render/DX7/OpaqueQueuesDX7.cpp, Source/Render/DX7/RendererDX7.cpp, Source/Render/DX9/DeviceCapabilitiesDX9.cpp, Source/Render/Device/DeviceSelection.cpp, Source/Render/Device/Direct3DErrors.cpp, Source/Render/Device/DisplayMode.cpp, Source/Render/Device/RenderAdapter.cpp, Source/Render/Device/RenderBackends.cpp, Source/Render/Drawing/ActionSpriteDrawing.cpp, Source/Render/Drawing/BitmapDrawing.cpp, Source/Render/Drawing/BlendColor.cpp, Source/Render/Drawing/SpriteGeometry.cpp, Source/Render/Primitives/AlphaRectangle.cpp, Source/Render/Primitives/AuxiliarySubmission.cpp, Source/Render/Primitives/SpriteQuad.cpp, Source/Render/Primitives/TextureQuad.cpp, Source/Render/Primitives/UIRPDataDrawing.cpp, Source/Render/Projection/ScreenGeometry.cpp, Source/Render/Projection/ScreenRectangle.cpp, Source/Render/Projection/ViewportProjection.cpp, Source/Resource/Bitmap/EmblemResource.cpp, Source/Resource/Bitmap/GifLzw.cpp, Source/Resource/Bitmap/GifResource.cpp, Source/Resource/Bitmap/PaletteResource.cpp, Source/Resource/Bitmap/SkinPalette.cpp, Source/Resource/Bitmap/TextureNames.cpp, Source/Resource/Effects/EZeffectResource.cpp, Source/Resource/Json/JsonCppLoader.cpp, Source/Resource/Models/RmaResource.cpp, Source/Resource/Sprites/ImfLayerIndex.cpp, Source/Resource/Sprites/ImfResource.cpp, Source/Resource/Xml/XmlNode.cpp, Source/Resource/Xml/XmlParsing.cpp, Source/Security/FileSignatureVerifier.cpp, Source/Security/ProcessSecurity.cpp, Source/Security/UnknownA68.cpp, Source/UI/Achievement/UIAchWnd.cpp, Source/UI/Buttons/UIBalloonOpenBtn.cpp, Source/UI/Buttons/UIMiniBtnWnd.cpp, Source/UI/Buttons/UISlotBitmap.cpp, Source/UI/Buttons/UIStaticBitmap.cpp, Source/UI/Buttons/UIStaticItem.cpp, Source/UI/CashShop/UIMileageWnd.cpp, Source/UI/Chat/UIZeroChatWnd.cpp, Source/UI/Dialogs/UIAccountLimitedToolWnd.cpp, Source/UI/Dialogs/UILocaleTextWnd.cpp, Source/UI/Dialogs/UIMessageBox.cpp, Source/UI/Dialogs/UINormalMB.cpp, Source/UI/Dialogs/UINoteWnd.cpp, Source/UI/Dialogs/UINoticeWnd.cpp, Source/UI/Dialogs/UIRPImageWnd.cpp, Source/UI/Dialogs/UIRPImageWnd2.cpp, Source/UI/Dialogs/UITransMenuWnd.cpp, Source/UI/Dialogs/UIVideoWnd.cpp, Source/UI/Dialogs/UIWordDisplayWnd.cpp, Source/UI/Events/UICheckAttendanceWnd.cpp, Source/UI/Events/UIOpenRoulletteWnd.cpp, Source/UI/Events/UIRoulletteWnd.cpp, Source/UI/GameSettings/UIBattleMsgOptionWnd.cpp, Source/UI/GameSettings/UIEscOptionWnd.cpp, Source/UI/GameSettings/UIHotKeyWnd.cpp, Source/UI/GameSettings/UIHotkeyGuideWnd.cpp, Source/UI/GameSettings/UIViewCameraInfoWnd.cpp, Source/UI/Gauges/UIBarGraph.cpp, Source/UI/Guild/UIEmblemWnd.cpp, Source/UI/Items/UIChangeMaterialWnd.cpp, Source/UI/Items/UICollectionSystemWnd.cpp, Source/UI/Items/UIEquipmentPropertiesWnd.cpp, Source/UI/Items/UIGradeEnchantWnd.cpp, Source/UI/Items/UIItemMoveInfo.cpp, Source/UI/Items/UIItemReformWnd.cpp, Source/UI/Items/UIItemStoreComboBox.cpp, Source/UI/Items/UIItemStoreWnd.cpp, Source/UI/Items/UILapineBoxWnd.cpp, Source/UI/Items/UILapineScrollBar.cpp, Source/UI/Items/UILapineUpgradeBoxWnd.cpp, Source/UI/Items/UIMerchantItemLogWnd.cpp, Source/UI/Items/UIParaItemShopWnd.cpp, Source/UI/Items/UIPreviewEquipWnd.cpp, Source/UI/Items/UIRefiningWnd.cpp, Source/UI/Items/UISecondCostumeWnd.cpp, Source/UI/Lists/UIScrollWnd.cpp, Source/UI/Login/FuncDrawWNDChar.cpp, Source/UI/Login/UIChangeNameWnd.cpp, Source/UI/Login/UIDescriptRace.cpp, Source/UI/Login/UIEmailAddressWnd.cpp, Source/UI/Login/UILoginWnd.cpp, Source/UI/Login/UINewMakeCharWnd.cpp, Source/UI/Login/UINewSelectCharWnd.cpp, Source/UI/Login/UIPasswordWnd.cpp, Source/UI/Login/UISelCharForUServerWnd.cpp, Source/UI/Login/UIWaitDBSaveWnd.cpp, Source/UI/Macro/UICaptchaPreviewWnd.cpp, Source/UI/Macro/UICaptchaRegisterWnd.cpp, Source/UI/Macro/UIMacroBlackListCheckWnd.cpp, Source/UI/Macro/UIMacroDetectorWnd.cpp, Source/UI/Macro/UIMacroReport.cpp, Source/UI/Macro/UIMacroUserInfoWnd.cpp, Source/UI/Navigation/NavigationLink.cpp, Source/UI/Navigation/UIListBoxNavi.cpp, Source/UI/Navigation/UIMinimapZoomWnd.cpp, Source/UI/Navigation/UINavigationHelpWnd.cpp, Source/UI/Navigation/UINavigationWnd.cpp, Source/UI/Navigation/UIRoMapWnd.cpp, Source/UI/Navigation/UIScrollBarNavi.cpp, Source/UI/Navigation/UIShowWarpWnd.cpp, Source/UI/Party/MiniPartyGrid.cpp, Source/UI/Party/MiniPartyManager.cpp, Source/UI/Party/MiniPartyPlacement.cpp, Source/UI/Party/MiniPartyUsableArea.cpp, Source/UI/Party/UIJobSlotButton.cpp, Source/UI/Party/UIPartyBookingHelpWnd.cpp, Source/UI/Party/UISeekPartyListWnd.cpp, Source/UI/Party/UISeekPartyMBWnd.cpp, Source/UI/Party/UISeekPartyWnd.cpp, Source/UI/Repute/UIReputeWnd.cpp, Source/UI/Rodex/UIOpenMailBoxWnd.cpp, Source/UI/Rodex/UIRodexContentsWnd.cpp, Source/UI/SelectPackageItemBox/UIPackageBoxNameList.cpp, Source/UI/Shop/PriceCommission.cpp, Source/UI/Shop/UIBartermarketWnd.cpp, Source/UI/Shop/UISerachStoreInfoWnd.cpp, Source/UI/Skill/UIDebuffRemoveWnd.cpp, Source/UI/Skill/UIGraffiStrboxWnd.cpp, Source/UI/Skill/UINewSkillListWnd.cpp, Source/UI/Skill/UINewSkillListWndHitTest.cpp, Source/UI/Status/UIBasicInfoWnd.cpp, Source/UI/Status/UIJobListWnd.cpp, Source/UI/Status/UIPetEvolutionWnd.cpp, Source/UI/Status/UIRebirthWnd.cpp, Source/UI/Text/TextTagExtraction.cpp, Source/UI/Text/TextTagRegistry.cpp, Source/UI/Text/UIBroadcastBalloon.cpp, Source/UI/Text/UIRoundBoxTooltipWnd.cpp, Source/UI/Window/FrameSkin.cpp, Source/UI/Window/UIBasicCtrl.cpp, Source/UI/Window/WindowBackground.cpp, Source/UI/Window/WindowLowerBorder.cpp, Source/UI/Window/WindowOverlay.cpp, Source/UI/Window/WindowSprite.cpp, Source/UI/Window/WindowTitlebar.cpp, Source/Utility/BoolStubs.cpp, Source/Utility/Hash/CRC32.cpp, Source/Utility/Hash/GGHash.cpp, Source/Utility/Hash/GGHashMgr.cpp, Source/Utility/Hash/Md5State.cpp, Source/Utility/Hash/SHA3.cpp, Source/Utility/Hash/XxHash3.cpp, Source/Utility/Lexicon/LexiconTrie.cpp, Source/Utility/Text/GuidParse.cpp, Source/Utility/Text/Tokenizer.cpp
Deletes: Source/ActorPickNode.cpp, Source/ActorPickNode.h, Source/Archive/UnknownA68.cpp, Source/Client/ClientOptions.cpp, Source/Client/ModeBaseEvents.cpp, Source/Client/ModeCursorDrawing.cpp, Source/Client/ModeFade.cpp, Source/Client/ModeFade.h, Source/Client/ModeFadeOut.cpp, Source/Client/ModeFadeOut.h, Source/Client/ModeScreenshot.cpp, Source/Client/ModeScreenshot.h, Source/Client/ModeTransitions.cpp, Source/Client/Registry.cpp, Source/Client/Registry.h, Source/Client/Replay.cpp, Source/Client/Replay.h, Source/Client/ReplayControl.cpp, Source/Client/ReplayPacketRecorder.cpp, Source/Client/ReplayRecordOption.h, Source/Client/Session.cpp, Source/Client/Session.h, Source/Client/SessionAchievements.cpp, Source/Client/SessionParty.cpp, Source/Client/SessionPredicates.cpp, Source/Client/SessionState.cpp, Source/Client/Timer.cpp, Source/Client/Timer.h, Source/EntityInit.cpp, Source/Interface/BoolStubs.cpp, Source/LexiconTrie.cpp, Source/Network/ActorNamePacket.cpp, Source/Network/ActorNamePacket.h, Source/Network/ClientKeepalive.cpp, Source/Network/ClientKeepalive.h, Source/Network/ClientOptionPacket.cpp, Source/Network/ClientOptionPacket.h, Source/Network/ExecutableDigestPacket.cpp, Source/Network/ExecutableDigestPacket.h, Source/Network/GameTickPacket.cpp, Source/Network/GameTickPacket.h, Source/Render/ActionSpriteDrawing.cpp, Source/Render/ActionSpriteDrawing.h, Source/Render/AlphaQueuesDX7.cpp, Source/Render/AlphaRectangle.cpp, Source/Render/AuxiliaryQueuesDX7.cpp, Source/Render/AuxiliarySubmission.cpp, Source/Render/AuxiliarySubmission.h, Source/Render/BitmapDrawing.cpp, Source/Render/BitmapDrawing.h, Source/Render/BlendColor.cpp, Source/Render/BlendColor.h, Source/Render/DeviceCapabilitiesDX9.cpp, Source/Render/DeviceSelection.cpp, Source/Render/DeviceSelection.h, Source/Render/Direct3DErrors.cpp, Source/Render/Direct3DErrors.h, Source/Render/DisplayMode.cpp, Source/Render/DisplayMode.h, Source/Render/OpaqueQueuesDX7.cpp, Source/Render/RenderAdapter.cpp, Source/Render/RenderAdapter.h, Source/Render/RenderBackends.cpp, Source/Render/RenderBackends.h, Source/Render/RendererDX7.cpp, Source/Render/RendererDX7.h, Source/Render/ScreenGeometry.cpp, Source/Render/ScreenGeometry.h, Source/Render/ScreenRectangle.cpp, Source/Render/ScreenRectangle.h, Source/Render/SpriteGeometry.cpp, Source/Render/SpriteGeometry.h, Source/Render/SpriteQuad.cpp, Source/Render/SpriteQuad.h, Source/Render/TextureQuad.cpp, Source/Render/TextureQuad.h, Source/Render/TextureStageModes.h, Source/Render/UIRPDataDrawing.cpp, Source/Render/ViewportProjection.cpp, Source/Resource/BinkRuntime.h, Source/Resource/EZeffectResource.cpp, Source/Resource/EZeffectResource.h, Source/Resource/EmblemResource.cpp, Source/Resource/EmblemResource.h, Source/Resource/GifLzw.cpp, Source/Resource/GifLzw.h, Source/Resource/GifResource.cpp, Source/Resource/GifResource.h, Source/Resource/ImfLayerIndex.cpp, Source/Resource/ImfResource.cpp, Source/Resource/ImfResource.h, Source/Resource/PaletteResource.cpp, Source/Resource/PaletteResource.h, Source/Resource/RmaResource.cpp, Source/Resource/RmaResource.h, Source/Resource/SkinPalette.cpp, Source/Resource/SkinPalette.h, Source/Resource/TextureNames.cpp, Source/Resource/TextureNames.h, Source/Resource/XmlNode.cpp, Source/Resource/XmlNode.h, Source/Resource/XmlParsing.cpp, Source/UI/Buttons/UICashEmotionSprBtn.h, Source/UI/Buttons/UIDescriptRace.cpp, Source/UI/Buttons/UIDescriptRace.h, Source/UI/Buttons/UIItemMoveInfo.cpp, Source/UI/Buttons/UIItemMoveInfo.h, Source/UI/Buttons/UIJobSlotButton.cpp, Source/UI/Buttons/UIJobSlotButton.h, Source/UI/Buttons/UIReplayButton.h, Source/UI/Dialogs/UIChooseWarpWnd.h, Source/UI/Dialogs/UIEmailAddressWnd.cpp, Source/UI/Dialogs/UIEmailAddressWnd.h, Source/UI/Dialogs/UIGraffiStrboxWnd.cpp, Source/UI/Dialogs/UIGraffiStrboxWnd.h, Source/UI/Dialogs/UIMemorialDunWnd.h, Source/UI/Dialogs/UIMiniMapWnd.h, Source/UI/Dialogs/UIMinimapZoomWnd.cpp, Source/UI/Dialogs/UIMinimapZoomWnd.h, Source/UI/Dialogs/UINotifyQuestWnd.h, Source/UI/Dialogs/UIPasswordWnd.cpp, Source/UI/Dialogs/UIPasswordWnd.h, Source/UI/Dialogs/UIPetTamingDeceiveWnd.h, Source/UI/Dialogs/UISecondPasswordEditWnd.h, Source/UI/Dialogs/UISelectCartWnd.h, Source/UI/Dialogs/UIWaitDBSaveWnd.cpp, Source/UI/Dialogs/UIWaitDBSaveWnd.h, Source/UI/FrameSkin.cpp, Source/UI/FrameSkin.h, Source/UI/Item/UIEquipmentPropertiesWnd.cpp, Source/UI/Item/UIEquipmentPropertiesWnd.h, Source/UI/Item/UIItemBaseWnd.h, Source/UI/Item/UIItemPurchaseWnd.h, Source/UI/Item/UIItemSellWnd.h, Source/UI/Item/UIItemSellWnd2.h, Source/UI/Item/UIItemShopWnd.h, Source/UI/Item/UIItemShopWnd2.h, Source/UI/Item/UIItemStoreFindWnd.h, Source/UI/Item/UIItemStoreSubWnd.h, Source/UI/Item/UIItemStoreWnd.cpp, Source/UI/Item/UIItemStoreWnd.h, Source/UI/Item/UIItemWnd.h, Source/UI/Item/UIMerchantItemLogWnd.cpp, Source/UI/Item/UIMerchantItemLogWnd.h, Source/UI/Item/UIParaItemShopWnd.cpp, Source/UI/Item/UIParaItemShopWnd.h, Source/UI/Lists/UIItemStoreComboBox.cpp, Source/UI/Lists/UIItemStoreComboBox.h, Source/UI/Lists/UIListBoxNavi.cpp, Source/UI/Lists/UIListBoxNavi.h, Source/UI/Lists/UIListBoxNaviSearch.h, Source/UI/Lists/UIPackageBoxNameList.cpp, Source/UI/Lists/UIPackageBoxNameList.h, Source/UI/Lists/UIReplayListBox.h, Source/UI/Lists/UIScrollBarNavi.cpp, Source/UI/Lists/UIScrollBarNavi.h, Source/UI/MiniPartyGrid.cpp, Source/UI/MiniPartyGrid.h, Source/UI/MiniPartyManager.cpp, Source/UI/MiniPartyPlacement.cpp, Source/UI/MiniPartyPlacement.h, Source/UI/MiniPartyUsableArea.cpp, Source/UI/PriceCommission.cpp, Source/UI/PriceCommission.h, Source/UI/Text/NavigationLink.cpp, Source/UI/Text/NavigationLink.h, Source/UI/Text/UIAchWnd.cpp, Source/UI/Text/UIAchWnd.h, Source/UI/TextTagExtraction.cpp, Source/UI/TextTagRegistry.cpp, Source/UI/TextTags.h, Source/UI/UIBarGraph.cpp, Source/UI/UIBarGraph.h, Source/UI/UIBartermarketWnd.cpp, Source/UI/UIBartermarketWnd.h, Source/UI/UIBasicCtrl.cpp, Source/UI/UIBasicCtrl.h, Source/UI/UIBroadcastBalloon.cpp, Source/UI/UIBroadcastBalloon.h, Source/UI/UICaptchaPreviewWnd.cpp, Source/UI/UICaptchaPreviewWnd.h, Source/UI/UICaptchaRegisterWnd.cpp, Source/UI/UICaptchaRegisterWnd.h, Source/UI/UIChangeMaterialWnd.cpp, Source/UI/UIChangeMaterialWnd.h, Source/UI/UICheckAttendanceWnd.cpp, Source/UI/UICheckAttendanceWnd.h, Source/UI/UIGradeEnchantWnd.cpp, Source/UI/UIGradeEnchantWnd.h, Source/UI/UIHotkeyGuideWnd.cpp, Source/UI/UIHotkeyGuideWnd.h, Source/UI/UIIngredientInfoWnd.h, Source/UI/UIItemReformWnd.cpp, Source/UI/UIItemReformWnd.h, Source/UI/UILapineBoxWnd.cpp, Source/UI/UILapineScrollBar.cpp, Source/UI/UILapineScrollBar.h, Source/UI/UILapineUpgradeBoxWnd.cpp, Source/UI/UILapineUpgradeBoxWnd.h, Source/UI/UIMacroBlackListCheckWnd.cpp, Source/UI/UIMacroBlackListCheckWnd.h, Source/UI/UIMacroDetectorWnd.cpp, Source/UI/UIMacroDetectorWnd.h, Source/UI/UIMacroReport.cpp, Source/UI/UIMacroReport.h, Source/UI/UIMacroUserInfoWnd.cpp, Source/UI/UIMacroUserInfoWnd.h, Source/UI/UIPreviewEquipWnd.cpp, Source/UI/UIPreviewEquipWnd.h, Source/UI/UIRefiningWnd.cpp, Source/UI/UIRefiningWnd.h, Source/UI/UIReputeWnd.cpp, Source/UI/UIReputeWnd.h, Source/UI/UIRoundBoxTooltipWnd.cpp, Source/UI/UIRoundBoxTooltipWnd.h, Source/UI/UIScrollWnd.cpp, Source/UI/UIScrollWnd.h, Source/UI/UISlotBitmap.cpp, Source/UI/UISlotBitmap.h, Source/UI/UIStaticBitmap.cpp, Source/UI/UIStaticBitmap.h, Source/UI/UIStaticItem.cpp, Source/UI/UIStaticItem.h, Source/UI/Window/FuncDrawWNDChar.cpp, Source/UI/Window/FuncDrawWNDChar.h, Source/UI/Window/MiniPartyWndAreaMgr.h, Source/UI/Window/UIAccountLimitedToolWnd.cpp, Source/UI/Window/UIAccountLimitedToolWnd.h, Source/UI/Window/UIBalloonOpenBtn.cpp, Source/UI/Window/UIBalloonOpenBtn.h, Source/UI/Window/UIBank_NewWnd.h, Source/UI/Window/UIBasicInfoWnd.cpp, Source/UI/Window/UIBasicInfoWnd.h, Source/UI/Window/UIBattleMsgOptionWnd.cpp, Source/UI/Window/UIBattleMsgOptionWnd.h, Source/UI/Window/UIChangeNameWnd.cpp, Source/UI/Window/UIChangeNameWnd.h, Source/UI/Window/UIChatRoomWnd.h, Source/UI/Window/UICntWnd.h, Source/UI/Window/UICollectionSystemWnd.cpp, Source/UI/Window/UICollectionSystemWnd.h, Source/UI/Window/UIDebuffRemoveWnd.cpp, Source/UI/Window/UIDebuffRemoveWnd.h, Source/UI/Window/UIEmblemWnd.cpp, Source/UI/Window/UIEmblemWnd.h, Source/UI/Window/UIEscOptionWnd.cpp, Source/UI/Window/UIEscOptionWnd.h, Source/UI/Window/UIHomunInfoWnd.h, Source/UI/Window/UIHotKeyWnd.cpp, Source/UI/Window/UIHotKeyWnd.h, Source/UI/Window/UIJobListWnd.cpp, Source/UI/Window/UIJobListWnd.h, Source/UI/Window/UILocaleTextWnd.cpp, Source/UI/Window/UILoginOTPWnd.h, Source/UI/Window/UILoginWnd.cpp, Source/UI/Window/UILoginWnd.h, Source/UI/Window/UIMakeCharWnd.h, Source/UI/Window/UIMerInfoWnd.h, Source/UI/Window/UIMessageBox.cpp, Source/UI/Window/UIMessageBox.h, Source/UI/Window/UIMessageBoxAutoreturn.h, Source/UI/Window/UIMileageWnd.cpp, Source/UI/Window/UIMileageWnd.h, Source/UI/Window/UIMiniBtnWnd.cpp, Source/UI/Window/UIMiniBtnWnd.h, Source/UI/Window/UIMonsterDisplayWnd.h, Source/UI/Window/UIMonsterInfoWnd.h, Source/UI/Window/UINavigationHelpWnd.cpp, Source/UI/Window/UINavigationHelpWnd.h, Source/UI/Window/UINavigationWnd.cpp, Source/UI/Window/UINavigationWnd.h, Source/UI/Window/UINewMakeCharWnd.cpp, Source/UI/Window/UINewMakeCharWnd.h, Source/UI/Window/UINewSelectCharWnd.cpp, Source/UI/Window/UINewSelectCharWnd.h, Source/UI/Window/UINewSkillListWnd.cpp, Source/UI/Window/UINewSkillListWnd.h, Source/UI/Window/UINewSkillListWndHitTest.cpp, Source/UI/Window/UINormalMB.cpp, Source/UI/Window/UINormalMB.h, Source/UI/Window/UINoteWnd.cpp, Source/UI/Window/UINoteWnd.h, Source/UI/Window/UINoticeWnd.cpp, Source/UI/Window/UINoticeWnd.h, Source/UI/Window/UIOpenMailBoxWnd.cpp, Source/UI/Window/UIOpenMailBoxWnd.h, Source/UI/Window/UIOpenRoulletteWnd.cpp, Source/UI/Window/UIOpenRoulletteWnd.h, Source/UI/Window/UIPartyBookingHelpWnd.cpp, Source/UI/Window/UIPartyBookingHelpWnd.h, Source/UI/Window/UIPayConfirmWnd.h, Source/UI/Window/UIPetEvolutionWnd.cpp, Source/UI/Window/UIPetEvolutionWnd.h, Source/UI/Window/UIPetInfoWnd.h, Source/UI/Window/UIRPImageWnd.cpp, Source/UI/Window/UIRPImageWnd.h, Source/UI/Window/UIRPImageWnd2.cpp, Source/UI/Window/UIRPImageWnd2.h, Source/UI/Window/UIRebirthWnd.cpp, Source/UI/Window/UIRebirthWnd.h, Source/UI/Window/UIReplayControlWnd.h, Source/UI/Window/UIReplayRECControlWnd.h, Source/UI/Window/UIRoMapWnd.cpp, Source/UI/Window/UIRoMapWnd.h, Source/UI/Window/UIRodexContentsWnd.cpp, Source/UI/Window/UIRodexContentsWnd.h, Source/UI/Window/UIRoulletteWnd.cpp, Source/UI/Window/UIRoulletteWnd.h, Source/UI/Window/UISecondCostumeWnd.cpp, Source/UI/Window/UISecondCostumeWnd.h, Source/UI/Window/UISeekPartyListWnd.cpp, Source/UI/Window/UISeekPartyListWnd.h, Source/UI/Window/UISeekPartyMBWnd.cpp, Source/UI/Window/UISeekPartyMBWnd.h, Source/UI/Window/UISeekPartyWnd.cpp, Source/UI/Window/UISeekPartyWnd.h, Source/UI/Window/UISelCharForUServerWnd.cpp, Source/UI/Window/UISelCharForUServerWnd.h, Source/UI/Window/UISelectReplayDataWnd.h, Source/UI/Window/UISelectServerWnd.h, Source/UI/Window/UISerachStoreInfoWnd.cpp, Source/UI/Window/UISerachStoreInfoWnd.h, Source/UI/Window/UIShowWarpWnd.cpp, Source/UI/Window/UIShowWarpWnd.h, Source/UI/Window/UITalkboxTrapInputWnd.h, Source/UI/Window/UITransMenuWnd.cpp, Source/UI/Window/UITransMenuWnd.h, Source/UI/Window/UIVideoWnd.cpp, Source/UI/Window/UIVideoWnd.h, Source/UI/Window/UIViewCameraInfoWnd.cpp, Source/UI/Window/UIViewCameraInfoWnd.h, Source/UI/Window/UIWindowCallBtnWnd.h, Source/UI/Window/UIWordDisplayWnd.cpp, Source/UI/Window/UIWordDisplayWnd.h, Source/UI/Window/UIZeroChatWnd.cpp, Source/UI/WindowBackground.cpp, Source/UI/WindowLowerBorder.cpp, Source/UI/WindowOverlay.cpp, Source/UI/WindowSprite.cpp, Source/UI/WindowTitlebar.cpp, Source/Utility/CRC32.cpp, Source/Utility/CRC32.h, Source/Utility/Compression/Zlib.h, Source/Utility/EncryptedName.h, Source/Utility/FileSignatureVerifier.cpp, Source/Utility/FileSignatureVerifier.h, Source/Utility/GGHash.cpp, Source/Utility/GGHash.h, Source/Utility/GGHashMgr.cpp, Source/Utility/GGHashMgr.h, Source/Utility/GuidParse.cpp, Source/Utility/GuidParse.h, Source/Utility/JsonCppLoader.cpp, Source/Utility/JsonCppLoader.h, Source/Utility/Md5State.cpp, Source/Utility/Md5State.h, Source/Utility/NFileLog.cpp, Source/Utility/NFileLog.h, Source/Utility/NIPAddr.cpp, Source/Utility/NIPAddr.h, Source/Utility/ProcessSecurity.cpp, Source/Utility/ProcessSecurity.h, Source/Utility/RegistryKey.cpp, Source/Utility/RegistryKey.h, Source/Utility/SHA3.cpp, Source/Utility/SHA3.h, Source/Utility/Tokenizer.cpp, Source/Utility/Tokenizer.h, Source/Utility/XxHash3.cpp, Source/Utility/XxHash3.h
2026-11-11 01:05:24 +00:00

683 lines
37 KiB
C++

#include "Client/Application/ApplicationWindow.h"
#include "Client/Mode/ModeMessage.h"
#include "UI/Window/UIEnums.h"
#include "UI/Window/WindowId.h"
#include "Utility/Cipher/EncryptedName.h"
#include "Client/Application/Launcher.h"
#include "Client/Mode/CGameMode.h"
#include "Client/Mode/CMode.h"
#include "Client/Mode/ModeMgr.h"
#include "Client/Session/Session.h"
#include "Client/Stove/StoveMgr.h"
#include "Client/Stove/StovePCSDK.h"
#include "Network/TextEncoding.h"
#include "UI/Text/UIBroadcastBalloon.h"
#include "UI/Window/UIWindow.h"
#include "UI/Window/UIWindowMgr.h"
#include "Utility/Cipher/XorBytes.h"
#include "Utility/Text/FormatString.h"
#include <algorithm>
#include <array>
#include <chrono>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <string>
#include <vector>
#include <windows.h>
#include <shellapi.h>
// GLOBAL: gl_24904
bool g_stoveWaitingCallback;
void OnStoveTermsAgreementFetched(Stove::PCSDK::CallbackResult callbackResult, int unused, const wchar_t* url);
void OnStoveCategoryProductsFetched(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count);
void OnStoveAllProductsFetched(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count);
void OnStoveInitialized(Stove::PCSDK::CallbackResult callbackResult);
void OnStoveShutdown(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::Base::StovePCShutdown shutdown);
void OnStovePurchaseStarted(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::IAP::StovePCPurchaseResult purchaseResult);
void OnStovePurchaseConfirmed(Stove::PCSDK::CallbackResult callbackResult, bool purchased, int productCount, unsigned int count, int remainingCount, int resultCode);
// STRING: st_01259
const wchar_t g_stoveCategoryIdA[] = L"44C71118750747D";
// STRING: st_01260
const wchar_t g_stoveCategoryIdB[] = L"14A6891F90E24D7";
// OFFSET: 0x0063EEE0
// FUNCTION: fn_04800
void CStoveMgr::FetchAllProducts() {
Stove::PCSDK::IAP::StovePCFetchProductParam allParam;
allParam.SetCategoryId(L"");
allParam.SetPageNumber(1);
allParam.SetPageSize(0x7FFFFFFF);
IAP_FetchProducts(&allParam, OnStoveAllProductsFetched);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
g_session.ClearInventoryCategoryItems(9);
Stove::PCSDK::IAP::StovePCFetchProductParam categoryParam;
if (this->m_environment == 2) {
categoryParam.SetCategoryId(g_stoveCategoryIdA);
} else {
categoryParam.SetCategoryId(g_stoveCategoryIdB);
}
categoryParam.SetPageNumber(1);
categoryParam.SetPageSize(0x7FFFFFFF);
IAP_FetchProducts(&categoryParam, OnStoveCategoryProductsFetched);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
}
// OFFSET: 0x0063F030
// FUNCTION: fn_04801
void FetchStoveTermsAgreement() {
Stove::PCSDK::IAP::StovePCTermsOption option;
option.SetOperation(Stove::PCSDK::IAP::StovePCPaymentOperation::DEFAULT);
IAP_FetchTermsAgreement(&option, OnStoveTermsAgreementFetched);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
}
// OFFSET: 0x0063E910
// FUNCTION: fn_45460
void CStoveMgr::FetchCategoryProducts() {
g_session.ClearInventoryCategoryItems(9);
Stove::PCSDK::IAP::StovePCFetchProductParam param;
param.SetCategoryId(this->m_environment == 2 ? g_stoveCategoryIdA : g_stoveCategoryIdB);
param.SetPageNumber(1);
param.SetPageSize(0x7FFFFFFF);
IAP_FetchProducts(&param, OnStoveCategoryProductsFetched);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
}
// INLINED
template <std::uint64_t Key, std::size_t Length>
const char* DecryptName(const char (&source)[Length]) {
thread_local EncryptedName<Length, Key> name(source);
return name.Text();
}
// INLINED
template <std::uint64_t Key, std::size_t Length>
const char* DecryptName(const std::array<char, Length>& source) {
thread_local EncryptedName<Length, Key> name(source);
return name.Text();
}
struct AccessTokenFailureMessage {
EncryptedName<100, 0x3375B1C7DBB5FD55ULL>& operator()() const;
};
struct UserFailureMessage {
EncryptedName<100, 0x151F77EBEBBB2147ULL>& operator()() const;
};
struct TokenCallbackFailureMessage {
EncryptedName<100, 0x4F1791FB1503C713ULL>& operator()() const;
};
struct PurchaseCheckingMessage {
EncryptedName<129, 0x2D3B15774149D5DDULL>& operator()() const;
};
struct InitializeCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult) const;
};
struct TermsAgreementCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, int unused, const wchar_t* url) const;
};
struct FetchProductsCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count) const;
};
struct PurchaseResultCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::IAP::StovePCPurchaseResult purchaseResult) const;
};
struct ShutdownCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::Base::StovePCShutdown shutdown) const;
};
struct CategoryProductsCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count) const;
};
struct ConfirmPurchaseCallback {
void operator()(Stove::PCSDK::CallbackResult callbackResult, bool purchased, int productCount, unsigned int count, int remainingCount, int resultCode) const;
};
// OFFSET: 0x0063A780
// FUNCTION: fn_04771
void OnStoveInitialized(Stove::PCSDK::CallbackResult callbackResult) {
InitializeCallback()(callbackResult);
}
// OFFSET: 0x0063A7F0
// FUNCTION: fn_04772
void OnStoveTermsAgreementFetched(Stove::PCSDK::CallbackResult callbackResult, int unused, const wchar_t* url) {
TermsAgreementCallback()(callbackResult, unused, url);
}
// OFFSET: 0x0063A860
// FUNCTION: fn_04773
void OnStoveAllProductsFetched(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count) {
CategoryProductsCallback()(callbackResult, products, count);
}
// OFFSET: 0x0063A8D0
// FUNCTION: fn_04774
void OnStoveCategoryProductsFetched(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products, unsigned int count) {
FetchProductsCallback()(callbackResult, products, count);
}
// OFFSET: 0x0063A940
// FUNCTION: fn_04775
void OnStovePurchaseStarted(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::IAP::StovePCPurchaseResult purchaseResult) {
PurchaseResultCallback()(callbackResult, purchaseResult);
}
// OFFSET: 0x0063A9D0
// FUNCTION: fn_04776
void OnStovePurchaseConfirmed(Stove::PCSDK::CallbackResult callbackResult, bool purchased, int productCount, unsigned int count, int remainingCount, int resultCode) {
ConfirmPurchaseCallback()(callbackResult, purchased, productCount, count, remainingCount, resultCode);
}
// OFFSET: 0x0063AA50
// FUNCTION: fn_04777
void OnStoveShutdown(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::Base::StovePCShutdown shutdown) {
ShutdownCallback()(callbackResult, shutdown);
}
// OFFSET: 0x0063AAE0
// FUNCTION: fn_04778
CStoveMgr::CStoveMgr()
: m_initialized(false), m_pendingOperation(0), m_environment(1), m_purchaseIdLow(0), m_purchaseIdHigh(0), m_purchaseUrl(), m_accessToken{},
m_memberNumber{}, m_gameUserId{}, m_applicationId() {
this->Initialize();
}
CStoveMgr::~CStoveMgr() {
if (this->m_initialized) {
Stove::PCSDK::Result result = IAP_UnInitialize();
result.IsSuccessful();
result = Base_UnInitialize();
result.IsSuccessful();
this->m_initialized = false;
}
}
// GLOBAL: gl_24905
CStoveMgr* g_stoveMgr;
// OFFSET: 0x0063AF30
// FUNCTION: fn_04781
void ShutdownCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::Base::StovePCShutdown shutdown) const {
if (callbackResult.GetResult().IsSuccessful()) {
std::string message =
EncodeText(CP_ACP, std::wstring(reinterpret_cast<const Stove::PCSDK::Base::StovePCLogEvent&>(shutdown).GetCategory1()));
if (reinterpret_cast<const Stove::PCSDK::Base::StovePCToken&>(shutdown).GetAccessToken() == nullptr) {
const char captionSource[] = {'\x27', '\x1D', '\xFA', '\x7E', '\x2A', '\xB1', '\xE1'};
const char* caption = DecryptName<0x91E147EBBD47C39FULL>(captionSource);
MessageBoxA(hWnd, message.c_str(), caption, MB_OK);
g_modeMgr.gameMode->SendMsg(MM_QUIT, 0, 0, 0, 0);
} else if (g_modeMgr.state == 0) {
g_windowMgr.Confirm(message.c_str(), 0, true, true, 0, "Message", 280, 120, 0);
} else {
UIBroadcastBalloon* balloonWindow = static_cast<CGameMode*>(g_modeMgr.GetGameMode())->EnsureBroadcastBalloon();
if (balloonWindow != nullptr) {
BroadcastBalloonMessage balloon{{}, {}, std::chrono::seconds(20), 12, 0x40000000, 0, 0};
balloon.start = std::chrono::system_clock::now();
balloon.lines.push_back(BroadcastBalloonLine{message, 0x62B0FF, 0});
balloonWindow->AddMessage(0, balloon);
}
g_windowMgr.SendNotice(UIM_OPENCHATWND, 0, 0, 0, 0, 0);
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(message.c_str()), 0x62B0FF, 0, 0, 0);
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY2, reinterpret_cast<std::intptr_t>(message.c_str()), 0x62B0FF, 0, 0, 0);
}
} else {
const char captionSource[] = {'\x6B', '\x33', '\x2A', '\xD6', '\x8C', '\xAD', '\xA5'};
const char* caption = DecryptName<0xA1A55B4D1597EDD3ULL>(captionSource);
MessageBoxA(hWnd, FormatOwnedString(TokenCallbackFailureMessage()().Text()).c_str(), caption, MB_OK);
PostQuitMessage(0);
}
}
// OFFSET: 0x0063B4B0
// FUNCTION: fn_04782
void FetchProductsCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products,
unsigned int count) const {
g_stoveWaitingCallback = false;
if (callbackResult.GetResult().IsSuccessful()) {
for (unsigned int index = 0; index < count; ++index) {
const Stove::PCSDK::IAP::StovePCProduct& product = products[index];
ITEM_INFO item;
item.identity[1] = 0xFFFFFFFF;
item.prices[0] = static_cast<int>(product.GetSalePrice());
item.prices[1] = static_cast<int>(product.GetSalePrice());
item.identity[0] = 4;
item.identified = 1;
item.damaged = 0;
item.refiningLevel = 0;
item.productId = reinterpret_cast<const Stove::PCSDK::IAP::StovePCOrderProduct&>(product).GetProductId();
std::string itemId = EncodeText(
CP_ACP, std::wstring(reinterpret_cast<const wchar_t*>(reinterpret_cast<const Stove::PCSDK::IAP::StovePCShopCategory&>(product).GetDisplayNumber())));
item.SetItemId(std::atoi(itemId.c_str()));
char name[256];
int capacity = 256;
item.GetIdDisplayName(name, capacity, 0);
item.SetName(name);
item.identified = 1;
if (product.GetPurchaseLimitCount() != 0 && product.GetSaleBeginDate() != 0 && product.GetSaleEndDate() != 0) {
item.bindOnEquip = 8;
const int guidQuantity = product.GetGuidQuantity();
item.saleData[3] = product.GetPurchaseLimitCount() - guidQuantity;
item.quantity = product.GetPurchaseLimitCount();
item.saleData[1] = static_cast<std::uint32_t>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::time_point(std::chrono::milliseconds(product.GetSaleBeginDate()))));
item.saleData[2] = static_cast<std::uint32_t>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::time_point(std::chrono::milliseconds(product.GetSaleEndDate()))));
g_session.AddInventoryCategoryItem(item, 9);
}
}
} else {
const char captionSource[] = {'\x7B', '\x1D', '\x68', '\x48', '\x9A', '\x1D', '\x3F'};
const char* caption = DecryptName<0x8B3FEB5B8BD5C3C3ULL>(captionSource);
const std::array<char, 56> messageSource = {'\x25', '\x6A', '\xF3', '\xC3', '\x87', '\xA0', '\x73', '\x4E', '\x3A', '\x34', '\xB0', '\x35', '\xF0', '\xCE', '\xEC', '\x43', '\x58', '\x4F', '\xF9', '\xDA', '\x83', '\xD8', '\x7D', '\xD7', '\xB6', '\xDB', '\x02', '\x43', '\x72', '\x21', '\xE3', '\x1A', '\x55', '\x3B', '\xF1', '\xAB', '\xF2', '\xCC', '\xE4', '\x39', '\xC5', '\x36', '\xE3', '\xD5', '\xF0', '\x21', '\xEA', '\x2E', '\x53', '\x77', '\xF9', '\xDA', '\x83', '\xD8', '\x7D', '\xF7'};
const char* message = DecryptName<0xF7530137154D8FE5ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
}
}
// OFFSET: 0x0063BA40
// FUNCTION: fn_04783
void PurchaseResultCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, Stove::PCSDK::IAP::StovePCPurchaseResult purchaseResult) const {
g_stoveWaitingCallback = false;
if (callbackResult.GetResult().IsSuccessful()) {
if (reinterpret_cast<std::intptr_t>(reinterpret_cast<const Stove::PCSDK::IAP::StovePCChargeInfo&>(purchaseResult).GetChargeTypeName()) != 2) {
const std::int64_t productId = reinterpret_cast<const Stove::PCSDK::IAP::StovePCOrderProduct&>(purchaseResult).GetProductId();
g_stoveMgr->m_purchaseIdLow = static_cast<int>(productId);
g_stoveMgr->m_purchaseIdHigh = static_cast<int>(productId >> 32);
g_stoveMgr->m_purchaseUrl = static_cast<const std::string&>(
EncodeText(CP_ACP, std::wstring(reinterpret_cast<const Stove::PCSDK::IAP::StovePCPurchasedProduct&>(purchaseResult).GetCategoryId())));
}
} else {
const char captionSource[] = {'\x71', '\x69', '\x98', '\x54', '\x7A', '\xC5', '\x83'};
const char* caption = DecryptName<0x078333BB9725B7C9ULL>(captionSource);
const std::array<char, 56> messageSource = {'\x67', '\x56', '\xBB', '\x1F', '\x15', '\xC2', '\xCB', '\xB2', '\x78', '\x08', '\xF8', '\xE9', '\x62', '\xAC', '\x54', '\xBF', '\x1A', '\x73', '\xB1', '\x06', '\x11', '\xBA', '\xC5', '\x2B', '\xF4', '\xE7', '\x4A', '\x9F', '\xE0', '\x43', '\x5B', '\xE6', '\x17', '\x07', '\xB9', '\x77', '\x60', '\xAE', '\x5C', '\xC5', '\x87', '\x0A', '\xAB', '\x09', '\x62', '\x43', '\x52', '\xD2', '\x11', '\x4B', '\xB1', '\x06', '\x11', '\xBA', '\xC5', '\x0B'};
const char* message = DecryptName<0x0BEB63A5C905B3A7ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
}
}
// OFFSET: 0x0063BD90
// FUNCTION: fn_04784
void CategoryProductsCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, const Stove::PCSDK::IAP::StovePCProduct* products,
unsigned int count) const {
g_stoveWaitingCallback = false;
if (callbackResult.GetResult().IsSuccessful()) {
g_session.ClearAllInventoryCategories();
for (unsigned int index = 0; index < count; ++index) {
const Stove::PCSDK::IAP::StovePCProduct& product = products[index];
std::string categoryId = EncodeText(CP_ACP, std::wstring(product.GetCategoryId()));
int list;
if (g_stoveMgr->m_environment == 2) {
if (std::strcmp(categoryId.c_str(), "50F317A54451454") == 0) {
list = 0;
} else if (std::strcmp(categoryId.c_str(), "0039EE31BF35469") == 0) {
list = 1;
} else if (std::strcmp(categoryId.c_str(), "F73534C437BF46E") == 0) {
list = 2;
} else if (std::strcmp(categoryId.c_str(), "098807579EF0460") == 0) {
list = 3;
} else if (std::strcmp(categoryId.c_str(), "6409085316FB443") == 0) {
list = 4;
} else if (std::strcmp(categoryId.c_str(), "B719A2340C6D4A6") == 0) {
list = 5;
} else if (std::strcmp(categoryId.c_str(), "F967B1811E85457") == 0) {
list = 6;
} else if (std::strcmp(categoryId.c_str(), "3C068812E673478") == 0) {
list = 7;
} else if (std::strcmp(categoryId.c_str(), "44C71118750747D") == 0) {
list = 8;
} else {
const char captionSource[] = {'\xAF', '\x27', '\xF2', '\x7A', '\x3A', '\x43', '\x2F'};
const char* caption = DecryptName<0xC52FB5FBB94FF917ULL>(captionSource);
const std::array<char, 34> messageSource = {'\x06', '\x89', '\x74', '\x9C', '\x4C', '\x5C', '\xF4', '\xE1', '\x93', '\xD9', '\x09', '\x93', '\x43', '\xBB', '\xF1', '\xBC', '\x76', '\xB0', '\x73', '\xBE', '\x41', '\x35', '\xF5', '\xC3', '\x07', '\xA8', '\x77', '\x8A', '\xD9', '\xB3', '\x10', '\x64', '\x9A', '\x67'};
const char* message = DecryptName<0x17359BF953C367B3ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message, categoryId.c_str()).c_str(), caption, MB_OK);
continue;
}
} else {
if (std::strcmp(categoryId.c_str(), "6BD73E0487554C5") == 0) {
list = 0;
} else if (std::strcmp(categoryId.c_str(), "BA5C75F95797471") == 0) {
list = 1;
} else if (std::strcmp(categoryId.c_str(), "6749388AE5EA4AE") == 0) {
list = 2;
} else if (std::strcmp(categoryId.c_str(), "E5161FAD921442A") == 0) {
list = 3;
} else if (std::strcmp(categoryId.c_str(), "D46B0A499ED9426") == 0) {
list = 4;
} else if (std::strcmp(categoryId.c_str(), "0FDC62110703456") == 0) {
list = 5;
} else if (std::strcmp(categoryId.c_str(), "82F5E6BE682C4E8") == 0) {
list = 6;
} else if (std::strcmp(categoryId.c_str(), "DF69418CA95B465") == 0) {
list = 7;
} else if (std::strcmp(categoryId.c_str(), "14A6891F90E24D7") == 0) {
list = 8;
} else {
const char captionSource[] = {'\x79', '\x11', '\x6E', '\xF0', '\x56', '\xEB', '\xFD'};
const char* caption = DecryptName<0x69FD1D9733D3CFC1ULL>(captionSource);
const std::array<char, 34> messageSource = {'\x70', '\x23', '\x30', '\x3A', '\x14', '\x64', '\x26', '\x65', '\xE5', '\x73', '\x4D', '\x35', '\x1B', '\x83', '\x23', '\x38', '\x00', '\x1A', '\x37', '\x18', '\x19', '\x0D', '\x27', '\x47', '\x71', '\x02', '\x33', '\x2C', '\x81', '\x8B', '\xC2', '\xE0', '\xEC', '\xCD'};
const char* message = DecryptName<0x93E7A3A1F587CDC5ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message, categoryId.c_str()).c_str(), caption, MB_OK);
continue;
}
}
ITEM_INFO item;
item.identity[1] = 0xFFFFFFFF;
item.prices[0] = static_cast<int>(product.GetSalePrice());
item.prices[1] = static_cast<int>(product.GetSalePrice());
item.identity[0] = 4;
item.identified = 1;
item.damaged = 0;
item.refiningLevel = 0;
item.productId = reinterpret_cast<const Stove::PCSDK::IAP::StovePCOrderProduct&>(product).GetProductId();
std::string itemId = EncodeText(
CP_ACP, std::wstring(reinterpret_cast<const wchar_t*>(reinterpret_cast<const Stove::PCSDK::IAP::StovePCShopCategory&>(product).GetDisplayNumber())));
item.SetItemId(std::atoi(itemId.c_str()));
char name[256];
int capacity = 256;
item.GetIdDisplayName(name, capacity, 0);
item.SetName(name);
item.identified = 1;
if (list == 8) {
if (product.GetPurchaseLimitCount() != 0 && product.GetSaleBeginDate() != 0 && product.GetSaleEndDate() != 0) {
item.bindOnEquip = 8;
const int guidQuantity = product.GetGuidQuantity();
item.saleData[3] = product.GetPurchaseLimitCount() - guidQuantity;
item.quantity = product.GetPurchaseLimitCount();
item.saleData[1] = static_cast<std::uint32_t>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::time_point(std::chrono::milliseconds(product.GetSaleBeginDate()))));
item.saleData[2] = static_cast<std::uint32_t>(std::chrono::system_clock::to_time_t(std::chrono::system_clock::time_point(std::chrono::milliseconds(product.GetSaleEndDate()))));
g_session.AddInventoryCategoryItem(item, 9);
}
} else if (product.GetPurchaseLimitCount() == 0 && product.GetSaleBeginDate() == 0 && product.GetSaleEndDate() == 0) {
item.bindOnEquip = static_cast<std::uint16_t>(list);
g_session.AddInventoryCategoryItem(item, list);
}
}
} else {
const char captionSource[] = {'\x89', '\x87', '\x96', '\xC2', '\xA0', '\x3B', '\x65'};
const char* caption = DecryptName<0x8B65CD61012B5931ULL>(captionSource);
const std::array<char, 56> messageSource = {'\x07', '\x28', '\x5B', '\xEB', '\xAF', '\xDC', '\x45', '\x4C', '\x18', '\x76', '\x18', '\x1D', '\xD8', '\xB2', '\xDA', '\x41', '\x7A', '\x0D', '\x51', '\xF2', '\xAB', '\xA4', '\x4B', '\xD5', '\x94', '\x99', '\xAA', '\x6B', '\x5A', '\x5D', '\xD5', '\x18', '\x77', '\x79', '\x59', '\x83', '\xDA', '\xB0', '\xD2', '\x3B', '\xE7', '\x74', '\x4B', '\xFD', '\xD8', '\x5D', '\xDC', '\x2C', '\x71', '\x35', '\x51', '\xF2', '\xAB', '\xA4', '\x4B', '\xF5'};
const char* message = DecryptName<0xF5657D1F3DE5CDC7ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
}
}
// OFFSET: 0x0063CF60
// FUNCTION: fn_04786
EncryptedName<100, 0x3375B1C7DBB5FD55ULL>& AccessTokenFailureMessage::operator()() const {
const char source[] = {'\x95', '\x18', '\x0B', '\x0D', '\x77', '\x10', '\x55', '\x8A', '\x8A', '\x46', '\x48', '\xFB', '\x00', '\x7E', '\xCA', '\x87', '\xE8', '\x3D', '\x01', '\x14', '\x73', '\x68', '\x5B', '\x13', '\xE5', '\x29', '\x75', '\x08', '\x07', '\x0A', '\x55', '\xF3', '\xB2', '\x40', '\x72', '\x1C', '\x27', '\x91', '\xB2', '\xEB', '\x94', '\x2B', '\x09', '\x67', '\x78', '\x55', '\x5B', '\x13', '\xEC', '\x53', '\x74', '\x7D', '\x77', '\x10', '\x55', '\xF2', '\xA3', '\x41', '\x66', '\x6E', '\x0E', '\x91', '\xC5', '\xD5', '\xEA', '\x11', '\x99', '\xFB', '\x94', '\xE5', '\x3A', '\x65', '\x10', '\xDD', '\x05', '\x36', '\x77', '\x05', '\xC9', '\x8D', '\x90', '\x30', '\x02', '\x15', '\xE7', '\x08', '\xDB', '\xF3', '\x92', '\xDD', '\x0C', '\x02', '\x71', '\x49', '\xC1', '\xFC', '\xE1', '\x24', '\x9B', '\xDB'};
thread_local EncryptedName<sizeof(source), 0x3375B1C7DBB5FD55ULL> name(source);
return name;
}
// OFFSET: 0x0063D060
// FUNCTION: fn_04787
EncryptedName<100, 0x151F77EBEBBB2147ULL>& UserFailureMessage::operator()() const {
const char source[] = {'\x87', '\xC4', '\x05', '\x3D', '\x5B', '\xD6', '\x3F', '\xAC', '\x98', '\x9A', '\x46', '\xCB', '\x2C', '\xB8', '\xA0', '\xA1', '\xFA', '\xE1', '\x0F', '\x24', '\x5F', '\xAE', '\x31', '\x35', '\xF7', '\xF5', '\x7B', '\x38', '\x2B', '\xCC', '\x3F', '\xD5', '\xA0', '\x9C', '\x7C', '\x2C', '\x0B', '\x57', '\xD8', '\xCD', '\x86', '\xF7', '\x07', '\x57', '\x54', '\x93', '\x31', '\x35', '\xFE', '\x8F', '\x7A', '\x4D', '\x5B', '\xD6', '\x3F', '\xD4', '\xB1', '\x9D', '\x68', '\x5E', '\x22', '\x57', '\xAF', '\xF3', '\xF8', '\xCD', '\x97', '\xCB', '\xB8', '\x23', '\x50', '\x43', '\x02', '\x01', '\x0B', '\x06', '\x5B', '\xC3', '\xA3', '\xAB', '\x82', '\xEC', '\x0C', '\x25', '\xCB', '\xCE', '\xB1', '\xD5', '\x80', '\x01', '\x02', '\x32', '\x5D', '\x8F', '\xAB', '\xDA', '\xF3', '\xF8', '\x95', '\xEB'};
thread_local EncryptedName<sizeof(source), 0x151F77EBEBBB2147ULL> name(source);
return name;
}
// OFFSET: 0x0063D160
// FUNCTION: fn_04788
EncryptedName<100, 0x4F1791FB1503C713ULL>& TokenCallbackFailureMessage::operator()() const {
const char source[] = {'\xD3', '\x22', '\xBD', '\xC3', '\x4B', '\x30', '\x37', '\xF6', '\xCC', '\x7C', '\xFE', '\x35', '\x3C', '\x5E', '\xA8', '\xFB', '\xAE', '\x07', '\xB7', '\xDA', '\x4F', '\x48', '\x39', '\x6F', '\xA3', '\x13', '\xC3', '\xC6', '\x3B', '\x2A', '\x37', '\x8F', '\xF4', '\x7A', '\xC4', '\xD2', '\x1B', '\xB1', '\xD0', '\x97', '\xD2', '\x11', '\xBF', '\xA9', '\x44', '\x75', '\x39', '\x6F', '\xAA', '\x69', '\xC2', '\xB3', '\x4B', '\x30', '\x37', '\x8E', '\xE5', '\x7B', '\xD0', '\xA0', '\x32', '\xB1', '\xA7', '\xA9', '\xAC', '\x2B', '\x2F', '\x35', '\xA8', '\xC5', '\x58', '\x19', '\x56', '\xE7', '\xB3', '\xF8', '\x4B', '\x25', '\xAB', '\xF1', '\xD6', '\x0A', '\xB4', '\xDB', '\xDB', '\x28', '\xB9', '\x8F', '\xD4', '\xE7', '\xBA', '\xCC', '\x4D', '\x69', '\xA3', '\x80', '\xA7', '\x1E', '\x2D', '\x15'};
thread_local EncryptedName<sizeof(source), 0x4F1791FB1503C713ULL> name(source);
return name;
}
// OFFSET: 0x0063D260
// FUNCTION: fn_04789
void InitializeCallback::operator()(Stove::PCSDK::CallbackResult callbackResult) const {
g_stoveWaitingCallback = false;
if (!callbackResult.GetResult().IsSuccessful()) {
const char captionSource[] = {'\xD5', '\x3D', '\xF8', '\x60', '\x2C', '\x37', '\xD7'};
const char* caption = DecryptName<0x31D7C1EDA345E36DULL>(captionSource);
const char messageSource[] = {'\xCE', '\x63', '\xFB', '\xA9', '\xF9', '\xE6', '\x92', '\x13', '\xF5', '\x89', '\x87', '\x84', '\x67', '\xAA', '\xB5', '\x1F', '\x29', '\x14', '\x80', '\x99', '\x09', '\x9A', '\xBA', '\x6C', '\xA0', '\x89', '\xF7', '\x8B', '\x19', '\x8E', '\xB5', '\x68', '\x29', '\x68', '\xF9', '\xE8', '\x38', '\x9A', '\xA0', '\x67', '\xC6', '\x1D', '\x9E', '\x71', '\xD9'};
const char* message = DecryptName<0xD3755DD95F47A909ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
PostQuitMessage(0);
}
}
// OFFSET: 0x0063D490
// FUNCTION: fn_04790
EncryptedName<129, 0x2D3B15774149D5DDULL>& PurchaseCheckingMessage::operator()() const {
const char source[] = {'\x63', '\x13', '\x89', '\x8D', '\xB2', '\xCE', '\x1B', '\x9C', '\x65', '\x6D', '\x8C', '\x61', '\xBF', '\xBB', '\xFB', '\xE3', '\xFD', '\x14', '\x96', '\x81', '\xA3', '\xA1', '\xF4', '\x99', '\x04', '\xFB', '\x67', '\x6F', '\x59', '\x1F', '\x31', '\x27', '\x83', '\xB3', '\x2F', '\x71', '\x47', '\x25', '\x0B', '\xEC', '\x0B', '\x15', '\x8E', '\x60', '\x57', '\x46', '\x4F', '\x42', '\xAB', '\xB0', '\x69', '\x87', '\x93', '\xD5', '\xF7', '\xEC', '\x2B', '\x6A', '\xE8', '\xFD', '\xDA', '\x35', '\x8A', '\x95', '\x65', '\x10', '\x69', '\xFE', '\xB8', '\xA2', '\xDA', '\x0D', '\x15', '\x11', '\x69', '\x1A', '\xBF', '\xBB', '\xFB', '\xE3', '\x80', '\xF5', '\xF0', '\xB7', '\xB1', '\xA5', '\xFB', '\x96', '\xFD', '\x61', '\xE4', '\xF6', '\xD8', '\xAB', '\xE4', '\x0D', '\x63', '\x13', '\x89', '\x8D', '\xB2', '\xCE', '\xFB', '\xE1', '\xFD', '\x14', '\xED', '\xFA', '\x84', '\x35', '\xFA', '\xDB', '\x6C', '\x0B', '\xFC', '\x8A', '\xC3', '\xDA', '\x8F', '\xF4', '\xF3', '\x8B', '\x79', '\x71', '\x47', '\x25', '\x0B', '\x1D', '\xDD'};
thread_local EncryptedName<sizeof(source), 0x2D3B15774149D5DDULL> name(source);
return name;
}
// OFFSET: 0x0063D5D0
// FUNCTION: fn_04791
void ConfirmPurchaseCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, bool purchased, int productCount, unsigned int count, int remainingCount,
int resultCode) const {
g_stoveWaitingCallback = false;
if (callbackResult.GetResult().IsSuccessful()) {
if (count != 0 && purchased == true) {
g_modeMgr.GetGameMode()->SendMsg(MM_STOVE_AUTHENTICATION, 4, 0, 0, 0);
g_stoveMgr->FetchAllProducts();
UIWindow* window = g_windowMgr.LookupWindow(WID_CASHSHOP_WND);
if (window != nullptr) {
window->SendMsg(nullptr, UM_UPDATE_CASHSHOP_BALANCE, 0, 0, 0, 0);
window->SendMsg(nullptr, UM_REFRESHITEM, 0, 0, 0, 0);
}
} else {
g_windowMgr.SendNotice(UIM_OPENCHATWND, 0, 0, 0, 0, 0);
const char noticeSource[] = {'\x50', '\x23', '\x4B', '\xBE', '\x58', '\x4F', '\xDF', '\xDF', '\x27', '\x5B', '\x3F', '\xBE', '\x36', '\x47', '\x33', '\x41', '\x5F', '\x63', '\x4E', '\xBB', '\x59', '\x48', '\x4B', '\xB8', '\xCF', '\x9B'};
const char* notice = DecryptName<0x61FF87ED7BF39BE1ULL>(noticeSource);
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(notice), 0xFFE6E6, 0, 0, 0);
}
} else {
const char captionSource[] = {'\x8B', '\xF9', '\x8E', '\xCC', '\x7C', '\xBB', '\x39'};
const char* caption = DecryptName<0x2D394DBD0F332733ULL>(captionSource);
const char messageSource[] = {'\x3F', '\x60', '\x99', '\xDB', '\xD5', '\x9E', '\xB9', '\xC4', '\x20', '\x3E', '\xDA', '\x2D', '\xA2', '\xF0', '\x26', '\xC9', '\x42', '\x45', '\x93', '\xC2', '\xD1', '\xE6', '\xB7', '\x5D', '\xAC', '\xD1', '\x68', '\x5B', '\x20', '\x1F', '\x29', '\x90', '\x4F', '\x31', '\x9B', '\xB3', '\xA0', '\xF2', '\x2E', '\xB3', '\xDF', '\x3C', '\x89', '\xCD', '\xA2', '\x1F', '\x20', '\xA4', '\x49', '\x7D', '\x93', '\xC2', '\xD1', '\xE6', '\xB7', '\x7D'};
const char* message = DecryptName<0x7D993F650D2785FFULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
}
}
// OFFSET: 0x0063DB80
// FUNCTION: fn_04794
void CSession::AddInventoryCategoryItem(const ITEM_INFO& item, int list) {
if (static_cast<unsigned int>(list) <= 10) {
this->inventoryCategories[list].push_back(item);
}
}
// OFFSET: 0x0063DC50
// FUNCTION: fn_04795
bool CStoveMgr::Initialize() {
if (this->m_initialized == true) {
return false;
}
Stove::PCSDK::Base::StovePCInitializeParam param;
const char sandboxSource[] = {'\x96', '\x7E', '\x5B', '\xCE', '\x35', '\x9E', '\x50', '\x3A', '\xD8', '\x63', '\x4B', '\xC3', '\x2C', '\x83', '\x0F'};
const char* sandbox = DecryptName<0x490FFB43A12F0DB9ULL>(sandboxSource);
if (std::strstr(g_commandLine, sandbox) != nullptr) {
this->m_environment = 1;
param.SetEnvironment(L"SANDBOX");
reinterpret_cast<Stove::PCSDK::Base::StovePCLogEvent&>(param).SetCategory1(L"SB_RAGNAROK_IND");
param.SetApplicationKey(L"6b57af29764992a85cf793b01d4af15be6047715fd5f4687b23d0a1ba02337f5");
this->m_applicationId = L"SB__SH_IPJVFX";
} else {
const char liveSource[] = {'\x5E', '\x8A', '\x2D', '\x9A', '\xF7', '\x78', '\x3A', '\xFD', '\x18', '\x8F', '\x3C', '\xF5'};
const char* live = DecryptName<0x91651D81F559F971ULL>(liveSource);
if (std::strstr(g_commandLine, live) != nullptr) {
this->m_environment = 2;
param.SetEnvironment(L"LIVE");
reinterpret_cast<Stove::PCSDK::Base::StovePCLogEvent&>(param).SetCategory1(L"RAGNAROK_IND");
param.SetApplicationKey(L"9af21dbb708609cd29703f56d002c64ab6f8f5bf0a310388f65cf781a5e8dd8f");
this->m_applicationId = L"RAG_SH_BTLTNL";
}
}
const char skipRestartSource[] = {'\x24', '\x08', '\xAB', '\x0E', '\x3D', '\x02', '\x8E', '\x10', '\x6A', '\x1C', '\x80', '\x15', '\x24', '\x08', '\xBD', '\x73'};
const char* skipRestart = DecryptName<0x73D1674B61DF7B0BULL>(skipRestartSource);
if (std::strstr(g_commandLine, skipRestart) == nullptr && Base_RestartAppIfNecessary(&param) == true) {
const char captionSource[] = {'\x69', '\xC7', '\x20', '\x4C', '\xAA', '\x7D', '\x0F'};
const char* caption = DecryptName<0x0F0F8B6B8F9D19D1ULL>(captionSource);
const std::array<char, 38> messageSource = {'\x3E', '\x17', '\x5A', '\x5B', '\xC0', '\x23', '\x4A', '\x75', '\xDB', '\x90', '\xF5', '\xE1', '\x1B', '\xF3', '\x49', '\x77', '\xD5', '\xC5', '\x15', '\xE8', '\x4E', '\xC4', '\x57', '\xF9', '\xD0', '\xA4', '\xF2', '\xCD', '\x62', '\xDB', '\xAF', '\x18', '\xBB', '\xDF', '\x89', '\x92', '\x41', '\x03'};
const char* message = DecryptName<0xD98F03A52D35636DULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
return false;
}
Base_Initialize(&param, OnStoveInitialized);
this->WaitForCallback();
Stove::PCSDK::Result result = IAP_Initialize(this->m_applicationId.c_str());
if (result.IsSuccessful()) {
this->FetchUser();
Base_GetShutdown(OnStoveShutdown);
this->m_initialized = true;
return true;
}
const char captionSource[] = {'\x0F', '\xD9', '\xEA', '\x0E', '\xEA', '\x11', '\x2B'};
const char* caption = DecryptName<0x812BE72BCD5707B7ULL>(captionSource);
const std::array<char, 45> messageSource = {'\x66', '\xF7', '\x23', '\x21', '\x43', '\x34', '\xC0', '\x99', '\x5D', '\x1D', '\x5F', '\x0C', '\xDD', '\x78', '\xE7', '\x95', '\x81', '\x80', '\x58', '\x11', '\xB3', '\x48', '\xE8', '\xE6', '\x08', '\x1D', '\x2F', '\x03', '\xA3', '\x5C', '\xE7', '\xE2', '\x81', '\xFC', '\x21', '\x60', '\x82', '\x48', '\xF2', '\xED', '\x6E', '\x89', '\x46', '\xF9', '\x63'};
const char* message = DecryptName<0x59278F63D79F3DA1ULL>(messageSource);
MessageBoxA(hWnd, FormatOwnedString(message).c_str(), caption, MB_OK);
return false;
}
// OFFSET: 0x0063E390
// FUNCTION: fn_04796
const char* CStoveMgr::GetAccessToken() {
wchar_t accessToken[600];
std::memset(accessToken, 0, sizeof(accessToken));
Stove::PCSDK::Result result = Base_GetAccessToken(accessToken, 600);
if (result.IsSuccessful()) {
std::string token = EncodeText(CP_ACP, std::wstring(accessToken));
memcpy_s(this->m_accessToken, sizeof(this->m_accessToken), token.c_str(), std::min(sizeof(this->m_accessToken), token.size() + 1));
return this->m_accessToken;
}
const std::array<char, 7> source = {'\xA7', '\xEF', '\x70', '\x24', '\x2C', '\x83', '\x6D'};
thread_local EncryptedName<sizeof(source), 0x1D6D75EDE7CD311FULL> caption(source);
MessageBoxA(hWnd, FormatOwnedString(AccessTokenFailureMessage()().Text()).c_str(), caption.Text(), MB_OK);
PostQuitMessage(0);
return nullptr;
}
// OFFSET: 0x0063E700
// FUNCTION: fn_04797
void CStoveMgr::FetchUser() {
Stove::PCSDK::Base::StovePCUser user;
Stove::PCSDK::Result result = Base_GetUser(&user);
if (result.IsSuccessful()) {
StringFormat(this->m_memberNumber, sizeof(this->m_memberNumber), _TRUNCATE, "%llu", user.GetMemberNumber());
StringFormat(this->m_gameUserId, sizeof(this->m_gameUserId), _TRUNCATE, "%llu", user.GetGameUserId());
} else {
const char source[] = {'\xB9', '\x89', '\x2A', '\x1C', '\xD2', '\x73', '\x53'};
thread_local EncryptedName<sizeof(source), 0xD1538513DF975701ULL> caption(source);
MessageBoxA(hWnd, FormatOwnedString(UserFailureMessage()().Text()).c_str(), caption.Text(), MB_OK);
PostQuitMessage(0);
}
}
// OFFSET: 0x0063E9E0
// FUNCTION: fn_04799
void CStoveMgr::StartPurchase(const std::vector<ITEM_INFO>& items) {
Stove::PCSDK::IAP::StovePCStartPurchaseParam param;
param.CreateOrderProduct(static_cast<unsigned int>(items.size()));
int index = 0;
for (const ITEM_INFO& item : items) {
Stove::PCSDK::IAP::StovePCOrderProduct orderProduct;
orderProduct.SetProductId(item.productId);
reinterpret_cast<Stove::PCSDK::IAP::StovePCChargeInfo&>(orderProduct).SetChargeDisplayDeductVal(static_cast<int>(item.prices[0]));
reinterpret_cast<Stove::PCSDK::IAP::StovePCChargeInfo&>(orderProduct).SetChargeType(item.quantity);
param.SetOrderProduct(index, &orderProduct);
++index;
}
Stove::PCSDK::IAP::StovePCPaymentOption option;
option.SetOperation(Stove::PCSDK::IAP::StovePCPaymentOperation::DEFAULT);
param.SetPurchaseOption(option);
IAP_StartPurchase(&param, OnStovePurchaseStarted);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
if (this->m_purchaseUrl.size() == 0) {
const char parametersSource[] = {'\x05', '\x47', '\x7B', '\xE5', '\xA8', '\x7F', '\xFC', '\x46', '\x0E', '\x40', '\x21', '\xFA', '\xB5', '\x36', '\xA7', '\x06', '\x1B', '\x56', '\x21', '\xF6', '\xB4', '\x28', '\xFC', '\x1A', '\x08', '\x41', '\x79', '\xFC', '\xB8', '\x20', '\xFC', '\x3B', '\x2C', '\x74', '\x41', '\xD4', '\x89', '\x0A', '\x98', '\x36', '\x24', '\x7D', '\x4B', '\x95'};
const char* parameters = DecryptName<0x69D345DB950F336DULL>(parametersSource);
const char fileSource[] = {'\x19', '\x6F', '\x87', '\x8F', '\xF4', '\x1F', '\xBE', '\xE8', '\x12', '\x68', '\xDD', '\x90', '\xE9', '\x56', '\xE5', '\xA8', '\x07', '\x7E', '\xDD', '\x9C', '\xE8', '\x48', '\xBE', '\xB4', '\x14', '\x69', '\x85', '\x96', '\xE4', '\x40', '\xBE', '\x95', '\x30', '\x5C', '\xBD', '\xBE', '\xD5', '\x6A', '\xDA', '\x98', '\x38', '\x55', '\xB7', '\xFF'};
const char* file = DecryptName<0xC7912587FFF31B71ULL>(fileSource);
const char verbSource[] = {'\xFA', '\x25', '\x24', '\x11', '\xFD'};
const char* verb = DecryptName<0x8F1B5BFD5F6175B5ULL>(verbSource);
ShellExecuteA(nullptr, verb, file, parameters, nullptr, SW_SHOWNORMAL);
} else {
const char* url = this->m_purchaseUrl.c_str();
const char verbSource[] = {'\x60', '\xCF', '\xF6', '\x95', '\xEF'};
const char* verb = DecryptName<0x9B17C9EFDBB39F2FULL>(verbSource);
ShellExecuteA(nullptr, verb, url, url, nullptr, SW_SHOWNORMAL);
if (g_windowMgr.Confirm(PurchaseCheckingMessage()().Text(), 2, true, false, 0, "Message", 250, 170, 0) == 187) {
IAP_ConfirmPurchase((static_cast<std::int64_t>(this->m_purchaseIdHigh) << 32) | static_cast<std::uint32_t>(this->m_purchaseIdLow), OnStovePurchaseConfirmed);
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
}
}
}
// OFFSET: 0x0063F090
// FUNCTION: fn_04802
void CStoveMgr::WaitForCallback() {
g_stoveWaitingCallback = true;
do {
Base_RunCallback();
Sleep(200);
} while (g_stoveWaitingCallback);
}
// OFFSET: 0x0063CD20
// FUNCTION: fn_04785
void TermsAgreementCallback::operator()(Stove::PCSDK::CallbackResult callbackResult, int unused, const wchar_t* url) const {
g_stoveWaitingCallback = false;
if (callbackResult.GetResult().IsSuccessful()) {
g_modeMgr.GetGameMode()->SendMsg(MM_REQUEST_CASH_SHOP, 0, 0, 0, 0);
} else {
std::string path = EncodeText(CP_ACP, std::wstring(url));
const char source[] = {'\x68', '\x51', '\x42', '\x23', '\x03'};
thread_local EncryptedName<sizeof(source), 0x2FF3C5036D070127ULL> verb(source);
ShellExecuteA(nullptr, verb.Text(), path.c_str(), path.c_str(), nullptr, SW_SHOWNORMAL);
}
}