summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/struct')
-rw-r--r--src/struct/battle.erl (renamed from src/struct/battlemap_instance.erl)81
-rw-r--r--src/struct/battle_action.erl123
2 files changed, 125 insertions, 79 deletions
diff --git a/src/struct/battlemap_instance.erl b/src/struct/battle.erl
index c3b411b..bfa0e8d 100644
--- a/src/struct/battlemap_instance.erl
+++ b/src/struct/battle.erl
@@ -1,4 +1,4 @@
--module(battlemap_instance).
+-module(battle).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -7,7 +7,7 @@
-record
(
- battlemap_instance,
+ battle,
{
id :: id(),
battlemap :: battlemap:struct(),
@@ -18,7 +18,7 @@
}
).
--opaque struct() :: #battlemap_instance{}.
+-opaque struct() :: #battle{}.
-export_type([struct/0, id/0]).
@@ -32,12 +32,15 @@
get_id/1,
get_battlemap/1,
get_character_instances/1,
+ get_character_instance/2,
get_player_ids/1,
+ get_player_id/2,
get_current_player_turn/1,
get_last_turns_effects/1,
set_battlemap/2,
set_character_instances/2,
+ set_character_instance/3,
set_player_ids/2,
set_current_player_turn/2,
set_last_turns_effects/2
@@ -60,32 +63,41 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
-spec get_id (struct()) -> id().
-get_id (BattlemapInstance) -> BattlemapInstance#battlemap_instance.id.
+get_id (Battle) -> Battle#battle.id.
-spec get_battlemap (struct()) -> battlemap:struct().
-get_battlemap (BattlemapInstance) ->
- BattlemapInstance#battlemap_instance.battlemap.
+get_battlemap (Battle) ->
+ Battle#battle.battlemap.
-spec get_character_instances (struct()) ->
array:array(character_instance:struct()).
-get_character_instances (BattlemapInstance) ->
- BattlemapInstance#battlemap_instance.character_instances.
+get_character_instances (Battle) ->
+ Battle#battle.character_instances.
+
+-spec get_character_instance (non_neg_integer(), struct()) ->
+ character_instance:struct().
+get_character_instance (IX, Battle) ->
+ array:get(IX, Battle#battle.character_instances).
-spec get_player_ids (struct()) -> array:array(player:id()).
-get_player_ids (BattlemapInstance) ->
- BattlemapInstance#battlemap_instance.player_ids.
+get_player_ids (Battle) ->
+ Battle#battle.player_ids.
+
+-spec get_player_id (non_neg_integer(), struct()) -> player:id().
+get_player_id (IX, Battle) ->
+ array:get(IX, Battle#battle.player_ids).
-spec get_current_player_turn (struct()) -> player_turn:struct().
-get_current_player_turn (BattlemapInstance) ->
- BattlemapInstance#battlemap_instance.current_player_turn.
+get_current_player_turn (Battle) ->
+ Battle#battle.current_player_turn.
-spec get_last_turns_effects (struct()) -> list(any()).
-get_last_turns_effects (BattlemapInstance) ->
- BattlemapInstance#battlemap_instance.last_turns_effects.
+get_last_turns_effects (Battle) ->
+ Battle#battle.last_turns_effects.
-spec set_battlemap (battlemap:struct(), struct()) -> struct().
-set_battlemap (Battlemap, BattlemapInstance) ->
- BattlemapInstance#battlemap_instance
+set_battlemap (Battlemap, Battle) ->
+ Battle#battle
{
battlemap = Battlemap
}.
@@ -96,20 +108,39 @@ set_battlemap (Battlemap, BattlemapInstance) ->
struct()
)
-> struct().
-set_character_instances (CharacterInstances, BattlemapInstance) ->
- BattlemapInstance#battlemap_instance
+set_character_instances (CharacterInstances, Battle) ->
+ Battle#battle
{
character_instances = CharacterInstances
}.
+-spec set_character_instance
+ (
+ non_neg_integer(),
+ character_instance:struct(),
+ struct()
+ )
+ -> struct().
+set_character_instance (IX, CharacterInstance, Battle) ->
+ Battle#battle
+ {
+ character_instances =
+ array:set
+ (
+ IX,
+ CharacterInstance,
+ Battle#battle.character_instances
+ )
+ }.
+
-spec set_player_ids
(
array:array(player:id()),
struct()
)
-> struct().
-set_player_ids (Players, BattlemapInstance) ->
- BattlemapInstance#battlemap_instance
+set_player_ids (Players, Battle) ->
+ Battle#battle
{
player_ids = Players
}.
@@ -120,8 +151,8 @@ set_player_ids (Players, BattlemapInstance) ->
struct()
)
-> struct().
-set_current_player_turn (PlayerTurn, BattlemapInstance) ->
- BattlemapInstance#battlemap_instance
+set_current_player_turn (PlayerTurn, Battle) ->
+ Battle#battle
{
current_player_turn = PlayerTurn
}.
@@ -132,8 +163,8 @@ set_current_player_turn (PlayerTurn, BattlemapInstance) ->
struct()
)
-> struct().
-set_last_turns_effects (Effects, BattlemapInstance) ->
- BattlemapInstance#battlemap_instance
+set_last_turns_effects (Effects, Battle) ->
+ Battle#battle
{
last_turns_effects = Effects
}.
@@ -185,7 +216,7 @@ random (ID, PlayersAsList, Battlemap, Characters) ->
Characters
),
- #battlemap_instance
+ #battle
{
id = ID,
battlemap = Battlemap,
diff --git a/src/struct/battle_action.erl b/src/struct/battle_action.erl
index 7287a95..c1bccc7 100644
--- a/src/struct/battle_action.erl
+++ b/src/struct/battle_action.erl
@@ -22,7 +22,7 @@
(
attack,
{
- target :: non_neg_integer()
+ target_ix :: non_neg_integer()
}
).
@@ -57,18 +57,76 @@ decode_mov_action (JSONMap) ->
decode_atk_action (JSONMap) ->
TargetIX = maps:get(<<"tix">>, JSONMap),
- #attack { target = TargetIX }.
+ #attack { target_ix = TargetIX }.
-spec decode_swp_action (map()) -> struct().
decode_swp_action (_JSONMap) ->
#switch_weapon{}.
+
+handle_attack_sequence
+(
+ CharacterInstance,
+ TargetCharacterInstance,
+ AttackSequence
+) ->
+ Character = character_instance:get_character(CharacterInstance),
+ TargetCharacter = character_instance:get_character(TargetCharacterInstance),
+ CharacterStatistics = character:get_statistics(Character),
+ TargetCharacterStatistics = character:get_statistics(TargetCharacter),
+
+ AttackPlannedEffects =
+ lists:map
+ (
+ fun (AttackStep) ->
+ attack:get_description_of
+ (
+ AttackStep,
+ CharacterStatistics,
+ TargetCharacterStatistics
+ )
+ end,
+ AttackSequence
+ ),
+
+ lists:foldl
+ (
+ fun
+ (
+ AttackEffectCandidate,
+ {AttackValidEffects, AttackerHealth, DefenderHealth}
+ ) ->
+ {AttackResult, NewAttackerHealth, NewDefenderHealth} =
+ attack:apply_to_healths
+ (
+ AttackEffectCandidate,
+ AttackerHealth,
+ DefenderHealth
+ ),
+ case AttackResult of
+ nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth};
+ _ ->
+ {
+ [AttackResult|AttackValidEffects],
+ NewAttackerHealth,
+ NewDefenderHealth
+ }
+ end
+ end,
+ {
+ [],
+ character_instance:get_current_health(CharacterInstance),
+ character_instance:get_current_health(TargetCharacterInstance)
+ },
+ AttackPlannedEffects
+ ).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec decode (binary()) -> struct().
decode (EncodedAction) ->
- JSONActionMap = jiffy:decode(EncodedAction, [return_maps]),
+ JSONActionMap = EncodedAction, %jiffy:decode(EncodedAction, [return_maps]),
ActionType = maps:get(<<"t">>, JSONActionMap),
case ActionType of
<<"mov">> -> decode_mov_action(JSONActionMap);
@@ -175,16 +233,13 @@ when is_record(BattleAction, move) ->
],
UpdatedCharacterInstance,
Battle
- }.
-handle (Battle, CharacterInstance, CharacterInstanceIX, BattleAction)
+ };
+handle (Battle, CharacterInstance, _CharacterInstanceIX, BattleAction)
when is_record(BattleAction, attack) ->
Character = character_instance:get_character(CharacterInstance),
- CharacterStatistics = character:get_statistics(Character),
- Battlemap = battle:get_battlemap(Battle),
TargetIX = BattleAction#attack.target_ix,
TargetCharacterInstance = battle:get_character_instance(TargetIX, Battle),
TargetCharacter = character_instance:get_character(TargetCharacterInstance),
- TargetCharacterStatistics = character:get_statistics(TargetCharacter),
Range =
location:dist
@@ -202,54 +257,14 @@ when is_record(BattleAction, attack) ->
AttackSequence =
attack:get_sequence(Range, AttackingWeapon, DefendingWeapon),
- AttackPlannedEffects =
- lists:map
+ {AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} =
+ handle_attack_sequence
(
- fun (AttackStep) ->
- attack:get_description_of
- (
- AttackStep,
- CharacterStatistics,
- TargetCharacterStatistics
- )
- end,
+ CharacterInstance,
+ TargetCharacterInstance,
AttackSequence
),
- % FIXME: may warrant a separate function
- {AttackEffects, RemainingAttakerHealth, RemainingDefenderHealth} =
- lists:foldl
- (
- fun
- (
- AttackEffectCandidate,
- {AttackValidEffects, AttackerHealth, DefenderHealth }
- ) ->
- {AttackResult, NewAttackerHealth, NewDefenderHealth} =
- attack:apply_to_healths
- (
- AttackPlannedEffect,
- AttackerHealth,
- DefenderHealth
- ),
- case AttackResult of
- nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth};
- _ ->
- {
- [AttackResult|AttackValidEffects],
- NewAttackerHealth,
- NewDefenderHealth
- }
- end,
- end,
- {
- [],
- character_instance:get_current_health(CharacterInstance),
- character_instance:get_current_health(TargetCharacterInstance)
- },
- AttackPlannedEffects
- ),
-
UpdatedCharacterInstance =
character_instance:set_current_health
(
@@ -267,12 +282,12 @@ when is_record(BattleAction, attack) ->
TargetCharacterInstance
),
Battle
- )
+ ),
{
% TODO: hide that into database_diff structs.
[], % TODO
% TODO: hide that into turn_result structs.
- AttackEffets,
+ AttackEffects,
UpdatedCharacterInstance,
UpdatedBattle
}.