| 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
 | -module(turn_result).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
-record
(
   switched_weapon,
   {
      character_instance_ix :: character_instance:id()
   }
).
-record
(
   moved,
   {
      character_instance_ix :: character_instance:id(),
      path :: [direction:enum()],
      new_location :: location:type()
   }
).
-record
(
   attacked,
   {
      attacker_ix :: character_instance:id(),
      defender_ix :: character_instance:id(),
      sequence :: list(attack:attack_desc())
   }
).
-opaque struct() :: (#switched_weapon{} | #moved{} | #attacked{}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-export_type([struct/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 (character_instance:id()) -> struct().
new_character_switched_weapons (CharacterInstanceIX) ->
   #switched_weapon { character_instance_ix = CharacterInstanceIX }.
-spec new_character_moved
   (
      character_instance:id(),
      list(direction:enum()),
      location:type()
   )
   -> struct().
new_character_moved (CharacterInstanceIX, Path, NewLocation) ->
   #moved
   {
      character_instance_ix = CharacterInstanceIX,
      path = Path,
      new_location = NewLocation
   }.
-spec new_character_attacked
   (
      character_instance:id(),
      character_instance:id(),
      list(attack:attack_desc())
   )
   -> struct().
new_character_attacked (AttackerIX, DefenderIX, AttackSequence) ->
   #attacked
   {
      attacker_ix = AttackerIX,
      defender_ix = DefenderIX,
      sequence = AttackSequence
   }.
-spec encode (struct()) -> binary().
encode (TurnResult) when is_record(TurnResult, switched_weapon) ->
   CharacterInstanceIX = TurnResult#switched_weapon.character_instance_ix,
   jiffy:encode
   (
      {
         [
            {<<"t">>, <<"swp">>},
            {<<"ix">>, CharacterInstanceIX}
         ]
      }
   );
encode (TurnResult) when is_record(TurnResult, moved) ->
   CharacterInstanceIX = TurnResult#moved.character_instance_ix,
   Path = TurnResult#moved.path,
   NewLocation = TurnResult#moved.new_location,
   EncodedPath = lists:map(fun direction:encode/1, Path),
   EncodedNewLocation = location:encode(NewLocation),
   jiffy:encode
   (
      {
         [
            {<<"t">>, <<"mv">>},
            {<<"ix">>, CharacterInstanceIX},
            {<<"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 attack:encode/1, Sequence),
   jiffy:encode
   (
      {
         [
            {<<"t">>, <<"atk">>},
            {<<"aix">>, AttackerIX},
            {<<"dix">>, DefenderIX},
            {<<"seq">>, EncodedSequence}
         ]
      }
   ).
 |