summaryrefslogtreecommitdiff |
diff options
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.erl | 123 |
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 }. |