summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-07-11 17:54:14 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-07-11 17:54:14 +0200
commitfde827cba1ff3d889135c74ee1978098465fd200 (patch)
treed6022f800aa8226bf79a26a19189965c8cbfb2fe /src/battle/struct/btl_character.erl
parentdf59024199c387903e3d4a901171939a358489d3 (diff)
"Battlemap" -> "Battle".
Diffstat (limited to 'src/battle/struct/btl_character.erl')
-rw-r--r--src/battle/struct/btl_character.erl290
1 files changed, 290 insertions, 0 deletions
diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl
new file mode 100644
index 0000000..841f4ea
--- /dev/null
+++ b/src/battle/struct/btl_character.erl
@@ -0,0 +1,290 @@
+-module(btl_character).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-type id() :: non_neg_integer().
+-type rank() :: ('optional' | 'target' | 'commander').
+
+-record
+(
+ character,
+ {
+ id :: id(),
+ player_ix :: non_neg_integer(),
+ name :: binary(),
+ rank :: rank(),
+ icon :: binary(),
+ portrait :: binary(),
+ attributes :: sh_attributes:type(),
+ statistics :: sh_statistics:type(),
+ weapon_ids :: {sh_weapon:id(), sh_weapon:id()},
+ armor_id :: sh_armor:id(),
+ location :: {non_neg_integer(), non_neg_integer()},
+ current_health :: integer(), %% Negative integers let us reverse attacks.
+ is_active :: boolean(),
+ is_defeated :: boolean()
+ }
+).
+
+-opaque type() :: #character{}.
+
+-export_type([type/0, rank/0, id/0]).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Accessors
+-export
+(
+ [
+ get_id/1,
+ get_player_index/1,
+ get_name/1,
+ get_rank/1,
+ get_icon/1,
+ get_portrait/1,
+ get_attributes/1,
+ get_statistics/1,
+ get_weapon_ids/1,
+ get_armor_id/1,
+ get_location/1,
+ get_current_health/1,
+ get_is_alive/1,
+ get_is_active/1,
+ get_is_defeated/1,
+
+ set_rank/2,
+ set_weapon_ids/2,
+ set_armor_id/2,
+ set_statistics/2,
+ set_location/2,
+ set_current_health/2,
+ set_is_active/2,
+ set_is_defeated/2,
+
+ get_rank_field/0,
+ get_statistics_field/0,
+ get_weapons_field/0,
+ get_location_field/0,
+ get_current_health_field/0,
+ get_is_active_field/0,
+ get_is_defeated_field/0
+ ]
+).
+
+-export
+(
+ [
+ random/5
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec find_random_location
+ (
+ non_neg_integer(),
+ non_neg_integer(),
+ list({non_neg_integer(), non_neg_integer()})
+ )
+ -> {non_neg_integer(), non_neg_integer()}.
+find_random_location (BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
+ X = sh_roll:between(0, (BattlemapWidth - 1)),
+ Y = sh_roll:between(0, (BattlemapHeight - 1)),
+
+ IsForbidden = lists:member({X, Y}, ForbiddenLocations),
+
+ case IsForbidden of
+ true ->
+ find_random_location
+ (
+ BattlemapWidth,
+ BattlemapHeight,
+ ForbiddenLocations
+ );
+
+ _ -> {X, Y}
+ end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%% Accessors
+-spec get_id (type()) -> id().
+get_id (Char) -> Char#character.id.
+
+-spec get_player_index (type()) -> non_neg_integer().
+get_player_index (Char) -> Char#character.player_ix.
+
+-spec get_name (type()) -> binary().
+get_name (Char) -> Char#character.name.
+
+-spec get_rank (type()) -> rank().
+get_rank (Char) -> Char#character.rank.
+
+-spec get_icon (type()) -> binary().
+get_icon (Char) -> Char#character.icon.
+
+-spec get_portrait (type()) -> binary().
+get_portrait (Char) -> Char#character.portrait.
+
+-spec get_attributes (type()) -> sh_attributes:type().
+get_attributes (Char) -> Char#character.attributes.
+
+-spec get_armor_id (type()) -> sh_armor:id().
+get_armor_id (Char) -> Char#character.armor_id.
+
+-spec get_weapon_ids (type()) -> {sh_weapon:id(), sh_weapon:id()}.
+get_weapon_ids (Char) -> Char#character.weapon_ids.
+
+-spec get_statistics (type()) -> sh_statistics:type().
+get_statistics (Char) -> Char#character.statistics.
+
+-spec get_location (type()) -> {non_neg_integer(), non_neg_integer()}.
+get_location (Char) -> Char#character.location.
+
+-spec get_current_health (type()) -> integer().
+get_current_health (Char) -> Char#character.current_health.
+
+-spec get_is_alive (type()) -> boolean().
+get_is_alive (Char) ->
+ (
+ (not Char#character.is_defeated)
+ and (Char#character.current_health > 0)
+ ).
+
+-spec get_is_active (type()) -> boolean().
+get_is_active (Char) ->
+ (
+ (not Char#character.is_defeated)
+ and Char#character.is_active
+ and get_is_alive(Char)
+ ).
+
+-spec get_is_defeated (type()) -> boolean().
+get_is_defeated (Char) -> Char#character.is_defeated.
+
+-spec set_rank (rank(), type()) -> type().
+set_rank (Rank, Char) ->
+ Char#character
+ {
+ rank = Rank
+ }.
+
+-spec set_location
+ (
+ {non_neg_integer(), non_neg_integer()},
+ type()
+ )
+ -> type().
+set_location (Location, Char) ->
+ Char#character
+ {
+ location = Location
+ }.
+
+-spec set_current_health (integer(), type()) -> type().
+set_current_health (Health, Char) ->
+ Char#character
+ {
+ current_health = Health
+ }.
+
+-spec set_is_active (boolean(), type()) -> type().
+set_is_active (Active, Char) ->
+ Char#character
+ {
+ is_active = Active
+ }.
+
+-spec set_is_defeated (boolean(), type()) -> type().
+set_is_defeated (Defeated, Char) ->
+ Char#character
+ {
+ is_defeated = Defeated
+ }.
+
+-spec set_armor_id (sh_armor:id(), type()) -> type().
+set_armor_id (ArmorID, Char) ->
+ Char#character
+ {
+ armor_id = ArmorID
+ }.
+
+-spec set_weapon_ids ({sh_weapon:id(), sh_weapon:id()}, type()) -> type().
+set_weapon_ids (WeaponIDs, Char) ->
+ Char#character
+ {
+ weapon_ids = WeaponIDs
+ }.
+
+-spec set_statistics
+ (
+ sh_statistics:type(),
+ type()
+ )
+ -> type().
+set_statistics (Stats, Char) ->
+ Char#character
+ {
+ statistics = Stats
+ }.
+
+%%%% Utils
+-spec random
+ (
+ non_neg_integer(),
+ non_neg_integer(),
+ non_neg_integer(),
+ non_neg_integer(),
+ list({non_neg_integer(), non_neg_integer()})
+ )
+ -> type().
+random (ID, PlayerIX, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
+ Location =
+ find_random_location(BattlemapWidth, BattlemapHeight, ForbiddenLocations),
+ WeaponIDs = {sh_weapon:random_id(), sh_weapon:random_id()},
+ ArmorID = sh_armor:random_id(),
+ Attributes = sh_attributes:random(),
+ Statistics = sh_statistics:new(Attributes, WeaponIDs, ArmorID),
+ IDAsListString = integer_to_list(ID),
+ IDAsBinaryString = list_to_binary(IDAsListString),
+
+ #character
+ {
+ id = ID,
+ player_ix = PlayerIX,
+ name = list_to_binary("Char" ++ IDAsListString),
+ rank =
+ if
+ ((ID rem 8) == 0) -> commander;
+ ((ID rem 3) == 0) -> target;
+ true -> optional
+ end,
+ icon = IDAsBinaryString,
+ portrait = IDAsBinaryString,
+ attributes = Attributes,
+ weapon_ids = WeaponIDs,
+ armor_id = ArmorID,
+ statistics = Statistics,
+ location = Location,
+ current_health = sh_statistics:get_health(Statistics),
+ is_active = false,
+ is_defeated = false
+ }.
+
+-spec get_rank_field() -> non_neg_integer().
+get_rank_field () -> #character.rank.
+-spec get_statistics_field() -> non_neg_integer().
+get_statistics_field () -> #character.statistics.
+-spec get_weapons_field() -> non_neg_integer().
+get_weapons_field () -> #character.weapon_ids.
+-spec get_location_field() -> non_neg_integer().
+get_location_field () -> #character.location.
+-spec get_current_health_field() -> non_neg_integer().
+get_current_health_field () -> #character.current_health.
+-spec get_is_active_field() -> non_neg_integer().
+get_is_active_field () -> #character.is_active.
+-spec get_is_defeated_field() -> non_neg_integer().
+get_is_defeated_field () -> #character.is_defeated.