summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-05-21 16:39:12 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-05-21 16:39:12 +0200
commit0157365585c1201c53aa29cac84cd977de7434a1 (patch)
tree44c301187f2809be974dbe8afcbc1032002ec1e8 /src/shared
parentfb4159dbfb49f71d23c2616e7b8c9be453953883 (diff)
Working on Attacks of Opportunity.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/struct/map/shr_map_marker.erl162
-rw-r--r--src/shared/struct/map/shr_tile_instance.erl6
2 files changed, 131 insertions, 37 deletions
diff --git a/src/shared/struct/map/shr_map_marker.erl b/src/shared/struct/map/shr_map_marker.erl
index 2403ae7..84cad36 100644
--- a/src/shared/struct/map/shr_map_marker.erl
+++ b/src/shared/struct/map/shr_map_marker.erl
@@ -1,5 +1,15 @@
-module(shr_map_marker).
+-define(OWNER_IX_FIELD, <<"oix">>).
+-define(LOCATIONS_FIELD, <<"l">>).
+-define(DATA_FIELD, <<"d">>).
+
+-define(DATA_TYPE_FIELD, <<"t">>).
+-define(MATK_TYPE_VALUE, <<"matk">>).
+-define(SPAWN_TYPE_VALUE, <<"spawn">>).
+
+-define(MATK_CHARACTER_IX_FIELD, <<"cix">>).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -15,17 +25,37 @@
(
spawn_mrk,
{
- player_ix :: non_neg_integer()
+ }
+).
+
+-record
+(
+ marker,
+ {
+ owner_ix :: (non_neg_integer() | -1),
+ data :: (data()),
+ locations :: list(shr_location:type())
}
).
-type name() :: binary().
+-type category() :: (matk | spawn).
-opaque melee_attack_zone() :: #matk_mrk{}.
-opaque spawn_zone() :: #spawn_mrk{}.
--opaque type() ::
- {list(shr_location:type()), (melee_attack_zone() | spawn_zone())}.
+-opaque data() :: (#matk_mrk{} | #spawn_mrk{}).
+-opaque type() :: #marker{}.
--export_type([name/0, type/0, melee_attack_zone/0, spawn_zone/0]).
+-export_type
+(
+ [
+ name/0,
+ type/0,
+ category/0,
+ data/0,
+ melee_attack_zone/0,
+ spawn_zone/0
+ ]
+).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -35,7 +65,17 @@
[
player_can_see/2,
get_locations/1,
- get_name/1
+ get_name/1,
+ get_owner_index/1,
+ get_category/1,
+ interrupts_movement/2
+ ]
+).
+
+-export
+(
+ [
+ get_character_index/1
]
).
@@ -50,53 +90,103 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec encode_data (data()) -> {list({binary(), any()})}.
+encode_data (MarkerData) when is_record(MarkerData, matk_mrk) ->
+ {
+ [
+ { ?DATA_TYPE_FIELD, ?MATK_TYPE_VALUE },
+ { ?MATK_CHARACTER_IX_FIELD, MarkerData#matk_mrk.character_ix }
+ ]
+ };
+encode_data (MarkerData) when is_record(MarkerData, spawn_mrk) ->
+ {
+ [
+ { ?DATA_TYPE_FIELD, ?SPAWN_TYPE_VALUE }
+ ]
+ }.
+
+-spec decode_data (map()) -> data().
+decode_data (Map) ->
+ case maps:get(?DATA_TYPE_FIELD, Map) of
+ ?MATK_TYPE_VALUE ->
+ #matk_mrk
+ {
+ character_ix = maps:get(?MATK_CHARACTER_IX_FIELD, Map)
+ };
+
+ ?SPAWN_TYPE_VALUE -> #spawn_mrk{};
+
+ _Other ->
+ % TODO: error.
+ #spawn_mrk{}
+ end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec interrupts_movement (non_neg_integer(), type()) -> boolean().
+interrupts_movement (PlayerIX, Marker) ->
+ (
+ (PlayerIX /= Marker#marker.owner_ix)
+ and is_record(Marker#marker.data, matk_mrk)
+ ).
+
-spec get_locations (type()) -> list(shr_location:type()).
-get_locations ({L, _}) -> L.
+get_locations (Marker) -> Marker#marker.locations.
--spec encode (type()) -> {list(any())}.
-encode ({L, MarkerData}) when is_record(MarkerData, matk_mrk) ->
- {
- [
- { <<"t">>, <<"matk">> },
- { <<"cix">>, MarkerData#matk_mrk.character_ix },
- { <<"l">>, lists:map(fun shr_location:encode/1, L) }
- ]
- };
-encode ({L, MarkerData}) when is_record(MarkerData, spawn_mrk) ->
+-spec get_owner_index (type()) -> (non_neg_integer() | -1).
+get_owner_index (Marker) -> Marker#marker.owner_ix.
+
+-spec get_category (type()) -> category().
+get_category (Marker) ->
+ case Marker#marker.data of
+ #matk_mrk{} -> matk;
+ #spawn_mrk{} -> spawn
+ end.
+
+-spec encode (type()) -> {list({binary(), any()})}.
+encode (Marker) ->
{
[
- { <<"t">>, <<"spawn">> },
- { <<"pix">>, MarkerData#spawn_mrk.player_ix },
- { <<"l">>, lists:map(fun shr_location:encode/1, L) }
+ {
+ ?LOCATIONS_FIELD,
+ lists:map(fun shr_location:encode/1, Marker#marker.locations)
+ },
+ { ?OWNER_IX_FIELD, Marker#marker.owner_ix },
+ { ?DATA_FIELD, encode_data(Marker#marker.data) }
]
}.
+
-spec decode (map()) -> type().
decode (Map) ->
- Data = maps:get(<<"d">>, Map),
+ #marker
{
- lists:map(fun shr_location:decode/1, maps:get(<<"l">>, Map)),
- (
- case maps:get(<<"t">>, Data) of
- <<"mtak">> -> #matk_mrk{ character_ix = maps:get(<<"cix">>, Data) };
- <<"spawn">> -> #spawn_mrk{ player_ix = maps:get(<<"pix">>, Data) }
- end
- )
+ locations = maps:get(?LOCATIONS_FIELD, Map),
+ owner_ix = maps:get(?OWNER_IX_FIELD, Map),
+ data = decode_data(maps:get(?DATA_FIELD, Map))
}.
-spec player_can_see (integer(), type()) -> boolean().
-player_can_see (PlayerIX, _Marker) -> (PlayerIX >= 0).
+player_can_see (_PlayerIX, _Marker) -> true.
-spec get_name (type()) -> binary().
-get_name ({_Location, MarkerData}) when is_record(MarkerData, matk_mrk) ->
- Prefix = <<"matk_c">>,
- CharacterIXString = integer_to_binary(MarkerData#matk_mrk.character_ix),
- <<Prefix/binary, CharacterIXString/binary>>;
-get_name ({_Location, MarkerData}) when is_record(MarkerData, spawn_mrk) ->
- Prefix = <<"spawn_p">>,
- PlayerIXString = integer_to_binary(MarkerData#spawn_mrk.player_ix),
- <<Prefix/binary, PlayerIXString/binary>>.
+get_name (Marker) ->
+ case Marker#marker.data of
+ #matk_mrk{ character_ix = CIX } ->
+ Prefix = <<"matk_c">>,
+ CharacterIXString = integer_to_binary(CIX),
+ <<Prefix/binary, CharacterIXString/binary>>;
+
+ #spawn_mrk{} ->
+ Prefix = <<"spawn_p">>,
+ PlayerIXString = integer_to_binary(Marker#marker.owner_ix),
+ <<Prefix/binary, PlayerIXString/binary>>
+ end.
+
+-spec get_character_index (type()) -> (non_neg_integer() | -1).
+get_character_index (Marker) ->
+ case Marker#marker.data of
+ #matk_mrk{ character_ix = IX } -> IX;
+ _ -> -1
+ end.
diff --git a/src/shared/struct/map/shr_tile_instance.erl b/src/shared/struct/map/shr_tile_instance.erl
index 9f95378..3c3621f 100644
--- a/src/shared/struct/map/shr_tile_instance.erl
+++ b/src/shared/struct/map/shr_tile_instance.erl
@@ -32,7 +32,8 @@
(
[
get_tile_id/1,
- get_variant_id/1
+ get_variant_id/1,
+ get_triggers/1
]
).
@@ -49,6 +50,9 @@ get_tile_id ({TileID, _, _, _}) -> TileID.
-spec get_variant_id (type()) -> shr_tile:variant_id().
get_variant_id ({_, VariantID, _, _}) -> VariantID.
+-spec get_triggers (type()) -> list(trigger_name()).
+get_triggers ({_, _, _, Triggers}) -> Triggers.
+
-spec decode (map()) -> type().
decode (Map) ->
L = maps:get(<<"b">>, Map),