The open source repository for the action RPG game in development by Sig Productions titled 'Adventures in Lestoria'!
https://forums.lestoria.net
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
9.0 KiB
163 lines
9.0 KiB
#pragma region License
|
|
/*
|
|
License (OLC-3)
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
|
|
|
|
Redistribution and use in source and binary forms, with or without modification,
|
|
are permitted provided that the following conditions are met:
|
|
|
|
1. Redistributions or derivations of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions or derivative works in binary form must reproduce the above
|
|
copyright notice. This list of conditions and the following disclaimer must be
|
|
reproduced in the documentation and/or other materials provided with the distribution.
|
|
|
|
3. Neither the name of the copyright holder nor the names of its contributors may
|
|
be used to endorse or promote products derived from this software without specific
|
|
prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
SUCH DAMAGE.
|
|
|
|
Portions of this software are copyright © 2024 The FreeType
|
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
|
All rights reserved.
|
|
*/
|
|
#pragma endregion
|
|
|
|
#include "AdventuresInLestoria.h"
|
|
#include "Menu.h"
|
|
#include "MenuComponent.h"
|
|
#include "SoundEffect.h"
|
|
#include "DEFINES.h"
|
|
#include "olcUTIL_DataFile.h"
|
|
#include "Unlock.h"
|
|
#include "State_OverworldMap.h"
|
|
#include "MenuLabel.h"
|
|
#include "Slider.h"
|
|
#include "Checkbox.h"
|
|
#include "InputDisplayComponent.h"
|
|
#include "GameSettings.h"
|
|
|
|
INCLUDE_DATA
|
|
INCLUDE_game
|
|
INCLUDE_WINDOW_SIZE
|
|
|
|
using A=Attribute;
|
|
|
|
void Menu::InitializeSettingsWindow(){
|
|
vf2d windowSize=WINDOW_SIZE-vf2d{28,28};
|
|
Menu*settingsWindow=CreateMenu(SETTINGS,CENTERED,windowSize);
|
|
|
|
settingsWindow->ADD("Unlock All Button",MenuComponent)(geom2d::rect<float>{{4,windowSize.y},{72,12}},"Unlock All",[](MenuFuncData data){
|
|
for(auto&cp:State_OverworldMap::connections){
|
|
Unlock::UnlockArea(cp.map);
|
|
}
|
|
SoundEffect::PlaySFX("Buy Item",SoundEffect::CENTERED);
|
|
return true;
|
|
})END;
|
|
|
|
settingsWindow->ADD("Settings Label",MenuLabel)(geom2d::rect<float>{{4,4},vf2d{windowSize.x-8,24}},"Game Settings",2.f,ComponentAttr::BACKGROUND|ComponentAttr::OUTLINE|ComponentAttr::SHADOW)END;
|
|
|
|
settingsWindow->F(A::LAST_BGM_VOLUME)=1.f;
|
|
settingsWindow->F(A::LAST_SFX_VOLUME)=1.f;
|
|
|
|
settingsWindow->ADD("BGM Slider",Slider)(geom2d::rect<float>{vf2d{windowSize.x/2-64,44},{172,16}},"BGM Volume:",Audio::GetBGMVolume(),[](float val){
|
|
if(abs(Menu::menus[SETTINGS]->F(A::LAST_BGM_VOLUME)-val)>=0.04f){
|
|
SoundEffect::PlaySFX("Change Volume",SoundEffect::CENTERED);
|
|
Menu::menus[SETTINGS]->F(A::LAST_BGM_VOLUME)=val;
|
|
}
|
|
Audio::SetBGMVolume(val);
|
|
})END;
|
|
settingsWindow->ADD("SFX Slider",Slider)(geom2d::rect<float>{vf2d{windowSize.x/2-64,64},{172,16}},"SFX Volume:",Audio::GetSFXVolume(),[](float val){
|
|
if(abs(Menu::menus[SETTINGS]->F(A::LAST_SFX_VOLUME)-val)>=0.04f){
|
|
SoundEffect::PlaySFX("Change Volume",SoundEffect::CENTERED);
|
|
Menu::menus[SETTINGS]->F(A::LAST_SFX_VOLUME)=val;
|
|
}
|
|
})END;
|
|
settingsWindow->ADD("Screen Shake Checkbox",Checkbox)(geom2d::rect<float>{{4.f,84},{16.f,16.f}},[](ToggleFuncData data){
|
|
GameSettings::SetScreenShake(data.checked);
|
|
return true;
|
|
},true)END;
|
|
settingsWindow->ADD("Screen Shake Label",MenuLabel)(geom2d::rect<float>{{22.f,84},{windowSize.x/2-24.f,16.f}},"Screen Shake",1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
|
settingsWindow->ADD("Controller Rumble Checkbox",Checkbox)(geom2d::rect<float>{{4.f,104},{16.f,16.f}},[](ToggleFuncData data){
|
|
GameSettings::SetRumble(data.checked);
|
|
if(GameSettings::RumbleEnabled()){
|
|
Input::StartVibration();
|
|
data.component.lock()->F(A::RUMBLE_TIMER)=0.3f;
|
|
}else{
|
|
Input::StopVibration();
|
|
}
|
|
return true;
|
|
},true)END;
|
|
settingsWindow->ADD("Controller Rumble Label",MenuLabel)(geom2d::rect<float>{{22.f,104},{windowSize.x/2-24.f,16.f}},"Gamepad Rumble",1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
|
|
|
settingsWindow->ADD("Terrain Collision Boxes Checkbox",Checkbox)(geom2d::rect<float>{{windowSize.x/2+4.f,84},{16.f,16.f}},[](ToggleFuncData data){
|
|
GameSettings::SetTerrainCollisionBoxes(data.checked);
|
|
return true;
|
|
},true)END;
|
|
settingsWindow->ADD("Terrain Collision Boxes Label",MenuLabel)(geom2d::rect<float>{{windowSize.x/2+22.f,84},{windowSize.x/2-24.f,16.f}},"Terrain Collision Boxes",1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
|
settingsWindow->ADD("Keyboard Play Auto-Aim Checkbox",Checkbox)(geom2d::rect<float>{{windowSize.x/2+4.f,104},{16.f,16.f}},[](ToggleFuncData data){
|
|
GameSettings::SetKeyboardAutoAim(data.checked);
|
|
return true;
|
|
},false)END;
|
|
settingsWindow->ADD("Keyboard Play Auto-Aim Label",MenuLabel)(geom2d::rect<float>{{windowSize.x/2+22.f,104},{windowSize.x/2-24.f,16.f}},"Aim Assist\n(No Mouse Players)",1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
|
#ifndef __EMSCRIPTEN__
|
|
settingsWindow->ADD("Fullscreen Toggle Checkbox",Checkbox)(geom2d::rect<float>{{windowSize.x/2+4.f,124},{16.f,16.f}},[](ToggleFuncData data){
|
|
game->SetFullscreen(data.checked,{});
|
|
return true;
|
|
},false)END;
|
|
settingsWindow->ADD("Fullscreen Toggle Label",MenuLabel)(geom2d::rect<float>{{windowSize.x/2+22.f,124},{windowSize.x/2-24.f,16.f}},"Fullscreen",1.f,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
|
#endif
|
|
|
|
#pragma region Setup all input displays as keyboard controls.
|
|
//NOTE: We are shadowing code from InputKeyboardWindow! If at some point the retrival method for getting input displays changes, we likely will be changing the code here as well!
|
|
auto ChangeKeybindDisplayType=[&](InputType inputType){
|
|
const int menuRowCount=DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()/2+1;
|
|
const int menuColCount=2;
|
|
for(int row=0;row<menuRowCount;row++){
|
|
for(int col=0;col<menuColCount;col++){
|
|
if(DATA.GetProperty("Inputs.Menu Input Names").GetValueCount()%2==1&&col==1&&row==menuRowCount-1)continue; //We only continue on a blank space when we have an odd number of elements.
|
|
Component<InputDisplayComponent>(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Input Displayer",row,col))->SetKeyType(inputType);
|
|
}
|
|
}
|
|
const int ingameControlsRowCount=DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()%2==0?DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2:DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()/2+1;
|
|
const int ingameControlsColCount=2;
|
|
for(int row=0;row<ingameControlsRowCount;row++){
|
|
for(int col=0;col<ingameControlsColCount;col++){
|
|
if(DATA.GetProperty("Inputs.Gameplay Input Names").GetValueCount()%2==1&&col==1&&row==ingameControlsRowCount-1)continue; //We only continue on a blank space when we have an odd number of elements.
|
|
Component<InputDisplayComponent>(INPUT_KEY_DISPLAY,std::format("Input_{}_{} Gameplay Input Displayer",row,col))->SetKeyType(inputType);
|
|
}
|
|
}
|
|
};
|
|
#pragma endregion
|
|
|
|
settingsWindow->ADD("Keyboard Bindings Button",MenuComponent)(geom2d::rect<float>{{28,144.f},vf2d{windowSize.x-32,24}},"Keyboard Bindings",[&](MenuFuncData data){
|
|
ChangeKeybindDisplayType(KEY);
|
|
Component<MenuLabel>(INPUT_KEY_DISPLAY,"Keyboard Mapping Label")->SetLabel("Keyboard Mappings");
|
|
Menu::OpenMenu(INPUT_KEY_DISPLAY);
|
|
return true;
|
|
},vf2d{1.5f,2.f})END;
|
|
settingsWindow->ADD("Controller Bindings Button",MenuComponent)(geom2d::rect<float>{{28,172.f},vf2d{windowSize.x-32,24}},"Controller Bindings",[&](MenuFuncData data){
|
|
ChangeKeybindDisplayType(CONTROLLER);
|
|
Component<MenuLabel>(INPUT_KEY_DISPLAY,"Keyboard Mapping Label")->SetLabel("Controller Mappings");
|
|
Menu::OpenMenu(INPUT_KEY_DISPLAY);
|
|
return true;
|
|
},vf2d{1.5f,2.f})END;
|
|
|
|
settingsWindow->ADD("Go Back",MenuComponent)(geom2d::rect<float>{vf2d{windowSize.x/2.f,windowSize.y}-vf2d{36,4},{72,12}},"Go Back",[](MenuFuncData data){
|
|
Menu::CloseMenu();
|
|
return true;
|
|
})END;
|
|
} |