summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-11 18:30:39 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2018-05-11 18:30:39 +0200 |
commit | e2813997860edc136142f5d8aeb8f5513f9a57db (patch) | |
tree | 7ab923b1d7e9150768c96fbc0f7e2a2b2731d613 | |
parent | 2bea185eb9191ddaeb406cd7ff3bcef37fbc4343 (diff) |
Fusing character & character_instances.
-rw-r--r-- | src/battlemap/src/game-logic/next_turn.erl | 24 | ||||
-rw-r--r-- | src/battlemap/src/game-logic/turn_actions.erl | 120 | ||||
-rw-r--r-- | src/battlemap/src/query/character_turn.erl | 38 | ||||
-rw-r--r-- | src/battlemap/src/query/load_state.erl | 14 | ||||
-rw-r--r-- | src/battlemap/src/reply/add_char.erl | 13 | ||||
-rw-r--r-- | src/battlemap/src/struct/battle.erl | 97 | ||||
-rw-r--r-- | src/battlemap/src/struct/character.erl | 101 | ||||
-rw-r--r-- | src/battlemap/src/struct/character_instance.erl | 167 | ||||
-rw-r--r-- | src/battlemap/src/struct/character_turn_data.erl | 39 | ||||
-rw-r--r-- | src/battlemap/src/struct/character_turn_request.erl | 14 | ||||
-rw-r--r-- | src/battlemap/src/struct/turn_result.erl | 32 |
11 files changed, 254 insertions, 405 deletions
diff --git a/src/battlemap/src/game-logic/next_turn.erl b/src/battlemap/src/game-logic/next_turn.erl index 03d2cbf..af54d3b 100644 --- a/src/battlemap/src/game-logic/next_turn.erl +++ b/src/battlemap/src/game-logic/next_turn.erl @@ -49,23 +49,21 @@ reset_next_player_timeline (Battle) -> -> {battle:type(), list(non_neg_integer())}. activate_next_players_characters (Battle, NextPlayer) -> NextPlayerID = player:get_id(NextPlayer), - CharacterInstances = battle:get_character_instances(Battle), + Characters = battle:get_characters(Battle), - {UpdatedCharacterInstances, ModifiedIXs} = + {UpdatedCharacters, ModifiedIXs} = array_util:mapiff ( - fun (CharacterInstance) -> - Character = character_instance:get_character(CharacterInstance), + fun (Character) -> (character:get_owner_id(Character) == NextPlayerID) end, - fun (CharacterInstance) -> - character_instance:set_is_active(true, CharacterInstance) + fun (Character) -> + character:set_is_active(true, Character) end, - CharacterInstances + Characters ), - UpdatedBattle = - battle:set_character_instances(UpdatedCharacterInstances, Battle), + UpdatedBattle = battle:set_characters(UpdatedCharacters, Battle), {UpdatedBattle, ModifiedIXs}. @@ -92,10 +90,10 @@ update (Update) -> S0Battle = set_player_turn_to_next(Battle), {S1Battle, NextPlayer} = reset_next_player_timeline(S0Battle), - {S2Battle, ActivatedCharacterInstancesIX} = + {S2Battle, ActivatedCharactersIX} = activate_next_players_characters(S1Battle, NextPlayer), - S0Update = add_activation_updates(ActivatedCharacterInstancesIX, Update), + S0Update = add_activation_updates(ActivatedCharactersIX, Update), UpdatedData = character_turn_data:set_battle(S2Battle, Data), @@ -105,9 +103,9 @@ update (Update) -> requires_update (Update) -> Data = character_turn_update:get_data(Update), Battle = character_turn_data:get_battle(Data), - CharacterInstances = battle:get_character_instances(Battle), + Characters = battle:get_characters(Battle), - array_util:none(fun character_instance:get_is_active/1, CharacterInstances). + array_util:none(fun character:get_is_active/1, Characters). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/battlemap/src/game-logic/turn_actions.erl b/src/battlemap/src/game-logic/turn_actions.erl index 29886a1..51c4fb3 100644 --- a/src/battlemap/src/game-logic/turn_actions.erl +++ b/src/battlemap/src/game-logic/turn_actions.erl @@ -25,9 +25,8 @@ -> character_turn_update:type(). handle_switch_weapon (Update) -> Data = character_turn_update:get_data(Update), - CharacterInstance = character_turn_data:get_character_instance(Data), - CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), - Character = character_instance:get_character(CharacterInstance), + Character = character_turn_data:get_character(Data), + CharacterIX = character_turn_data:get_character_ix(Data), CharacterAttributes = character:get_attributes(Character), {PrimaryWeaponID, SecondaryWeaponID} = character:get_weapon_ids(Character), @@ -40,23 +39,16 @@ handle_switch_weapon (Update) -> UpdatedCharacterStatistics, character:set_weapon_ids(UpdatedWeaponIDs, Character) ), - UpdatedCharacterInstance = - character_instance:set_character(UpdatedCharacter, CharacterInstance), % TODO: db update entries... - % {character_instance, CharacterInstanceIX, wp0, SecondaryWeaponID}, - % {character_instance, CharacterInstanceIX, wp1, PrimaryWeaponID} + % {character, CharacterIX, wp0, SecondaryWeaponID}, + % {character, CharacterIX, wp1, PrimaryWeaponID} - UpdatedData = - character_turn_data:set_character_instance - ( - UpdatedCharacterInstance, - Data - ), + UpdatedData = character_turn_data:set_character(UpdatedCharacter, Data), character_turn_update:add_to_timeline ( - turn_result:new_character_switched_weapons(CharacterInstanceIX), + turn_result:new_character_switched_weapons(CharacterIX), character_turn_update:set_data(UpdatedData, Update) ). @@ -68,24 +60,24 @@ handle_switch_weapon (Update) -> ) -> {non_neg_integer(), location:type()}. get_path_cost_and_destination (Data, Path) -> - CharacterInstance = character_turn_data:get_character_instance(Data), - CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), + Character = character_turn_data:get_character(Data), + CharacterIX = character_turn_data:get_character_ix(Data), Battle = character_turn_data:get_battle(Data), Battlemap = battle:get_battlemap(Battle), ForbiddenLocations = array:foldl ( - fun (IX, CharInst, Prev) -> - IsAlive = character_instance:get_is_alive(CharInst), + fun (IX, Char, Prev) -> + IsAlive = character:get_is_alive(Char), if - (IX == CharacterInstanceIX) -> Prev; + (IX == CharacterIX) -> Prev; (not IsAlive) -> Prev; - true -> [character_instance:get_location(CharInst)|Prev] + true -> [character:get_location(Char)|Prev] end end, [], - battle:get_character_instances(Battle) + battle:get_characters(Battle) ), {NewLocation, Cost} = @@ -94,7 +86,7 @@ get_path_cost_and_destination (Data, Path) -> Battlemap, ForbiddenLocations, Path, - character_instance:get_location(CharacterInstance) + character:get_location(Character) ), {Cost, NewLocation}. @@ -106,8 +98,7 @@ get_path_cost_and_destination (Data, Path) -> ) -> 'ok'. assert_character_can_move (Data, Cost) -> - CharacterInstance = character_turn_data:get_character_instance(Data), - Character = character_instance:get_character(CharacterInstance), + Character = character_turn_data:get_character(Data), CharacterStatistics = character:get_statistics(Character), CharacterMovementPoints = statistics:get_movement_points(CharacterStatistics), @@ -125,32 +116,21 @@ assert_character_can_move (Data, Cost) -> -> character_turn_update:type(). commit_move (Update, Path, NewLocation) -> Data = character_turn_update:get_data(Update), - CharacterInstance = character_turn_data:get_character_instance(Data), - CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), + Character = character_turn_data:get_character(Data), + CharacterIX = character_turn_data:get_character_ix(Data), - UpdatedCharacterInstance = - character_instance:set_location(NewLocation, CharacterInstance), + UpdatedCharacter = character:set_location(NewLocation, Character), - UpdatedData = - character_turn_data:set_character_instance - ( - UpdatedCharacterInstance, - Data - ), + UpdatedData = character_turn_data:set_character(UpdatedCharacter, Data), S0Update = character_turn_update:add_to_timeline ( - turn_result:new_character_moved - ( - CharacterInstanceIX, - Path, - NewLocation - ), + turn_result:new_character_moved(CharacterIX, Path, NewLocation), Update ), - %[{character_instance, CharacterInstanceIX, loc, NewLocation}], + %[{character, CharacterIX, loc, NewLocation}], character_turn_update:set_data(UpdatedData, S0Update). @@ -172,19 +152,17 @@ handle_move (Update, BattleAction) -> %%%% ATTACKING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec handle_attack_sequence ( - character_instance:type(), - character_instance:type(), + character:type(), + character:type(), list(attack:step()) ) -> {list(attack:type()), non_neg_integer(), non_neg_integer()}. handle_attack_sequence ( - CharacterInstance, - TargetCharacterInstance, + Character, + TargetCharacter, AttackSequence ) -> - Character = character_instance:get_character(CharacterInstance), - TargetCharacter = character_instance:get_character(TargetCharacterInstance), CharacterStatistics = character:get_statistics(Character), TargetCharacterStatistics = character:get_statistics(TargetCharacter), @@ -228,27 +206,24 @@ handle_attack_sequence end, { [], - character_instance:get_current_health(CharacterInstance), - character_instance:get_current_health(TargetCharacterInstance) + character:get_current_health(Character), + character:get_current_health(TargetCharacter) }, AttackPlannedEffects ). -spec get_attack_sequence ( - character_instance:type(), - character_instance:type() + character:type(), + character:type() ) -> list(attack:step()). -get_attack_sequence (CharacterInstance, TargetCharacterInstance) -> - Character = character_instance:get_character(CharacterInstance), - TargetCharacter = character_instance:get_character(TargetCharacterInstance), - +get_attack_sequence (Character, TargetCharacter) -> Range = location:dist ( - character_instance:get_location(CharacterInstance), - character_instance:get_location(TargetCharacterInstance) + character:get_location(Character), + character:get_location(TargetCharacter) ), {AttackingWeaponID, _} = character:get_weapon_ids(Character), @@ -269,46 +244,45 @@ get_attack_sequence (CharacterInstance, TargetCharacterInstance) -> handle_attack (Update, BattleAction) -> Data = character_turn_update:get_data(Update), Battle = character_turn_data:get_battle(Data), - CharacterInstance = character_turn_data:get_character_instance(Data), - CharacterInstanceIX = character_turn_data:get_character_instance_ix(Data), + Character = character_turn_data:get_character(Data), + CharacterIX = character_turn_data:get_character_ix(Data), TargetIX = battle_action:get_target_ix(BattleAction), - TargetCharacterInstance = battle:get_character_instance(TargetIX, Battle), + TargetCharacter = battle:get_character(TargetIX, Battle), - AttackSequence = - get_attack_sequence(CharacterInstance, TargetCharacterInstance), + AttackSequence = get_attack_sequence(Character, TargetCharacter), {AttackEffects, RemainingAttackerHealth, RemainingDefenderHealth} = handle_attack_sequence ( - CharacterInstance, - TargetCharacterInstance, + Character, + TargetCharacter, AttackSequence ), - UpdatedCharacterInstance = - character_instance:set_current_health + UpdatedCharacter = + character:set_current_health ( RemainingAttackerHealth, - CharacterInstance + Character ), UpdatedBattle = - battle:set_character_instance + battle:set_character ( TargetIX, - character_instance:set_current_health + character:set_current_health ( RemainingDefenderHealth, - TargetCharacterInstance + TargetCharacter ), Battle ), S0Data = character_turn_data:set_battle(UpdatedBattle, Data), S1Data = - character_turn_data:set_character_instance + character_turn_data:set_character ( - UpdatedCharacterInstance, + UpdatedCharacter, S0Data ), @@ -317,7 +291,7 @@ handle_attack (Update, BattleAction) -> ( turn_result:new_character_attacked ( - CharacterInstanceIX, + CharacterIX, TargetIX, AttackEffects ), diff --git a/src/battlemap/src/query/character_turn.erl b/src/battlemap/src/query/character_turn.erl index 0814131..a96f984 100644 --- a/src/battlemap/src/query/character_turn.erl +++ b/src/battlemap/src/query/character_turn.erl @@ -1,5 +1,4 @@ -module(character_turn). -% FIXME: There's still too much of a mess in this module. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -41,12 +40,12 @@ authenticate_user (Request) -> fetch_data (Request) -> PlayerID = character_turn_request:get_player_id(Request), BattleID = character_turn_request:get_battle_id(Request), - CharacterInstanceIX = - character_turn_request:get_character_instance_ix(Request), + CharacterIX = + character_turn_request:get_character_ix(Request), Battle = timed_cache:fetch(battle_db, PlayerID, BattleID), - character_turn_data:new(Battle, CharacterInstanceIX). + character_turn_data:new(Battle, CharacterIX). %%%% ASSERTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec assert_user_is_current_player @@ -72,8 +71,7 @@ assert_user_is_current_player (Data, Request) -> ) -> 'ok'. assert_user_owns_played_character (Data, Request) -> PlayerID = character_turn_request:get_player_id(Request), - CharacterInstance = character_turn_data:get_character_instance(Data), - Character = character_instance:get_character(CharacterInstance), + Character = character_turn_data:get_character(Data), CharacterOwnerID = character:get_owner_id(Character), true = (PlayerID == CharacterOwnerID), @@ -82,9 +80,9 @@ assert_user_owns_played_character (Data, Request) -> -spec assert_character_can_be_played (character_turn_data:type()) -> 'ok'. assert_character_can_be_played (Data) -> - CharacterInstance = character_turn_data:get_character_instance(Data), + Character = character_turn_data:get_character(Data), - true = character_instance:get_is_active(CharacterInstance), + true = character:get_is_active(Character), ok. @@ -101,22 +99,22 @@ assert_user_permissions (Data, Request) -> ok. %%%% QUERY LOGIC HANDLING %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec finalize_character_instance +-spec finalize_character ( character_turn_update:type() ) -> character_turn_update:type(). -finalize_character_instance (Update) -> +finalize_character (Update) -> Data = character_turn_update:get_data(Update), - CharacterInstance = character_turn_data:get_character_instance(Data), + Character = character_turn_data:get_character(Data), - DisabledCharacterInstance = - character_instance:set_is_active(false, CharacterInstance), + DisabledCharacter = + character:set_is_active(false, Character), UpdatedData = - character_turn_data:set_character_instance + character_turn_data:set_character ( - DisabledCharacterInstance, + DisabledCharacter, Data ), FinalizedData = character_turn_data:clean_battle(UpdatedData), @@ -136,7 +134,7 @@ handle_actions (Data, Request) -> PostActionsUpdate = lists:foldl(fun turn_actions:handle/2, EmptyUpdate, Actions), - finalize_character_instance(PostActionsUpdate). + finalize_character(PostActionsUpdate). -spec update_timeline ( @@ -205,13 +203,7 @@ send_to_cache (Update, Request) -> Data = character_turn_update:get_data(Update), Battle = character_turn_data:get_battle(Data), - timed_cache:update - ( - battle_db, - PlayerID, - BattleID, - Battle - ), + timed_cache:update(battle_db, PlayerID, BattleID, Battle), ok. diff --git a/src/battlemap/src/query/load_state.erl b/src/battlemap/src/query/load_state.erl index 37a30cf..f905892 100644 --- a/src/battlemap/src/query/load_state.erl +++ b/src/battlemap/src/query/load_state.erl @@ -53,13 +53,7 @@ fetch_data (Input) -> PlayerID = Input#input.player_id, BattleID = Input#input.battle_id, - Battle = - timed_cache:fetch - ( - battle_db, - PlayerID, - BattleID - ), + Battle = timed_cache:fetch (battle_db, PlayerID, BattleID), #query_state { @@ -81,10 +75,10 @@ generate_reply (QueryState, Input) -> ( array:map ( - fun (IX, CharacterInstance) -> - add_char:generate(IX, CharacterInstance, PlayerID) + fun (IX, Character) -> + add_char:generate(IX, Character, PlayerID) end, - battle:get_character_instances(Battle) + battle:get_characters(Battle) ) ) ] diff --git a/src/battlemap/src/reply/add_char.erl b/src/battlemap/src/reply/add_char.erl index 7fad9a0..86b1e9c 100644 --- a/src/battlemap/src/reply/add_char.erl +++ b/src/battlemap/src/reply/add_char.erl @@ -35,19 +35,18 @@ attributes_as_json (Attributes) -> -spec generate ( non_neg_integer(), - character_instance:type(), + character:type(), player:id() ) -> {list(any())}. -generate (IX, CharacterInstance, PlayerID) -> - Character = character_instance:get_character(CharacterInstance), - IsAlive = character_instance:get_is_alive(CharacterInstance), +generate (IX, Character, PlayerID) -> + IsAlive = character:get_is_alive(Character), Attributes = character:get_attributes(Character), {ActiveWeapon, SecondaryWeapon} = character:get_weapon_ids(Character), OwnerID = character:get_owner_id(Character), Location = case IsAlive of - true -> character_instance:get_location(CharacterInstance); + true -> character:get_location(Character); _ -> location:get_nowhere() end, @@ -60,14 +59,14 @@ generate (IX, CharacterInstance, PlayerID) -> {<<"prt">>, character:get_portrait(Character)}, { <<"hea">>, - character_instance:get_current_health(CharacterInstance) + character:get_current_health(Character) }, {<<"lc">>, location:encode(Location)}, {<<"pla">>, OwnerID}, { <<"ena">>, ( - character_instance:get_is_active(CharacterInstance) + character:get_is_active(Character) and (OwnerID == PlayerID) ) diff --git a/src/battlemap/src/struct/battle.erl b/src/battlemap/src/struct/battle.erl index 259e7f0..59cc581 100644 --- a/src/battlemap/src/struct/battle.erl +++ b/src/battlemap/src/struct/battle.erl @@ -11,7 +11,7 @@ { id :: id(), battlemap :: battlemap:type(), - character_instances :: array:array(character_instance:type()), + characters :: array:array(character:type()), players :: array:array(player:type()), current_player_turn :: player_turn:type() } @@ -30,16 +30,16 @@ [ get_id/1, get_battlemap/1, - get_character_instances/1, - get_character_instance/2, + get_characters/1, + get_character/2, get_players/1, get_player/2, get_current_player_turn/1, get_encoded_last_turns_effects/1, set_battlemap/2, - set_character_instances/2, - set_character_instance/3, + set_characters/2, + set_character/3, set_players/2, set_player/3, set_current_player_turn/2 @@ -80,15 +80,13 @@ get_id (Battle) -> Battle#battle.id. get_battlemap (Battle) -> Battle#battle.battlemap. --spec get_character_instances (type()) -> - array:array(character_instance:type()). -get_character_instances (Battle) -> - Battle#battle.character_instances. +-spec get_characters (type()) -> array:array(character:type()). +get_characters (Battle) -> + Battle#battle.characters. --spec get_character_instance (non_neg_integer(), type()) -> - character_instance:type(). -get_character_instance (IX, Battle) -> - array:get(IX, Battle#battle.character_instances). +-spec get_character (non_neg_integer(), type()) -> character:type(). +get_character (IX, Battle) -> + array:get(IX, Battle#battle.characters). -spec get_players (type()) -> array:array(player:type()). get_players (Battle) -> @@ -119,56 +117,34 @@ set_battlemap (Battlemap, Battle) -> battlemap = Battlemap }. --spec set_character_instances - ( - array:array(character_instance:type()), - type() - ) - -> type(). -set_character_instances (CharacterInstances, Battle) -> +-spec set_characters (array:array(character:type()), type()) -> type(). +set_characters (Characters, Battle) -> Battle#battle { - character_instances = CharacterInstances + characters = Characters }. --spec set_character_instance - ( - non_neg_integer(), - character_instance:type(), - type() - ) - -> type(). -set_character_instance (IX, CharacterInstance, Battle) -> +-spec set_character (non_neg_integer(), character:type(), type()) -> type(). +set_character (IX, Character, Battle) -> Battle#battle { - character_instances = + characters = array:set ( IX, - CharacterInstance, - Battle#battle.character_instances + Character, + Battle#battle.characters ) }. --spec set_players - ( - array:array(player:type()), - type() - ) - -> type(). +-spec set_players (array:array(player:type()), type()) -> type(). set_players (Players, Battle) -> Battle#battle { players = Players }. --spec set_player - ( - non_neg_integer(), - player:type(), - type() - ) - -> type(). +-spec set_player (non_neg_integer(), player:type(), type()) -> type(). set_player (IX, Player, Battle) -> Battle#battle { @@ -181,12 +157,7 @@ set_player (IX, Player, Battle) -> ) }. --spec set_current_player_turn - ( - player_turn:type(), - type() - ) - -> type(). +-spec set_current_player_turn (player_turn:type(), type()) -> type(). set_current_player_turn (PlayerTurn, Battle) -> Battle#battle { @@ -204,36 +175,36 @@ set_current_player_turn (PlayerTurn, Battle) -> random (ID, PlayersAsList, Battlemap, Characters) -> BattlemapWidth = battlemap:get_width(Battlemap), BattlemapHeight = battlemap:get_height(Battlemap), - {CharacterInstancesAsList, _ForbiddenLocations} = + {CharactersAsList, _ForbiddenLocations} = lists:mapfoldl ( fun (Character, ForbiddenLocations) -> CharacterOwner = character:get_owner_id(Character), - NewCharacterInstance = - character_instance:random + NewCharacter = + character:random ( Character, BattlemapWidth, BattlemapHeight, ForbiddenLocations ), - NewCharacterInstanceActive = + NewCharacterActive = case CharacterOwner of <<"0">> -> - character_instance:set_is_active + character:set_is_active ( true, - NewCharacterInstance + NewCharacter ); _ -> - NewCharacterInstance + NewCharacter end, - NewCharacterInstanceLocation = - character_instance:get_location(NewCharacterInstanceActive), + NewCharacterLocation = + character:get_location(NewCharacterActive), { - NewCharacterInstanceActive, - [NewCharacterInstanceLocation|ForbiddenLocations] + NewCharacterActive, + [NewCharacterLocation|ForbiddenLocations] } end, [], @@ -244,7 +215,7 @@ random (ID, PlayersAsList, Battlemap, Characters) -> { id = ID, battlemap = Battlemap, - character_instances = array:from_list(CharacterInstancesAsList), + characters = array:from_list(CharactersAsList), players = array:from_list(PlayersAsList), current_player_turn = player_turn:new(0, 0) }. diff --git a/src/battlemap/src/struct/character.erl b/src/battlemap/src/struct/character.erl index 34a44a1..930bdc9 100644 --- a/src/battlemap/src/struct/character.erl +++ b/src/battlemap/src/struct/character.erl @@ -16,7 +16,10 @@ portrait :: binary(), attributes :: attributes:type(), statistics :: statistics:type(), - weapon_ids :: {weapon:id(), weapon:id()} + weapon_ids :: {weapon:id(), weapon:id()}, + location :: {non_neg_integer(), non_neg_integer()}, + current_health :: non_neg_integer(), + active :: boolean() } ). @@ -38,22 +41,53 @@ get_attributes/1, get_statistics/1, get_weapon_ids/1, + get_location/1, + get_current_health/1, + get_is_alive/1, + get_is_active/1, set_weapon_ids/2, - set_statistics/2 + set_statistics/2, + set_location/2, + set_current_health/2, + set_is_active/2 ] ). -export ( [ - random/2 + 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 = roll:between(0, (BattlemapWidth - 1)), + Y = 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -83,6 +117,52 @@ get_weapon_ids (Char) -> Char#character.weapon_ids. -spec get_statistics (type()) -> statistics:type(). get_statistics (Char) -> Char#character.statistics. +-spec get_location (type()) -> {non_neg_integer(), non_neg_integer()}. +get_location (Char) -> + true = get_is_alive(Char), + Char#character.location. + +-spec get_current_health (type()) -> non_neg_integer(). +get_current_health (Char) -> Char#character.current_health. + +-spec get_is_alive (type()) -> boolean(). +get_is_alive (Char) -> + (Char#character.current_health > 0). + +-spec get_is_active (type()) -> boolean(). +get_is_active (Char) -> + ( + Char#character.active + and + get_is_alive(Char) + ). + +-spec set_location + ( + {non_neg_integer(), non_neg_integer()}, + type() + ) + -> type(). +set_location (Location, Char) -> + Char#character + { + location = Location + }. + +-spec set_current_health (non_neg_integer(), type()) -> type(). +set_current_health (Health, Char) -> + Char#character + { + current_health = max(0, Health) + }. + +-spec set_is_active (boolean(), type()) -> type(). +set_is_active (Active, Char) -> + Char#character + { + active = Active + }. + -spec set_weapon_ids ( {weapon:id(), weapon:id()}, @@ -107,13 +187,19 @@ set_statistics (Stats, Char) -> statistics = Stats }. +%%%% Utils -spec random ( non_neg_integer(), - player:id() + player:id(), + non_neg_integer(), + non_neg_integer(), + list({non_neg_integer(), non_neg_integer()}) ) -> type(). -random (ID, OwnerID) -> +random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) -> + Location = + find_random_location(BattlemapWidth, BattlemapHeight, ForbiddenLocations), WeaponIDs = {weapon:random_id(), weapon:random_id()}, Attributes = attributes:random(), Statistics = statistics:new(Attributes, WeaponIDs), @@ -129,5 +215,8 @@ random (ID, OwnerID) -> portrait = IDAsBinaryString, attributes = Attributes, weapon_ids = WeaponIDs, - statistics = Statistics + statistics = Statistics, + location = Location, + current_health = statistics:get_health(Statistics), + active = false }. diff --git a/src/battlemap/src/struct/character_instance.erl b/src/battlemap/src/struct/character_instance.erl deleted file mode 100644 index 912f2cf..0000000 --- a/src/battlemap/src/struct/character_instance.erl +++ /dev/null @@ -1,167 +0,0 @@ --module(character_instance). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --record -( - character_instance, - { - character :: character:type(), - location :: {non_neg_integer(), non_neg_integer()}, - current_health :: non_neg_integer(), - active :: boolean() - } -). - --opaque type() :: #character_instance{}. - --export_type([type/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export -( - [ - new/2, - random/4 - ] -). - -%%%% Accessors --export -( - [ - get_character/1, - get_location/1, - get_current_health/1, - get_is_alive/1, - get_is_active/1, - - set_character/2, - set_location/2, - set_current_health/2, - set_is_active/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% 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 = roll:between(0, (BattlemapWidth - 1)), - Y = 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_character (type()) -> character:type(). -get_character (CharInst) -> CharInst#character_instance.character. - --spec get_location (type()) -> {non_neg_integer(), non_neg_integer()}. -get_location (CharInst) -> - true = get_is_alive(CharInst), - CharInst#character_instance.location. - --spec get_current_health (type()) -> non_neg_integer(). -get_current_health (CharInst) -> CharInst#character_instance.current_health. - --spec get_is_alive (type()) -> boolean(). -get_is_alive (CharInst) -> - (CharInst#character_instance.current_health > 0). - --spec get_is_active (type()) -> boolean(). -get_is_active (CharInst) -> - ( - CharInst#character_instance.active - and - get_is_alive(CharInst) - ). - --spec set_character (character:type(), type()) -> type(). -set_character (Char, CharInst) -> - CharInst#character_instance - { - character = Char - }. - --spec set_location - ( - {non_neg_integer(), non_neg_integer()}, - type() - ) - -> type(). -set_location (Location, CharInst) -> - CharInst#character_instance - { - location = Location - }. - --spec set_current_health (non_neg_integer(), type()) -> type(). -set_current_health (Health, CharInst) -> - CharInst#character_instance - { - current_health = max(0, Health) - }. - --spec set_is_active (boolean(), type()) -> type(). -set_is_active (Active, CharInst) -> - CharInst#character_instance - { - active = Active - }. - -%%%% Utils --spec new - ( - character:type(), - {non_neg_integer(), non_neg_integer()} - ) - -> type(). -new (Character, Location) -> - CharacterStatistics = character:get_statistics(Character), - #character_instance - { - character = Character, - location = Location, - current_health = statistics:get_health(CharacterStatistics), - active = false - }. - --spec random - ( - character:type(), - non_neg_integer(), - non_neg_integer(), - list({non_neg_integer(), non_neg_integer()}) - ) - -> type(). -random (Character, BattlemapWidth, BattlemapHeight, ForbiddenLocations) -> - new - ( - Character, - find_random_location(BattlemapWidth, BattlemapHeight, ForbiddenLocations) - ). diff --git a/src/battlemap/src/struct/character_turn_data.erl b/src/battlemap/src/struct/character_turn_data.erl index ca0954e..6ea744b 100644 --- a/src/battlemap/src/struct/character_turn_data.erl +++ b/src/battlemap/src/struct/character_turn_data.erl @@ -9,8 +9,8 @@ { dirty :: boolean(), battle :: battle:type(), - character_instance :: character_instance:type(), - character_instance_ix :: non_neg_integer() + character :: character:type(), + character_ix :: non_neg_integer() } ). @@ -28,11 +28,11 @@ get_battle_is_dirty/1, get_battle/1, - get_character_instance/1, - get_character_instance_ix/1, + get_character/1, + get_character_ix/1, set_battle/2, - set_character_instance/2 + set_character/2 ] ). @@ -51,16 +51,15 @@ %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec new (battle:type(), non_neg_integer()) -> type(). -new (Battle, CharacterInstanceIX) -> - CharacterInstance = - battle:get_character_instance(CharacterInstanceIX, Battle), +new (Battle, CharacterIX) -> + Character = battle:get_character(CharacterIX, Battle), #type { dirty = false, battle = Battle, - character_instance = CharacterInstance, - character_instance_ix = CharacterInstanceIX + character = Character, + character_ix = CharacterIX }. -spec get_battle_is_dirty (type()) -> boolean(). @@ -69,22 +68,22 @@ get_battle_is_dirty (Data) -> Data#type.dirty. -spec get_battle (type()) -> battle:type(). get_battle (Data) -> Data#type.battle. --spec get_character_instance (type()) -> character_instance:type(). -get_character_instance (Data) -> Data#type.character_instance. +-spec get_character (type()) -> character:type(). +get_character (Data) -> Data#type.character. --spec get_character_instance_ix (type()) -> non_neg_integer(). -get_character_instance_ix (Data) -> Data#type.character_instance_ix. +-spec get_character_ix (type()) -> non_neg_integer(). +get_character_ix (Data) -> Data#type.character_ix. -spec set_battle (battle:type(), type()) -> type(). set_battle (Battle, Data) -> Data#type{ battle = Battle }. --spec set_character_instance (character_instance:type(), type()) -> type(). -set_character_instance (CharacterInstance, Data) -> +-spec set_character (character:type(), type()) -> type(). +set_character (Character, Data) -> Data#type { dirty = true, - character_instance = CharacterInstance + character = Character }. -spec clean_battle (type()) -> type(). @@ -93,10 +92,10 @@ clean_battle (Data) -> { dirty = false, battle = - battle:set_character_instance + battle:set_character ( - Data#type.character_instance_ix, - Data#type.character_instance, + Data#type.character_ix, + Data#type.character, Data#type.battle ) }. diff --git a/src/battlemap/src/struct/character_turn_request.erl b/src/battlemap/src/struct/character_turn_request.erl index 1cfb212..ca8f44f 100644 --- a/src/battlemap/src/struct/character_turn_request.erl +++ b/src/battlemap/src/struct/character_turn_request.erl @@ -3,7 +3,7 @@ -define(PLAYER_ID_FIELD, <<"pid">>). -define(SESSION_TOKEN_FIELD, <<"stk">>). -define(BATTLE_ID_FIELD, <<"bid">>). --define(CHAR_INST_IX_FIELD, <<"cix">>). +-define(CHAR_IX_FIELD, <<"cix">>). -define(ACTIONS_FIELD, <<"act">>). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,7 +16,7 @@ player_id :: player:id(), session_token :: binary(), battle_id :: binary(), - character_instance_ix :: non_neg_integer(), + character_ix :: non_neg_integer(), actions :: list(battle_action:type()) } ). @@ -41,7 +41,7 @@ get_player_id/1, get_session_token/1, get_battle_id/1, - get_character_instance_ix/1, + get_character_ix/1, get_actions/1 ] ). @@ -55,7 +55,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec decode (map()) -> type(). decode (Map) -> - CharacterInstanceIX = binary_to_integer(maps:get(?CHAR_INST_IX_FIELD, Map)), + CharacterIX = binary_to_integer(maps:get(?CHAR_IX_FIELD, Map)), EncodedActions = maps:get(?ACTIONS_FIELD, Map), Actions = lists:map(fun battle_action:decode/1, EncodedActions), @@ -64,7 +64,7 @@ decode (Map) -> player_id = maps:get(?PLAYER_ID_FIELD, Map), session_token = maps:get(?SESSION_TOKEN_FIELD, Map), battle_id = maps:get(?BATTLE_ID_FIELD, Map), - character_instance_ix = CharacterInstanceIX, + character_ix = CharacterIX, actions = Actions }. @@ -77,8 +77,8 @@ get_session_token (Request) -> Request#type.session_token. -spec get_battle_id (type()) -> binary(). get_battle_id (Request) -> Request#type.battle_id. --spec get_character_instance_ix (type()) -> non_neg_integer(). -get_character_instance_ix (Request) -> Request#type.character_instance_ix. +-spec get_character_ix (type()) -> non_neg_integer(). +get_character_ix (Request) -> Request#type.character_ix. -spec get_actions (type()) -> list(battle_action:type()). get_actions (Request) -> Request#type.actions. diff --git a/src/battlemap/src/struct/turn_result.erl b/src/battlemap/src/struct/turn_result.erl index 53ae94e..42a3a18 100644 --- a/src/battlemap/src/struct/turn_result.erl +++ b/src/battlemap/src/struct/turn_result.erl @@ -8,7 +8,7 @@ ( switched_weapon, { - character_instance_ix :: character_instance:id() + character_ix :: character:id() } ). @@ -16,7 +16,7 @@ ( moved, { - character_instance_ix :: character_instance:id(), + character_ix :: character:id(), path :: list(direction:enum()), new_location :: location:type() } @@ -26,8 +26,8 @@ ( attacked, { - attacker_ix :: character_instance:id(), - defender_ix :: character_instance:id(), + attacker_ix :: character:id(), + defender_ix :: character:id(), sequence :: list(attack:type()) } ). @@ -62,29 +62,29 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new_character_switched_weapons (character_instance:id()) -> type(). -new_character_switched_weapons (CharacterInstanceIX) -> - #switched_weapon { character_instance_ix = CharacterInstanceIX }. +-spec new_character_switched_weapons (character:id()) -> type(). +new_character_switched_weapons (CharacterIX) -> + #switched_weapon { character_ix = CharacterIX }. -spec new_character_moved ( - character_instance:id(), + character:id(), list(direction:enum()), location:type() ) -> type(). -new_character_moved (CharacterInstanceIX, Path, NewLocation) -> +new_character_moved (CharacterIX, Path, NewLocation) -> #moved { - character_instance_ix = CharacterInstanceIX, + character_ix = CharacterIX, path = Path, new_location = NewLocation }. -spec new_character_attacked ( - character_instance:id(), - character_instance:id(), + character:id(), + character:id(), list(attack:type()) ) -> type(). @@ -98,16 +98,16 @@ new_character_attacked (AttackerIX, DefenderIX, AttackSequence) -> -spec encode (type()) -> {list(any())}. encode (TurnResult) when is_record(TurnResult, switched_weapon) -> - CharacterInstanceIX = TurnResult#switched_weapon.character_instance_ix, + CharacterIX = TurnResult#switched_weapon.character_ix, { [ {<<"t">>, <<"swp">>}, - {<<"ix">>, CharacterInstanceIX} + {<<"ix">>, CharacterIX} ] }; encode (TurnResult) when is_record(TurnResult, moved) -> - CharacterInstanceIX = TurnResult#moved.character_instance_ix, + CharacterIX = TurnResult#moved.character_ix, Path = TurnResult#moved.path, NewLocation = TurnResult#moved.new_location, @@ -117,7 +117,7 @@ encode (TurnResult) when is_record(TurnResult, moved) -> { [ {<<"t">>, <<"mv">>}, - {<<"ix">>, CharacterInstanceIX}, + {<<"ix">>, CharacterIX}, {<<"p">>, EncodedPath}, {<<"nlc">>, EncodedNewLocation} ] |