summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-12-26 13:46:47 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-12-26 13:46:47 +0100
commitf55133c2e24ee782416a32619aa1a3b07811915f (patch)
tree011c425ed8b0b469c6964ffce31a97f60c93d1f3
parent6777c3edc9414e3a59f94f940756f8666e017a6e (diff)
...
-rw-r--r--src/shared/tonkadur/Tonkadur/Execute.elm132
-rw-r--r--src/shared/tonkadur/Tonkadur/PlayerInput.elm85
-rw-r--r--src/shared/tonkadur/Tonkadur/Types.elm11
3 files changed, 168 insertions, 60 deletions
diff --git a/src/shared/tonkadur/Tonkadur/Execute.elm b/src/shared/tonkadur/Tonkadur/Execute.elm
index ebdd943..6876e80 100644
--- a/src/shared/tonkadur/Tonkadur/Execute.elm
+++ b/src/shared/tonkadur/Tonkadur/Execute.elm
@@ -15,45 +15,16 @@ import Tonkadur.Compute
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
----- UPDATE MEMORY -------------------------------------------------------------
-apply_at_address : (
- (List.List String) ->
- (
- String ->
- (Dict.Dict String Value) ->
- (Dict.Dict String Value)
- )
- (Dict.Dict String Value) ->
- (Dict.Dict String Value)
- )
-apply_at_address address fun memory =
- case address of
- [] -> memory
- (last_element :: []) -> (fun last_element memory)
- (next_element :: next_address) ->
- (Dict.update
- next_element
- (\maybe_value ->
- case maybe_value of
- (Just value) ->
- (Just
- (apply_at_address
- next_address
- fun
- (Tonkadur.Types.value_to_dict value)
- )
- )
-
- Nothing -> Nothing
- )
- )
+increment_program_counter : Tonkadur.Types.State -> Tonkadur.Types.State
+increment_program_counter state =
+ {state | program_counter = program_counter + 1}
---- INSTRUCTIONS --------------------------------------------------------------
add_event_option : (
String ->
(List.List Tonkadur.Types.Computation) ->
Tonkadur.Types.State ->
- Tonkadur.Types.State ->
+ Tonkadur.Types.State
)
add_event_option name parameters state =
(Tonkadur.Types.append_option
@@ -118,7 +89,7 @@ initialize : (
initialize type_name address state =
{state |
memory =
- (apply_at_address
+ (Tonkadur.Types.apply_at_address
(Tonkadur.Types.value_to_list
(Tonkadur.Compute.compute state address)
)
@@ -142,8 +113,15 @@ prompt_command : (
Tonkadur.Types.State
)
prompt_command address min max label state =
- -- TODO: how to prompt for input?
- state
+ {state |
+ memorized_target = (Tonkadur.Compute.compute state address),
+ last_instruction_effect =
+ (PromptCommand
+ (Tonkadur.Compute.compute state min)
+ (Tonkadur.Compute.compute state max)
+ (Tonkadur.Compute.compute state label)
+ )
+ }
prompt_integer : (
Tonkadur.Types.Computation ->
@@ -154,8 +132,15 @@ prompt_integer : (
Tonkadur.Types.State
)
prompt_integer address min max label state =
- -- TODO: how to prompt for input?
- state
+ {state |
+ memorized_target = (Tonkadur.Compute.compute state address),
+ last_instruction_effect =
+ (PromptInteger
+ (Tonkadur.Compute.compute state min)
+ (Tonkadur.Compute.compute state max)
+ (Tonkadur.Compute.compute state label)
+ )
+ }
prompt_string : (
Tonkadur.Types.Computation ->
@@ -166,8 +151,15 @@ prompt_string : (
Tonkadur.Types.State
)
prompt_integer address min max label state =
- -- TODO: how to prompt for input?
- state
+ {state |
+ memorized_target = (Tonkadur.Compute.compute state address),
+ last_instruction_effect =
+ (PromptString
+ (Tonkadur.Compute.compute state min)
+ (Tonkadur.Compute.compute state max)
+ (Tonkadur.Compute.compute state label)
+ )
+ }
remove : (
Tonkadur.Types.Computation ->
@@ -177,7 +169,7 @@ remove : (
remove address state =
{state |
memory =
- (apply_at_address
+ (Tonkadur.Types.apply_at_address
(Tonkadur.Types.value_to_list
(Tonkadur.Compute.compute state address)
)
@@ -188,8 +180,7 @@ remove address state =
resolve_choice : Tonkadur.Types.State -> Tonkadur.Types.State
resolve_choice state =
- -- TODO: how to prompt for input?
- state
+ {state | last_instruction_effect = PromptChoice}
set_pc : (
Tonkadur.Types.Computation ->
@@ -226,7 +217,7 @@ set_random address min max state =
in
{state |
memory =
- (apply_at_address
+ (Tonkadur.Types.apply_at_address
(Tonkadur.Types.value_to_list
(Tonkadur.Compute.compute state address)
)
@@ -246,7 +237,7 @@ set : (
set address value state =
{state |
memory =
- (apply_at_address
+ (Tonkadur.Types.apply_at_address
(Tonkadur.Types.value_to_list
(Tonkadur.Compute.compute state address)
)
@@ -270,34 +261,55 @@ execute : (
Tonkadur.Types.State ->
)
execute instruction state =
+ let new_state = {state | last_instruction_effect = Continue} in
case instruction of
(AddEventOption name parameters) ->
- (add_event_option name parameters state)
+ (increment_program_counter
+ (add_event_option name parameters new_state)
+ )
(AddTextOption label) ->
- (add_text_option name parameters state)
+ (increment_program_counter
+ (add_text_option name parameters new_state)
+ )
(Assert condition label) ->
- (assert condition label state)
+ (increment_program_counter
+ (assert condition label new_state)
+ )
- (Display label) -> (display label state)
- End -> (end state)
+ (Display label) ->
+ (increment_program_counter (display label new_state))
+
+ End -> (end new_state)
(ExtraInstruction name parameters) ->
- (extra_instruction name parameters state)
+ (extra_instruction name parameters new_state)
- (Initialize type_name address) -> (initialize type_name address state)
+ (Initialize type_name address) ->
+ (increment_program_counter
+ (initialize type_name address new_state)
+ )
(PromptCommand address min max label) ->
- (prompt_command address min max label state)
+ (increment_program_counter
+ (prompt_command address min max label new_state)
+ )
(PromptInteger address min max label) ->
- (prompt_integer address min max label state)
+ (increment_program_counter
+ (prompt_integer address min max label new_state)
+ )
(PromptString address min max label) ->
- (prompt_string address min max label state)
+ (increment_program_counter
+ (prompt_string address min max label new_state)
+ )
+
+ (Remove address) -> (increment_program_counter (remove address new_state))
+ ResolveChoice -> (increment_program_counter (resolve_choice new_state))
+ (SetPC value) -> (set_pc value new_state)
+ (SetRandom address min max) ->
+ (increment_program_counter (set_random address min max new_state))
- (Remove address) -> (remove address state)
- ResolveChoice -> (resolve_choice state)
- (SetPC value) -> (set_pc value state)
- (SetRandom address min max) -> (set_random address min max state)
- (Set address value) -> (set address value state)
+ (Set address value) ->
+ (increment_program_counter (set address value new_state))
diff --git a/src/shared/tonkadur/Tonkadur/PlayerInput.elm b/src/shared/tonkadur/Tonkadur/PlayerInput.elm
new file mode 100644
index 0000000..0cd75aa
--- /dev/null
+++ b/src/shared/tonkadur/Tonkadur/PlayerInput.elm
@@ -0,0 +1,85 @@
+module Tonkadur.PlayerInput exposing (..)
+
+-- Elm -------------------------------------------------------------------------
+import List
+import Dict
+
+-- Tonkadur --------------------------------------------------------------------
+import Tonkadur.Types
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+select_choice : Int -> Tonkadur.Types.State -> Tonkadur.Types.State
+select_choice index state = {state | last_choice_index = index}
+
+input_string : String -> Tonkadur.Types.State -> Tonkadur.Types.State
+input_string string state =
+ {state |
+ memory =
+ (Tonkadur.Types.apply_at_address
+ (Tonkadur.Types.value_to_address state.memorized_target)
+ (\last_address dict ->
+ (Dict.insert last_address (StringValue string) dict)
+ )
+ state.memory
+ )
+ }
+
+input_int : Int -> Tonkadur.Types.State -> Tonkadur.Types.State
+input_int int state =
+ {state |
+ memory =
+ (Tonkadur.Types.apply_at_address
+ (Tonkadur.Types.value_to_address state.memorized_target)
+ (\last_address dict ->
+ (Dict.insert last_address (IntValue int) dict)
+ )
+ state.memory
+ )
+ }
+
+input_command : (
+ (List.List String) ->
+ Tonkadur.Types.State ->
+ Tonkadur.Types.State
+ )
+input_command commands state =
+ {state |
+ memory =
+ (Tonkadur.Types.apply_at_address
+ (Tonkadur.Types.value_to_address state.memorized_target)
+ (\last_address dict ->
+ (Dict.insert
+ last_address
+ (ListValue
+ (Dict.fromList
+ (List.indexedMap
+ (\index value ->
+ (
+ (
+ case (String.fromInt index) of
+ (Just i) -> i
+ Nothing -> "invalid_index"
+ ),
+ value
+ )
+ )
+ commands
+ )
+ )
+ )
+ dict
+ )
+ )
+ state.memory
+ )
+ }
diff --git a/src/shared/tonkadur/Tonkadur/Types.elm b/src/shared/tonkadur/Tonkadur/Types.elm
index 1e2be63..3393970 100644
--- a/src/shared/tonkadur/Tonkadur/Types.elm
+++ b/src/shared/tonkadur/Tonkadur/Types.elm
@@ -66,6 +66,17 @@ type Instruction =
| SetRandom (Computation, Computation, Computation)
| Set (Computation, Computation)
+type InstructionEffect =
+ Continue
+ | End
+ | PromptCommand (Value, Value, Value)
+ | PromptInteger (Value, Value, Value)
+ | PromptString (Value, Value, Value)
+ | PromptChoice
+ | Display Value
+ | DisplayError Value
+ | ExtraEffect (String, (List.List Value))
+
type alias State =
{
memory : (Dict.Dict String Value)