summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_move.erl | 17 | ||||
-rw-r--r-- | src/battle/reply/btl_add_tile.erl | 2 | ||||
-rw-r--r-- | src/battle/struct/btl_pending_battle.erl | 16 | ||||
-rw-r--r-- | src/bounty/bnt_generate_player.erl | 2 | ||||
-rw-r--r-- | src/bounty/bnt_join_battle.erl | 215 | ||||
-rw-r--r-- | src/roster/query/rst_load.erl | 2 | ||||
-rw-r--r-- | src/roster/query/rst_update.erl | 2 | ||||
-rw-r--r-- | src/roster/struct/rst_roster.erl | 2 | ||||
-rw-r--r-- | src/shared/reply/shr_add_weapon.erl | 1 | ||||
-rw-r--r-- | src/shared/struct/inventory/shr_inventory.erl | 16 | ||||
-rw-r--r-- | src/shared/struct/inventory/shr_weapon.erl.m4 | 4 | ||||
-rw-r--r-- | src/shared/struct/shr_character.erl | 46 | ||||
-rw-r--r-- | src/shared/struct/shr_omnimods.erl | 28 |
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) -> |