summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/battlemap/struct/bm_turn_result.erl')
-rw-r--r--src/battlemap/struct/bm_turn_result.erl142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/battlemap/struct/bm_turn_result.erl b/src/battlemap/struct/bm_turn_result.erl
new file mode 100644
index 0000000..c3440bd
--- /dev/null
+++ b/src/battlemap/struct/bm_turn_result.erl
@@ -0,0 +1,142 @@
+-module(bm_turn_result).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%
+-record
+(
+ switched_weapon,
+ {
+ character_ix :: bm_character:id()
+ }
+).
+
+-record
+(
+ moved,
+ {
+ character_ix :: bm_character:id(),
+ path :: list(bm_direction:enum()),
+ new_location :: bm_location:type()
+ }
+).
+
+-record
+(
+ attacked,
+ {
+ attacker_ix :: bm_character:id(),
+ defender_ix :: bm_character:id(),
+ sequence :: list(bm_attack:type())
+ }
+).
+
+-opaque type() :: (#switched_weapon{} | #moved{} | #attacked{}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export_type([type/0]).
+
+-export
+(
+ [
+ new_character_switched_weapons/1,
+ new_character_moved/3,
+ new_character_attacked/3
+ ]
+).
+
+-export
+(
+ [
+ encode/1
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec new_character_switched_weapons (bm_character:id()) -> type().
+new_character_switched_weapons (CharacterIX) ->
+ #switched_weapon { character_ix = CharacterIX }.
+
+-spec new_character_moved
+ (
+ bm_character:id(),
+ list(bm_direction:enum()),
+ bm_location:type()
+ )
+ -> type().
+new_character_moved (CharacterIX, Path, NewLocation) ->
+ #moved
+ {
+ character_ix = CharacterIX,
+ path = Path,
+ new_location = NewLocation
+ }.
+
+-spec new_character_attacked
+ (
+ bm_character:id(),
+ bm_character:id(),
+ list(bm_attack:type())
+ )
+ -> type().
+new_character_attacked (AttackerIX, DefenderIX, AttackSequence) ->
+ #attacked
+ {
+ attacker_ix = AttackerIX,
+ defender_ix = DefenderIX,
+ sequence = AttackSequence
+ }.
+
+-spec encode (type()) -> {list(any())}.
+encode (TurnResult) when is_record(TurnResult, switched_weapon) ->
+ CharacterIX = TurnResult#switched_weapon.character_ix,
+
+ {
+ [
+ {<<"t">>, <<"swp">>},
+ {<<"ix">>, CharacterIX}
+ ]
+ };
+encode (TurnResult) when is_record(TurnResult, moved) ->
+ CharacterIX = TurnResult#moved.character_ix,
+ Path = TurnResult#moved.path,
+ NewLocation = TurnResult#moved.new_location,
+
+ EncodedPath = lists:map(fun bm_direction:encode/1, Path),
+ EncodedNewLocation = bm_location:encode(NewLocation),
+
+ {
+ [
+ {<<"t">>, <<"mv">>},
+ {<<"ix">>, CharacterIX},
+ {<<"p">>, EncodedPath},
+ {<<"nlc">>, EncodedNewLocation}
+ ]
+ };
+encode (TurnResult) when is_record(TurnResult, attacked) ->
+ AttackerIX = TurnResult#attacked.attacker_ix,
+ DefenderIX = TurnResult#attacked.defender_ix,
+ Sequence = TurnResult#attacked.sequence,
+
+ EncodedSequence = lists:map(fun bm_attack:encode/1, Sequence),
+
+ {
+ [
+ {<<"t">>, <<"atk">>},
+ {<<"aix">>, AttackerIX},
+ {<<"dix">>, DefenderIX},
+ {<<"seq">>, EncodedSequence}
+ ]
+ };
+encode (Other) ->
+ io:format("~n invalid encode param\"~p\"~n", [Other]),
+ true = Other.