summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-02-26 17:16:08 +0100
committernsensfel <SpamShield0@noot-noot.org>2018-02-26 17:16:08 +0100
commit6494b74a45e27085fd81836f7b8c969431e8ff3c (patch)
treee344a24fa2e9a2ee198314c0552c46b235072009 /src
parentfd4d031ab5b31763d376c663cc049f62ee389243 (diff)
Got it to work, I think.
Diffstat (limited to 'src')
-rw-r--r--src/battlemap/movement.erl8
-rw-r--r--src/query/character_turn.erl111
-rw-r--r--src/query/character_turn/handle_character_instance_attacking_2.erl30
-rw-r--r--src/query/load_state.erl8
-rw-r--r--src/reply/add_char.erl4
-rw-r--r--src/reply/set_map.erl2
-rw-r--r--src/shim/database_shim.erl9
-rw-r--r--src/struct/battlemap.erl2
-rw-r--r--src/struct/battlemap_instance.erl36
-rw-r--r--src/struct/player_turn.erl10
-rw-r--r--src/struct/weapon.erl11
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 =