From 1f8b4b856525f9940a0ff105851c9118cabf5529 Mon Sep 17 00:00:00 2001 From: justin Date: Tue, 19 Oct 2021 14:20:56 +0100 Subject: [PATCH] Unify save states --- src/Dodge/Data.hs | 7 ++++--- src/Dodge/Default/World.hs | 4 +--- src/Dodge/Event/Keyboard.hs | 2 +- src/Dodge/Initialisation.hs | 3 +-- src/Dodge/Menu.hs | 2 +- src/Dodge/Save.hs | 25 +++++++++++++++++-------- 6 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/Dodge/Data.hs b/src/Dodge/Data.hs index 7df7894af..055a5e395 100644 --- a/src/Dodge/Data.hs +++ b/src/Dodge/Data.hs @@ -78,10 +78,8 @@ data World = World , _pathGraph :: ~(Gr Point2 Float) , _pathGraphP :: ~[(Point2,Point2)] , _pathPoints :: ~(IM.IntMap (IM.IntMap [(Int,Point2)])) - , _storedLevel :: Maybe World - , _quicksaveLevel :: Maybe World + , _savedWorlds :: M.Map SaveSlot World , _menuLayers :: [ScreenLayer] --- , _worldState :: M.Map WorldState Bool , _worldTriggers :: S.Set WorldTrigger , _carteDisplay :: !Bool , _carteCenter :: !Point2 @@ -103,6 +101,9 @@ data World = World , _frameClock :: Int , _worldBounds :: Bounds } +data SaveSlot = QuicksaveSlot | LevelStartSlot + deriving (Eq,Ord) + data OptionScreenFlag = NormalOptions | GameOverOptions data ScreenLayer = OptionScreen diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index d4e566a1b..de870926c 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -52,10 +52,8 @@ defaultWorld = World , _playingSounds = M.empty , _corpses = Zone IM.empty , _decorations = IM.empty - , _storedLevel = Nothing - , _quicksaveLevel = Nothing + , _savedWorlds = M.empty , _menuLayers = [] --- , _worldState = M.empty , _worldTriggers = S.empty , _clickMousePos = V2 0 0 , _pathGraph = Data.Graph.Inductive.Graph.empty diff --git a/src/Dodge/Event/Keyboard.hs b/src/Dodge/Event/Keyboard.hs index 7139f5d50..e1e4e18c4 100644 --- a/src/Dodge/Event/Keyboard.hs +++ b/src/Dodge/Event/Keyboard.hs @@ -33,7 +33,7 @@ handleKeyboardEvent kev w = case keyboardEventKeyMotion kev of handlePressedKey :: Bool -> Scancode -> World -> Maybe World handlePressedKey True _ w = Just w handlePressedKey _ ScancodeF5 w = Just $ doQuicksave w -handlePressedKey _ ScancodeF9 w = Just $ maybe w doQuicksave (_quicksaveLevel w) +handlePressedKey _ ScancodeF9 w = Just $ loadSaveSlot QuicksaveSlot w handlePressedKey _ ScancodeSemicolon w = Just $ gotoTerminal w handlePressedKey _ scode w | null (_menuLayers w) = handlePressedKeyInGame scode w diff --git a/src/Dodge/Initialisation.hs b/src/Dodge/Initialisation.hs index bfeb21f5f..6fe9fbbed 100644 --- a/src/Dodge/Initialisation.hs +++ b/src/Dodge/Initialisation.hs @@ -50,13 +50,12 @@ initialWorld = defaultWorld , _mousePos = V2 0 0 , _testString = testStringInit , _yourID = 0 - , _worldEvents = storeLevel . soundStart BackgroundSound (V2 0 0) foamSprayFadeOutS Nothing + , _worldEvents = saveWorldInEmptySlot LevelStartSlot . soundStart BackgroundSound (V2 0 0) foamSprayFadeOutS Nothing . foldr ((.) . makeStartCloudAt) id [V3 x y 5 | x <- [-5,-3..5] , y <- [-5,-3..5]] , _pressPlates = IM.empty , _buttons = IM.empty , _toPlaySounds = M.empty , _decorations = IM.empty - , _storedLevel = Nothing , _menuLayers = [TerminalScreen 300 rezText'] } testStringInit :: World -> [String] diff --git a/src/Dodge/Menu.hs b/src/Dodge/Menu.hs index 2a42a70cd..1fb4d3969 100644 --- a/src/Dodge/Menu.hs +++ b/src/Dodge/Menu.hs @@ -151,7 +151,7 @@ pauseMenu = OptionScreen pauseMenuOptions :: [MenuOption] pauseMenuOptions = [ Toggle ScancodeN startNewGame (const "NEW LEVEL") - , Toggle ScancodeR (Just . loadStoredLevel) (const "RESTART") + , Toggle ScancodeR (Just . loadSaveSlot LevelStartSlot) (const "RESTART") , Toggle ScancodeO (pushScreen optionMenu ) (const "OPTIONS") , Toggle ScancodeC (pushScreen displayControls) (const "CONTROLS") , InvisibleToggle ScancodeEscape (const Nothing) diff --git a/src/Dodge/Save.hs b/src/Dodge/Save.hs index c34961bc1..5d99ea971 100644 --- a/src/Dodge/Save.hs +++ b/src/Dodge/Save.hs @@ -1,25 +1,34 @@ module Dodge.Save - ( storeLevel - , loadStoredLevel + ( saveWorldInEmptySlot + , loadSaveSlot , doQuicksave ) where import Dodge.Data +import qualified Data.Map.Strict as M import Data.Maybe import Control.Lens import qualified Data.Set as S -storeLevel :: World -> World -storeLevel w = case _storedLevel w of - Nothing -> w & storedLevel ?~ clearKeys w +clearSaves :: World -> World +clearSaves = savedWorlds .~ M.empty + +saveWorldInEmptySlot :: SaveSlot -> World -> World +saveWorldInEmptySlot slot w = case M.lookup slot $ _savedWorlds w of + Nothing -> w & savedWorlds %~ M.insert slot (clearKeys w) _ -> w -loadStoredLevel :: World -> World -loadStoredLevel w = fromMaybe w $ _storedLevel w <&> quicksaveLevel .~ _quicksaveLevel w +saveWorldInSlot :: SaveSlot -> World -> World +saveWorldInSlot slot w = w & savedWorlds %~ M.insert slot (clearSaves $ clearKeys w) + +loadSaveSlot :: SaveSlot -> World -> World +loadSaveSlot slot w = fromMaybe w + $ M.lookup slot (_savedWorlds w) + <&> savedWorlds .~ _savedWorlds w -- keep saves from current point, not from save point doQuicksave :: World -> World -doQuicksave w = w & quicksaveLevel ?~ clearKeys w +doQuicksave = saveWorldInSlot QuicksaveSlot clearKeys :: World -> World clearKeys = (keys .~ S.empty) . (mouseButtons .~ S.empty)