diff --git a/Source/Render/DX7/RenderSystemDX7.h b/Source/Render/DX7/RenderSystemDX7.h index aeff9bb3..f4c2bf94 100644 --- a/Source/Render/DX7/RenderSystemDX7.h +++ b/Source/Render/DX7/RenderSystemDX7.h @@ -46,6 +46,8 @@ private: /* 000C */ std::shared_ptr m_backBuffer; }; +extern int g_configuredFullscreen; + void ClearDirectDrawModes(); #if defined(_WIN32) && !defined(_WIN64) diff --git a/Source/UI/GameSettings/GameSettingsUI.cpp b/Source/UI/GameSettings/GameSettingsUI.cpp index d533fd36..01ab8507 100644 --- a/Source/UI/GameSettings/GameSettingsUI.cpp +++ b/Source/UI/GameSettings/GameSettingsUI.cpp @@ -1,17 +1,24 @@ #include "UI/GameSettings/GameSettingsUI.h" +#include "Client/Mode/ModeMgr.h" #include "Contents/Configuration/ServiceOptions.h" #include "Contents/MessageTable.h" #include "Contents/SkinMgr.h" +#include "Contents/Sound/SoundMgr.h" #include "Network/Connection/Connection.h" #include "Network/Packets/PacketLengths.h" #include "Render/DisplayMode.h" +#include "Render/DX7/RenderSystemDX7.h" #include "Render/RenderAdapter.h" #include "Render/RenderBackends.h" #include "UI/Buttons/UIRadioButton.h" +#include "UI/Lists/UIVScrollBar.h" +#include "UI/Window/UIRoulletteWnd.h" #include "UI/Window/UIWindowMgr.h" #include "UI/Window/WindowBorder.h" +#include #include +#include namespace { struct RodexSpamOptionPacket { @@ -22,6 +29,9 @@ namespace { static_assert(sizeof(RodexSpamOptionPacket) == 12); } +template <> +__declspec(noinline) void CUIListBoxEx::SelectItem(CUIListItem* item); + // OFFSET: 0x00A344D0 // OFFSET: 0x00A34500 // OFFSET: 0x00A34530 @@ -40,6 +50,44 @@ template void CUIComboBox::Paint(); template void CUIComboBox::Paint(); template void CUIComboBox::Paint(); +// OFFSET: 0x00A40040 +// OFFSET: 0x00A40050 +// OFFSET: 0x00A40060 +// OFFSET: 0x00A40070 +// FUNCTION: fn_15962 +// FUNCTION: fn_15963 +// FUNCTION: fn_15964 +// FUNCTION: fn_15965 +template unsigned int CUIComboBox::Selected() const { + return this->listBox->selected; +} + +template unsigned int CUIComboBox::Selected() const; +template unsigned int CUIComboBox::Selected() const; +template unsigned int CUIComboBox::Selected() const; +template unsigned int CUIComboBox::Selected() const; + +// OFFSET: 0x00A41FE0 +// OFFSET: 0x00A42060 +// OFFSET: 0x00A420E0 +// OFFSET: 0x00A42160 +// FUNCTION: fn_16009 +// FUNCTION: fn_16010 +// FUNCTION: fn_16011 +// FUNCTION: fn_16012 +template void CUIComboBox::UpdateListHeight() { + const int height = std::min(this->listBox->data.size(), this->visibleItems) * this->itemHeight; + if (height != this->listBox->geometry.height) { + this->listBox->Resize(this->listBox->geometry.width, height); + } + this->listBox->UpdateScrollBar(); +} + +template void CUIComboBox::UpdateListHeight(); +template void CUIComboBox::UpdateListHeight(); +template void CUIComboBox::UpdateListHeight(); +template void CUIComboBox::UpdateListHeight(); + // OFFSET: 0x00A34590 // FUNCTION: fn_15411 template <> @@ -643,6 +691,49 @@ void CUIPage::Slot16() { } } +// OFFSET: 0x00A3F360 + +// OFFSET: 0x00A3F3D0 + +// OFFSET: 0x00A3F4C0 + +// OFFSET: 0x00A3F560 + +// OFFSET: 0x00A3F5C0 + +// OFFSET: 0x00A3F6B0 + +// OFFSET: 0x00A3F6D0 + +// OFFSET: 0x00A401C0 + +// OFFSET: 0x00A40270 +// FUNCTION: fn_15968 +void CUIListPage::Slot54(CUIOptionItem* item, const TALKTYPE& type) { +} + +// OFFSET: 0x00A41E30 + +// OFFSET: 0x00A41E90 + +// OFFSET: 0x00A41F30 + +// OFFSET: 0x00A42FE0 + +// OFFSET: 0x00A42FF0 + +// OFFSET: 0x00A43650 + +// OFFSET: 0x00A436A0 + +// OFFSET: 0x00A43700 + +// OFFSET: 0x00A43810 + +// OFFSET: 0x00A43870 + +// OFFSET: 0x00A43A40 + // OFFSET: 0x00A43B70 // FUNCTION: fn_16045 void CUIPage::Refresh() { diff --git a/Source/UI/GameSettings/GameSettingsUI.h b/Source/UI/GameSettings/GameSettingsUI.h index 0fbb2e0e..26a511dc 100644 --- a/Source/UI/GameSettings/GameSettingsUI.h +++ b/Source/UI/GameSettings/GameSettingsUI.h @@ -1,57 +1,161 @@ #ifndef RAGNAROK_SOURCE_UI_GAMESETTINGS_GAMESETTINGSUI_H #define RAGNAROK_SOURCE_UI_GAMESETTINGS_GAMESETTINGSUI_H +#include "Render/DisplayMode.h" +#include "Render/RenderAdapter.h" +#include "Render/RenderBackends.h" #include "UI/Lists/UIListBoxTemplate.h" #include "UI/Window/UIControl.h" #include "UI/Window/UIFrameWnd.h" +#include + enum TALKTYPE : int; +class CUICheckBox; +class CUIRadioButton; +class CUIStaticText; + template class CUIComboBox : public CUIControl { public: void Paint() override; + unsigned int Selected() const; + void UpdateListHeight(); + + /* 0084 */ unsigned char unknown_0084[0x08]; + /* 008C */ CUIListBoxEx* listBox; + /* 0090 */ unsigned char unknown_0090[0x04]; + /* 0094 */ int itemHeight; + /* 0098 */ int visibleItems; }; namespace GameSettingsUI { +class CUIComboItem; +class CUIOptionItem; + class CUIGroup : public CUIControl { public: virtual void Apply(); virtual void Refresh() = 0; + + /* 0080 */ CUIStaticText* m_title; }; class CUIGroupEmblem : public CUIGroup { public: void Apply() override; + void Refresh() override; + __declspec(noinline) void SetEnabled(bool enabled); + void OnSelect(CUIRadioButton* button); + + /* 0084 */ CUIRadioButton* m_onButton; + /* 0088 */ CUIStaticText* m_onText; + /* 008C */ CUIRadioButton* m_offButton; + /* 0090 */ CUIStaticText* m_offText; +}; + +class CUIGroupFullscreen : public CUIGroup { +public: + void Refresh() override; + + /* 0084 */ CUIRadioButton* m_onButton; + /* 0088 */ CUIStaticText* m_onText; + /* 008C */ CUIRadioButton* m_offButton; + /* 0090 */ CUIStaticText* m_offText; +}; + +class CUIGroupGraphics : public CUIGroup { +public: + /* 0084 */ CUIComboBox* m_adapterCombo; + /* 0088 */ CUIStaticText* m_modeText; + /* 008C */ CUIComboBox* m_modeCombo; + /* 0090 */ RenderAdapter m_adapter; + /* 00F8 */ RenderAdapter m_pendingAdapter; + /* 0160 */ DisplayMode m_mode; + /* 0184 */ DisplayMode m_pendingMode; +}; + +class CUIGroupGraphicsAPI : public CUIGroup { +public: + /* 0084 */ CUIComboBox* m_combo; + /* 0088 */ int m_backend; + /* 008C */ int m_pendingBackend; }; class CUIGroupLogInOut : public CUIGroup { public: void Apply() override; + void Refresh() override; + __declspec(noinline) void SetEnabled(bool enabled); + void OnSelect(CUIRadioButton* button); + + /* 0084 */ CUIRadioButton* m_onButton; + /* 0088 */ CUIStaticText* m_onText; + /* 008C */ CUIRadioButton* m_offButton; + /* 0090 */ CUIStaticText* m_offText; }; class CUIGroupRodexSpam : public CUIGroup { public: void Apply() override; + void OnSelect(CUIRadioButton* button); + + /* 0084 */ CUIRadioButton* m_onButton; + /* 0088 */ CUIStaticText* m_onText; + /* 008C */ CUIRadioButton* m_offButton; + /* 0090 */ CUIStaticText* m_offText; }; class CUIGroupSkin : public CUIGroup { public: void Apply() override; + void Refresh() override; + + /* 0084 */ CUIComboBox* m_combo; }; class CUIGroupSound : public CUIGroup { public: void Paint() override; + void Refresh() override; + __declspec(noinline) void SetBgmEnabled(bool enabled); + __declspec(noinline) void SetBgmVolume(int volume); + __declspec(noinline) void SetEffectVolume(int volume); + void OnBgmMute(bool muted); + void OnEffectMute(bool muted); + void OnBgmScroll(int position); + void OnEffectScroll(int position); + + /* 0084 */ CUIStaticText* m_bgmText; + /* 0088 */ CUIVScrollBar* m_bgmSlider; + /* 008C */ CUICheckBox* m_bgmMute; + /* 0090 */ CUIStaticText* unknown_0090; + /* 0094 */ CUIStaticText* m_effectText; + /* 0098 */ CUIVScrollBar* m_effectSlider; + /* 009C */ CUICheckBox* m_effectMute; }; class CUIGroupSpriteDetailLevel : public CUIGroup { public: void Paint() override; + void Refresh() override; + + /* 0084 */ CUIVScrollBar* m_slider; }; class CUIGroupTextureDetailLevel : public CUIGroup { public: void Paint() override; + + /* 0084 */ CUIVScrollBar* m_slider; +}; + +class CUIGroupTrilinear : public CUIGroup { +public: + /* 0084 */ CUIRadioButton* m_onButton; + /* 0088 */ CUIStaticText* m_onText; + /* 008C */ CUIRadioButton* m_offButton; + /* 0090 */ CUIStaticText* m_offText; }; class CUIPage : public CUIControl { @@ -62,10 +166,23 @@ public: virtual void Refresh(); }; +class CUIGraphicsPage : public CUIPage { +public: + bool IsModified(); + + /* 0080 */ CUIGroupGraphicsAPI* m_graphicsApi; + /* 0084 */ CUIGroupGraphics* m_graphics; + /* 0088 */ CUIGroupSpriteDetailLevel* m_spriteDetailLevel; + /* 008C */ CUIGroupTextureDetailLevel* m_textureDetailLevel; + /* 0090 */ CUIGroupFullscreen* m_fullscreen; + /* 0094 */ CUIGroupTrilinear* m_trilinear; +}; + class CUIListPage : public CUIControl { public: void Slot16() override; void Paint() override; + virtual void Slot54(CUIOptionItem* item, const TALKTYPE& type); }; class CUIComboItem : public CUIListItem {