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
678 lines
26 KiB
C++
678 lines
26 KiB
C++
#include "UI/Chat/UINewChatWnd.h"
|
|
#include "Client/Mode/ModeMessage.h"
|
|
#include "UI/Window/UIEnums.h"
|
|
#include "UI/Window/WindowId.h"
|
|
#include "UI/Window/UIEnums.h"
|
|
|
|
#include "Client/Input/Mouse.h"
|
|
#include "Client/Mode/CMode.h"
|
|
#include "Client/Replay/Replay.h"
|
|
#include "Client/Session/Session.h"
|
|
#include "Contents/Configuration/ServiceConfiguration.h"
|
|
#include "Contents/Jobs/JobInheritance.h"
|
|
#include "Contents/Tables/MessageTable.h"
|
|
#include "Network/TextEncoding.h"
|
|
#include "Render/Renderer.h"
|
|
#include "UI/Buttons/UITextButton.h"
|
|
#include "UI/Chat/UISubChatHisWnd.h"
|
|
#include "UI/Edit/UIEditCtrl.h"
|
|
#include "UI/Edit/UIItemTagCtrl.h"
|
|
#include "UI/Lists/UIChatHisBox.h"
|
|
#include "UI/Lists/UITabControl.h"
|
|
#include "UI/Navigation/NavigationLink.h"
|
|
#include "UI/Text/TextMarkup.h"
|
|
#include "UI/Text/TextWrapping.h"
|
|
#include "Client/Mode/ModeMgr.h"
|
|
#include "UI/Window/UIWindowMgr.h"
|
|
#include "Utility/Text/FormatString.h"
|
|
|
|
#include "Resource/MSGSTRINGID.h"
|
|
#include <windows.h>
|
|
#include <mbstring.h>
|
|
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// GLOBAL: gl_25380
|
|
static const std::string s_chatItemLinkOpening = "<ITEML>";
|
|
|
|
// GLOBAL: gl_25450
|
|
static const std::string s_itemLinkClosing = "</ITEML>";
|
|
|
|
// OFFSET: 0x00936360
|
|
// FUNCTION: fn_12750
|
|
int UINewChatWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) {
|
|
if (g_replayAnimationScaling != 0 && Replay::Instance().header.options.recordRestricted == 0) {
|
|
return 1;
|
|
}
|
|
|
|
switch (message) {
|
|
case UM_RESOLVE_PLAYER_TAGS:
|
|
for (std::map<int, SubChatWndInfo>::iterator it = g_session.m_noSubChatWnds.begin(); it != g_session.m_noSubChatWnds.end(); ++it) {
|
|
static_cast<UIChatHisBox*>(this->m_tabs[it->first])->ResolvePlayerTags(reinterpret_cast<const char*>(a));
|
|
}
|
|
return 0;
|
|
case UM_DETACH_CHAT_TAB: {
|
|
if (!g_session.m_canDragWnd || g_session.m_noSubChatWnds.size() <= 1) {
|
|
return 0;
|
|
}
|
|
std::map<int, SubChatWndInfo>& names = g_session.m_noSubChatWnds;
|
|
std::map<int, SubChatWndInfo>::iterator found = names.find(this->m_currentTab);
|
|
if (found == names.end()) {
|
|
return 0;
|
|
}
|
|
int detached = static_cast<int>(g_session.m_subChatWnds.size());
|
|
g_session.m_subChatWnds[detached] = found->second;
|
|
const int key = found->first;
|
|
names.erase(found);
|
|
if (key != names.size()) {
|
|
std::map<int, SubChatWndInfo> saved(names);
|
|
names.clear();
|
|
int index = 0;
|
|
for (std::map<int, SubChatWndInfo>::iterator it = saved.begin(); it != saved.end(); ++it, ++index) {
|
|
names[index] = it->second;
|
|
}
|
|
}
|
|
|
|
this->m_tabControl->RemoveTab(this->m_currentTab);
|
|
this->m_tabWidth = this->m_tabControl->geometry.width / names.size();
|
|
UISubChatHisWnd* window = static_cast<UISubChatHisWnd*>(g_windowMgr.OpenSubChatWindow(static_cast<int>(g_windowMgr.retainedWindows.size()), -1, -1, 0, 0));
|
|
if (window == nullptr) {
|
|
return 0;
|
|
}
|
|
|
|
std::vector<UIChatHisBox*>::iterator tab = this->m_tabs.begin() + this->m_currentTab;
|
|
if (tab != this->m_tabs.end()) {
|
|
window->ChatBox()->CopyHistory(*static_cast<UIChatHisBox*>(*tab));
|
|
this->RemoveChild(*tab, 1);
|
|
this->m_tabs.erase(tab);
|
|
}
|
|
|
|
RECT rectangle;
|
|
rectangle.left = 3;
|
|
rectangle.top = 0;
|
|
rectangle.right = this->m_tabWidth + 3 + this->m_tabControl->geometry.width;
|
|
rectangle.bottom = this->m_tabControl->geometry.height;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
if (this->m_currentTab > 0) {
|
|
--this->m_currentTab;
|
|
this->m_tabControl->activeTabIndex = this->m_currentTab;
|
|
}
|
|
this->RefreshTabs(true);
|
|
|
|
if (sender != this) {
|
|
int x = 0;
|
|
int y = 0;
|
|
this->ToScreen(x, y);
|
|
g_windowMgr.ReleaseCapture();
|
|
window->Move(x, y);
|
|
window->OnLBtnDown(g_mouse.x - this->m_tabWidth * a - x, g_mouse.y - y);
|
|
}
|
|
this->ApplyHeaderLayout();
|
|
return 0;
|
|
}
|
|
case UM_ATTACH_CHAT_TAB: {
|
|
if (!g_session.m_canDragWnd || this->m_tabControl->geometry.width + this->m_tabWidth > this->geometry.width - 0x5A) {
|
|
return 0;
|
|
}
|
|
int index = static_cast<UISubChatHisWnd*>(sender)->m_index;
|
|
std::map<int, SubChatWndInfo>& windows = g_session.m_subChatWnds;
|
|
std::map<int, SubChatWndInfo>::iterator found = windows.find(index);
|
|
if (found == windows.end()) {
|
|
return 0;
|
|
}
|
|
|
|
int count = static_cast<int>(g_session.m_noSubChatWnds.size());
|
|
if (this->TextWidth(found->second.name.c_str(), 0, 0, 12, 0, 0) * (count + 1)
|
|
> this->geometry.width - 0x5A) {
|
|
g_windowMgr.SendNotice(UIM_OPENCHATWND, 0, 0, 0, 0, 0);
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_OVER_TABSIZE)), 0xFF, 0, 0, 0);
|
|
g_windowMgr.Promote(sender);
|
|
return 0;
|
|
}
|
|
|
|
g_session.m_noSubChatWnds[count] = found->second;
|
|
this->m_tabControl->AddTab(found->second.name.c_str(), "");
|
|
this->m_tabWidth = this->m_tabControl->geometry.width / g_session.m_noSubChatWnds.size();
|
|
const int key = found->first;
|
|
windows.erase(found);
|
|
if (key != windows.size()) {
|
|
std::map<int, SubChatWndInfo> saved(windows);
|
|
windows.clear();
|
|
int renumbered = 0;
|
|
for (std::map<int, SubChatWndInfo>::iterator it = saved.begin(); it != saved.end(); ++it, ++renumbered) {
|
|
windows[renumbered] = it->second;
|
|
}
|
|
}
|
|
|
|
int height = this->geometry.height - this->m_inputOffsetY - this->m_inputAreaHeight - 4;
|
|
if (height < 0) {
|
|
height = this->m_inputAreaHeight;
|
|
}
|
|
UIChatHisBox* box = new UIChatHisBox();
|
|
box->Configure(0, 0, this->geometry.width - 8, height, 0);
|
|
box->Move(-100 - this->geometry.width, -100);
|
|
this->AddChild(box);
|
|
box->CopyHistory(*static_cast<UISubChatHisWnd*>(g_windowMgr.retainedWindows[index])->ChatBox());
|
|
this->m_tabs.push_back(box);
|
|
g_windowMgr.ReleaseRetainedWindow(index);
|
|
if (index != g_windowMgr.retainedWindows.size()) {
|
|
std::map<int, UIWindow*> saved(g_windowMgr.retainedWindows);
|
|
g_windowMgr.retainedWindows.clear();
|
|
int renumbered = 0;
|
|
for (std::map<int, UIWindow*>::iterator it = saved.begin(); it != saved.end(); ++it, ++renumbered) {
|
|
static_cast<UISubChatHisWnd*>(it->second)->m_index = renumbered;
|
|
g_windowMgr.retainedWindows[renumbered] = it->second;
|
|
}
|
|
}
|
|
|
|
RECT rectangle;
|
|
rectangle.left = 3;
|
|
rectangle.top = 0;
|
|
rectangle.right = this->m_tabControl->geometry.width + 3;
|
|
rectangle.bottom = this->m_tabControl->geometry.height;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
this->m_currentTab = count;
|
|
this->m_tabControl->activeTabIndex = count;
|
|
this->RefreshTabs(true);
|
|
this->ApplyHeaderLayout();
|
|
return 0;
|
|
}
|
|
case 0x74:
|
|
if (this->geometry.height <= this->m_inputOffsetY + this->m_inputAreaHeight) {
|
|
return 0;
|
|
}
|
|
if (sender == this->m_tabControl) {
|
|
if (a != 0) {
|
|
g_session.m_noSubChatWnds[b].name = reinterpret_cast<const char*>(a);
|
|
this->m_tabWidth = this->m_tabControl->geometry.width / g_session.m_noSubChatWnds.size();
|
|
g_windowMgr.SetFocus(this->m_inputEdit);
|
|
if (UIWindow* window = g_windowMgr.LookupWindow(WID_BATTLEMSGOPTIONWND)) {
|
|
window->SendMsg(this, UM_COMMAND, ID_OPTION, this->m_currentTab, 1, 2);
|
|
}
|
|
}
|
|
RECT rectangle;
|
|
rectangle.left = 3;
|
|
rectangle.top = 0;
|
|
rectangle.right = (c != 0 ? c : this->m_tabControl->geometry.width) + 3;
|
|
rectangle.bottom = this->m_tabControl->geometry.height;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
this->ApplyHeaderLayout();
|
|
this->Invalidate();
|
|
return 0;
|
|
} else {
|
|
RECT rectangle;
|
|
rectangle.left = 5;
|
|
rectangle.top = this->m_inputOffsetY + 2;
|
|
rectangle.right = this->geometry.width - 6;
|
|
rectangle.bottom = this->geometry.height - this->m_inputAreaHeight - 2;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
return 0;
|
|
}
|
|
case UM_TAB:
|
|
if (a != this->m_currentTab) {
|
|
this->m_currentTab = a;
|
|
this->RefreshTabs(true);
|
|
} else {
|
|
this->RefreshTabs(false);
|
|
}
|
|
return 0;
|
|
case UM_DELETE_WHISPER_NAME: {
|
|
std::string name(reinterpret_cast<const char*>(a));
|
|
const int count = static_cast<int>(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history.size());
|
|
int index = 0;
|
|
for (std::vector<std::string>::iterator it = static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history.begin(); it != static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history.end(); ++it, ++index) {
|
|
if (*it == name) {
|
|
UIWhisperEditCtrl* whisper = static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit);
|
|
whisper->history.erase(it);
|
|
if (static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex == index) {
|
|
static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex = count - 1;
|
|
} else if (static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex > index) {
|
|
static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex = static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex - 1;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
case UM_COMBOBOX_SELECTED:
|
|
switch (this->m_menuMode) {
|
|
case 1:
|
|
*reinterpret_cast<int*>(&g_session.itemSendState[0x8]) = a;
|
|
switch (a) {
|
|
case 0:
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->TextColor(0, 0, 0, 0xFFFFFFFF);
|
|
break;
|
|
case 1:
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->TextColor(0x80, 0, 0x80, 0xFFFFFFFF);
|
|
break;
|
|
case 2:
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->TextColor(0, 0x80, 0x80, 0xFFFFFFFF);
|
|
break;
|
|
case 4:
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->TextColor(0x94, 0, 0xD3, 0xFFFFFFFF);
|
|
break;
|
|
}
|
|
this->Invalidate();
|
|
return 0;
|
|
case 0: {
|
|
const int count = static_cast<int>(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history.size());
|
|
if (a >= 0 && a <= count) {
|
|
static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->SetText(a == count ? "" : static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history[a].c_str());
|
|
static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex = a;
|
|
}
|
|
g_windowMgr.SetFocus(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit));
|
|
break;
|
|
}
|
|
default:
|
|
return 0;
|
|
}
|
|
case UM_GET_EDIT_FOCUS:
|
|
g_windowMgr.SetFocus(static_cast<UIChatEditCtrl*>(this->m_chatEdit));
|
|
return 0;
|
|
case UM_ADDCHAT:
|
|
case UM_ADDCHAT2:
|
|
if (message != UM_ADDCHAT2) {
|
|
std::vector<std::string> lines;
|
|
char name[25] = {};
|
|
if (d != 0) {
|
|
std::strcpy(name, reinterpret_cast<const char*>(d));
|
|
}
|
|
|
|
switch (c) {
|
|
case 1:
|
|
case 3:
|
|
case 4:
|
|
case 21: {
|
|
std::string text(reinterpret_cast<const char*>(a));
|
|
const int length = static_cast<int>(std::strlen(reinterpret_cast<const char*>(a)));
|
|
const int position = static_cast<int>(text.find(" :"));
|
|
if (position > 0 && position < length && position < 24) {
|
|
std::memcpy(name, reinterpret_cast<const char*>(a), position);
|
|
name[position] = '\0';
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (g_serviceType == 10 && std::strlen(name) > 24) {
|
|
return 0;
|
|
}
|
|
|
|
if (std::strcmp(name, g_session.DecodePlayerName()) == 0) {
|
|
name[0] = '\0';
|
|
}
|
|
|
|
bool hasLink = false;
|
|
std::string plain = RemoveTextColors(reinterpret_cast<const char*>(a));
|
|
if (g_navigationLinkParser->HasLink(plain)) {
|
|
hasLink = true;
|
|
lines.push_back(plain);
|
|
} else {
|
|
WrapPlainText(
|
|
RemoveTextColors(reinterpret_cast<const char*>(a)).c_str(), lines, 0x5E
|
|
);
|
|
}
|
|
|
|
const bool everyTab = c == 25 || (c == 0 && b == 0xFF);
|
|
int index = 0;
|
|
for (std::map<int, SubChatWndInfo>::iterator it = g_session.m_noSubChatWnds.begin(); it != g_session.m_noSubChatWnds.end(); ++it, ++index) {
|
|
if ((it->second.options[c] || everyTab) && this->m_tabs[index] != nullptr) {
|
|
static_cast<UIChatHisBox*>(this->m_tabs[index])->AddLinkRecord(reinterpret_cast<const char*>(a), b, name);
|
|
for (unsigned int line = 0; line < lines.size(); ++line) {
|
|
UIWindow* tab = this->m_tabs[index];
|
|
const int width = this->TextWidth(lines[line].c_str(), 0, 0, 12, 0, 0);
|
|
if (width <= tab->geometry.width - 20 || hasLink) {
|
|
static_cast<UIChatHisBox*>(this->m_tabs[index])->AddText(lines[line].c_str(), b, name);
|
|
} else {
|
|
static_cast<UIChatHisBox*>(this->m_tabs[index])->AddTextWrapped(lines[line].c_str(), b, name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
index = 0;
|
|
for (std::map<int, SubChatWndInfo>::iterator it = g_session.m_subChatWnds.begin(); it != g_session.m_subChatWnds.end(); ++it, ++index) {
|
|
if (it->second.options[c] || everyTab) {
|
|
g_windowMgr.retainedWindows[index]->SendMsg(this, UM_ADDCHAT, a, b, reinterpret_cast<std::intptr_t>(name), 0);
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
case UM_SETINFO: {
|
|
bool reset = false;
|
|
if (g_windowMgr.chatWndX < 0) {
|
|
reset = true;
|
|
}
|
|
if (g_windowMgr.chatWndY < 0) {
|
|
reset = true;
|
|
}
|
|
if (g_windowMgr.chatWndX > g_renderer->viewport.width - this->geometry.width) {
|
|
reset = true;
|
|
}
|
|
if (g_windowMgr.chatWndY > g_renderer->viewport.height - this->geometry.height) {
|
|
reset = true;
|
|
}
|
|
if (reset) {
|
|
g_windowMgr.chatWndX = 0;
|
|
g_windowMgr.chatWndY = g_renderer->viewport.height - this->geometry.height;
|
|
}
|
|
this->geometry.x = g_windowMgr.chatWndX;
|
|
this->geometry.y = g_windowMgr.chatWndY;
|
|
this->ResizeRows(g_windowMgr.chatWndStatus);
|
|
this->Move(this->geometry.x, this->geometry.y);
|
|
return 0;
|
|
}
|
|
case UM_COMMAND:
|
|
switch (a) {
|
|
case ID_OPTION:
|
|
if (UIWindow* window = g_windowMgr.EnsureWindow(WID_BATTLEMSGOPTIONWND)) {
|
|
window->SendMsg(this, UM_COMMAND, ID_OPTION, this->m_currentTab, 1, 0);
|
|
}
|
|
return 0;
|
|
case ID_NAME:
|
|
g_windowMgr.SelectWhisperName(reinterpret_cast<const char*>(b));
|
|
return 0;
|
|
case ID_STICK_ON:
|
|
*reinterpret_cast<unsigned char*>(&g_windowMgr.chatWndStickOn) = 1;
|
|
this->m_currentTab = 0;
|
|
if (this->m_savedRowCount == 0) {
|
|
this->m_savedRowCount = 1;
|
|
}
|
|
this->ResizeRows(this->m_savedRowCount);
|
|
this->Invalidate();
|
|
return 0;
|
|
case ID_STICK_OFF:
|
|
this->SendMsg(this, UM_DETACH_CHAT_TAB, this->m_currentTab, 0, 0, 0);
|
|
return 0;
|
|
case ID_TALKTOWHOCOMBO: {
|
|
this->m_menuMode = 1;
|
|
if (g_windowMgr.comboBoxWnd != nullptr) {
|
|
g_windowMgr.CloseWindow(WID_COMBOBOXWND);
|
|
}
|
|
UIWindow* menu = g_windowMgr.EnsureWindow(WID_COMBOBOXWND);
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_SEND_TO_ALL)), 0, 0, 0);
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_SEND_TO_PARTY)), 0, 0, 0);
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_SEND_TO_GUILD)), 0, 0, 0);
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_CLAN_MANAGE_LAND)), 0, 0, 0);
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_REFINING_IMPOSSIBLE)), 0, 0, 0);
|
|
menu->SendMsg(nullptr, UM_SETCURITEM, *reinterpret_cast<int*>(&g_session.itemSendState[0x8]), 0, 0, 0);
|
|
menu->Resize(0x70, 0x30);
|
|
menu->SendMsg(nullptr, UM_SET_CALLER_WID, 1, 0, 0, 0);
|
|
int x = this->geometry.width - 0x73;
|
|
int y = this->geometry.height - this->m_inputAreaHeight;
|
|
this->ToScreen(x, y);
|
|
menu->Move(x + 1, y - 0x2F);
|
|
return 0;
|
|
}
|
|
case ID_WHISPERCOMBO: {
|
|
this->m_menuMode = 0;
|
|
if (g_windowMgr.comboBoxWnd != nullptr) {
|
|
g_windowMgr.CloseWindow(WID_COMBOBOXWND);
|
|
}
|
|
const int count = static_cast<int>(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history.size());
|
|
if (count != 0) {
|
|
UIWindow* menu = g_windowMgr.EnsureWindow(WID_COMBOBOXWND);
|
|
for (int i = 0; i < count; ++i) {
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->history[i].c_str()), 0, 0, 0);
|
|
}
|
|
menu->SendMsg(nullptr, UM_ADDITEM, reinterpret_cast<std::intptr_t>(""), 0, 0, 0);
|
|
int height = (count + 1) * 16;
|
|
if (height > 0x50) {
|
|
height = 0x50;
|
|
}
|
|
menu->SendMsg(nullptr, UM_SETCURITEM, static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->historyIndex, 0, 0, 0);
|
|
menu->Resize(0x70, height);
|
|
menu->SendMsg(nullptr, UM_SET_CALLER_WID, 1, 0, 0, 0);
|
|
int x = 0;
|
|
int y = this->geometry.height - this->m_inputAreaHeight;
|
|
this->ToScreen(x, y);
|
|
menu->Move(x + 1, y - height + 1);
|
|
} else {
|
|
g_windowMgr.SendNotice(UIM_OPENCHATWND, 0, 0, 0, 0, 0);
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_NOWHISPERLIST)), 0xFF, 0, 0, 0);
|
|
}
|
|
return 0;
|
|
}
|
|
case ID_OK: {
|
|
if (!g_windowMgr.inputSuggestionsEnabled && g_windowMgr.chatModeChanged) {
|
|
return 0;
|
|
}
|
|
|
|
char buffer[0x16A];
|
|
std::memset(buffer, 0, sizeof(buffer));
|
|
std::string text(static_cast<UIChatEditCtrl*>(this->m_chatEdit)->Text());
|
|
const std::size_t lineEnd = text.find('\n', 0);
|
|
if (lineEnd != std::string::npos) {
|
|
text = text.substr(0, lineEnd);
|
|
}
|
|
|
|
UIChatEditCtrl* edit = static_cast<UIChatEditCtrl*>(this->m_chatEdit);
|
|
bool rejected = HasItemLinkTag(std::string(edit->Text()));
|
|
if (!rejected) {
|
|
UIItemTagOnChat* tags = static_cast<UIChatEditCtrl*>(this->m_chatEdit)->itemTags;
|
|
if (tags != nullptr && tags->linkedText.size() != 0) {
|
|
text = std::string(tags->linkedText);
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->itemTags->linkedText.clear();
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->itemTags->ClearTags();
|
|
rejected = static_cast<UIChatEditCtrl*>(this->m_chatEdit)->LinkedText().size() != 0;
|
|
}
|
|
}
|
|
if (rejected) {
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->SetText("");
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_CLOSE)), 0xFF, 0, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
if (static_cast<UIChatEditCtrl*>(this->m_chatEdit)->LinkedText().size() != 0) {
|
|
text = static_cast<UIChatEditCtrl*>(this->m_chatEdit)->LinkedText();
|
|
}
|
|
edit = static_cast<UIChatEditCtrl*>(this->m_chatEdit);
|
|
if (HasNaviLinkTag(std::string(edit->Text())) != 0) {
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->SetText("");
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_CLOSE)), 0xFF, 0, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
StringFormat(buffer, sizeof(buffer), static_cast<std::size_t>(-1), "%s", text.c_str());
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->PushHistory();
|
|
this->m_inputEdit = static_cast<UIChatEditCtrl*>(this->m_chatEdit);
|
|
g_windowMgr.SetFocus(static_cast<UIChatEditCtrl*>(this->m_chatEdit));
|
|
static_cast<UIChatEditCtrl*>(this->m_chatEdit)->linkedText.clear();
|
|
if (std::strlen(buffer) == 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (g_serviceType == 1 && !ValidateCharacterName(buffer)) {
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_ENGLISHONLY)), 0xFF, 0, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
if (static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->Length() != 0 && buffer[0] != '/') {
|
|
g_windowMgr.chatInputText = buffer;
|
|
g_modeMgr.gameMode->SendMsg(MM_WHISPERMSG, reinterpret_cast<int>(static_cast<UIWhisperEditCtrl*>(this->m_whisperEdit)->Text()), 0, 0, 0);
|
|
return 0;
|
|
}
|
|
|
|
if (g_session.ProcessEmotionShortcut(buffer) != 0) {
|
|
return 0;
|
|
}
|
|
|
|
std::string parts[3];
|
|
int talkType;
|
|
const int offset = g_session.GetTalkType(buffer, &talkType, parts);
|
|
if (talkType == 0x37 || talkType == 0x1A || talkType == 0x12) {
|
|
if (_mbsstr(reinterpret_cast<const unsigned char*>(buffer), reinterpret_cast<const unsigned char*>(s_chatItemLinkOpening.c_str())) != nullptr
|
|
|| _mbsstr(reinterpret_cast<const unsigned char*>(buffer), reinterpret_cast<const unsigned char*>(s_itemLinkClosing.c_str())) != nullptr) {
|
|
g_windowMgr.SendNotice(UIM_PUSHINTOCHATHISTORY, reinterpret_cast<std::intptr_t>(LookupMessage(MSI_STYLING_SHOP_OPEN_COUPON)), 0x64FFFF, 0, 0, 0);
|
|
return 0;
|
|
}
|
|
}
|
|
if (offset != -1) {
|
|
g_windowMgr.SetChatInputText(buffer + offset);
|
|
}
|
|
g_modeMgr.gameMode->SendMsg(MM_PROCESS_TALK_TYPE, talkType, reinterpret_cast<int>(parts), 0, 0);
|
|
return 0;
|
|
}
|
|
case ID_HIS:
|
|
this->SendMsg(nullptr, UM_TOGGLEPUSH, 0, 0, 0, 0);
|
|
return 0;
|
|
case ID_ADD_CHAT_TAB: {
|
|
int noSubCount = static_cast<int>(g_session.m_noSubChatWnds.size());
|
|
int subCount = static_cast<int>(g_session.m_subChatWnds.size());
|
|
const int total = noSubCount + subCount;
|
|
if (total == this->m_maxTabs) {
|
|
g_windowMgr.Confirm(LookupMessage(MSI_FAILED_ADD_TAB), 0, true, false, 0, "Message", 0x118, 0x78, 0);
|
|
return 0;
|
|
}
|
|
|
|
SubChatWndInfo info;
|
|
std::memset(info.options, 0, sizeof(info.options));
|
|
info.height = 0;
|
|
info.width = 0;
|
|
info.x = 0;
|
|
info.y = 0;
|
|
info.name = "NewTab_";
|
|
char number[16];
|
|
info.name += _itoa(total + 1, number, 10);
|
|
if ((noSubCount + 1) * this->m_tabWidth <= this->geometry.width - 0x5A) {
|
|
g_session.m_noSubChatWnds[noSubCount] = info;
|
|
this->m_tabControl->AddTab(info.name.c_str(), "");
|
|
this->m_tabWidth = this->m_tabControl->geometry.width / g_session.m_noSubChatWnds.size();
|
|
UIChatHisBox* box = new UIChatHisBox();
|
|
static_cast<UIChatHisBox*>(box)->Configure(0, 0, this->geometry.width - 8, this->geometry.height - this->m_inputAreaHeight - this->m_inputOffsetY - 4, 0);
|
|
box->Move(-100 - this->geometry.width, -100);
|
|
this->AddChild(box);
|
|
this->m_tabs.push_back(box);
|
|
|
|
RECT rectangle;
|
|
rectangle.left = 3;
|
|
rectangle.top = 0;
|
|
rectangle.right = this->m_tabControl->geometry.width + 3;
|
|
rectangle.bottom = this->m_tabControl->geometry.height;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
this->m_currentTab = noSubCount;
|
|
this->m_tabControl->activeTabIndex = noSubCount;
|
|
this->RefreshTabs(true);
|
|
this->ApplyHeaderLayout();
|
|
} else {
|
|
g_session.m_subChatWnds[subCount] = info;
|
|
g_windowMgr.OpenSubChatWindow(static_cast<int>(g_windowMgr.retainedWindows.size()), -1, -1, 0, 0);
|
|
}
|
|
return 0;
|
|
}
|
|
case ID_MINI: {
|
|
std::map<int, SubChatWndInfo>& names = g_session.m_noSubChatWnds;
|
|
if (names.size() <= 1) {
|
|
return 0;
|
|
}
|
|
std::map<int, SubChatWndInfo>::iterator found = names.find(this->m_currentTab);
|
|
if (found == names.end()) {
|
|
return 0;
|
|
}
|
|
const int key = found->first;
|
|
names.erase(found);
|
|
if (key != names.size()) {
|
|
std::map<int, SubChatWndInfo> saved(names);
|
|
names.clear();
|
|
int index = 0;
|
|
for (std::map<int, SubChatWndInfo>::iterator it = saved.begin(); it != saved.end(); ++it, ++index) {
|
|
names[index] = it->second;
|
|
}
|
|
}
|
|
|
|
std::vector<UIChatHisBox*>::iterator tab = this->m_tabs.begin() + this->m_currentTab;
|
|
if (tab != this->m_tabs.end()) {
|
|
this->RemoveChild(*tab, 1);
|
|
this->m_tabs.erase(tab);
|
|
}
|
|
this->m_tabControl->RemoveTab(this->m_currentTab);
|
|
this->m_tabWidth = this->m_tabControl->geometry.width / names.size();
|
|
|
|
RECT rectangle;
|
|
rectangle.left = 3;
|
|
rectangle.top = 0;
|
|
rectangle.right = this->m_tabWidth + this->m_tabControl->geometry.width + 3;
|
|
rectangle.bottom = this->m_tabControl->geometry.height;
|
|
this->FillSurface(0xFFFF00FF, &rectangle);
|
|
if (this->m_currentTab > 0) {
|
|
--this->m_currentTab;
|
|
this->m_tabControl->activeTabIndex = this->m_currentTab;
|
|
}
|
|
this->RefreshTabs(true);
|
|
this->ApplyHeaderLayout();
|
|
if (UIWindow* window = g_windowMgr.LookupWindow(WID_BATTLEMSGOPTIONWND)) {
|
|
window->SendMsg(this, UM_COMMAND, ID_OPTION, this->m_currentTab, 1, 1);
|
|
}
|
|
return 0;
|
|
}
|
|
default:
|
|
return 0;
|
|
}
|
|
case UM_RESIZE:
|
|
if (a == 2 && static_cast<unsigned char>(g_windowMgr.chatWndStickOn) != 0) {
|
|
const int top = this->m_inputOffsetY + 0x38;
|
|
if (c >= top) {
|
|
int rows = (c - top) / 14 + 1;
|
|
if (rows > 15) {
|
|
rows = 15;
|
|
}
|
|
if (this->geometry.state != rows) {
|
|
this->ResizeRows(rows);
|
|
}
|
|
} else if (this->geometry.state != 0) {
|
|
this->ResizeRows(0);
|
|
}
|
|
}
|
|
return 0;
|
|
case UM_TOGGLEPUSH:
|
|
if (static_cast<unsigned char>(g_windowMgr.chatWndStickOn) != 0) {
|
|
const int step = a == 0 ? 1 : -1;
|
|
int rows = step;
|
|
if (this->geometry.state != 0) {
|
|
rows = static_cast<int>(this->geometry.state) + step * 3;
|
|
}
|
|
if (rows > 0) {
|
|
this->ResizeRows(rows / 3 * 3 + 1);
|
|
} else {
|
|
this->ResizeRows(this->geometry.state != 0 ? 0 : rows);
|
|
}
|
|
}
|
|
return 0;
|
|
case UM_PAGEDOWNPUSH: {
|
|
UIListBox* tab = static_cast<UIListBox*>(this->m_tabs[this->m_currentTab]);
|
|
if (tab != nullptr && tab->verticalOverflow != 0) {
|
|
if (HIBYTE(GetKeyState(VK_CONTROL))) {
|
|
tab->SendMsg(nullptr, UM_SCROLLVERT, tab->LineCount(), 0, 0, 0);
|
|
} else {
|
|
tab->SendMsg(nullptr, UM_SCROLLVERTPAGEDOWN, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
case UM_PAGEUPPUSH: {
|
|
UIListBox* tab = static_cast<UIListBox*>(this->m_tabs[this->m_currentTab]);
|
|
if (tab != nullptr && tab->verticalOverflow != 0) {
|
|
if (HIBYTE(GetKeyState(VK_CONTROL))) {
|
|
tab->SendMsg(nullptr, UM_SCROLLVERT, -tab->LineCount(), 0, 0, 0);
|
|
} else {
|
|
tab->SendMsg(nullptr, UM_SCROLLVERTPAGEUP, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
case UM_CHANGESTATUS:
|
|
this->ResizeRows(a);
|
|
return 0;
|
|
case UM_OPENCHATWND:
|
|
if (static_cast<unsigned char>(g_windowMgr.chatWndStickOn) != 0 && this->geometry.state == 0) {
|
|
this->ResizeRows(1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
return this->UIFrameWnd::SendMsg(sender, message, a, b, c, d);
|
|
}
|