summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-10-20 20:59:34 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-10-20 20:59:34 +0200
commit08fab636c981574a703baffad9ebb52ff4308f17 (patch)
tree6fd3742f4b374fb948ecd017be88e5923dc9d611
parent4aaf3670c0ff4bc46092e909bb450b6336417ed9 (diff)
...
-rw-r--r--src/battle/mechanic/action/btl_action_attack.erl1
-rw-r--r--src/battle/mechanic/action/btl_action_move.erl3
-rw-r--r--src/battle/mechanic/action/btl_action_switch_weapon.erl1
-rw-r--r--src/battle/mechanic/btl_actions_management.erl64
-rw-r--r--src/battle/mechanic/condition/btl_cond_heal.erl22
-rw-r--r--src/battle/query/btl_character_turn.erl24
-rw-r--r--src/battle/struct/btl_character_turn_update.erl32
7 files changed, 70 insertions, 77 deletions
diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl
index 91c886b..d155197 100644
--- a/src/battle/mechanic/action/btl_action_attack.erl
+++ b/src/battle/mechanic/action/btl_action_attack.erl
@@ -1129,6 +1129,7 @@ handle_attack_sequence ([AttackCategory|S0NextElements], Action, S0Update) ->
)
-> btl_character_turn_update:type().
handle (Action, S0Update) ->
+ % TODO: assert target & actor are alive.
S0Sequence = [first, counter, second],
{S1Sequence, S1Update} =
diff --git a/src/battle/mechanic/action/btl_action_move.erl b/src/battle/mechanic/action/btl_action_move.erl
index 897525f..756ebca 100644
--- a/src/battle/mechanic/action/btl_action_move.erl
+++ b/src/battle/mechanic/action/btl_action_move.erl
@@ -450,6 +450,7 @@ commit_move (CharacterIX, Character, S0Update, Path, NewLocation) ->
)
-> btl_character_turn_update:type().
handle (Action, S0Update) ->
+ % TODO: assert actor is alive.
ActorIX = btl_action:get_actor_index(Action),
S0Battle = btl_character_turn_update:get_battle(S0Update),
@@ -526,7 +527,7 @@ handle (Action, S0Update) ->
_ ->
btl_character_turn_update:add_actions
(
- false,
+ true,
(
Interruptions
++
diff --git a/src/battle/mechanic/action/btl_action_switch_weapon.erl b/src/battle/mechanic/action/btl_action_switch_weapon.erl
index 354c328..10348bc 100644
--- a/src/battle/mechanic/action/btl_action_switch_weapon.erl
+++ b/src/battle/mechanic/action/btl_action_switch_weapon.erl
@@ -28,6 +28,7 @@
)
-> btl_character_turn_update:type().
handle (Action, S0Update) ->
+ % TODO: assert actor is alive.
ActorIX = btl_action:get_actor_index(Action),
S0PerformSwitch = true,
diff --git a/src/battle/mechanic/btl_actions_management.erl b/src/battle/mechanic/btl_actions_management.erl
index 050ab4e..d7b85c5 100644
--- a/src/battle/mechanic/btl_actions_management.erl
+++ b/src/battle/mechanic/btl_actions_management.erl
@@ -9,65 +9,31 @@
-export
(
[
- handle/2
+ handle/1
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec perform_action
- (
- btl_action:type(),
- btl_character:type(),
- btl_character_turn_update:type()
- )
- ->
- (
- {ok, btl_character_turn_update:type()}
- | {events, list(btl_action:type()), btl_character_turn_update:type()}
- ).
-perform_action (Action, Character, Update) ->
- case btl_action:get_category(Action) of
- move -> btl_action_move:handle(Action, Character, Update);
- attack -> btl_action_attack:handle(Action, Character, Update);
- switch_weapon ->
- btl_action_switch_weapon:handle(Action, Character, Update)
- end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec handle
- (
- list(btl_action:type()),
- btl_character_turn_update:type()
- )
- -> btl_character_turn_update:type().
-handle ([], Update) -> Update;
-handle ([BattleAction|FutureBattleActions], S0Update) ->
- case btl_action:get_actor_index(BattleAction) of
- -1 -> handle(FutureBattleActions, S0Update);
- CharacterIX ->
- S0Battle = btl_character_turn_update:get_battle(S0Update),
- {Character, S1Battle} =
- btl_battle:get_resolved_character(CharacterIX, S0Battle),
-
- S1Update = btl_character_turn_update:set_battle(S1Battle, S0Update),
+-spec handle (btl_character_turn_update:type()) ->
+btl_character_turn_update:type().
+handle (S0Update) ->
+ case btl_character_turn_update:pop_next_action(S0Update) of
+ none -> S0Update;
+ {ok, S1Update, Action} ->
+ S2Update =
+ case btl_action:get_category(Action) of
+ move -> btl_action_move:handle(Action, S1Update);
+ attack -> btl_action_attack:handle(Action, S1Update);
+ switch_weapon ->
+ btl_action_switch_weapon:handle(Action, S1Update)
+ end,
- case btl_character:get_is_alive(Character) of
- false -> handle(FutureBattleActions, S1Update);
- true ->
- case perform_action(BattleAction, Character, S1Update) of
- {ok, S2Update} ->
- handle(FutureBattleActions, S2Update);
- {events, NewEvents, S2Update} ->
- handle
- (
- (NewEvents ++ FutureBattleActions),
- S2Update
- )
- end
- end
+ handle(S2Update)
end.
diff --git a/src/battle/mechanic/condition/btl_cond_heal.erl b/src/battle/mechanic/condition/btl_cond_heal.erl
index bbbbc96..897768a 100644
--- a/src/battle/mechanic/condition/btl_cond_heal.erl
+++ b/src/battle/mechanic/condition/btl_cond_heal.erl
@@ -62,18 +62,12 @@ apply_to_character (Condition, S0Character) ->
(RemainingUses == 1) ->
{
- btl_condition:set_remaining_uses
- (
- UpdatedRemainingUses,
- Condition
- ),
remove,
[{S1Character, CharacterUpdate}]
};
(RemainingUses == 0) ->
{
- Condition,
remove,
[{S1Character, CharacterUpdate}]
};
@@ -108,18 +102,16 @@ handle_context ({Trigger, ReadOnly, VolatileData}, Condition) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec apply
(
- shr_condition:context(),
- btl_condition:type(),
- btl_character_turn_update:type()
+ shr_condition:context(any(), VolatileDataType),
+ btl_character_turn_update:type(),
+ btl_condition:type()
) ->
{
- shr_condition:context(),
+ VolatileDataType,
btl_character_turn_update:type(),
btl_condition:update_action()
}.
-apply (S0Context, S0Condition, S0Update) ->
- S1Context = handle_context(S0Context, S0Condition),
-
- {TargetIX, Amount} = btl_condition:get_parameters(S0Condition),
+apply (S0Context, S0Update, _S0Condition) ->
+ {_Trigger, _ReadOnlyData, VolatileData} = S0Context,
- {S1Context, S0Update, none}.
+ {VolatileData, S0Update, none}.
diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl
index 9534945..d0046b2 100644
--- a/src/battle/query/btl_character_turn.erl
+++ b/src/battle/query/btl_character_turn.erl
@@ -263,20 +263,24 @@ handle (Query) ->
S0Update = fetch_data(Request),
assert_user_permissions(S0Update, Request),
- S1Update = btl_actions_management:handle
- (
- btl_character_turn_request:get_actions(Request),
- S0Update
- ),
- S2Update = deactivate_character(S1Update),
- S3Update = update_timeline(S2Update),
- S4Update = btl_turn_progression:handle(S3Update),
+ S1Update =
+ btl_character_turn_update:add_actions
+ (
+ true,
+ btl_character_turn_request:get_actions(Request),
+ S0Update
+ ),
+
+ S2Update = btl_actions_management:handle(S1Update),
+ S3Update = deactivate_character(S2Update),
+ S4Update = update_timeline(S3Update),
+ S5Update = btl_turn_progression:handle(S4Update),
- commit_update(S4Update, Request),
+ commit_update(S5Update, Request),
shr_security:unlock_queries(PlayerID),
- generate_reply(S4Update);
+ generate_reply(S5Update);
error -> jiffy:encode([shr_disconnected:generate()])
end.
diff --git a/src/battle/struct/btl_character_turn_update.erl b/src/battle/struct/btl_character_turn_update.erl
index 304f19d..e0d94f1 100644
--- a/src/battle/struct/btl_character_turn_update.erl
+++ b/src/battle/struct/btl_character_turn_update.erl
@@ -10,7 +10,8 @@
battle :: btl_battle:type(),
character_ix :: non_neg_integer(),
reversed_battle_updates :: list(ataxic:basic()),
- timeline :: list(any())
+ timeline :: list(any()),
+ actions :: list(btl_action:type())
}
).
@@ -31,10 +32,13 @@
get_character_ix/1,
get_battle_update/1,
get_timeline/1,
+ pop_next_action/1,
set_battle/2,
ataxia_set_battle/3,
+ add_actions/3,
+
add_to_timeline/2
]
).
@@ -53,7 +57,8 @@ new (Battle, CharacterIX) ->
battle = Battle,
character_ix = CharacterIX,
reversed_battle_updates = [],
- timeline = []
+ timeline = [],
+ actions = []
}.
-spec get_battle (type()) -> btl_battle:type().
@@ -62,6 +67,18 @@ get_battle (Data) -> Data#type.battle.
-spec get_character_ix (type()) -> non_neg_integer().
get_character_ix (Data) -> Data#type.character_ix.
+-spec pop_next_action (type()) -> ({ok, type(), btl_action:type()} | none).
+pop_next_action (Data) ->
+ case Data#type.actions of
+ [] -> none;
+ [Result|NextActions] ->
+ {
+ ok,
+ Data#type { actions = NextActions },
+ Result
+ }
+ end.
+
-spec set_battle (btl_battle:type(), type()) -> type().
set_battle (Battle, Data) -> Data#type { battle = Battle }.
@@ -79,6 +96,17 @@ ataxia_set_battle (Battle, BattleUpdate, Data) ->
reversed_battle_updates = [BattleUpdate|Data#type.reversed_battle_updates]
}.
+-spec add_actions (boolean(), list(btl_action:type()), type()) -> type().
+add_actions (IsPrefix, Actions, Data) ->
+ Data#type
+ {
+ actions =
+ case IsPrefix of
+ true -> (Actions ++ Data#type.actions);
+ false -> (Data#type.actions ++ Actions)
+ end
+ }.
+
-spec add_to_timeline (btl_turn_result:type(), type()) -> type().
add_to_timeline (Item, Data) ->
Data#type