summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/mechanic/turn_action/btl_turn_actions_move.erl17
-rw-r--r--src/battle/reply/btl_add_tile.erl2
-rw-r--r--src/battle/struct/btl_pending_battle.erl16
-rw-r--r--src/bounty/bnt_generate_player.erl2
-rw-r--r--src/bounty/bnt_join_battle.erl215
-rw-r--r--src/roster/query/rst_load.erl2
-rw-r--r--src/roster/query/rst_update.erl2
-rw-r--r--src/roster/struct/rst_roster.erl2
-rw-r--r--src/shared/reply/shr_add_weapon.erl1
-rw-r--r--src/shared/struct/inventory/shr_inventory.erl16
-rw-r--r--src/shared/struct/inventory/shr_weapon.erl.m44
-rw-r--r--src/shared/struct/shr_character.erl46
-rw-r--r--src/shared/struct/shr_omnimods.erl28
13 files changed, 142 insertions, 211 deletions
diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_move.erl b/src/battle/mechanic/turn_action/btl_turn_actions_move.erl
index da62e8c..a0cd138 100644
--- a/src/battle/mechanic/turn_action/btl_turn_actions_move.erl
+++ b/src/battle/mechanic/turn_action/btl_turn_actions_move.erl
@@ -107,7 +107,7 @@ get_path_cost_and_destination (Update, Path) ->
btl_character:type(),
non_neg_integer()
)
- -> 'ok'.
+ -> ('ok' | 'error').
assert_character_can_move (Char, Cost) ->
CharacterMovementPoints =
shr_statistics:get_movement_points
@@ -118,9 +118,16 @@ assert_character_can_move (Char, Cost) ->
)
),
- true = (Cost =< CharacterMovementPoints),
-
- ok.
+ case (Cost =< CharacterMovementPoints) of
+ true -> ok;
+ false ->
+ io:format
+ (
+ "~n[E] Character trying to move ~p dist with ~p points.~n",
+ [Cost, CharacterMovementPoints]
+ ),
+ error
+ end.
-spec commit_move
(
@@ -184,6 +191,6 @@ handle (BattleAction, Update) ->
{PathCost, NewLocation, S1Update} =
get_path_cost_and_destination(S0Update, Path),
- assert_character_can_move(Character, PathCost),
+ ok = assert_character_can_move(Character, PathCost),
commit_move(Character, S1Update, Path, NewLocation).
diff --git a/src/battle/reply/btl_add_tile.erl b/src/battle/reply/btl_add_tile.erl
index 980628d..90bcbc9 100644
--- a/src/battle/reply/btl_add_tile.erl
+++ b/src/battle/reply/btl_add_tile.erl
@@ -24,6 +24,8 @@ generate (Tile) ->
{<<"id">>, shr_tile:get_id(Tile)},
{<<"nam">>, shr_tile:get_name(Tile)},
{<<"ct">>, shr_tile:get_cost(Tile)},
+ {<<"de">>, 1}, % TODO: provide actual depth.
+ {<<"fa">>, <<"">>}, % TODO: provide actual family.
{<<"omni">>, shr_omnimods:encode(shr_tile:get_omnimods(Tile))}
]
}.
diff --git a/src/battle/struct/btl_pending_battle.erl b/src/battle/struct/btl_pending_battle.erl
index 0e46a24..cb8cbfa 100644
--- a/src/battle/struct/btl_pending_battle.erl
+++ b/src/battle/struct/btl_pending_battle.erl
@@ -46,6 +46,8 @@
push_player_summary_ix/2,
ataxia_set_battle/2,
+ ataxia_set_battle/3,
+
ataxia_set_free_slots/2,
ataxia_set_battle_id/2,
ataxia_set_player_ids/2,
@@ -107,12 +109,22 @@ set_battle (Battle, PBattle) -> PBattle#pending_battle{ battle = Battle }.
-spec ataxia_set_battle (btl_battle:type(), type()) -> {type(), ataxic:basic()}.
ataxia_set_battle (Battle, PBattle) ->
+ ataxia_set_battle(Battle, ataxic:constant(Battle), PBattle).
+
+-spec ataxia_set_battle
+ (
+ btl_battle:type(),
+ ataxic:basic(),
+ type()
+ )
+ -> {type(), ataxic:basic()}.
+ataxia_set_battle (Battle, BattleAtaxiaUpdate, PBattle) ->
{
- PBattle#pending_battle{ battle = Battle },
+ set_battle(Battle, PBattle),
ataxic:update_field
(
get_battle_field(),
- ataxic:constant(Battle)
+ BattleAtaxiaUpdate
)
}.
diff --git a/src/bounty/bnt_generate_player.erl b/src/bounty/bnt_generate_player.erl
index 9d496c3..17091d5 100644
--- a/src/bounty/bnt_generate_player.erl
+++ b/src/bounty/bnt_generate_player.erl
@@ -81,7 +81,7 @@ finalize_login (UsernameLC, EmailLC, PlayerID) ->
-spec generate_inventory (shr_player:id()) -> shr_inventory:id().
generate_inventory (PlayerID) ->
- Inventory = shr_inventory:new(PlayerID),
+ Inventory = shr_inventory:default(),
{ok, InventoryID} =
ataxia_client:add
diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl
index 2d4d4e5..7a2bb7c 100644
--- a/src/bounty/bnt_join_battle.erl
+++ b/src/bounty/bnt_join_battle.erl
@@ -86,16 +86,17 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) ->
btl_character:to_unresolved(Result).
--spec handle_characters
+-spec add_characters
(
non_neg_integer(),
- shr_map:type(),
- ordsets:ordset(shr_location:type()),
list(shr_character:unresolved()),
btl_battle:type()
)
-> { btl_battle:type(), ataxic:basic() }.
-handle_characters (PlayerIX, Map, UsedLocations, RosterCharacters, Battle) ->
+add_characters (PlayerIX, RosterCharacters, Battle) ->
+ Map = btl_battle:get_map(Battle),
+ ForbiddenLocations = get_forbidden_locations(Battle),
+
{_FinalUsedLocations, FinalBattle, FinalBattleAtaxicUpdates} =
lists:foldl
(
@@ -114,122 +115,43 @@ handle_characters (PlayerIX, Map, UsedLocations, RosterCharacters, Battle) ->
CurrentUsedLocations
),
- {_NewCharacterIX, NewBattle, NewBattleAtaxiaUpdate} =
+ {_NewCharacterIX, S0Battle, BattleAtaxiaUpdate0} =
btl_battle:ataxia_add_character(NewCharacterRef, CurrentBattle),
+ {UpdatedInventory, InventoryAtaxiaUpdate} =
+ shr_inventory:ataxia_add_equipment
+ (
+ shr_character:get_equipment(RosterCharacter),
+ btl_battle:get_related_inventory(S0Battle)
+ ),
+
+ {S1Battle, BattleAtaxiaUpdate1} =
+ btl_battle:ataxia_set_related_inventory
+ (
+ UpdatedInventory,
+ InventoryAtaxiaUpdate,
+ S0Battle
+ ),
+
{
[
btl_character:get_location(NewCharacterRef)
|CurrentUsedLocations
],
- NewBattle,
- [NewBattleAtaxiaUpdate|CurrentBattleAtaxicUpdates]
+ S1Battle,
+ [
+ BattleAtaxiaUpdate0,
+ BattleAtaxiaUpdate1
+ |CurrentBattleAtaxicUpdates
+ ]
}
end,
- {UsedLocations, Battle, []},
+ {ForbiddenLocations, Battle, []},
RosterCharacters
),
{FinalBattle, ataxic:optimize(ataxic:sequence(FinalBattleAtaxicUpdates))}.
--spec add_player
- (
- shr_player:id(),
- non_neg_integer(),
- shr_battle_summary:category(),
- btl_battle:type()
- )
- -> {btl_battle:type(), non_neg_integer(), ataxic:basic()}.
-add_player (PlayerID, PlayerSummaryIX, PlayerSummaryCategory, Battle) ->
-
- {PlayerIX, Update}.
-
--spec add_characters
- (
- list(shr_character:unresolved()),
- non_neg_integer(),
- btl_battle:type()
- )
- -> {btl_battle:type(), ataxic:basic()}.
-add_characters (RosterCharacters, PlayerIX, Battle) ->
- CurrentCharacters = btl_battle:get_characters(Battle),
- NextCharacterIX = orddict:size(CurrentCharacters),
- Map = btl_battle:get_map(Battle),
-
- ForbiddenLocations = get_forbidden_locations(Battle),
-
- {NewCharacters, CharactersUpdates} =
- handle_characters
- (
- RosterCharacters,
- PlayerIX,
- Map,
- ForbiddenLocations,
- NextCharacterIX,
- CurrentCharacters,
- []
- ),
-
- {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs} =
- get_equipment_ids(RosterCharacters),
-
- OldPortraitIDs = btl_battle:get_used_portrait_ids(Battle),
- PortraitIDsUpdate =
- ataxic:update_field
- (
- btl_battle:get_used_portrait_ids_field(),
- update_ordset(UsedPortraitIDs, OldPortraitIDs)
- ),
-
- OldWeaponIDs = btl_battle:get_used_weapon_ids(Battle),
- WeaponIDsUpdate =
- ataxic:update_field
- (
- btl_battle:get_used_weapon_ids_field(),
- update_ordset(UsedWeaponIDs, OldWeaponIDs)
- ),
-
- OldArmorIDs = btl_battle:get_used_armor_ids(Battle),
- ArmorIDsUpdate =
- ataxic:update_field
- (
- btl_battle:get_used_armor_ids_field(),
- update_ordset(UsedArmorIDs, OldArmorIDs)
- ),
-
- S0Battle = btl_battle:set_characters(NewCharacters, Battle),
- S1Battle =
- btl_battle:set_used_armor_ids
- (
- ordsets:union(UsedArmorIDs, OldArmorIDs),
- btl_battle:set_used_weapon_ids
- (
- ordsets:union(UsedWeaponIDs, OldWeaponIDs),
- btl_battle:set_used_portrait_ids
- (
- ordsets:union(UsedPortraitIDs, OldPortraitIDs),
- S0Battle
- )
- )
- ),
-
- Update =
- ataxic:sequence
- (
- [
- ataxic:update_field
- (
- btl_battle:get_characters_field(),
- ataxic:sequence(CharactersUpdates)
- ),
- PortraitIDsUpdate,
- WeaponIDsUpdate,
- ArmorIDsUpdate
- ]
- ),
-
- {S1Battle, Update}.
-
-spec get_roster_characters
(
shr_player:id(),
@@ -285,63 +207,47 @@ add_to_pending_battle
NewCharacters = get_roster_characters(PlayerID, SelectedRosterCharacterIXs),
- NewPlayer =
- btl_player:new
+ NewPlayer = btl_player:new(0, PlayerID, PlayerSumIX, PlayerSumCategory),
+
+ {PlayerIX, S0Battle, BattleAtaxiaUpdate0} =
+ btl_battle:ataxia_add_player(NewPlayer, Battle),
+
+ {S1Battle, BattleAtaxiaUpdate1} =
+ add_characters(PlayerIX, NewCharacters, S0Battle),
+
+ {S0PendingBattle, PendingBattleUpdate0} =
+ btl_pending_battle:ataxia_set_battle
(
- 0,
- PlayerID,
- PlayerSumIX,
- PlayerSumCategory
+ S1Battle,
+ ataxic:sequence([BattleAtaxiaUpdate0, BattleAtaxiaUpdate1]),
+ PendingBattle
),
- {PlayerIX, S0Battle, BattleAtaxiaUpdate} =
- btl_battle:add_player(NewPlayer, Battle),
+ {S1PendingBattle, PendingBattleUpdate1} =
+ btl_pending_battle:ataxia_set_free_slots(RemainingSlots, S0PendingBattle),
- {S1Battle, BattleUpdate1} =
- add_characters(NewCharacters, PlayerIX, S0Battle),
+ {S2PendingBattle, PendingBattleUpdate2} =
+ btl_pending_battle:ataxia_push_player_id(PlayerID, S1PendingBattle),
- S0PendingBattle = btl_pending_battle:set_battle(S1Battle, PendingBattle),
- S1PendingBattle =
- btl_pending_battle:set_free_slots(RemainingSlots, S0PendingBattle),
- S2PendingBattle =
- btl_pending_battle:push_player_id(PlayerID, S1PendingBattle),
- S3PendingBattle =
- btl_pending_battle:push_player_summary_ix(PlayerIX, S2PendingBattle),
+ {S3PendingBattle, PendingBattleUpdate3} =
+ btl_pending_battle:ataxia_push_player_summary_ix
+ (
+ PlayerIX,
+ S2PendingBattle
+ ),
- Update =
+ {
+ S3PendingBattle,
ataxic:sequence
(
[
- ataxic:update_field
- (
- btl_pending_battle:get_battle_field(),
- ataxic:sequence
- (
- [
- BattleUpdate0,
- BattleUpdate1
- ]
- )
- ),
- ataxic:update_field
- (
- btl_pending_battle:get_free_slots_field(),
- ataxic:constant(RemainingSlots)
- ),
- ataxic:update_field
- (
- btl_pending_battle:get_player_ids_field(),
- ataxic:list_cons(ataxic:constant(PlayerID))
- ),
- ataxic:update_field
- (
- btl_pending_battle:get_player_summary_ixs_field(),
- ataxic:list_cons(ataxic:constant(PlayerSumIX))
- )
+ PendingBattleUpdate0,
+ PendingBattleUpdate1,
+ PendingBattleUpdate2,
+ PendingBattleUpdate3
]
- ),
-
- {S3PendingBattle, Update}.
+ )
+ }.
%%%% STAGE -1: CREATING THE PENDING BATTLE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec generate_pending_battle
@@ -652,7 +558,7 @@ repair_battle_final_link_of_player (BattleID, Player) ->
ataxic:update_field
(
shr_battle_summary:get_is_players_turn_field(),
- ataxic:constant(btl_player:get_index(Player) == 0)
+ ataxic:constant(false)
)
]
),
@@ -673,7 +579,6 @@ repair_battle_final_link_of_player (BattleID, Player) ->
ok.
-
-spec repair_battle_final_links
(
btl_pending_battle:id(),
diff --git a/src/roster/query/rst_load.erl b/src/roster/query/rst_load.erl
index 4f7cf64..017772d 100644
--- a/src/roster/query/rst_load.erl
+++ b/src/roster/query/rst_load.erl
@@ -75,7 +75,7 @@ fetch_data (Player, Input) ->
io:format("[W] Using shim inventory.~n"),
- Inventory = shr_inventory:new(PlayerID),
+ Inventory = shr_inventory:default(),
#query_state
{
diff --git a/src/roster/query/rst_update.erl b/src/roster/query/rst_update.erl
index 933c52c..c11e0a6 100644
--- a/src/roster/query/rst_update.erl
+++ b/src/roster/query/rst_update.erl
@@ -88,7 +88,7 @@ fetch_data (Player, Input) ->
),
% Inventory = shr_timed_cache:fetch(inventory_db, PlayerID, InventoryID),
- Inventory = shr_inventory:new(PlayerID),
+ Inventory = shr_inventory:default(),
#query_state
{
diff --git a/src/roster/struct/rst_roster.erl b/src/roster/struct/rst_roster.erl
index ec28db0..5d4a16f 100644
--- a/src/roster/struct/rst_roster.erl
+++ b/src/roster/struct/rst_roster.erl
@@ -143,7 +143,7 @@ ataxia_set_character (IX, Character, Roster) ->
-> {type(), ataxic:basic()}.
ataxia_set_character (IX, Character, CharacterAtaxiaUpdate, Roster) ->
{
- ataxia_set_character(IX, Character, Roster),
+ set_character(IX, Character, Roster),
ataxic:update_field
(
get_characters_field(),
diff --git a/src/shared/reply/shr_add_weapon.erl b/src/shared/reply/shr_add_weapon.erl
index 44a83dd..bd8dfb5 100644
--- a/src/shared/reply/shr_add_weapon.erl
+++ b/src/shared/reply/shr_add_weapon.erl
@@ -25,6 +25,7 @@ generate (Weapon) ->
{<<"nam">>, shr_weapon:get_name(Weapon)},
{<<"rmi">>, shr_weapon:get_minimum_range(Weapon)},
{<<"rma">>, shr_weapon:get_maximum_range(Weapon)},
+ {<<"pri">>, shr_weapon:get_is_primary(Weapon)},
{<<"omni">>, shr_omnimods:encode(shr_weapon:get_omnimods(Weapon))}
]
}.
diff --git a/src/shared/struct/inventory/shr_inventory.erl b/src/shared/struct/inventory/shr_inventory.erl
index 884c213..0396b0a 100644
--- a/src/shared/struct/inventory/shr_inventory.erl
+++ b/src/shared/struct/inventory/shr_inventory.erl
@@ -273,12 +273,7 @@ default () ->
glyphs = EmptySet
}.
--spec allows_equipment
- (
- (shr_equipment:type()|shr_equipment:unresolved()),
- type()
- )
- -> boolean().
+-spec allows_equipment (shr_equipment:either(), type()) -> boolean().
allows_equipment (Eq, Inv) ->
Weapons = Inv#inventory.weapons,
Glyphs = Inv#inventory.glyphs,
@@ -312,12 +307,7 @@ allows_equipment (Eq, Inv) ->
)
).
--spec add_equipment
- (
- (shr_equipment:type()|shr_equipment:unresolved()),
- type()
- )
- -> type().
+-spec add_equipment (shr_equipment:either(), type()) -> type().
add_equipment (Eq, Inv) ->
Inv#inventory
{
@@ -360,7 +350,7 @@ add_equipment (Eq, Inv) ->
-spec ataxia_add_equipment
(
- (shr_equipment:type()|shr_equipment:unresolved()),
+ shr_equipment:either(),
type()
)
-> {type(), ataxic:basic()}.
diff --git a/src/shared/struct/inventory/shr_weapon.erl.m4 b/src/shared/struct/inventory/shr_weapon.erl.m4
index a18c48e..b2c6734 100644
--- a/src/shared/struct/inventory/shr_weapon.erl.m4
+++ b/src/shared/struct/inventory/shr_weapon.erl.m4
@@ -30,6 +30,7 @@
(
[
get_id/1,
+ get_is_primary/1,
get_name/1,
get_minimum_range/1,
get_maximum_range/1,
@@ -60,6 +61,9 @@ get_id (Wp) -> Wp#weapon.id.
-spec get_name (type()) -> binary().
get_name (Wp) -> Wp#weapon.name.
+-spec get_is_primary (type()) -> boolean().
+get_is_primary (Wp) -> Wp#weapon.is_primary.
+
-spec get_minimum_range (type()) -> non_neg_integer().
get_minimum_range (Wp) -> Wp#weapon.range_min.
diff --git a/src/shared/struct/shr_character.erl b/src/shared/struct/shr_character.erl
index ea8e857..68e6cb6 100644
--- a/src/shared/struct/shr_character.erl
+++ b/src/shared/struct/shr_character.erl
@@ -69,6 +69,7 @@
-export
(
[
+ new/0,
resolve/2,
to_unresolved/1,
encode/1,
@@ -107,6 +108,15 @@ get_equipment_but_weapons_omnimods (Equipment) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec new () -> unresolved().
+new () ->
+ #shr_char_ref
+ {
+ name = <<"Unnamed Character">>,
+ equipment = shr_equipment:default_unresolved(),
+ is_using_secondary = false
+ }.
+
%%%% Accessors
-spec get_name (either()) -> binary().
get_name (#shr_char{ name = R }) -> R;
@@ -346,18 +356,44 @@ set_extra_omnimods (O, Char) ->
-spec resolve (shr_omnimods:type(), unresolved()) -> type().
resolve (LocalOmnimods, CharRef) ->
- Attributes = shr_attributes:default(),
Eq = shr_equipment:resolve(CharRef#shr_char_ref.equipment),
+ EquipmentButWeaponsOmnimods = get_equipment_but_weapons_omnimods(Eq),
+
+ NewOmnimods =
+ shr_omnimods:merge
+ (
+ shr_omnimods:merge
+ (
+ EquipmentButWeaponsOmnimods,
+ shr_weapon:get_omnimods(get_active_weapon(CharRef))
+ ),
+ LocalOmnimods
+ ),
+
+ NewAttributes =
+ shr_omnimods:apply_to_attributes
+ (
+ NewOmnimods,
+ shr_attributes:default()
+ ),
+
+ NewStatistics =
+ shr_omnimods:apply_to_statistics
+ (
+ NewOmnimods,
+ shr_statistics:new_raw(NewAttributes)
+ ),
+
#shr_char
{
name = CharRef#shr_char_ref.name,
- equipment_but_weapons_omnimods = get_equipment_but_weapons_omnimods(Eq),
+ equipment_but_weapons_omnimods = EquipmentButWeaponsOmnimods,
equipment = Eq,
is_using_secondary = CharRef#shr_char_ref.is_using_secondary,
- statistics = shr_statistics:new_raw(Attributes),
- attributes = Attributes,
- omnimods = shr_omnimods:default(),
+ statistics = NewStatistics,
+ attributes = NewAttributes,
+ omnimods = NewOmnimods,
extra_omnimods = LocalOmnimods
}.
diff --git a/src/shared/struct/shr_omnimods.erl b/src/shared/struct/shr_omnimods.erl
index 8d82287..081477d 100644
--- a/src/shared/struct/shr_omnimods.erl
+++ b/src/shared/struct/shr_omnimods.erl
@@ -29,8 +29,7 @@
(
[
default/0,
- new/4,
- new_dirty/4
+ new/4
]
).
@@ -64,14 +63,6 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec cleanup_entry_list (list(entry())) -> list(entry()).
-cleanup_entry_list (ModList) ->
- [First|Rem] = ModList,
- case First of
- {none, _} -> Rem;
- _ -> ModList
- end.
-
-spec apply_coefficient_to_mods (float(), mods()) -> mods().
apply_coefficient_to_mods (Coef, Mods) ->
dict:map(fun (_Name, Val) -> shr_math_util:ceil(Coef * Val) end, Mods).
@@ -119,23 +110,6 @@ new (AttributeMods, StatisticMods, AttackMods, DefenseMods) ->
-spec default () -> type().
default () -> new([], [], [], []).
--spec new_dirty
-(
- list(entry()),
- list(entry()),
- list(entry()),
- list(entry())
- )
- -> type().
-new_dirty(AttributeMods, StatisticMods, AttackMods, DefenseMods) ->
- new
- (
- cleanup_entry_list(AttributeMods),
- cleanup_entry_list(StatisticMods),
- cleanup_entry_list(AttackMods),
- cleanup_entry_list(DefenseMods)
- ).
-
%%% Modification
-spec merge (type(), type()) -> type().
merge (OmniA, OmniB) ->