summaryrefslogtreecommitdiff
blob: 4d1bfaa588fa910ef2e7e5f6c9b78fd59304b28f (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
module Update.Story exposing
   (
      select_choice,
      input_string,
      input_integer,
      input_command
   )

-- Elm -------------------------------------------------------------------------
import Array
import Html

-- Local Module ----------------------------------------------------------------
import Struct.Event
import Struct.Model
import Struct.UI

import Util.TonkadurToHtml

-- Tonkadur --------------------------------------------------------------------
import Tonkadur.Execute
import Tonkadur.Types

--------------------------------------------------------------------------------
-- TYPES -----------------------------------------------------------------------
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
step : Struct.Model.Type -> Struct.Model.Type
step model =
   case model.tonkadur.last_instruction_effect of
      Tonkadur.Types.MustContinue ->
         case (Array.get model.tonkadur.program_counter model.tonkadur.code) of
            (Just instruction) ->
               (step
                  {model |
                     tonkadur =
                        (Tonkadur.Execute.execute instruction model.tonkadur)
                  }
               )

            Nothing -> model -- TODO: error

      Tonkadur.Types.MustEnd -> model -- TODO

      (Tonkadur.Types.MustPromptCommand min max label) ->
         {model |
            tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
            ui =
               (Struct.UI.prompt_command
                  (Tonkadur.Types.value_to_int min)
                  (Tonkadur.Types.value_to_int max)
                  model.ui
               )
         }

      (Tonkadur.Types.MustPromptInteger min max label) ->
         {model |
            tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
            ui =
               (Struct.UI.prompt_integer
                  (Tonkadur.Types.value_to_int min)
                  (Tonkadur.Types.value_to_int max)
                  model.ui
               )
         }

      (Tonkadur.Types.MustPromptString min max label) ->
         {model |
            tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
            ui =
               (Struct.UI.prompt_string
                  (Tonkadur.Types.value_to_int min)
                  (Tonkadur.Types.value_to_int max)
                  model.ui
               )
         }

      Tonkadur.Types.MustPromptChoice ->
         let (last_ix, new_ui) =
               (List.foldl
                  (\option (ix, ui) ->
                     case option of
                        (Tonkadur.Types.Choice rich_text) ->
                           (
                              (ix + 1),
                              (Struct.UI.display_choice
                                 ix
                                 (Util.TonkadurToHtml.convert
                                    (Tonkadur.Types.TextValue rich_text)
                                 )
                                 ui
                              )
                           )

                        _ -> ((ix + 1), ui)
                  )
                  (0, model.ui)
                  model.tonkadur.available_options
               )
         in
         {model |
            tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
            ui = new_ui
         }

      (Tonkadur.Types.MustDisplay text) ->
         (step
            {model |
               tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
               ui =
                  (Struct.UI.display_text
                     (Util.TonkadurToHtml.convert text)
                     model.ui
                  )
            }
         )

      (Tonkadur.Types.MustDisplayError text) ->
         (step
            {model |
               tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
               ui =
                  (Struct.UI.display_error
                     (Util.TonkadurToHtml.convert text)
                     model.ui
                  )
            }
         )

      _ -> model

--------------------------------------------------------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------

select_choice : Int -> Struct.Model.Type -> Struct.Model.Type
select_choice ix model = model
   -- TODO: implement

input_string : String -> Struct.Model.Type -> Struct.Model.Type
input_string string model = model
   -- TODO: implement

input_integer : String -> Struct.Model.Type -> Struct.Model.Type
input_integer string model = model
   -- TODO: implement

input_command : String -> Struct.Model.Type -> Struct.Model.Type
input_command string model = model
   -- TODO: implement