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
1190 lines
39 KiB
C++
1190 lines
39 KiB
C++
#include "UI/Login/UINewSelectCharWnd.h"
|
|
#include "Client/Mode/ModeMessage.h"
|
|
#include "UI/Window/UIEnums.h"
|
|
#include "UI/Window/WindowId.h"
|
|
#include "UI/Window/UIEnums.h"
|
|
#include "UI/Items/UIRefiningWnd.h"
|
|
|
|
#include "Client/Application/ApplicationWindow.h"
|
|
#include "Client/Mode/CGameMode.h"
|
|
#include "Client/Mode/CMode.h"
|
|
#include "Client/Mode/ModeDragState.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "Client/Session/Session.h"
|
|
#include "Contents/Sound/SoundMgr.h"
|
|
#include "Contents/Items/ItemDescription.h"
|
|
#include "Contents/Items/ItemId.h"
|
|
#include "Contents/Tables/MessageTable.h"
|
|
#include "Network/Connection/Connection.h"
|
|
#include "Network/Packets/PacketLengths.h"
|
|
#include "Resource/Bitmap/BitmapResource.h"
|
|
#include "Resource/ResourceMgr.h"
|
|
#include "Resource/Bitmap/TextureNames.h"
|
|
#include "UI/Buttons/UIBasicButton.h"
|
|
#include "UI/Shop/ItemDrawing.h"
|
|
#include "UI/Window/WindowBorder.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
#include "UI/Window/WindowManagerWindows.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
|
|
#include "Resource/MSGSTRINGID.h"
|
|
#include "Network/Packets/PacketId.h"
|
|
#include <windows.h>
|
|
#include <shellapi.h>
|
|
#include <timeapi.h>
|
|
|
|
#include <cstddef>
|
|
#include <cstring>
|
|
#include <list>
|
|
#include <string>
|
|
|
|
#pragma pack(push, 1)
|
|
struct RefiningSelectPacket {
|
|
/* 0000 */ std::int16_t id;
|
|
/* 0002 */ std::uint16_t index;
|
|
};
|
|
|
|
struct RefiningRequestPacket {
|
|
/* 0000 */ std::int16_t id;
|
|
/* 0002 */ std::uint16_t index;
|
|
/* 0004 */ std::uint32_t materialId;
|
|
/* 0008 */ unsigned char useCatalyst;
|
|
};
|
|
|
|
struct RefiningClosePacket {
|
|
/* 0000 */ std::int16_t id;
|
|
};
|
|
#pragma pack(pop)
|
|
|
|
// OFFSET: 0x007F4920
|
|
// FUNCTION: fn_09890
|
|
UIRefiningWnd::UIRefiningWnd()
|
|
: UIFrameWnd(0), refiningButton(nullptr), returnButton(nullptr),
|
|
cancelButton(nullptr), state(0), result(7), frameInterval(100), stateTick(0), frame(0), selectedMaterial(-1), materials(), catalystEnabled(0),
|
|
catalystItemId(0), catalystCount(0), item(0), requestPending(0), nextMaterials(), nextCatalystCount(0), nextItem(0) {
|
|
this->catalystItemId = 6635;
|
|
}
|
|
|
|
// OFFSET: 0x007F4A70
|
|
// FUNCTION: fn_09891
|
|
UIRefining_BtnAgain::UIRefining_BtnAgain() : UIBitmapButton(), cost(0) {
|
|
}
|
|
|
|
// OFFSET: 0x007F4AD0
|
|
// FUNCTION: fn_09892
|
|
UIRefining_BtnRefining::UIRefining_BtnRefining() : UIBitmapButton(), cost(0) {
|
|
}
|
|
|
|
// OFFSET: 0x007F4B30
|
|
// FUNCTION: fn_09893
|
|
UIRefining_BtnReturn::UIRefining_BtnReturn() : UIBitmapButton(), highlighted(1) {
|
|
}
|
|
|
|
// OFFSET: 0x007F5E30
|
|
// FUNCTION: fn_09907
|
|
void UIRefiningWnd::OnCreate(int width, int height) {
|
|
this->AddBaseButton();
|
|
this->AddCloseButton("", 0);
|
|
|
|
UIBasicButton* basic = new UIBasicButton();
|
|
basic->Configure(56, LookupMessage(MSI_CANCEL));
|
|
basic->Move(204, 322);
|
|
basic->SetId(185);
|
|
this->AddChild(basic);
|
|
this->cancelButton = basic;
|
|
|
|
this->refiningButton = new UIRefining_BtnRefining();
|
|
this->refiningButton->SetBitmap("유저인터페이스\\refining_renewal\\bt_refining_normal.bmp", 0, 0);
|
|
this->refiningButton->SetBitmap("유저인터페이스\\refining_renewal\\bt_refining_normal.bmp", 1, 0);
|
|
this->refiningButton->SetBitmap("유저인터페이스\\refining_renewal\\bt_refining_press.bmp", 2, 0);
|
|
this->refiningButton->SetBitmap("유저인터페이스\\refining_renewal\\bt_refining_disable.bmp", 3, 0);
|
|
this->refiningButton->Resize(this->refiningButton->BitmapWidth(), this->refiningButton->BitmapHeight());
|
|
this->refiningButton->Move(84, 262);
|
|
this->refiningButton->SetId(184);
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
this->AddChild(this->refiningButton);
|
|
|
|
this->returnButton = new UIRefining_BtnReturn();
|
|
this->returnButton->UpdateBitmaps();
|
|
this->returnButton->Move(20, 267);
|
|
this->returnButton->SetId(519);
|
|
this->returnButton->Enable(0);
|
|
this->AddChild(this->returnButton);
|
|
|
|
this->againButton = new UIRefining_BtnAgain();
|
|
this->againButton->UpdateBitmaps();
|
|
this->againButton->Move(142, 267);
|
|
this->againButton->SetId(520);
|
|
this->againButton->Enable(0);
|
|
this->AddChild(this->againButton);
|
|
|
|
this->notice = new UIRefining_Notice();
|
|
this->notice->SetSize(194, 22);
|
|
this->notice->Move(6, 322);
|
|
this->AddChild(this->notice);
|
|
|
|
UIBitmapButton* help = new UIBitmapButton();
|
|
help->SetBitmap("유저인터페이스\\basic_interface\\btn_help_normal.bmp", 0, 0);
|
|
help->SetBitmap("유저인터페이스\\basic_interface\\btn_help_over.bmp", 1, 0);
|
|
help->SetBitmap("유저인터페이스\\basic_interface\\btn_help_pressed.bmp", 2, 0);
|
|
help->SetBitmap("유저인터페이스\\basic_interface\\btn_help_disabled.bmp", 3, 0);
|
|
help->SetSize(help->BitmapWidth(), help->BitmapHeight());
|
|
help->Move(230, 20);
|
|
help->SetTooltip(LookupMessage(MSI_PROBABILITY_TITLE));
|
|
help->SetId(510);
|
|
this->AddChild(help);
|
|
}
|
|
|
|
// OFFSET: 0x007F5270
|
|
// FUNCTION: fn_09902
|
|
void UIRefiningWnd::DragAndDrop(int x, int y, std::intptr_t value) {
|
|
const ModeDragState* drag = reinterpret_cast<const ModeDragState*>(value);
|
|
if (static_cast<unsigned>(x - 109) <= 46 && static_cast<unsigned>(y - 201) <= 46 && drag->source == 1) {
|
|
this->SendMsg(this, UM_REFRESHITEM, drag->id, 0, 0, 0);
|
|
}
|
|
g_modeMgr.GetGameMode()->SendMsg(MM_CANCEL_DRAG, 0, 0, 0, 0);
|
|
}
|
|
|
|
// OFFSET: 0x007F52D0
|
|
// FUNCTION: fn_09903
|
|
__declspec(noinline) void UIRefiningWnd::Reset() {
|
|
this->requestPending = 0;
|
|
this->item = ITEM_INFO(0);
|
|
this->selectedMaterial = -1;
|
|
this->materials.clear();
|
|
this->catalystEnabled = 0;
|
|
this->catalystCount = 0;
|
|
this->notice->SetNotice("", 0, 0);
|
|
|
|
this->refiningButton->cost = 0;
|
|
this->refiningButton->Invalidate();
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
|
|
this->state = 0;
|
|
this->result = 7;
|
|
this->stateTick = timeGetTime();
|
|
this->frame = 0;
|
|
if (this->cancelButton) {
|
|
this->cancelButton->SetDisabled(0);
|
|
this->cancelButton->Invalidate();
|
|
}
|
|
|
|
this->result = 7;
|
|
this->refiningButton->Enable(1);
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
this->returnButton->Enable(0);
|
|
this->againButton->Enable(0);
|
|
this->Invalidate();
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F54B0
|
|
// FUNCTION: fn_09904
|
|
std::uint32_t UIRefiningWnd::SelectedMaterialValue() {
|
|
if (this->item.identity[1] > 0 && this->materials.size() > 0 && this->selectedMaterial >= 0 &&
|
|
this->materials.size() > static_cast<unsigned>(this->selectedMaterial)) {
|
|
return this->materials[this->selectedMaterial].cost;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// OFFSET: 0x007F5500
|
|
// FUNCTION: fn_09905
|
|
int UIRefiningWnd::SlotAt(int x, int y) {
|
|
int offsetX = x - 11;
|
|
if (static_cast<unsigned>(offsetX) > 242 || static_cast<unsigned>(y - 55) > 52) {
|
|
return -1;
|
|
}
|
|
int index = offsetX / 49;
|
|
if (x > index * 49 + 57 || index >= 5) {
|
|
return -1;
|
|
}
|
|
return index;
|
|
}
|
|
|
|
// OFFSET: 0x007F55A0
|
|
// FUNCTION: fn_09906
|
|
__declspec(safebuffers) void UIRefiningWnd::ApplyResult() {
|
|
this->notice->SetNotice("", 0, 0);
|
|
this->item = this->nextItem;
|
|
this->refiningButton->Enable(0);
|
|
this->returnButton->Enable(1);
|
|
this->againButton->Enable(1);
|
|
|
|
switch (this->result) {
|
|
case 3:
|
|
this->returnButton->highlighted = 1;
|
|
this->returnButton->UpdateBitmaps();
|
|
this->againButton->success = 1;
|
|
this->againButton->UpdateBitmaps();
|
|
break;
|
|
case 4:
|
|
this->returnButton->highlighted = 0;
|
|
this->returnButton->UpdateBitmaps();
|
|
this->againButton->success = 0;
|
|
this->againButton->UpdateBitmaps();
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
break;
|
|
case 5:
|
|
case 6:
|
|
this->returnButton->highlighted = 0;
|
|
this->returnButton->UpdateBitmaps();
|
|
this->againButton->success = 0;
|
|
this->againButton->UpdateBitmaps();
|
|
break;
|
|
}
|
|
|
|
int nextIndex = 0;
|
|
for (auto it = this->nextMaterials.begin(); it != this->nextMaterials.end(); ++it) {
|
|
if (this->materials[this->selectedMaterial].itemId == it->itemId) {
|
|
break;
|
|
}
|
|
++nextIndex;
|
|
}
|
|
|
|
if (g_session.m_zeny < static_cast<int>(this->SelectedMaterialValue())) {
|
|
this->notice->SetNotice(LookupMessage(MSI_NPC_ALL_STAT_DOWN), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
} else {
|
|
this->againButton->cost = this->SelectedMaterialValue();
|
|
}
|
|
this->againButton->Invalidate();
|
|
|
|
this->catalystCount = this->nextCatalystCount;
|
|
if (this->catalystEnabled == 1) {
|
|
if (this->nextCatalystCount == 0) {
|
|
this->catalystEnabled = 0;
|
|
this->notice->SetNotice(LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_BLACKSMITHBLESSING), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
} else {
|
|
this->notice->SetNotice(LookupMessage(MSI_CANNOT_REFINE_ITEM), 0, 0);
|
|
const int owned = LookupClientItem(g_session.m_inventoryItems, this->catalystItemId, 0).quantity;
|
|
if (this->catalystCount > owned) {
|
|
this->catalystEnabled = 0;
|
|
this->notice->SetNotice(LookupMessage(MSI_NPC_ALL_STAT_DOWN_RESET), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
}
|
|
}
|
|
}
|
|
|
|
const std::size_t count = this->nextMaterials.size();
|
|
if (count == 0) {
|
|
this->materials.clear();
|
|
this->selectedMaterial = -1;
|
|
this->notice->SetNotice(LookupMessage(MSI_RETURN), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
} else {
|
|
bool same = true;
|
|
if (this->materials.size() == count) {
|
|
for (auto it = this->materials.begin(); it != this->materials.end(); ++it) {
|
|
auto found = this->nextMaterials.begin();
|
|
for (; found != this->nextMaterials.end(); ++found) {
|
|
if (it->itemId == found->itemId) {
|
|
break;
|
|
}
|
|
}
|
|
if (found == this->nextMaterials.end()) {
|
|
same = false;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
same = false;
|
|
}
|
|
|
|
this->materials = this->nextMaterials;
|
|
|
|
unsigned char level = 0;
|
|
if (this->item.identity[1] > 0 && this->materials.size() > 0 && this->selectedMaterial >= 0 &&
|
|
this->materials.size() > static_cast<unsigned>(this->selectedMaterial)) {
|
|
level = this->materials[this->selectedMaterial].successRate;
|
|
}
|
|
this->againButton->remainingCount = level;
|
|
this->againButton->Invalidate();
|
|
|
|
if (!same) {
|
|
this->selectedMaterial = -1;
|
|
this->notice->SetNotice(LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_BLACKSMITHBLESSING), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
} else if (this->selectedMaterial >= 0 && static_cast<unsigned>(this->selectedMaterial) < this->materials.size()) {
|
|
this->selectedMaterial = nextIndex;
|
|
const std::uint32_t itemId = this->materials[nextIndex].itemId;
|
|
|
|
ITEM_INFO info;
|
|
char name[260];
|
|
std::memset(name, 0, sizeof(name));
|
|
info.SetItemId(itemId);
|
|
int capacity = 260;
|
|
info.GetIdDisplayName(name, capacity, 0);
|
|
this->againButton->SetTooltip(name);
|
|
|
|
const ITEM_INFO owned = LookupClientItem(g_session.m_inventoryItems, itemId, 0);
|
|
if (owned.quantity == 0) {
|
|
this->notice->SetNotice(LookupMessage(MSI_REFINING_FAIL_BROKEN_ITEM), 5000, 1);
|
|
this->againButton->SetDisabled(1);
|
|
this->againButton->Invalidate();
|
|
}
|
|
}
|
|
}
|
|
|
|
this->requestPending = 0;
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F6BF0
|
|
// FUNCTION: fn_09909
|
|
void UIRefining_BtnAgain::Paint() {
|
|
UIBitmapButton::Paint();
|
|
if (this->m_disabled == 1) {
|
|
int width = this->TextWidth(LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_MONEY), 0, 0, 12, 1, 0);
|
|
std::uint32_t color = this->success == 1 ? 0xE1C1F : (this->m_disabled == 1 ? 0x6F4333 : 0x3E1B12);
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 14, LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_MONEY), 0, 0, 12, color, 1, 0
|
|
);
|
|
return;
|
|
}
|
|
|
|
int width = this->TextWidth(LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_MONEY), 0, 0, 12, 1, 0);
|
|
std::uint32_t color = this->success == 1 ? 0xE1C1F : (this->m_disabled == 1 ? 0x6F4333 : 0x3E1B12);
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 9, LookupMessage(MSI_REFINING_AGAIN_FAILED_LACK_OF_MONEY), 0, 0, 12, color, 1, 0
|
|
);
|
|
|
|
std::string count = FormatOwnedString(LookupMessage(MSI_CASHSHOP_SALE_LIST), this->remainingCount);
|
|
width = this->TextWidth(count.c_str(), 0, 0, 11, 0, 0);
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 22, count.c_str(), 0, 0, 11, 0, 0, 0
|
|
);
|
|
|
|
width = this->TextWidth(IntToString(this->cost, 0).c_str(), 0, 0, 11, 1, 0);
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 38, IntToString(this->cost, 0).c_str(), 0, 0, 11, 0xFFFFFF, 1, 0
|
|
);
|
|
}
|
|
|
|
// OFFSET: 0x007F6EA0
|
|
// FUNCTION: fn_09910
|
|
void UIRefining_BtnRefining::Paint() {
|
|
UIBitmapButton::Paint();
|
|
int width = this->TextWidth(LookupMessage(MSI_NOTENOUGH_BLACKSMITH_BLESSING), 0, 0, 13, 1, 0);
|
|
std::uint32_t color = this->m_disabled == 1 ? 0x94644A : 0x3E1B12;
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 11, LookupMessage(MSI_NOTENOUGH_BLACKSMITH_BLESSING), 0, 0, 12, color, 1, 0
|
|
);
|
|
|
|
if (this->m_disabled == 0) {
|
|
width = this->TextWidth(IntToString(this->cost, 0).c_str(), 0, 0, 12, 1, 0);
|
|
this->DrawTextAt(83 - width, (this->geometry.state == 2) + 28, IntToString(this->cost, 0).c_str(), 0, 0, 12, 0xFFFFFF, 1, 0
|
|
);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F7030
|
|
// FUNCTION: fn_09911
|
|
void UIRefining_BtnReturn::Paint() {
|
|
UIBitmapButton::Paint();
|
|
int width = this->TextWidth(LookupMessage(MSI_MANUFACTURED_MARRIAGERING_ITEM), 0, 0, 12, 1, 0);
|
|
std::uint32_t color = this->highlighted == 1 ? 0xE1C1F : 0x3E1B12;
|
|
this->DrawTextAt(static_cast<int>(static_cast<float>(this->geometry.width - width) * 0.5f),
|
|
(this->geometry.state == 2) + 14, LookupMessage(MSI_MANUFACTURED_MARRIAGERING_ITEM), 0, 0, 12, color, 1, 0
|
|
);
|
|
}
|
|
|
|
// OFFSET: 0x007F70C0
|
|
// FUNCTION: fn_09912
|
|
void UIRefining_Notice::Paint() {
|
|
this->ClearSurface(0xFFFF00FF);
|
|
if (this->text.size() > 0) {
|
|
this->DrawBitmap(0, 3, static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\refining_renewal\\ico_notice.bmp"))), false);
|
|
|
|
std::uint32_t color = this->highlight != 1 ? 0xC4281C : 0x2E15CA;
|
|
std::list<std::string> lines;
|
|
this->WrapFormattedText(this->text, &lines, this->geometry.width - 18, 0, 11, 0);
|
|
|
|
int offset = 0;
|
|
for (auto line = lines.begin(); line != lines.end(); ++line) {
|
|
this->DrawTextAt(18, static_cast<int>((this->geometry.height - lines.size() * 11) * 0.5 + offset), line->c_str(), 0, 0, 11, color, 0, 0
|
|
);
|
|
offset += 11;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F72A0
|
|
// FUNCTION: fn_09913
|
|
void UIRefiningWnd::OnLBtnDblClk(int x, int y) {
|
|
if (this->item.identity[1] > 0 && static_cast<unsigned>(x - 109) <= 46 && static_cast<unsigned>(y - 201) <= 46) {
|
|
this->Reset();
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F72D0
|
|
// FUNCTION: fn_09914
|
|
void UIRefiningWnd::OnLBtnDown(int x, int y) {
|
|
if (y < 17) {
|
|
UIFrameWnd::OnLBtnDown(x, y);
|
|
return;
|
|
}
|
|
|
|
if (this->state == 1 && this->item.identity[1] > 0 && static_cast<unsigned>(x - 109) <= 46 && static_cast<unsigned>(y - 201) <= 46) {
|
|
static_cast<CGameMode*>(g_modeMgr.GetGameMode())->drag.BeginItem(g_windowMgr, 28, this->item, 1, -1);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F7340
|
|
// FUNCTION: fn_09915
|
|
void UIRefiningWnd::OnLBtnUp(int x, int y) {
|
|
if (y < 17) {
|
|
UIFrameWnd::OnLBtnUp(x, y);
|
|
return;
|
|
}
|
|
|
|
if (this->state != 1) {
|
|
return;
|
|
}
|
|
|
|
const int slot = this->SlotAt(x, y);
|
|
if (slot < 0) {
|
|
return;
|
|
}
|
|
|
|
if (static_cast<unsigned>(slot) < this->materials.size()) {
|
|
const int owned = LookupClientItem(g_session.m_inventoryItems, this->materials[slot].itemId, 0).quantity;
|
|
if (owned < 1) {
|
|
return;
|
|
}
|
|
|
|
this->selectedMaterial = slot;
|
|
this->refiningButton->cost = this->SelectedMaterialValue();
|
|
this->refiningButton->Invalidate();
|
|
|
|
if (this->materials[slot].successRate <= 99 && this->catalystEnabled == 0) {
|
|
int message;
|
|
switch (this->materials[slot].itemId) {
|
|
case Carnium:
|
|
case Bradium:
|
|
message = 2990;
|
|
break;
|
|
case HD_Carnium:
|
|
case HD_Bradium:
|
|
case HD_Oridecon:
|
|
case HD_Elunium:
|
|
case LI_HD_Bradium:
|
|
case LI_HD_Carnium:
|
|
case LI_HD_Oridecon:
|
|
case LI_HD_Elunium:
|
|
case Ethernium:
|
|
case Etherdeocon:
|
|
case Enriched_Ethernium:
|
|
case Enriched_Etherdeocon:
|
|
message = 2989;
|
|
break;
|
|
case ITEMID_ORIDECON:
|
|
case Elunium:
|
|
case ITEMID_PHRACON:
|
|
case ITEMID_EMVERETARCON:
|
|
case Enriched_Elunium:
|
|
case Enriched_Oridecon:
|
|
case HD_Ethernium:
|
|
case HD_Etherdeocon:
|
|
case Etel_Bradium:
|
|
case HD_Etel_Bradium:
|
|
case Etel_Carnium:
|
|
case HD_Etel_Carnium:
|
|
message = 2988;
|
|
break;
|
|
default:
|
|
this->Invalidate();
|
|
return;
|
|
}
|
|
this->notice->SetNotice(LookupMessage(message), 0, 0);
|
|
}
|
|
} else {
|
|
if (slot != 4 || this->catalystCount < 1) {
|
|
return;
|
|
}
|
|
|
|
const int owned = LookupClientItem(g_session.m_inventoryItems, this->catalystItemId, 0).quantity;
|
|
if (owned < this->catalystCount) {
|
|
this->notice->SetNotice(LookupMessage(MSI_REFINING_FAIL), 3000, 1);
|
|
} else if (this->catalystEnabled == 1) {
|
|
this->catalystEnabled = 0;
|
|
this->notice->SetNotice("", 0, 0);
|
|
} else {
|
|
this->catalystEnabled = 1;
|
|
this->notice->SetNotice(LookupMessage(MSI_CANNOT_REFINE_ITEM), 0, 0);
|
|
}
|
|
}
|
|
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F76C0
|
|
// FUNCTION: fn_09916
|
|
void UIRefiningWnd::OnMouseHover(int x, int y) {
|
|
if (this->state != 1) {
|
|
return;
|
|
}
|
|
|
|
char name[260];
|
|
std::memset(name, 0, sizeof(name));
|
|
|
|
if (this->selectedMaterial != -1 && x >= 81 && x <= 105 && y >= 150 && y <= 174) {
|
|
ITEM_INFO info;
|
|
info.SetItemId(this->materials[this->selectedMaterial].itemId);
|
|
int capacity = 260;
|
|
info.GetIdDisplayName(name, capacity, 0);
|
|
int tipX = 81;
|
|
int tipY = 150;
|
|
this->ToScreen(tipX, tipY);
|
|
g_modeMgr.gameMode->ShowTooltip(name, tipX, tipY - 20, -1, false, true);
|
|
return;
|
|
}
|
|
|
|
if (this->catalystEnabled == 1 && x >= 161 && x <= 185 && y >= 150 && y <= 174) {
|
|
ITEM_INFO info;
|
|
info.SetItemId(this->catalystItemId);
|
|
int capacity = 260;
|
|
info.GetIdDisplayName(name, capacity, 0);
|
|
int tipX = 161;
|
|
int tipY = 150;
|
|
this->ToScreen(tipX, tipY);
|
|
g_modeMgr.gameMode->ShowTooltip(name, tipX, tipY - 20, -1, false, true);
|
|
return;
|
|
}
|
|
|
|
const int offsetX = x - 11;
|
|
if (static_cast<unsigned>(offsetX) > 242 || static_cast<unsigned>(y - 55) > 52) {
|
|
return;
|
|
}
|
|
const int slot = offsetX / 49;
|
|
if (x > slot * 49 + 57 || slot >= 5 || slot < 0) {
|
|
return;
|
|
}
|
|
|
|
if (static_cast<unsigned>(slot) < this->materials.size()) {
|
|
ITEM_INFO info;
|
|
info.SetItemId(this->materials[slot].itemId);
|
|
int capacity = 260;
|
|
info.GetIdDisplayName(name, capacity, 0);
|
|
} else if (slot == 4 && this->catalystCount > 0) {
|
|
ITEM_INFO info;
|
|
info.SetItemId(this->catalystItemId);
|
|
int capacity = 260;
|
|
info.GetIdDisplayName(name, capacity, 0);
|
|
}
|
|
|
|
if (std::strlen(name) != 0) {
|
|
int tipX = slot * 49 + 11;
|
|
int tipY = 35;
|
|
this->ToScreen(tipX, tipY);
|
|
g_modeMgr.gameMode->ShowTooltip(name, tipX, tipY, -1, false, true);
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F7AA0
|
|
// FUNCTION: fn_09917
|
|
void UIRefiningWnd::OnProcess() {
|
|
if (this->notice) {
|
|
this->notice->OnProcess();
|
|
}
|
|
|
|
if (this->state == 1 && this->refiningButton->Disabled() == 1 && this->item.identity[1] > 0 && this->selectedMaterial >= 0 &&
|
|
static_cast<unsigned>(this->selectedMaterial) < this->materials.size()) {
|
|
this->refiningButton->SetDisabled(0);
|
|
this->refiningButton->Invalidate();
|
|
this->refiningButton->cost = this->SelectedMaterialValue();
|
|
this->refiningButton->Invalidate();
|
|
this->Invalidate();
|
|
}
|
|
|
|
const int frameCounts[7] = {4, 3, 14, 17, 20, 20, 20};
|
|
if (this->frame >= frameCounts[this->state]) {
|
|
return;
|
|
}
|
|
if (timeGetTime() <= this->stateTick + this->frameInterval) {
|
|
return;
|
|
}
|
|
|
|
++this->frame;
|
|
if (this->state == 2) {
|
|
if (this->frame == 7) {
|
|
g_soundMgr->PlayWave("effect\\refine\\bs_refine_1.wav", 0.0f, 0.0f, 0.0f, 250, 40, 1.0f, 0);
|
|
}
|
|
if (this->frame == 12) {
|
|
g_soundMgr->PlayWave("effect\\refine\\bs_refine_2.wav", 0.0f, 0.0f, 0.0f, 250, 40, 1.0f, 0);
|
|
}
|
|
}
|
|
|
|
if (this->frame >= frameCounts[this->state]) {
|
|
switch (this->state) {
|
|
case 0:
|
|
this->frame = 0;
|
|
break;
|
|
case 3:
|
|
this->frame = 13;
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
this->frame = 18;
|
|
break;
|
|
default:
|
|
this->frame = frameCounts[this->state] - 1;
|
|
if (this->state == 2) {
|
|
if (this->result == 3) {
|
|
g_soundMgr->PlayWave("effect\\refine\\bs_refine_success.wav", 0.0f, 0.0f, 0.0f, 250, 40, 1.0f, 0);
|
|
} else if (this->result == 4 || this->result == 5 || this->result == 6) {
|
|
g_soundMgr->PlayWave("effect\\refine\\bs_refine_failed.wav", 0.0f, 0.0f, 0.0f, 250, 40, 1.0f, 0);
|
|
}
|
|
this->ApplyResult();
|
|
this->SetState(this->result, 7);
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
this->stateTick = timeGetTime();
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F7D80
|
|
// FUNCTION: fn_09918
|
|
void UIRefining_Notice::OnProcess() {
|
|
if (this->expireTick != 0 && timeGetTime() > this->expireTick) {
|
|
this->expireTick = 0;
|
|
if (this->autoShown == 1) {
|
|
this->autoShown = 0;
|
|
this->geometry.visible = 0;
|
|
}
|
|
this->text = this->savedText;
|
|
this->highlight = this->savedHighlight;
|
|
this->Invalidate();
|
|
if (this->parent) {
|
|
this->parent->Invalidate();
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F7E10
|
|
// FUNCTION: fn_09919
|
|
void UIRefiningWnd::OnRBtnDown(int x, int y) {
|
|
}
|
|
|
|
// OFFSET: 0x007F7E20
|
|
// FUNCTION: fn_09920
|
|
void UIRefiningWnd::OnRBtnUp(int x, int y) {
|
|
if (y < 17) {
|
|
return;
|
|
}
|
|
|
|
if (this->state == 1) {
|
|
if (this->selectedMaterial != -1 && x >= 81 && x <= 105 && y >= 150 && y <= 174) {
|
|
UIWindow* window = g_windowMgr.EnsureWindow(WID_ITEMCOLLECTIONWND);
|
|
if (!window) {
|
|
return;
|
|
}
|
|
ITEM_INFO info = LookupClientItem(g_session.m_inventoryItems, this->materials[this->selectedMaterial].itemId, 0);
|
|
window->SendMsg(nullptr, UM_ITEMEXPLANATION, reinterpret_cast<std::intptr_t>(&info), 0, 0, 0);
|
|
return;
|
|
}
|
|
|
|
if (this->catalystEnabled == 1 && x >= 161 && x <= 185 && y >= 150 && y <= 174) {
|
|
UIWindow* window = g_windowMgr.EnsureWindow(WID_ITEMCOLLECTIONWND);
|
|
if (!window) {
|
|
return;
|
|
}
|
|
ITEM_INFO info = LookupClientItem(g_session.m_inventoryItems, this->catalystItemId, 0);
|
|
window->SendMsg(nullptr, UM_ITEMEXPLANATION, reinterpret_cast<std::intptr_t>(&info), 0, 0, 0);
|
|
return;
|
|
}
|
|
|
|
const int slot = this->SlotAt(x, y);
|
|
if (slot >= 0) {
|
|
if (static_cast<unsigned>(slot) < this->materials.size()) {
|
|
ITEM_INFO info = LookupClientItem(g_session.m_inventoryItems, this->materials[slot].itemId, 0);
|
|
if (info.identity[1] > 0) {
|
|
UIWindow* window = g_windowMgr.EnsureWindow(WID_ITEMCOLLECTIONWND);
|
|
if (window) {
|
|
window->SendMsg(nullptr, UM_ITEMEXPLANATION, reinterpret_cast<std::intptr_t>(&info), 0, 0, 0);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (slot == 4) {
|
|
if (this->catalystCount < 1) {
|
|
return;
|
|
}
|
|
ITEM_INFO info = LookupClientItem(g_session.m_inventoryItems, this->catalystItemId, 0);
|
|
if (info.identity[1] > 0) {
|
|
UIWindow* window = g_windowMgr.EnsureWindow(WID_ITEMCOLLECTIONWND);
|
|
if (window) {
|
|
window->SendMsg(nullptr, UM_ITEMEXPLANATION, reinterpret_cast<std::intptr_t>(&info), 0, 0, 0);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this->item.identity[1] > 0 && static_cast<unsigned>(x - 109) <= 46 && static_cast<unsigned>(y - 201) <= 46) {
|
|
UIWindow* window = g_windowMgr.EnsureWindow(WID_ITEMCOLLECTIONWND);
|
|
if (window) {
|
|
window->SendMsg(nullptr, UM_ITEMEXPLANATION, reinterpret_cast<std::intptr_t>(&this->item), 0, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F80C0
|
|
// FUNCTION: fn_09921
|
|
void UIRefining_BtnAgain::UpdateBitmaps() {
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_again_%s_normal.bmp", this->success == 1 ? "success" : "fail").c_str(), 0, 0
|
|
);
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_again_%s_normal.bmp", this->success == 1 ? "success" : "fail").c_str(), 1, 0
|
|
);
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_again_%s_press.bmp", this->success == 1 ? "success" : "fail").c_str(), 2, 0
|
|
);
|
|
this->Resize(this->m_bitmapWidth, this->m_bitmapHeight);
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F8210
|
|
// FUNCTION: fn_09922
|
|
void UIRefining_BtnReturn::UpdateBitmaps() {
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_return_%s_normal.bmp", this->highlighted == 1 ? "success" : "fail").c_str(), 0, 0
|
|
);
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_return_%s_normal.bmp", this->highlighted == 1 ? "success" : "fail").c_str(), 1, 0
|
|
);
|
|
this->SetBitmap(
|
|
FormatOwnedString("유저인터페이스\\refining_renewal\\bt_refining_return_%s_press.bmp", this->highlighted == 1 ? "success" : "fail").c_str(), 2, 0
|
|
);
|
|
this->Resize(this->m_bitmapWidth, this->m_bitmapHeight);
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F8360
|
|
// FUNCTION: fn_09923
|
|
int UIRefiningWnd::SendMsg(
|
|
UIWindow* sender, int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4
|
|
) {
|
|
switch (message) {
|
|
case UM_COMMAND:
|
|
switch (argument1) {
|
|
case 510:
|
|
ShellExecuteA(hWnd, "open", LookupMessage(MSI_SELLINGSLOT_ERROR_MAXSLOT), nullptr, nullptr, SW_SHOWNORMAL);
|
|
break;
|
|
case ID_OK:
|
|
if (this->requestPending != 1) {
|
|
const std::uint32_t index = this->item.identity[1];
|
|
if (index != 0) {
|
|
if (g_session.m_zeny < static_cast<int>(this->SelectedMaterialValue())) {
|
|
this->notice->SetNotice(LookupMessage(MSI_REFINING_SUCCESS), 3000, 1);
|
|
} else {
|
|
this->requestPending = 1;
|
|
RefiningRequestPacket packet;
|
|
packet.id = ID_CZ_REQ_REFINING;
|
|
packet.index = static_cast<std::uint16_t>(index);
|
|
packet.materialId = this->materials[this->selectedMaterial].itemId;
|
|
packet.useCatalyst = this->catalystEnabled;
|
|
GetRagConnection().Send(reinterpret_cast<const PacketLengths&>(GetRagConnection()).FixedLength(packet.id), &packet);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case ID_CANCEL:
|
|
case ID_CLOSE:
|
|
if (this->state != 2) {
|
|
RefiningClosePacket packet;
|
|
packet.id = ID_CZ_CLOSE_REFINING_UI;
|
|
GetRagConnection().Send(reinterpret_cast<const PacketLengths&>(GetRagConnection()).FixedLength(packet.id), &packet);
|
|
g_windowMgr.CloseWindow(WID_REFININGWND);
|
|
}
|
|
break;
|
|
case 519:
|
|
this->notice->SetNotice("", 0, 0);
|
|
this->selectedMaterial = -1;
|
|
this->catalystEnabled = 0;
|
|
if (this->state == 4) {
|
|
this->Reset();
|
|
} else {
|
|
this->SetState(1, 7);
|
|
}
|
|
break;
|
|
case 520:
|
|
this->SendMsg(this, UM_COMMAND, ID_OK, 0, 0, 0);
|
|
break;
|
|
}
|
|
break;
|
|
case UM_REFRESHITEM:
|
|
if (this->state == 0 || this->state == 1) {
|
|
const ITEM_INFO info = LookupClientItemByIdentity(g_session.m_inventoryItems, argument1);
|
|
if (g_session.HasSwapEquipmentItem(info.identity[1]) == 1) {
|
|
g_modeMgr.GetGameMode()->SendMsg(MM_CANCEL_DRAG, 0, 0, 0, 0);
|
|
return -1;
|
|
}
|
|
|
|
if (info.identity[1] > 0) {
|
|
if (info.identified == 1) {
|
|
RefiningSelectPacket packet;
|
|
packet.id = ID_CZ_REFINING_SELECT_ITEM;
|
|
packet.index = static_cast<std::uint16_t>(argument1);
|
|
GetRagConnection().Send(reinterpret_cast<const PacketLengths&>(GetRagConnection()).FixedLength(packet.id), &packet);
|
|
} else {
|
|
this->notice->SetNotice(LookupMessage(MSI_RETURN), 3000, 1);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
return UIFrameWnd::SendMsg(sender, message, argument1, argument2, argument3, argument4);
|
|
}
|
|
|
|
// OFFSET: 0x007F87B0
|
|
// FUNCTION: fn_09924
|
|
void UIRefiningWnd::ApplyItem(int id, int count, RefiningMaterial* materials, int catalystCount) {
|
|
switch (this->state) {
|
|
case 0:
|
|
case 1: {
|
|
if (id == -1 || count == 0) {
|
|
this->notice->SetNotice(LookupMessage(MSI_RETURN), 3000, 1);
|
|
return;
|
|
}
|
|
|
|
ITEM_INFO found = LookupClientItemByIdentity(g_session.m_inventoryItems, id);
|
|
if (found.identity[1] == 0) {
|
|
return;
|
|
}
|
|
|
|
this->item = found;
|
|
int highlightColor;
|
|
std::vector<char*> breaks;
|
|
char text[0x104];
|
|
std::memset(text, 0, sizeof(text));
|
|
char* highlight = nullptr;
|
|
std::size_t remaining = sizeof(text);
|
|
char* cursor = text;
|
|
this->BuildItemName(&this->item, &highlightColor, &breaks, &cursor, &remaining, &highlight, 1, 0);
|
|
if (this->item.identified == 1 && this->item.optionCount != 0) {
|
|
sprintf_s(text, sizeof(text), LookupMessage(MSI_FAILED_MAIL_LIMIT_CNT), text, this->item.optionCount);
|
|
}
|
|
|
|
this->item.SetName(text);
|
|
this->materials.assign(materials, materials + count);
|
|
this->selectedMaterial = -1;
|
|
this->catalystCount = catalystCount;
|
|
this->catalystEnabled = 0;
|
|
this->notice->SetNotice("", 0, 0);
|
|
this->state = 1;
|
|
this->result = 7;
|
|
this->stateTick = timeGetTime();
|
|
this->frame = 0;
|
|
if (this->cancelButton) {
|
|
this->cancelButton->SetDisabled(0);
|
|
this->cancelButton->Invalidate();
|
|
}
|
|
|
|
this->result = 7;
|
|
this->refiningButton->Enable(1);
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
this->returnButton->Enable(0);
|
|
this->againButton->Enable(0);
|
|
this->Invalidate();
|
|
this->requestPending = 0;
|
|
break;
|
|
}
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6: {
|
|
if (id == -1 || this->item.identity[1] != static_cast<std::uint32_t>(id)) {
|
|
return;
|
|
}
|
|
|
|
ITEM_INFO found = LookupClientItemByIdentity(g_session.m_inventoryItems, id);
|
|
if (found.identity[1] == 0) {
|
|
return;
|
|
}
|
|
|
|
this->nextItem = found;
|
|
int highlightColor;
|
|
std::vector<char*> breaks;
|
|
char text[0x104];
|
|
std::memset(text, 0, sizeof(text));
|
|
char* cursor = nullptr;
|
|
std::size_t remaining = sizeof(text);
|
|
char* name = text;
|
|
this->BuildItemName(&this->nextItem, &highlightColor, &breaks, &name, &remaining, &cursor, 1, 0);
|
|
if (this->nextItem.identified == 1 && this->nextItem.optionCount != 0) {
|
|
sprintf_s(text, sizeof(text), LookupMessage(MSI_FAILED_MAIL_LIMIT_CNT), text, this->nextItem.optionCount);
|
|
}
|
|
|
|
this->nextItem.SetName(text);
|
|
this->nextMaterials.assign(materials, materials + count);
|
|
this->nextCatalystCount = catalystCount;
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F8C40
|
|
// FUNCTION: fn_09925
|
|
void UIRefining_BtnAgain::Enable(unsigned char value) {
|
|
if (value == 0) {
|
|
g_windowMgr.ReleaseCapture();
|
|
}
|
|
|
|
this->m_disabled = value ^ 1;
|
|
this->Invalidate();
|
|
this->geometry.visible = value;
|
|
}
|
|
|
|
// OFFSET: 0x007F8C80
|
|
// FUNCTION: fn_09926
|
|
void UIRefining_BtnRefining::Enable(unsigned char value) {
|
|
if (value == 0) {
|
|
g_windowMgr.ReleaseCapture();
|
|
}
|
|
|
|
this->m_disabled = value ^ 1;
|
|
this->Invalidate();
|
|
this->geometry.visible = value;
|
|
}
|
|
|
|
// OFFSET: 0x007F8CC0
|
|
// FUNCTION: fn_09927
|
|
void UIRefiningWnd::SetState(int state, int result) {
|
|
this->state = state;
|
|
this->result = result;
|
|
this->stateTick = timeGetTime();
|
|
this->frame = 0;
|
|
if (this->cancelButton) {
|
|
this->cancelButton->SetDisabled(0);
|
|
this->cancelButton->Invalidate();
|
|
}
|
|
|
|
switch (state) {
|
|
case 0:
|
|
case 1:
|
|
this->result = 7;
|
|
this->refiningButton->Enable(1);
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
this->returnButton->Enable(0);
|
|
this->againButton->Enable(0);
|
|
this->Invalidate();
|
|
return;
|
|
case 2:
|
|
this->refiningButton->Enable(1);
|
|
this->refiningButton->SetDisabled(1);
|
|
this->refiningButton->Invalidate();
|
|
this->returnButton->Enable(0);
|
|
this->againButton->Enable(0);
|
|
if (this->cancelButton) {
|
|
this->cancelButton->SetDisabled(1);
|
|
this->cancelButton->Invalidate();
|
|
}
|
|
break;
|
|
case 3:
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_ITEM_REFINING_SUCCEESS)), 0xFFFF00, 0, 0, 0);
|
|
break;
|
|
case 5:
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_ITEM_REFINING_DOWNGRADE)), 0xFFFF00, 0, 0, 0);
|
|
break;
|
|
case 4:
|
|
case 6:
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_ITEM_REFINING_FAIL)), 0xFFFF00, 0, 0, 0);
|
|
break;
|
|
}
|
|
|
|
this->Invalidate();
|
|
}
|
|
|
|
// OFFSET: 0x007F8EA0
|
|
// FUNCTION: fn_09928
|
|
void UIRefining_Notice::SetNotice(const char* value, int duration, unsigned char highlight) {
|
|
this->highlight = highlight;
|
|
this->text = value;
|
|
if (duration == 0) {
|
|
this->savedText = value;
|
|
this->savedHighlight = highlight;
|
|
} else {
|
|
this->expireTick = timeGetTime() + duration;
|
|
if (this->geometry.visible == 0) {
|
|
this->autoShown = 1;
|
|
this->geometry.visible = 1;
|
|
}
|
|
}
|
|
this->Invalidate();
|
|
if (this->parent) {
|
|
this->parent->Invalidate();
|
|
}
|
|
}
|
|
|
|
// OFFSET: 0x007F6280
|
|
// FUNCTION: fn_09908
|
|
__declspec(safebuffers) void UIRefiningWnd::Paint() {
|
|
this->ClearSurface(0xFFFF00FF);
|
|
DrawRectangleBorder(*this, 0, 17, 264, 302, 0xC2C2C2);
|
|
|
|
std::string background;
|
|
switch (this->state) {
|
|
case 0:
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining_wait_%02d.bmp", this->frame));
|
|
break;
|
|
case 1:
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining%s_ready_%02d.bmp", this->catalystCount > 0 ? "A" : "B", this->frame));
|
|
break;
|
|
case 2:
|
|
if (this->frame < 9) {
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining%s_process_%02d.bmp", this->catalystEnabled == 1 ? "A" : "B", this->frame));
|
|
} else {
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining_process_%02d.bmp", this->frame));
|
|
}
|
|
break;
|
|
case 3:
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining_success_%02d.bmp", this->frame));
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
background = static_cast<const std::string&>(FormatOwnedString("유저인터페이스\\refining_renewal\\bg_refining_fail_%02d.bmp", this->frame));
|
|
break;
|
|
}
|
|
|
|
CBitmapRes* bitmap = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve(background.c_str())));
|
|
this->DrawBitmap(1, 17, bitmap, false);
|
|
|
|
|
|
if (this->state == 1) {
|
|
if (this->selectedMaterial >= 0) {
|
|
this->DrawBitmap(this->selectedMaterial * 49 + 11, 55,
|
|
static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve(FormatOwnedString("유저인터페이스\\refining_renewal\\slot_select_blue%d.bmp", this->selectedMaterial).c_str()))),
|
|
false);
|
|
}
|
|
|
|
if (this->catalystEnabled == 1) {
|
|
bitmap = static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve("유저인터페이스\\refining_renewal\\slot_select_red.bmp")));
|
|
this->DrawBitmap(207, 55, bitmap, false);
|
|
}
|
|
|
|
const char* color = "^CA152E";
|
|
int index = 0;
|
|
int x = 10;
|
|
for (auto material = this->materials.begin(); material != this->materials.end(); ++material) {
|
|
ITEM_INFO icon;
|
|
icon.SetItemId(material->itemId);
|
|
const int owned = LookupClientItem(g_session.m_inventoryItems, material->itemId, 0).quantity;
|
|
DrawItemIcon(*this, ResourceMgr::Instance(), x + 12, 69, icon, 0);
|
|
const std::string count = FormatOwnedString("%s%d^000000/1", owned != 0 ? "" : color, owned);
|
|
this->DrawFormattedText(x, 107, count, 48, 6, 0, 12, 0, 0);
|
|
if (index == this->selectedMaterial && (this->state == 1 || (this->state == 2 && this->frame == 0))) {
|
|
DrawItemIcon(*this, ResourceMgr::Instance(), 81, 150, icon, 0);
|
|
}
|
|
++index;
|
|
x += 49;
|
|
}
|
|
|
|
if (this->catalystItemId > 0 && this->catalystCount > 0) {
|
|
ITEM_INFO icon;
|
|
icon.SetItemId(this->catalystItemId);
|
|
const int owned = LookupClientItem(g_session.m_inventoryItems, this->catalystItemId, 0).quantity;
|
|
DrawItemIcon(*this, ResourceMgr::Instance(), 218, 69, icon, 0);
|
|
const std::string count = FormatOwnedString("%s%d^000000/%d", this->catalystCount <= owned ? "" : color, owned, this->catalystCount);
|
|
this->DrawFormattedText(206, 107, count, 48, 6, 0, 12, 0, 0);
|
|
if (this->catalystEnabled == 1 && (this->state == 1 || (this->state == 2 && this->frame < 13))) {
|
|
DrawItemIcon(*this, ResourceMgr::Instance(), 161, 150, icon, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this->item.identity[1] > 0) {
|
|
DrawItemIcon(*this, ResourceMgr::Instance(), 120, 212, this->item, 0);
|
|
if (this->item.grade > 0) {
|
|
this->DrawBitmap(120, 224,
|
|
static_cast<CBitmapRes*>(ResourceMgr::Instance().Load(Resolve(FormatOwnedString("유저인터페이스\\grade_enchant\\grade_icon%d.bmp", this->item.grade).c_str()))),
|
|
true);
|
|
}
|
|
}
|
|
|
|
switch (this->state) {
|
|
case 1:
|
|
this->DrawCenteredText(0, 246, this->item.displayName.c_str(), 264, 0, 12, 0x462117, 1);
|
|
break;
|
|
case 3:
|
|
case 5:
|
|
case 6:
|
|
this->DrawCenteredText(0, 249, this->item.displayName.c_str(), 264, 0, 12, 0x462117, 1);
|
|
break;
|
|
case 4:
|
|
this->DrawCenteredText(0, 249, LookupMessage(MSI_OTP_MUST_8_CHAR), 264, 0, 12, 0x462117, 1);
|
|
break;
|
|
}
|
|
|
|
switch (this->state) {
|
|
case 0:
|
|
case 1:
|
|
case 2: {
|
|
if (this->state == 2 && this->frame > 3) {
|
|
break;
|
|
}
|
|
|
|
unsigned char rate = 0;
|
|
if (this->item.identity[1] > 0 && !this->materials.empty() && this->selectedMaterial >= 0 &&
|
|
static_cast<unsigned>(this->selectedMaterial) < this->materials.size()) {
|
|
rate = this->materials[this->selectedMaterial].successRate;
|
|
}
|
|
const std::string label = FormatOwnedString("%s %d%%", LookupMessage(MSI_CHANGE_HOMUN_NAME), rate);
|
|
const int labelWidth = this->TextWidth(label.c_str(), 0, 0, 12, 1, 0);
|
|
|
|
rate = 0;
|
|
if (this->item.identity[1] > 0 && !this->materials.empty() && this->selectedMaterial >= 0 &&
|
|
static_cast<unsigned>(this->selectedMaterial) < this->materials.size()) {
|
|
rate = this->materials[this->selectedMaterial].successRate;
|
|
}
|
|
const std::string percent = FormatOwnedString("%d%%", rate);
|
|
const int percentWidth = this->TextWidth(percent.c_str(), 0, 0, 12, 1, 0);
|
|
|
|
const int x = static_cast<int>((this->geometry.width - labelWidth) * 0.5);
|
|
this->DrawTextAt(x, 31, LookupMessage(MSI_CHANGE_HOMUN_NAME), 0, 0, 12, 0x422B1F, 1, 0);
|
|
this->DrawTextAt(x - percentWidth + labelWidth, 31, percent.c_str(), 0, 0, 12, 0xDE612A, 1, 0);
|
|
break;
|
|
}
|
|
case 3: {
|
|
const int width = this->TextWidth(LookupMessage(MSI_SUCCESS), 0, 0, 12, 1, 0);
|
|
this->DrawTextAt(static_cast<int>((this->geometry.width - width) * 0.5), 31, LookupMessage(MSI_SUCCESS), 0, 0, 12, 0x422B1F, 1, 0
|
|
);
|
|
break;
|
|
}
|
|
case 4:
|
|
case 5:
|
|
case 6: {
|
|
const int width = this->TextWidth(LookupMessage(MSI_RESET), 0, 0, 12, 1, 0);
|
|
this->DrawTextAt(static_cast<int>((this->geometry.width - width) * 0.5), 31, LookupMessage(MSI_RESET), 0, 0, 12, 0x422B1F, 1, 0
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
|
|
this->DrawButtonBar(2, 0, 1);
|
|
this->DrawTitleBar(false, LookupMessage(MSI_NOTENOUGH_BLACKSMITH_BLESSING), 0);
|
|
}
|