summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-28 23:31:29 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-01-28 23:31:29 +0100
commitc116cb57903333bec870d50df180fbcb624f21ff (patch)
tree5153b61f3ce12ec15cf3656c95520d5523f5323d /src
parentdc988b5aa72204954b2034615d644c703b35d294 (diff)
...
Diffstat (limited to 'src')
-rw-r--r--src/battle/mechanic/turn_action/btl_turn_actions_attack.erl200
-rw-r--r--src/battle/struct/btl_attack.erl12
-rw-r--r--src/login/query/lgn_get_player_id.erl9
-rw-r--r--src/player/query/plr_get_battles.erl9
-rw-r--r--src/shared/struct/shr_query.erl24
5 files changed, 155 insertions, 99 deletions
diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl
index a414588..150d7b5 100644
--- a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl
+++ b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl
@@ -16,15 +16,17 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
-spec handle_attack_sequence
(
btl_character_current_data:type(),
non_neg_integer(),
btl_character_current_data:type(),
non_neg_integer(),
- list(btl_attack:step()),
integer(),
- integer()
+ integer(),
+ list(btl_attack:step()),
+ list(btl_attack:type())
)
->
{
@@ -36,61 +38,73 @@
}.
handle_attack_sequence
(
- CharacterCurrentData,
+ _CharacterCurrentData,
CharacterCurrentHealth,
- TargetCurrentData,
+ _TargetCurrentData,
TargetCurrentHealth,
+ AttackerLuck,
+ DefenderLuck,
AttackSequence,
+ Result
+)
+when
+(
+ (CharacterCurrentHealth == 0)
+ or (TargetCurrentHealth == 0)
+ or (AttackSequence == [])
+) ->
+ {
+ lists:reverse(Result),
+ CharacterCurrentHealth,
+ TargetCurrentHealth,
+ AttackerLuck,
+ DefenderLuck
+ };
+handle_attack_sequence
+(
+ CharacterCurrentData,
+ AttackerHealth,
+ TargetCurrentData,
+ DefenderHealth,
AttackerLuck,
- DefenderLuck
+ DefenderLuck,
+ [NextAttack | AttackSequence],
+ Result
) ->
- % TODO lists:foldl over AttackSequence to take luck into account.
- AttackPlannedEffects =
- lists:map
+ {AttackEffect, NewAttackerLuck, NewDefenderLuck} =
+ btl_attack:get_description_of
(
- fun (AttackStep) ->
- btl_attack:get_description_of
- (
- AttackStep,
- CharacterCurrentData,
- TargetCurrentData,
- AttackerLuck,
- DefenderLuck
- )
- end,
- AttackSequence
+ NextAttack,
+ CharacterCurrentData,
+ TargetCurrentData,
+ AttackerLuck,
+ DefenderLuck
),
- lists:foldl
- (
- fun
+ {AttackResult, NewAttackerHealth, NewDefenderHealth} =
+ btl_attack:apply_to_healths
(
- AttackEffectCandidate,
- {AttackValidEffects, AttackerHealth, DefenderHealth}
- ) ->
- {AttackResult, NewAttackerHealth, NewDefenderHealth} =
- btl_attack:apply_to_healths
- (
- AttackEffectCandidate,
- AttackerHealth,
- DefenderHealth
- ),
- case AttackResult of
- nothing -> {AttackValidEffects, AttackerHealth, DefenderHealth};
- _ ->
- {
- (AttackValidEffects ++ [AttackResult]),
- NewAttackerHealth,
- NewDefenderHealth
- }
- end
+ AttackEffect,
+ AttackerHealth,
+ DefenderHealth
+ ),
+
+ NextResult =
+ case AttackResult of
+ nothing -> Result;
+ _ -> [AttackResult|Result]
end,
- {
- [],
- CharacterCurrentHealth,
- TargetCurrentHealth
- },
- AttackPlannedEffects
+
+ handle_attack_sequence
+ (
+ CharacterCurrentData,
+ NewAttackerHealth,
+ TargetCurrentData,
+ NewDefenderHealth,
+ NewAttackerLuck,
+ NewDefenderLuck,
+ AttackSequence,
+ NextResult
).
-spec get_attack_sequence
@@ -115,8 +129,6 @@ get_attack_sequence (Character, TargetCharacter) ->
btl_attack:get_sequence(Range, AttackingWeapon, DefendingWeapon).
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -133,21 +145,16 @@ handle (BattleAction, Update) ->
CharacterIX = btl_character_turn_data:get_character_ix(Data),
CharacterCurrentData =
btl_character_turn_data:get_character_current_data(Data),
- AttackingPlayer =
- btl_battle:get_player(btl_character:get_player_ix(Character), Battle),
+ AttackingPlayerIX = btl_character:get_player_index(Character),
+ AttackingPlayer = btl_battle:get_player(AttackingPlayerIX, Battle),
AttackingPlayerLuck = btl_player:get_luck(AttackingPlayer),
-
Map = btl_battle:get_map(Battle),
TargetIX = btl_battle_action:get_target_ix(BattleAction),
TargetCharacter = btl_battle:get_character(TargetIX, Battle),
TargetCurrentData = btl_character_current_data:new(TargetCharacter, Map),
- DefendingPlayer =
- btl_battle:get_player
- (
- btl_character:get_player_ix(TargetCharacter),
- Battle
- ),
+ DefendingPlayerIX = btl_character:get_player_index(TargetCharacter),
+ DefendingPlayer = btl_battle:get_player(DefendingPlayerIX, Battle),
DefendingPlayerLuck = btl_player:get_luck(DefendingPlayer),
true = btl_character:get_is_alive(TargetCharacter),
@@ -158,8 +165,8 @@ handle (BattleAction, Update) ->
AttackEffects,
RemainingAttackerHealth,
RemainingDefenderHealth,
- _NewAttackerLuck,
- _NewDefenderLuck
+ NewAttackerLuck,
+ NewDefenderLuck
} =
handle_attack_sequence
(
@@ -167,26 +174,39 @@ handle (BattleAction, Update) ->
btl_character:get_current_health(Character),
TargetCurrentData,
btl_character:get_current_health(TargetCharacter),
- AttackSequence,
AttackingPlayerLuck,
- DefendingPlayerLuck
+ DefendingPlayerLuck,
+ AttackSequence,
+ []
),
% TODO: update lucks...
+ NextAttackingPlayer = btl_player:set_luck(NewAttackerLuck, AttackingPlayer),
+ NextDefendingPlayer = btl_player:set_luck(NewDefenderLuck, DefendingPlayer),
UpdatedCharacter =
btl_character:set_current_health(RemainingAttackerHealth, Character),
UpdatedBattle =
- btl_battle:set_character
+ btl_battle:set_player
(
- TargetIX,
- btl_character:set_current_health
+ DefendingPlayerIX,
+ NextDefendingPlayer,
+ btl_battle:set_player
(
- RemainingDefenderHealth,
- TargetCharacter
- ),
- Battle
+ AttackingPlayerIX,
+ NextAttackingPlayer,
+ btl_battle:set_character
+ (
+ TargetIX,
+ btl_character:set_current_health
+ (
+ RemainingDefenderHealth,
+ TargetCharacter
+ ),
+ Battle
+ )
+ )
),
S0Data = btl_character_turn_data:set_battle(UpdatedBattle, Data),
@@ -230,6 +250,35 @@ handle (BattleAction, Update) ->
)
),
+ DBQuery2 =
+ ataxic:update_field
+ (
+ btl_battle:get_players_field(),
+ ataxic:sequence
+ (
+ [
+ ataxic_sugar:update_orddict_element
+ (
+ DefendingPlayerIX,
+ ataxic:update_field
+ (
+ btl_player:get_luck_field(),
+ ataxic:constant(NewDefenderLuck)
+ )
+ ),
+ ataxic_sugar:update_orddict_element
+ (
+ AttackingPlayerIX,
+ ataxic:update_field
+ (
+ btl_player:get_luck_field(),
+ ataxic:constant(NewAttackerLuck)
+ )
+ )
+ ]
+ )
+ ),
+
S0Update =
btl_character_turn_update:add_to_timeline
(
@@ -239,22 +288,23 @@ handle (BattleAction, Update) ->
),
S1Update = btl_character_turn_update:add_to_db(DBQuery1, S0Update),
- S2Update = btl_character_turn_update:set_data(S1Data, S1Update),
+ S2Update = btl_character_turn_update:add_to_db(DBQuery2, S1Update),
+ S3Update = btl_character_turn_update:set_data(S1Data, S2Update),
- S3Update =
+ S4Update =
btl_victory:handle_character_lost_health
(
CharacterIX,
RemainingAttackerHealth,
- S2Update
+ S3Update
),
- S4Update =
+ S5Update =
btl_victory:handle_character_lost_health
(
TargetIX,
RemainingDefenderHealth,
- S3Update
+ S4Update
),
- S4Update.
+ S5Update.
diff --git a/src/battle/struct/btl_attack.erl b/src/battle/struct/btl_attack.erl
index 6286e41..769f3e3 100644
--- a/src/battle/struct/btl_attack.erl
+++ b/src/battle/struct/btl_attack.erl
@@ -91,11 +91,7 @@ roll_precision
roll_critical_hit (AttackerStatistics, AttackerLuck) ->
CriticalHitChance = shr_statistics:get_critical_hits(AttackerStatistics),
{_Roll, IsSuccess, NewLuck} =
- shr_roll:percentage_with_luck
- (
- CriticalHitChance,
- AttackerLuck
- ),
+ shr_roll:percentage_with_luck(CriticalHitChance, AttackerLuck),
{IsSuccess, NewLuck}.
@@ -108,11 +104,7 @@ roll_critical_hit (AttackerStatistics, AttackerLuck) ->
roll_parry (DefenderStatistics, DefenderLuck) ->
DefenderParryChance = shr_statistics:get_parries(DefenderStatistics),
{_Roll, IsSuccess, NewLuck} =
- shr_roll:percentage_with_luck
- (
- DefenderParryChance,
- DefenderLuck
- ),
+ shr_roll:percentage_with_luck(DefenderParryChance, DefenderLuck),
{IsSuccess, NewLuck}.
diff --git a/src/login/query/lgn_get_player_id.erl b/src/login/query/lgn_get_player_id.erl
index d87c8e2..2056cec 100644
--- a/src/login/query/lgn_get_player_id.erl
+++ b/src/login/query/lgn_get_player_id.erl
@@ -26,8 +26,9 @@ generate_reply (PlayerID) ->
Output.
--spec handle (binary()) -> binary().
-handle (UsernameOrEmail) ->
+-spec handle (shr_query:type()) -> binary().
+handle (Query) ->
+ UsernameOrEmail = dict:fetch(<<"name">>, shr_query:get_url_params(Query)),
PlayerID = fetch_data(UsernameOrEmail),
generate_reply(PlayerID).
@@ -35,10 +36,8 @@ handle (UsernameOrEmail) ->
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
out(A) ->
- {ok, UsernameOrEmailTXT} = yaws_api:queryvar(A, "name"),
- UsernameOrEmail = list_to_binary(UsernameOrEmailTXT),
{
content,
"application/json; charset=UTF-8",
- handle(UsernameOrEmail)
+ handle(shr_query:new(A))
}.
diff --git a/src/player/query/plr_get_battles.erl b/src/player/query/plr_get_battles.erl
index 0d93154..4b00ed8 100644
--- a/src/player/query/plr_get_battles.erl
+++ b/src/player/query/plr_get_battles.erl
@@ -44,8 +44,9 @@ generate_reply (QueryState) ->
Output.
--spec handle (binary()) -> binary().
-handle (PlayerID) ->
+-spec handle (shr_query:type()) -> binary().
+handle (Query) ->
+ PlayerID = dict:fetch(<<"pid">>, shr_query:get_url_params(Query)),
QueryState = fetch_data(PlayerID),
generate_reply(QueryState).
@@ -53,10 +54,8 @@ handle (PlayerID) ->
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
out(A) ->
- {ok, PlayerIDTXT} = yaws_api:queryvar(A, "pid"),
- PlayerID = list_to_binary(PlayerIDTXT),
{
content,
"application/json; charset=UTF-8",
- handle(PlayerID)
+ handle(shr_query:new(A))
}.
diff --git a/src/shared/struct/shr_query.erl b/src/shared/struct/shr_query.erl
index 44d3222..e85f204 100644
--- a/src/shared/struct/shr_query.erl
+++ b/src/shared/struct/shr_query.erl
@@ -10,7 +10,8 @@
query,
{
ip :: binary(),
- params :: map:map(binary(), any())
+ params :: map(),
+ url_params :: dict:dict(binary(), any())
}
).
@@ -26,7 +27,8 @@
[
new/1,
get_ip/1,
- get_params/1
+ get_params/1,
+ get_url_params/1
]
).
@@ -45,11 +47,25 @@ new (YawsArg) ->
#query
{
ip = IP,
- params = jiffy:decode(YawsArg#arg.clidata, [return_maps])
+ params = jiffy:decode(YawsArg#arg.clidata, [return_maps]),
+ url_params =
+ dict:from_list
+ (
+ lists:map
+ (
+ fun ({K, V}) ->
+ {list_to_binary(K), list_to_binary(V)}
+ end,
+ yaws_api:parse_query(YawsArg)
+ )
+ )
}.
-spec get_ip (type()) -> binary().
get_ip (Query) -> Query#query.ip.
--spec get_params (type()) -> map:map(binary(), any()).
+-spec get_params (type()) -> map().
get_params (Query) -> Query#query.params.
+
+-spec get_url_params (type()) -> dict:dict(binary(), any()).
+get_url_params (Query) -> Query#query.url_params.