-
Notifications
You must be signed in to change notification settings - Fork 0
/
Output.fs
92 lines (84 loc) · 3.67 KB
/
Output.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
module Output
open Types
open ActionTypes
open ScreenWriter
open Status
open MapWriter
let initialiseScreen () =
initialiseConsole()
let private fakeDoorActor = {
Name = "door"
Tile = UnknownActorTile
ControllerName = "dummy"
Script = WaitScript
}
let updateMapOutputTileset tileset action =
match action with
| PlayerAction ToggleTileSetAction -> cycleTileset tileset
| _ -> tileset
let private updateMapScreen combatState tileset action =
match action with
| PlayerAction ToggleTileSetAction ->
redrawMapScreen tileset combatState
| AnyoneAction (MoveAction (origin, _)) ->
drawTileAt origin combatState.CombatMap tileset
let currentActorID = combatState.ActorCombatQueue.Head
drawActor tileset combatState currentActorID
| AnyoneAction (AttackAction (_, _, position)) ->
drawTileAt position combatState.CombatMap tileset
| AnyoneAction (OpenDoorAction pos)
| AnyoneAction (CloseDoorAction pos) ->
drawTileAt pos combatState.CombatMap tileset
| AnyoneAction (MindSwapActorAction (targetID, targetControllerName)) ->
let currentActorID = combatState.ActorCombatQueue.Head
drawActor tileset combatState currentActorID
drawActor tileset combatState targetID
| AnyoneAction WaitAction
| PlayerAction HelpAction
| PlayerAction SaveGameAction
| PlayerAction QuitAction
| PlayerAction CancelAction ->
()
let private pushStartupStatus statusState startResult =
match startResult with
| NormalStart ->
pushStatus statusState "Ready."
|> popStatus true false
| StartWithUnknownTileset ->
pushStatus statusState "Save game contained unknown tileset, switching to default."
|> popStatus true false
let private pushActionStatus actor tileset statusState action =
match action with
| AnyoneAction (MoveAction _) -> statusState
| AnyoneAction (AttackAction (_, object, _)) ->
pushStatusByController "kill" "kills" (Some object) "!" actor statusState
| AnyoneAction (OpenDoorAction _) ->
pushStatusByController "open" "opens" (Some fakeDoorActor) "." actor statusState
| AnyoneAction (CloseDoorAction _) ->
pushStatusByController "close" "closes" (Some fakeDoorActor) "." actor statusState
| AnyoneAction (MindSwapActorAction _) -> pushStatus statusState "Done."
| AnyoneAction WaitAction -> pushStatusByController "wait" "waits" None "." actor statusState
| PlayerAction HelpAction -> pushStatus statusState "Move: arrow keys Open: o Close: c Mind swap: m Wait: . Quit: q"
| PlayerAction QuitAction -> pushStatus statusState "Bye! Press any key to exit." // assumes status bar is last line
| PlayerAction CancelAction -> pushStatus statusState "OK."
| PlayerAction SaveGameAction -> pushStatus statusState "Game saved."
| PlayerAction ToggleTileSetAction ->
"Tileset changed to " +
match tileset with
| DefaultTileset -> "default"
| DottedTileset -> "dots"
+ "."
|> pushStatus statusState
let startOutput tileset statusState sessionStartResult combatState =
redrawMapScreen tileset combatState
let newStatusState = pushStartupStatus statusState sessionStartResult
tileset, newStatusState
let updateOutputState tileset statusState action combatState =
let newTileset = updateMapOutputTileset tileset action
updateMapScreen combatState newTileset action
let currentActorID = combatState.ActorCombatQueue.Head
let currentActor =
combatState.Actors
|> Map.find currentActorID
let newStatusState = pushActionStatus currentActor newTileset statusState action
newTileset, newStatusState