From dc119102df0076e45ee6c484e361c3fff3e6e2dd Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Fri, 2 Mar 2018 15:43:23 +0100 Subject: Still working on it... --- src/struct/battle.erl | 227 ++++++++++++++++++++++++++++++++++++++ src/struct/battle_action.erl | 123 ++++++++++++--------- src/struct/battlemap_instance.erl | 196 -------------------------------- 3 files changed, 296 insertions(+), 250 deletions(-) create mode 100644 src/struct/battle.erl delete mode 100644 src/struct/battlemap_instance.erl (limited to 'src/struct') diff --git a/src/struct/battle.erl b/src/struct/battle.erl new file mode 100644 index 0000000..bfa0e8d --- /dev/null +++ b/src/struct/battle.erl @@ -0,0 +1,227 @@ +-module(battle). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-opaque id() :: binary(). + +-record +( + battle, + { + id :: id(), + battlemap :: battlemap:struct(), + character_instances :: array:array(character_instance:struct()), + player_ids :: array:array(player:id()), + current_player_turn :: player_turn:struct(), + last_turns_effects :: list(any()) + } +). + +-opaque struct() :: #battle{}. + +-export_type([struct/0, id/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + 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 + ] +). + +-export +( + [ + random/4 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_id (struct()) -> id(). +get_id (Battle) -> Battle#battle.id. + +-spec get_battlemap (struct()) -> battlemap:struct(). +get_battlemap (Battle) -> + Battle#battle.battlemap. + +-spec get_character_instances (struct()) -> + array:array(character_instance:struct()). +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 (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 (Battle) -> + Battle#battle.current_player_turn. + +-spec get_last_turns_effects (struct()) -> list(any()). +get_last_turns_effects (Battle) -> + Battle#battle.last_turns_effects. + +-spec set_battlemap (battlemap:struct(), struct()) -> struct(). +set_battlemap (Battlemap, Battle) -> + Battle#battle + { + battlemap = Battlemap + }. + +-spec set_character_instances + ( + array:array(character_instance:struct()), + struct() + ) + -> struct(). +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, Battle) -> + Battle#battle + { + player_ids = Players + }. + +-spec set_current_player_turn + ( + player_turn:struct(), + struct() + ) + -> struct(). +set_current_player_turn (PlayerTurn, Battle) -> + Battle#battle + { + current_player_turn = PlayerTurn + }. + +-spec set_last_turns_effects + ( + list(any()), + struct() + ) + -> struct(). +set_last_turns_effects (Effects, Battle) -> + Battle#battle + { + last_turns_effects = Effects + }. + +-spec random + ( + id(), + list(player:id()), + battlemap:struct(), + list(character:struct()) + ) + -> struct(). +random (ID, PlayersAsList, Battlemap, Characters) -> + BattlemapWidth = battlemap:get_width(Battlemap), + BattlemapHeight = battlemap:get_height(Battlemap), + {CharacterInstancesAsList, _ForbiddenLocations} = + lists:mapfoldl + ( + fun (Character, ForbiddenLocations) -> + CharacterOwner = character:get_owner_id(Character), + NewCharacterInstance = + character_instance:random + ( + Character, + BattlemapWidth, + BattlemapHeight, + ForbiddenLocations + ), + NewCharacterInstanceActive = + case CharacterOwner of + <<"0">> -> + character_instance:set_is_active + ( + true, + NewCharacterInstance + ); + + _ -> + NewCharacterInstance + end, + NewCharacterInstanceLocation = + character_instance:get_location(NewCharacterInstanceActive), + { + NewCharacterInstanceActive, + [NewCharacterInstanceLocation|ForbiddenLocations] + } + end, + [], + Characters + ), + + #battle + { + id = ID, + battlemap = Battlemap, + character_instances = array:from_list(CharacterInstancesAsList), + player_ids = array:from_list(PlayersAsList), + current_player_turn = player_turn:new(0, 0), + last_turns_effects = [] + }. 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 }. diff --git a/src/struct/battlemap_instance.erl b/src/struct/battlemap_instance.erl deleted file mode 100644 index c3b411b..0000000 --- a/src/struct/battlemap_instance.erl +++ /dev/null @@ -1,196 +0,0 @@ --module(battlemap_instance). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: binary(). - --record -( - battlemap_instance, - { - id :: id(), - battlemap :: battlemap:struct(), - character_instances :: array:array(character_instance:struct()), - player_ids :: array:array(player:id()), - current_player_turn :: player_turn:struct(), - last_turns_effects :: list(any()) - } -). - --opaque struct() :: #battlemap_instance{}. - --export_type([struct/0, id/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --export -( - [ - get_id/1, - get_battlemap/1, - get_character_instances/1, - get_player_ids/1, - get_current_player_turn/1, - get_last_turns_effects/1, - - set_battlemap/2, - set_character_instances/2, - set_player_ids/2, - set_current_player_turn/2, - set_last_turns_effects/2 - ] -). - --export -( - [ - random/4 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --spec get_id (struct()) -> id(). -get_id (BattlemapInstance) -> BattlemapInstance#battlemap_instance.id. - --spec get_battlemap (struct()) -> battlemap:struct(). -get_battlemap (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.battlemap. - --spec get_character_instances (struct()) -> - array:array(character_instance:struct()). -get_character_instances (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.character_instances. - --spec get_player_ids (struct()) -> array:array(player:id()). -get_player_ids (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.player_ids. - --spec get_current_player_turn (struct()) -> player_turn:struct(). -get_current_player_turn (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.current_player_turn. - --spec get_last_turns_effects (struct()) -> list(any()). -get_last_turns_effects (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.last_turns_effects. - --spec set_battlemap (battlemap:struct(), struct()) -> struct(). -set_battlemap (Battlemap, BattlemapInstance) -> - BattlemapInstance#battlemap_instance - { - battlemap = Battlemap - }. - --spec set_character_instances - ( - array:array(character_instance:struct()), - struct() - ) - -> struct(). -set_character_instances (CharacterInstances, BattlemapInstance) -> - BattlemapInstance#battlemap_instance - { - character_instances = CharacterInstances - }. - --spec set_player_ids - ( - array:array(player:id()), - struct() - ) - -> struct(). -set_player_ids (Players, BattlemapInstance) -> - BattlemapInstance#battlemap_instance - { - player_ids = Players - }. - --spec set_current_player_turn - ( - player_turn:struct(), - struct() - ) - -> struct(). -set_current_player_turn (PlayerTurn, BattlemapInstance) -> - BattlemapInstance#battlemap_instance - { - current_player_turn = PlayerTurn - }. - --spec set_last_turns_effects - ( - list(any()), - struct() - ) - -> struct(). -set_last_turns_effects (Effects, BattlemapInstance) -> - BattlemapInstance#battlemap_instance - { - last_turns_effects = Effects - }. - --spec random - ( - id(), - list(player:id()), - battlemap:struct(), - list(character:struct()) - ) - -> struct(). -random (ID, PlayersAsList, Battlemap, Characters) -> - BattlemapWidth = battlemap:get_width(Battlemap), - BattlemapHeight = battlemap:get_height(Battlemap), - {CharacterInstancesAsList, _ForbiddenLocations} = - lists:mapfoldl - ( - fun (Character, ForbiddenLocations) -> - CharacterOwner = character:get_owner_id(Character), - NewCharacterInstance = - character_instance:random - ( - Character, - BattlemapWidth, - BattlemapHeight, - ForbiddenLocations - ), - NewCharacterInstanceActive = - case CharacterOwner of - <<"0">> -> - character_instance:set_is_active - ( - true, - NewCharacterInstance - ); - - _ -> - NewCharacterInstance - end, - NewCharacterInstanceLocation = - character_instance:get_location(NewCharacterInstanceActive), - { - NewCharacterInstanceActive, - [NewCharacterInstanceLocation|ForbiddenLocations] - } - end, - [], - Characters - ), - - #battlemap_instance - { - id = ID, - battlemap = Battlemap, - character_instances = array:from_list(CharacterInstancesAsList), - player_ids = array:from_list(PlayersAsList), - current_player_turn = player_turn:new(0, 0), - last_turns_effects = [] - }. -- cgit v1.2.3-70-g09d2