diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj b/Adventures in Lestoria/Adventures in Lestoria.vcxproj index bbb35967..41d7c4e0 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj @@ -649,6 +649,10 @@ + + + + diff --git a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters index 5678257d..07e10e25 100644 --- a/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters +++ b/Adventures in Lestoria/Adventures in Lestoria.vcxproj.filters @@ -791,6 +791,9 @@ Source Files\Interface + + Source Files\Interface + diff --git a/Adventures in Lestoria/AdventuresInLestoria.cpp b/Adventures in Lestoria/AdventuresInLestoria.cpp index 2311201a..fa9b3c98 100644 --- a/Adventures in Lestoria/AdventuresInLestoria.cpp +++ b/Adventures in Lestoria/AdventuresInLestoria.cpp @@ -71,6 +71,7 @@ All rights reserved. #include "TitleScreen.h" #include "SoundEffect.h" #include "olcPGEX_Gamepad.h" +#include "InventoryScrollableWindowComponent.h" #ifndef __EMSCRIPTEN__ #include "discord.h" #endif @@ -2461,7 +2462,7 @@ void AiL::InitializeDefaultKeybinds(){ KEY_ATTACK.AddKeybind({KEY,SHIFT}); KEY_ATTACK.AddKeybind({MOUSE,Mouse::LEFT}); KEY_ATTACK.AddKeybind({CONTROLLER,static_cast(GPButtons::L2)}); - KEY_LEFT.AddKeybind({KEY,A}); + KEY_LEFT.AddKeybind({KEY,Key::A}); KEY_LEFT.AddKeybind({KEY,LEFT}); KEY_LEFT.AddKeybind({CONTROLLER,static_cast(GPButtons::DPAD_L)}); KEY_RIGHT.AddKeybind({KEY,D}); @@ -2806,6 +2807,19 @@ const std::weak_ptrAiL::GetLoadoutItem(int slot){ void AiL::SetLoadoutItem(int slot,std::string itemName){ if(slot<0||slot>loadout.size()-1)ERR("Invalid inventory slot "+std::to_string(slot)+", please choose a slot in range (0-"+std::to_string(loadout.size()-1)+")."); if(Inventory::GetItemCount(itemName)>0){ + if(loadout[slot]&&!ISBLANK(loadout[slot])&&loadout[slot]->Amt()>0){ + //If the slot isn't blank, we should clear the item from being selected in the consumables list. + auto&itemsList=Component(INVENTORY_CONSUMABLES,"inventory")->GetComponents(); + auto item=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&component){ + if(DYNAMIC_POINTER_CAST(component)->GetItem().lock()->ActualName()==loadout[slot]->ActualName()){ + return true; + } + return false; + }); + if(item!=itemsList.end()){ + DYNAMIC_POINTER_CAST(*item)->selected=-1; + }else ERR(std::format("WARNING! Could not find item {} in inventory while deselecting a loadout item from the consumables menu! THIS SHOULD NOT BE HAPPENING!",loadout[slot]->ActualName())); + } loadout[slot]=Inventory::CopyItem(itemName)[0]; GetLoadoutItem(slot).lock()->amt=std::min((uint32_t)"Player.Item Loadout Limit"_I,GetLoadoutItem(slot).lock()->Amt()); //We are only allowed to have up to 10 maximum of an item on a journey. InputGroup*inputGroup=nullptr; @@ -2848,6 +2862,18 @@ void AiL::SetLoadoutItem(int slot,std::string itemName){ }break; } + //Set the loadout slot selection for this loadout item. + auto&itemsList=Component(INVENTORY_CONSUMABLES,"inventory")->GetComponents(); + auto item=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&component){ + if(DYNAMIC_POINTER_CAST(component)->GetItem().lock()->ActualName()==loadout[slot]->ActualName()){ + return true; + } + return false; + }); + if(item!=itemsList.end()){ + DYNAMIC_POINTER_CAST(*item)->selected=slot; + }else ERR(std::format("WARNING! Could not find item {} in inventory while selecting a loadout item from the consumables menu! THIS SHOULD NOT BE HAPPENING!",loadout[slot]->ActualName())); + }else{ ERR("Trying to set item "+itemName+" in Loadout slot "+std::to_string(slot)+" when said item does not exist in our inventory!"); } diff --git a/Adventures in Lestoria/InventoryConsumableWindow.cpp b/Adventures in Lestoria/InventoryConsumableWindow.cpp index 3873fb10..fd916e38 100644 --- a/Adventures in Lestoria/InventoryConsumableWindow.cpp +++ b/Adventures in Lestoria/InventoryConsumableWindow.cpp @@ -88,10 +88,20 @@ void Menu::InitializeConsumableInventoryWindow(){ inventoryWindow->SetupKeyboardNavigation( [](MenuType type,Data&returnData){ //On Open - //Get the first component in the consumables list. + //Try to find the component that matches the loadout item we have on us. std::vector>&components=Component(INVENTORY_CONSUMABLES,"inventory")->GetComponents(); + auto inventory=Component(INVENTORY_CONSUMABLES,"inventory"); + auto foundComponent=std::find_if(components.begin(),components.end(),[&](auto&component){ + if(!ISBLANK(DYNAMIC_POINTER_CAST(component)->GetItem().lock())&&DYNAMIC_POINTER_CAST(component)->GetItem().lock()->ActualName()==game->GetLoadoutItem(Menu::menus[type]->I(A::LOADOUT_SLOT)).lock()->ActualName()){ + return true; + } + return false; + }); + if(foundComponent!=components.end()){ + returnData=*foundComponent; + }else if(components.size()>0){ - returnData=components[0].lock()->GetName(); + returnData=components.front(); }else{ returnData="OK Button"; } @@ -103,17 +113,37 @@ void Menu::InitializeConsumableInventoryWindow(){ }}}, } ,{ //Button Navigation Rules + {"OK Button",{ + .up=[](MenuType type,Data&returnData){ + auto&itemsList=Component(type,"inventory")->GetComponents(); + if(itemsList.size()>0){ + returnData=itemsList.back(); + } + }, + .down=[](MenuType type,Data&returnData){ + auto&itemsList=Component(type,"inventory")->GetComponents(); + if(itemsList.size()>0){ + returnData=itemsList.front(); + } + }, + .left=[](MenuType type,Data&returnData){ + auto&itemsList=Component(type,"inventory")->GetComponents(); + if(itemsList.size()>0){ + returnData=itemsList.back(); + } + }, + .right=[](MenuType type,Data&returnData){ + auto&itemsList=Component(type,"inventory")->GetComponents(); + if(itemsList.size()>0){ + returnData=itemsList.front(); + } + }, + }}, {"inventory",{ - .up="Quit Game Button", - .down="Load Game Button",}}, - {"Load Game Button",{ - .up="New Game Button", - .down="Quit Game Button",}}, - {"Quit Game Button",{ .up=[](MenuType type,Data&returnData){ auto&selection=Menu::menus[type]->GetSelection(); auto&itemsList=Component(type,"inventory")->GetComponents(); - auto itemsWindow=Component(type,"inventory") + auto itemsWindow=Component(type,"inventory"); auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();}); if(itemsList.size()>0){ if(component==itemsList.end()){ @@ -121,26 +151,27 @@ void Menu::InitializeConsumableInventoryWindow(){ returnData=itemsList.back(); }else{ int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding)); - std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(component); + std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(*component); int newRowIndex=selectedButton.lock()->inventoryIndex-invWidth; //Moving up moves the cursor up an entire row. if(newRowIndex<0){ //This means we have to wrap around. - newRowIndex+=itemsList.size(); + returnData="OK Button"; + return; } if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex)); //Select the component that matches this new number. - auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp).lock()->inventoryIndex==newRowIndex;}); + auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp)->inventoryIndex==newRowIndex;}); if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex)); - returnData=component; + returnData=*component; } }else{ returnData="OK Button"; } }, - .right=[](MenuType type,Data&returnData){ + .down=[](MenuType type,Data&returnData){ auto&selection=Menu::menus[type]->GetSelection(); auto&itemsList=Component(type,"inventory")->GetComponents(); - auto itemsWindow=Component(type,"inventory") + auto itemsWindow=Component(type,"inventory"); auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();}); if(itemsList.size()>0){ if(component==itemsList.end()){ @@ -148,72 +179,76 @@ void Menu::InitializeConsumableInventoryWindow(){ returnData=itemsList.front(); }else{ int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding)); - std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(component); - int newRowIndex=std::clamp(selectedButton.lock()->inventoryIndex+1,(selectedButton.lock()->inventoryIndex/invWidth)*invWidth,std::min(itemsList.size(),(selectedButton.lock()->inventoryIndex/invWidth+1)*invWidth-1)); //Moving right, we need to wrap around if we get to the edge. + std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(*component); + int newRowIndex=selectedButton.lock()->inventoryIndex+invWidth; //Moving down moves the cursor down an entire row. if(newRowIndex>=itemsList.size()){ //This means we have to wrap around. - newRowIndex-=itemsList.size(); + returnData="OK Button"; + return; } if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex)); //Select the component that matches this new number. - auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp).lock()->inventoryIndex==newRowIndex;}); + auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp)->inventoryIndex==newRowIndex;}); if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex)); - returnData=component; + returnData=*component; } }else{ returnData="OK Button"; } }, - .down=[](MenuType type,Data&returnData){ + .left=[](MenuType type,Data&returnData){ auto&selection=Menu::menus[type]->GetSelection(); auto&itemsList=Component(type,"inventory")->GetComponents(); - auto itemsWindow=Component(type,"inventory") + auto itemsWindow=Component(type,"inventory"); auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();}); if(itemsList.size()>0){ if(component==itemsList.end()){ - //Set the selected button to the first element in the list. - returnData=itemsList.front(); + //Set the selected button to the last element in the list. + returnData=itemsList.back(); }else{ int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding)); - std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(component); - int newRowIndex=selectedButton.lock()->inventoryIndex+invWidth; //Moving down moves the cursor down an entire row. - if(newRowIndex>=itemsList.size()){ + std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(*component); + + int rowBaseIndex=(selectedButton.lock()->inventoryIndex/invWidth)*invWidth; + int newRowIndex=selectedButton.lock()->inventoryIndex-1; + if(newRowIndex=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex)); //Select the component that matches this new number. - auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp).lock()->inventoryIndex==newRowIndex;}); + auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp)->inventoryIndex==newRowIndex;}); if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex)); - returnData=component; + returnData=*component; } }else{ returnData="OK Button"; } }, - .left=[](MenuType type,Data&returnData){ + .right=[](MenuType type,Data&returnData){ auto&selection=Menu::menus[type]->GetSelection(); auto&itemsList=Component(type,"inventory")->GetComponents(); - auto itemsWindow=Component(type,"inventory") + auto itemsWindow=Component(type,"inventory"); auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return comp.lock()==selection.lock();}); if(itemsList.size()>0){ if(component==itemsList.end()){ - //Set the selected button to the last element in the list. - returnData=itemsList.back(); + //Set the selected button to the first element in the list. + returnData=itemsList.front(); }else{ int invWidth=int((itemsWindow->rect.size.x-12)/(float(itemsWindow->options.size.x)+itemsWindow->options.padding)); - std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(component); - - int newRowIndex=std::clamp(selectedButton.lock()->inventoryIndex-1,(selectedButton.lock()->inventoryIndex/invWidth)*invWidth,std::min(itemsList.size(),(selectedButton.lock()->inventoryIndex/invWidth+1)*invWidth-1)); //Moving left, we need to wrap around if we get to the edge. - if(newRowIndex<0){ - //This means we have to wrap around. - newRowIndex+=itemsList.size(); - } + std::weak_ptrselectedButton=DYNAMIC_POINTER_CAST(*component); + + int rowBaseIndex=(selectedButton.lock()->inventoryIndex/invWidth)*invWidth; + int newRowIndex=selectedButton.lock()->inventoryIndex+1; + if(newRowIndex>rowBaseIndex+invWidth-1)newRowIndex-=invWidth; + newRowIndex=std::clamp(newRowIndex,0,int(itemsList.size()-1)); if(newRowIndex<0||newRowIndex>=itemsList.size())ERR(std::format("New Row Index ended up out-of-bounds! newRowIndex={}. THIS SHOULD NOT BE HAPPENING!",newRowIndex)); //Select the component that matches this new number. - auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp).lock()->inventoryIndex==newRowIndex;}); + auto component=std::find_if(itemsList.begin(),itemsList.end(),[&](auto&comp){return DYNAMIC_POINTER_CAST(comp)->inventoryIndex==newRowIndex;}); if(component==itemsList.end())ERR(std::format("WARNING! Could not find row index {} in items list while navigating! THIS SHOULD NOT BE HAPPENING!",newRowIndex)); - returnData=component; + returnData=*component; } }else{ returnData="OK Button"; diff --git a/Adventures in Lestoria/Item.cpp b/Adventures in Lestoria/Item.cpp index eda422d6..14cc3b0a 100644 --- a/Adventures in Lestoria/Item.cpp +++ b/Adventures in Lestoria/Item.cpp @@ -735,7 +735,7 @@ const ItemScript&ItemInfo::OnUseAction()const{ const bool Item::IsBlank()const{ if(Item::IsBlankStaticCallCounter!=1)ERR("WARNING! You should not call the IsBlank() function directly! Use ISBLANK() macro instead!") Item::IsBlankStaticCallCounter--; - return amt==0||it==nullptr; + return this==nullptr||amt==0||it==nullptr; } void Inventory::Clear(ITCategory itemCategory){ diff --git a/Adventures in Lestoria/Key.cpp b/Adventures in Lestoria/Key.cpp index 43c76d27..b4cfbfe8 100644 --- a/Adventures in Lestoria/Key.cpp +++ b/Adventures in Lestoria/Key.cpp @@ -393,7 +393,7 @@ std::map,GenericKey::KeyInfo> GenericKey::keyLiteral={ {{KEY, ESCAPE},{"ESC"}}, {{KEY, RETURN},{"ENTER"}}, {{KEY, ENTER},{"ENTER"}}, - {{KEY, PAUSE},{"PAUSE"}}, + {{KEY, Key::PAUSE},{"PAUSE"}}, {{KEY, SCROLL},{"SCR LK"}}, {{KEY, NP0},{"NP0"}}, {{KEY, NP1},{"NP1"}}, diff --git a/Adventures in Lestoria/Menu.cpp b/Adventures in Lestoria/Menu.cpp index 7ac8ed39..9233d217 100644 --- a/Adventures in Lestoria/Menu.cpp +++ b/Adventures in Lestoria/Menu.cpp @@ -76,7 +76,6 @@ Menu::Menu(vf2d pos,vf2d size) } void Menu::InitializeMenus(){ - #define MAX_MENUS 32 stack.reserve(MAX_MENUS); InitializeConsumableInventoryWindow(); InitializeClassSelectionWindow(); @@ -102,6 +101,7 @@ void Menu::InitializeMenus(){ InitializeShermanWindow(); InitializeKeyboardInputWindow(); InitializeNewKeybindInputWindow(); + InitializePauseWindow(); for(MenuType type=MenuType(int(MenuType::ENUM_START)+1);typeonClick(MenuFuncData{*this,game,selection,dynamic_pointer_cast(selection.lock()->parentComponent.lock())}); if(buttonStillValid){ if(selection.lock()->menuDest!=MenuType::ENUM_END){ - if(stack.size()<32){ - stack.push_back(menus[selection.lock()->menuDest]);//Navigate to the next menu. + if(stack.size()menuDest); //Navigate to the next menu. }else{ ERR("WARNING! Exceeded menu stack size limit!") } diff --git a/Adventures in Lestoria/Menu.h b/Adventures in Lestoria/Menu.h index ec9632ac..a92b6170 100644 --- a/Adventures in Lestoria/Menu.h +++ b/Adventures in Lestoria/Menu.h @@ -75,6 +75,7 @@ using ToggleFunc=std::function; #define DEFAULT_DEPTH -999999 #define STARTING_DEPTH 999999 +#define MAX_MENUS 32 using Data=std::variant>; using MenuDataFunc=std::function; @@ -114,6 +115,7 @@ class Menu:public IAttributable{ static void InitializeShermanWindow(); static void InitializeKeyboardInputWindow(); static void InitializeNewKeybindInputWindow(); + static void InitializePauseWindow(); friend class AiL; friend class ItemInfo; diff --git a/Adventures in Lestoria/MenuComponent.cpp b/Adventures in Lestoria/MenuComponent.cpp index 751676aa..2c22f848 100644 --- a/Adventures in Lestoria/MenuComponent.cpp +++ b/Adventures in Lestoria/MenuComponent.cpp @@ -40,6 +40,7 @@ All rights reserved. #include "drawutil.h" #include "util.h" #include "ScrollableWindowComponent.h" +#include "Menu.h" INCLUDE_game @@ -250,8 +251,8 @@ void MenuComponent::Click(){ bool buttonStillValid=onClick(MenuFuncData{*Menu::menus[parentMenu],game,Menu::menus[parentMenu]->components[name]}); if(buttonStillValid){ if(menuDest!=MenuType::ENUM_END){ - if(Menu::stack.size()<32){ - Menu::stack.push_back(Menu::menus[menuDest]);//Navigate to the next menu. + if(Menu::stack.size() + +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 "Menu.h" + +void Menu::InitializePauseWindow(){ + Menu*pauseWindow=CreateMenu(MenuType::PAUSE,CENTERED,vi2d{96,164}); +} \ No newline at end of file diff --git a/Adventures in Lestoria/TODO.txt b/Adventures in Lestoria/TODO.txt index bc09d549..a00a1daa 100644 --- a/Adventures in Lestoria/TODO.txt +++ b/Adventures in Lestoria/TODO.txt @@ -1,43 +1,15 @@ January 1st =========== -Settings Menu - - Any settings should be saved to the save file! - - Volume Controls - - Play Sound in Background (Sound while Focused) - - Keyboard aim assist (When playing w/keyboard, have the game auto fire for players that don't want to use mouse or cannot) - - Terrain Collision Boxes - - Key Configuration - -Upon pressing a key, check if the key is bound to another option, if so, - remove that bind from the list. Up to two keys may be binded per action. - -We have to save keybinds to the save file. - - Menu Inputs - - Confirm - - Back - - Menu - - Change Loadout (Overworld Map) - - Unequip - - Left - - Right - - Up - - Down - - Gameplay Inputs - - Ability 1,2,3,4 - - Item 1,2,3 - - Basic Attack - - XP Bar +- Mouse click keybind changes should be possible and mouse buttons should show up in the list along with keyboard mappings. + - If a mouse click is reassigned, it is removed from any other inputs with that mouse click. + - Implement escape menu during gameplay. - If you leave a stage, the stage complete window still shows up, showing only the loot you obtained that session. -- When setting loadout items while loading the game it should highlight the correct item in the consumables inventory as well. - - Clamp bosses in boss arenas. -- Save randomized traveling merchant. - - Track items used during a stage, on death, restore the loadout item quantities used. - Add screen shake and rumble as a toggle. @@ -46,7 +18,6 @@ Settings Menu January 31st ============ -Story proofreading/correcting/storyboarding - Loading Screen - Title Screen setpieces @@ -63,4 +34,6 @@ Story proofreading/correcting/storyboarding - Auto aim causes retreat-type moves to aim away from the auto target, and prefer the direction the player's moving in. -- Save window position and size \ No newline at end of file +- Save window position and size + +- Fullscreen toggle \ No newline at end of file diff --git a/Adventures in Lestoria/Version.h b/Adventures in Lestoria/Version.h index 297cc4d4..67136688 100644 --- a/Adventures in Lestoria/Version.h +++ b/Adventures in Lestoria/Version.h @@ -39,7 +39,7 @@ All rights reserved. #define VERSION_MAJOR 0 #define VERSION_MINOR 3 #define VERSION_PATCH 0 -#define VERSION_BUILD 6872 +#define VERSION_BUILD 6907 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/x64/Release/Adventures in Lestoria.exe b/x64/Release/Adventures in Lestoria.exe index 5a9a9fce..09de122c 100644 Binary files a/x64/Release/Adventures in Lestoria.exe and b/x64/Release/Adventures in Lestoria.exe differ