From ff6c008d7884975f3dc0295a75b9383fd2c3a2ed Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sat, 6 Nov 2021 11:44:14 -0400 Subject: feat(gs/xanthous): Default to the current save file When saving, default to the save file that was loaded for the game if any. To support this, this also makes text prompts support a default, which will be used if no value is input. Change-Id: I72a826499d6e987b939e3465a2d29167e53416be Reviewed-on: https://cl.tvl.fyi/c/depot/+/3801 Reviewed-by: grfn Tested-by: BuildkiteCI --- users/grfn/xanthous/src/Xanthous/App.hs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'users/grfn/xanthous/src/Xanthous/App.hs') diff --git a/users/grfn/xanthous/src/Xanthous/App.hs b/users/grfn/xanthous/src/Xanthous/App.hs index bb6d6cf4ddda..369f6ae2ff9e 100644 --- a/users/grfn/xanthous/src/Xanthous/App.hs +++ b/users/grfn/xanthous/src/Xanthous/App.hs @@ -73,7 +73,7 @@ import qualified Xanthous.Generators.Level.Dungeon as Dungeon type App = Brick.App GameState AppEvent ResourceName -data RunType = NewGame | LoadGame +data RunType = NewGame | LoadGame FilePath deriving stock (Eq) makeApp :: GameEnv -> RunType -> IO App @@ -83,7 +83,7 @@ makeApp env rt = pure $ Brick.App , appHandleEvent = \game event -> runAppM (handleEvent event) env game , appStartEvent = case rt of NewGame -> runAppM (startEvent >> get) env - LoadGame -> pure + LoadGame save -> pure . (savefile ?~ save) , appAttrMap = const $ attrMap defAttr [] } @@ -334,15 +334,24 @@ handleCommand Fire = do handleCommand Save = do -- TODO default save locations / config file? - prompt_ @'StringPrompt ["save", "location"] Cancellable - $ \(StringResult filename) -> do - exists <- liftIO . doesFileExist $ unpack filename - if exists - then confirm ["save", "overwrite"] (object ["filename" A..= filename]) - $ doSave filename - else doSave filename + use savefile >>= \case + Just filepath -> + stringPromptWithDefault_ + ["save", "location"] + Cancellable + (pack filepath) + promptCallback + Nothing -> prompt_ @'StringPrompt ["save", "location"] Cancellable promptCallback continue where + promptCallback :: PromptResult 'StringPrompt -> AppM () + promptCallback (StringResult filename) = do + sf <- use savefile + exists <- liftIO . doesFileExist $ unpack filename + if exists && sf /= Just (unpack filename) + then confirm ["save", "overwrite"] (object ["filename" A..= filename]) + $ doSave filename + else doSave filename doSave filename = do src <- gets saveGame lift . liftIO $ do -- cgit 1.4.1