summaryrefslogtreecommitdiff
blob: bee5cc8f738db3e8a61fde27c14b92aa962eae14 (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
module Update.Story exposing
   (
      new,
      select_choice,
      input_string,
      input_integer,
      input_command
   )

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

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

import Util.TonkadurToHtml

import Tonkadur.Execute

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

--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
step : Struct.Model.Type -> Struct.Model.Type
step model =
   case model.tonkadur.last_instruction_effect of
      MustContinue ->
         (step
            {model |
               tonkadur =
                  (Tonkadur.Execute.execute
                     model.tonkadur.code[model.tonkadur.program_counter]
                     model.tonkadur
                  )
            }
         )

      MustEnd -> model -- TODO

      (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
               )
         }

      (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
               )
         }

      (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
               )
         }

      MustPromptChoice ->
         {model |
            tonkadur = (Tonkadur.Types.allow_continuing model.tonkadur),
            ui =
               (List.foldl
                  (\option (ix, ui) ->
                     case option of
                        (Choice rich_text) ->
                           (
                              (ix + 1),
                              (Struct.UI.display_choice
                                 ix
                                 (Util.TonkadurToHtml.convert
                                    (TextValue rich_text)
                                 )
                              )
                           )

                        _ -> ((ix + 1), ui)
                  )
                  (0, model.ui)
                  model.tonkadur.available_options
               )
         }

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

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

      _ -> model

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

new : Type
new =
   {
      displayed_text = [],
      displayed_options = []
   }