summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/battlemap/movement.erl | 8 | ||||
-rw-r--r-- | src/query/character_turn.erl | 111 | ||||
-rw-r--r-- | src/query/character_turn/handle_character_instance_attacking_2.erl | 30 | ||||
-rw-r--r-- | src/query/load_state.erl | 8 | ||||
-rw-r--r-- | src/reply/add_char.erl | 4 | ||||
-rw-r--r-- | src/reply/set_map.erl | 2 | ||||
-rw-r--r-- | src/shim/database_shim.erl | 9 | ||||
-rw-r--r-- | src/struct/battlemap.erl | 2 | ||||
-rw-r--r-- | src/struct/battlemap_instance.erl | 36 | ||||
-rw-r--r-- | src/struct/player_turn.erl | 10 | ||||
-rw-r--r-- | src/struct/weapon.erl | 11 |
11 files changed, 149 insertions, 82 deletions
diff --git a/src/battlemap/movement.erl b/src/battlemap/movement.erl index 7fc5db1..513d032 100644 --- a/src/battlemap/movement.erl +++ b/src/battlemap/movement.erl @@ -41,12 +41,13 @@ location_to_array_index (ArrayWidth, X, Y) -> cross (_Battlemap, _ForbiddenLocations, [], Cost, X, Y) -> {{X, Y}, Cost}; cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) -> - BattlemapTiles = battlemap:get_tiles(Battlemap), + BattlemapWidth = battlemap:get_width(Battlemap), + BattlemapTiles = battlemap:get_tile_ids(Battlemap), {NextX, NextY} = location_after_step(Step, X, Y), NextTileIX = - location_to_array_index(array:size(BattlemapTiles), NextX, NextY), - NextTile = array:get(array:get(NextTileIX, BattlemapTiles)), + location_to_array_index(BattlemapWidth, NextX, NextY), + NextTile = array:get(NextTileIX, BattlemapTiles), NextCost = (Cost + tile:get_cost(NextTile)), IsForbidden = array:foldl @@ -54,6 +55,7 @@ cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) -> fun (_IX, Location, Prev) -> (Prev or ({NextX, NextY} == Location)) end, + false, ForbiddenLocations ), diff --git a/src/query/character_turn.erl b/src/query/character_turn.erl index 0519a80..33684d9 100644 --- a/src/query/character_turn.erl +++ b/src/query/character_turn.erl @@ -91,11 +91,11 @@ assert_character_instance_can_be_played (QueryState, Input) -> ControlledCharacterInstance = QueryState#query_state.character_instance, %%% Asserts PlayerID = - arrays:get + array:get ( player_turn:get_player_ix ( - battlemap_instance:get_player_turn(BattlemapInstance) + battlemap_instance:get_current_player_turn(BattlemapInstance) ), battlemap_instance:get_player_ids(BattlemapInstance) ), @@ -111,6 +111,8 @@ handle_character_instance_moving (QueryState, Input) -> ControlledCharacterInstance = QueryState#query_state.character_instance, ControlledCharacter = character_instance:get_character(ControlledCharacterInstance), + ControlledCharacterIX = Input#input.character_instance_ix, + Path = Input#input.path, Battlemap = battlemap_instance:get_battlemap(BattlemapInstance), ControlledCharacterStatistics = @@ -121,7 +123,9 @@ handle_character_instance_moving (QueryState, Input) -> ForbiddenLocations = array:map ( - fun character_instance:get_location/1, + fun (_IX, CharacterInstance) -> + character_instance:get_location(CharacterInstance) + end, battlemap_instance:get_character_instances(BattlemapInstance) ), {NewLocation, Cost} = @@ -133,19 +137,35 @@ handle_character_instance_moving (QueryState, Input) -> character_instance:get_location(ControlledCharacterInstance) ), + io:format + ( + "~nMoving from ~p to ~p (cost ~p) with ~p movement points.~n", + [ + character_instance:get_location(ControlledCharacterInstance), + NewLocation, + Cost, + ControlledCharacterMovementPoints + ] + ), + true = (Cost =< ControlledCharacterMovementPoints), - QueryState#query_state + UpdatedQueryState = + QueryState#query_state + { + character_instance = + character_instance:set_location + ( + NewLocation, + ControlledCharacterInstance + ) + }, { - character_instance = - character_instance:set_location - ( - NewLocation, - ControlledCharacterInstance - ) + [{move, ControlledCharacterIX, NewLocation}], + UpdatedQueryState }. -handle_character_instance_switching_weapons (QueryState) -> +handle_character_instance_switching_weapons (QueryState, Input) -> ControlledCharacterInstance = QueryState#query_state.character_instance, ControlledCharacter = character_instance:get_character(ControlledCharacterInstance), @@ -153,6 +173,7 @@ handle_character_instance_switching_weapons (QueryState) -> character:get_attributes(ControlledCharacter), {PrimaryWeapon, SecondaryWeapon} = character:get_weapons(ControlledCharacter), + ControlledCharacterIX = Input#input.character_instance_ix, UpdatedWeapons = {SecondaryWeapon, PrimaryWeapon}, UpdatedControlledCharacterStatistics = @@ -176,10 +197,15 @@ handle_character_instance_switching_weapons (QueryState) -> UpdatedControlledCharacter, ControlledCharacterInstance ), + UpdatedQueryState = + QueryState#query_state + { + character_instance = UpdatedControlledCharacterInstance + }, - QueryState#query_state { - character_instance = UpdatedControlledCharacterInstance + [{switch_weapons, ControlledCharacterIX}], + UpdatedQueryState }. -include("character_turn/handle_character_instance_attacking_2.erl"). @@ -197,7 +223,7 @@ get_type_of_turn (Input) -> finalize_character_instance (QueryState, Input) -> BattlemapInstance = QueryState#query_state.battlemap_instance, FinalizedCharacterInstance = - character_instance:set_active + character_instance:set_is_active ( false, QueryState#query_state.character_instance @@ -251,7 +277,7 @@ activate_relevant_character_instances (IXs, CharacterInstances, Owner, IX) -> start_next_players_turn (QueryState) -> BattlemapInstance = QueryState#query_state.battlemap_instance, PlayerIDs = battlemap_instance:get_player_ids(BattlemapInstance), - PlayerTurn = battlemap_instance:get_player_turn(BattlemapInstance), + PlayerTurn = battlemap_instance:get_current_player_turn(BattlemapInstance), CurrentPlayerIX = player_turn:get_player_ix(PlayerTurn), CurrentTurnNumber = player_turn:get_number(PlayerTurn), CharacterInstances = @@ -299,6 +325,7 @@ finalize_character_turn (QueryState) -> fun (_IX, CharacterInstance, Prev) -> (Prev or character_instance:get_is_active(CharacterInstance)) end, + false, CharacterInstances ), @@ -321,29 +348,38 @@ finalize_character_turn (QueryState) -> } end. -play (QueryState, [], _Input) -> - QueryState; -play (QueryState, [nothing|Next], Input) -> - play(QueryState, Next, Input); -play (QueryState, [move|Next], Input) -> +play (DiffUpdate, QueryState, [], _Input) -> + {DiffUpdate, QueryState}; +play (DiffUpdate, QueryState, [nothing|Next], Input) -> + play(DiffUpdate, QueryState, Next, Input); +play (DiffUpdate, QueryState, [move|Next], Input) -> + {AddedDiffContent, NewQueryState} = + handle_character_instance_moving(QueryState, Input), play ( - handle_character_instance_moving(QueryState, Input), + (AddedDiffContent ++ DiffUpdate), + NewQueryState, Next, Input ); -play (QueryState, [switch|Next], Input) -> +play (DiffUpdate, QueryState, [switch|Next], Input) -> + {AddedDiffContent, NewQueryState} = + handle_character_instance_switching_weapons(QueryState, Input), play ( - handle_character_instance_switching_weapons(QueryState), + (AddedDiffContent ++ DiffUpdate), + NewQueryState, Next, Input ); -play (QueryState, [attack|Next], Input) -> +play (DiffUpdate, QueryState, [attack|Next], Input) -> + {AddedDiffContent, NewQueryState} = + handle_character_instance_attacking(QueryState, Input), play ( - handle_character_instance_attacking(QueryState, Input), + (AddedDiffContent ++ DiffUpdate), + NewQueryState, Next, Input ). @@ -375,29 +411,36 @@ update_cache (QueryResult, Input) -> BattlemapInstance ). -generate_reply (_QueryResult, _TurnType, _Input) -> - unimplemented. +generate_reply (_QueryResult, DiffUpdate, _TurnType, _Input) -> + %% TODO + jiffy:encode + ( + [ + [ + <<"raw">>, + list_to_binary(io_lib:format("~p", [DiffUpdate])) + ] + ] + ). handle (Req) -> Input = parse_input(Req), security:assert_identity(Input#input.player_id, Input#input.session_token), security:lock_queries(Input#input.player_id), QueryState = fetch_data(Input), - assert_character_instance_can_be_played(Input, QueryState), + assert_character_instance_can_be_played(QueryState, Input), TurnType = get_type_of_turn(Input), + {DiffUpdate, UpdatedQueryState} = play([], QueryState, TurnType, Input), QueryResult = finalize_character_turn ( - finalize_character_instance - ( - play(QueryState, TurnType, Input), - Input - ) + finalize_character_instance(UpdatedQueryState, Input) ), send_to_database(QueryResult, TurnType, Input), update_cache(QueryResult, Input), + io:format("~nCharacter turn result:~n~p~n", [DiffUpdate]), security:unlock_queries(Input#input.player_id), - generate_reply(QueryResult, TurnType, Input). + generate_reply(QueryResult, DiffUpdate, TurnType, Input). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/query/character_turn/handle_character_instance_attacking_2.erl b/src/query/character_turn/handle_character_instance_attacking_2.erl index 52c3f3d..5f34d05 100644 --- a/src/query/character_turn/handle_character_instance_attacking_2.erl +++ b/src/query/character_turn/handle_character_instance_attacking_2.erl @@ -1,3 +1,4 @@ +%% FIXME: parry not working as intended roll_hits (AttackerStatistics, DefenderStatistics) -> DefenderDodges = statistics:get_dodges(DefenderStatistics), AttackerAccuracy = statistics:get_accuracy(AttackerStatistics), @@ -28,7 +29,6 @@ handle_attack (AttackerStatistics, DefenderStatistics) -> end. -%% FIXME: parry not working as intended handle_attacks ([], _AttackerStatistics, _DefenderStatistics, Results) -> Results; handle_attacks @@ -53,7 +53,7 @@ handle_attacks DefenderStatistics, Results ) -> - SecondHitChance = statistics:get_second_hits(AttackerStatistics), + SecondHitChance = statistics:get_double_hits(AttackerStatistics), UpdatedResults = case roll:percentage() of X when (X =< SecondHitChance) -> @@ -100,7 +100,7 @@ handle_attacks DefenderStatistics, Results ) -> - SecondHitChance = statistics:get_second_hits(AttackerStatistics), + SecondHitChance = statistics:get_double_hits(AttackerStatistics), ParryChance = statistics:get_parries(DefenderStatistics), AttackResult = case roll:percentage() of @@ -172,7 +172,7 @@ when ((Action == first) or (Action == second)) -> ); false -> - ValidEffects + {ValidEffects, AttackerHealth, DefenderHealth} end; apply_attacks_to_healths ( @@ -199,7 +199,7 @@ when ); false -> - ValidEffects + {ValidEffects, AttackerHealth, DefenderHealth} end. set_new_healths_in_query_state @@ -231,16 +231,18 @@ set_new_healths_in_query_state TargettedCharacterInstanceIX, character_instance:set_current_health ( - TargettedCharacterInstance, - RemainingDefenderHealth - ) - ) + RemainingDefenderHealth, + TargettedCharacterInstance + ), + CharacterInstances + ), + BattlemapInstance ), character_instance = character_instance:set_current_health ( - ControlledCharacterInstance, - RemainingAttackerHealth + RemainingAttackerHealth, + ControlledCharacterInstance ) }. @@ -286,9 +288,9 @@ handle_character_instance_attacking (QueryState, Input) -> Actions = case {CanDefend, CanParry} of {true, true} -> - [{attack, parry}, counter, {attack, parry}]; + [{second, parry}, counter, {first, parry}]; {true, false} -> - [second, counter, no_parry]; + [second, counter, first]; {false, _} -> [second, first] end, @@ -313,9 +315,9 @@ handle_character_instance_attacking (QueryState, Input) -> RemainingEffects, set_new_healths_in_query_state ( - QueryState, RemainingAttackerHealth, RemainingDefenderHealth, + QueryState, Input ) }. diff --git a/src/query/load_state.erl b/src/query/load_state.erl index d17c78d..4ad1d45 100644 --- a/src/query/load_state.erl +++ b/src/query/load_state.erl @@ -65,15 +65,13 @@ generate_reply (QueryState) -> jiffy:encode ( [ - set_map:generate(battlemap_instange:get_battlemap(BattlemapInstance)) + set_map:generate(battlemap_instance:get_battlemap(BattlemapInstance)) | - array:to_list + array:sparse_to_list ( array:map ( - fun (CharacterInstance) -> - add_char:generate(CharacterInstance) - end, + fun add_char:generate/2, battlemap_instance:get_character_instances(BattlemapInstance) ) ) diff --git a/src/reply/add_char.erl b/src/reply/add_char.erl index 5e2bf56..7d30bac 100644 --- a/src/reply/add_char.erl +++ b/src/reply/add_char.erl @@ -28,7 +28,7 @@ encode (IX, CharacterInstance) -> Character = character_instance:get_character(CharacterInstance), {X, Y} = character_instance:get_location(CharacterInstance), Attributes = character:get_attributes(Character), - {ActiveWeapon, SecondaryWeapon} = character:get_weapons(Character), + {ActiveWeapon, SecondaryWeapon} = character:get_weapon_ids(Character), jiffy:encode ( @@ -44,7 +44,7 @@ encode (IX, CharacterInstance) -> }, {<<"lcx">>, X}, {<<"lcy">>, Y}, - {<<"tem">>, character:get_owner_id(Character)}, + {<<"pla">>, character:get_owner_id(Character)}, {<<"ena">>, character_instance:get_is_active(CharacterInstance)}, {<<"att">>, attributes_as_json(Attributes)}, {<<"awp">>, ActiveWeapon}, diff --git a/src/reply/set_map.erl b/src/reply/set_map.erl index ba1ddbb..5a2cf55 100644 --- a/src/reply/set_map.erl +++ b/src/reply/set_map.erl @@ -19,7 +19,7 @@ encode (Battlemap) -> [ {<<"w">>, battlemap:get_width(Battlemap)}, {<<"h">>, battlemap:get_height(Battlemap)}, - {<<"t">>, array:to_list(battlemap:list_tiles(Battlemap))} + {<<"t">>, array:sparse_to_list(battlemap:get_tile_ids(Battlemap))} ] } ). diff --git a/src/shim/database_shim.erl b/src/shim/database_shim.erl index 1589d14..af49ca0 100644 --- a/src/shim/database_shim.erl +++ b/src/shim/database_shim.erl @@ -70,7 +70,12 @@ generate_random_characters TotalCharacterCount, Result ) -> - NewCharacter = character:random(TotalCharacterCount, MaxPlayerID), + NewCharacter = + character:random + ( + TotalCharacterCount, + list_to_binary(integer_to_list(MaxPlayerID)) + ), generate_random_characters ( MaxPlayerID, @@ -95,7 +100,7 @@ generate_db (Heir) -> Characters = generate_random_characters(1, 7, 8, 0, []), PlayersAsList = [<<"0">>, <<"1">>], BattlemapInstance = - battlemap_instance_shim:random + battlemap_instance:random ( <<"0">>, PlayersAsList, diff --git a/src/struct/battlemap.erl b/src/struct/battlemap.erl index b999436..733f76c 100644 --- a/src/struct/battlemap.erl +++ b/src/struct/battlemap.erl @@ -68,5 +68,5 @@ random (ID, Width, Height) -> id = ID, width = Width, height = Height, - tile_ids = TileIDs + tile_ids = array:from_list(TileIDs) }. diff --git a/src/struct/battlemap_instance.erl b/src/struct/battlemap_instance.erl index d031ccd..bae7a4a 100644 --- a/src/struct/battlemap_instance.erl +++ b/src/struct/battlemap_instance.erl @@ -10,7 +10,7 @@ id, battlemap, character_instances, - players, + player_ids, current_player_turn, last_turns_effects } @@ -26,13 +26,13 @@ get_id/1, get_battlemap/1, get_character_instances/1, - get_players/1, + get_player_ids/1, get_current_player_turn/1, get_last_turns_effects/1, set_battlemap/2, set_character_instances/2, - set_players/2, + set_player_ids/2, set_current_player_turn/2, set_last_turns_effects/2 ] @@ -61,8 +61,8 @@ get_battlemap (BattlemapInstance) -> get_character_instances (BattlemapInstance) -> BattlemapInstance#battlemap_instance.character_instances. -get_players (BattlemapInstance) -> - BattlemapInstance#battlemap_instance.players. +get_player_ids (BattlemapInstance) -> + BattlemapInstance#battlemap_instance.player_ids. get_current_player_turn (BattlemapInstance) -> BattlemapInstance#battlemap_instance.current_player_turn. @@ -82,10 +82,10 @@ set_character_instances (CharacterInstances, BattlemapInstance) -> character_instances = CharacterInstances }. -set_players (Players, BattlemapInstance) -> +set_player_ids (Players, BattlemapInstance) -> BattlemapInstance#battlemap_instance { - players = Players + player_ids = Players }. set_current_player_turn (PlayerTurn, BattlemapInstance) -> @@ -103,10 +103,11 @@ set_last_turns_effects (Effects, BattlemapInstance) -> random (ID, PlayersAsList, Battlemap, Characters) -> BattlemapWidth = battlemap:get_width(Battlemap), BattlemapHeight = battlemap:get_height(Battlemap), - CharacterInstancesAsList = + {CharacterInstancesAsList, _ForbiddenLocations} = lists:mapfoldl ( fun (Character, ForbiddenLocations) -> + CharacterOwner = character:get_owner_id(Character), NewCharacterInstance = character_instance:random ( @@ -115,13 +116,26 @@ random (ID, PlayersAsList, Battlemap, Characters) -> BattlemapHeight, ForbiddenLocations ), + NewCharacterInstanceActive = + case CharacterOwner of + <<"0">> -> + character_instance:set_is_active + ( + true, + NewCharacterInstance + ); + + _ -> + NewCharacterInstance + end, NewCharacterInstanceLocation = - character_instance:get_location(NewCharacterInstance), + character_instance:get_location(NewCharacterInstanceActive), { - NewCharacterInstance, + NewCharacterInstanceActive, [NewCharacterInstanceLocation|ForbiddenLocations] } end, + [], Characters ), @@ -130,7 +144,7 @@ random (ID, PlayersAsList, Battlemap, Characters) -> id = ID, battlemap = Battlemap, character_instances = array:from_list(CharacterInstancesAsList), - players = array:from_list(PlayersAsList), + player_ids = array:from_list(PlayersAsList), current_player_turn = player_turn:new(0, 0), last_turns_effects = [] }. diff --git a/src/struct/player_turn.erl b/src/struct/player_turn.erl index b973135..e49156e 100644 --- a/src/struct/player_turn.erl +++ b/src/struct/player_turn.erl @@ -8,7 +8,7 @@ player_turn, { number, - player_id + player_ix } ). @@ -27,7 +27,7 @@ ( [ get_number/1, - get_player_id/1 + get_player_ix/1 ] ). @@ -39,13 +39,13 @@ %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Accessors -new (Number, PlayerID) -> +new (Number, PlayerIX) -> #player_turn { number = Number, - player_id = PlayerID + player_ix = PlayerIX }. get_number (PlayerTurn) -> PlayerTurn#player_turn.number. -get_player_id (PlayerTurn) -> PlayerTurn#player_turn.player_id. +get_player_ix (PlayerTurn) -> PlayerTurn#player_turn.player_ix. diff --git a/src/struct/weapon.erl b/src/struct/weapon.erl index ca74ada..41f99f8 100644 --- a/src/struct/weapon.erl +++ b/src/struct/weapon.erl @@ -24,16 +24,17 @@ ( [ get_id/1, - random_id/0 + get_range_type/1, + get_ranges/1, + get_damages/1 ] ). -export ( [ + random_id/0, from_id/1, - get_ranges/1, - get_damages/1, apply_to_attributes/2 ] ). @@ -57,6 +58,8 @@ damages_of_type (melee, light) -> {15, 30}. %%%% Accessors get_id (Wp) -> Wp#weapon.id. +get_range_type (Wp) -> Wp#weapon.range_type. + get_ranges (Wp) -> ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod). get_damages (Wp) -> @@ -293,7 +296,7 @@ random_id () -> apply_to_attributes (Attributes, Weapon) -> Dexterity = attributes:get_dexterity(Attributes), - Speed = attributes:get_dexterity(Attributes), + Speed = attributes:get_speed(Attributes), RangeModifier = Weapon#weapon.range_mod, DamageModifier = Weapon#weapon.damage_mod, WithRangeModifier = |