summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/battle/struct/btl_turn_result.erl | 16 | ||||
-rw-r--r-- | src/special/spe_battle.erl | 86 |
2 files changed, 85 insertions, 17 deletions
diff --git a/src/battle/struct/btl_turn_result.erl b/src/battle/struct/btl_turn_result.erl index 97169e3..f31fb90 100644 --- a/src/battle/struct/btl_turn_result.erl +++ b/src/battle/struct/btl_turn_result.erl @@ -8,7 +8,7 @@ ( switched_weapon, { - character_ix :: btl_character:id() + character_ix :: non_neg_integer() } ). @@ -16,7 +16,7 @@ ( moved, { - character_ix :: btl_character:id(), + character_ix :: non_neg_integer(), path :: list(btl_direction:enum()), new_location :: btl_location:type() } @@ -26,8 +26,8 @@ ( attacked, { - attacker_ix :: btl_character:id(), - defender_ix :: btl_character:id(), + attacker_ix :: non_neg_integer(), + defender_ix :: non_neg_integer(), sequence :: list(btl_attack:type()) } ). @@ -108,13 +108,13 @@ new_player_lost (PlayerIX) -> new_player_turn_started (PlayerIX) -> #player_turn_started { player_ix = PlayerIX }. --spec new_character_switched_weapons (btl_character:id()) -> type(). +-spec new_character_switched_weapons (non_neg_integer()) -> type(). new_character_switched_weapons (CharacterIX) -> #switched_weapon { character_ix = CharacterIX }. -spec new_character_moved ( - btl_character:id(), + non_neg_integer(), list(btl_direction:enum()), btl_location:type() ) @@ -129,8 +129,8 @@ new_character_moved (CharacterIX, Path, NewLocation) -> -spec new_character_attacked ( - btl_character:id(), - btl_character:id(), + non_neg_integer(), + non_neg_integer(), list(btl_attack:type()) ) -> type(). diff --git a/src/special/spe_battle.erl b/src/special/spe_battle.erl index 4836fd2..c494f50 100644 --- a/src/special/spe_battle.erl +++ b/src/special/spe_battle.erl @@ -110,10 +110,11 @@ get_glyphs_omnimods (RosterChar) -> GlyphBoardID = rst_character:get_glyph_board_id(RosterChar), GlyphIDs = rst_character:get_glyph_ids(RosterChar), GlyphBoard = shr_glyph_board:from_id(GlyphBoardID), - Glyphs = array:map(fun rst_glyph:from_id/1, GlyphIDs), - Result = shr_glyph_board:get_omnimods(Glyphs, GlyphBoard), - - Result. + Glyphs = lists:map(fun shr_glyph:from_id/1, array:sparse_to_list(GlyphIDs)), + case shr_glyph_board:get_omnimods_with_glyphs(Glyphs, GlyphBoard) of + {ok, Result} -> Result; + error -> shr_omnimods:new([], [], [], []) + end. -spec create_character ( @@ -144,14 +145,79 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) -> Result. +-spec handle_characters + ( + list(rst_character:type()), + non_neg_integer(), + list(btl_character:type()), + btl_map:type(), + list(btl_location:type()) + ) + -> {list(btl_character:type()), list(btl_location:type())}. +handle_characters ([], _PlayerIX, Characters, _Map, UsedLocations) -> + {Characters, UsedLocations}; +handle_characters +( + [RosterCharacter|NextRosterCharacters], + PlayerIX, + Characters, + Map, + UsedLocations +) -> + NewCharacter = + create_character(PlayerIX, RosterCharacter, Map, UsedLocations), + + handle_characters + ( + NextRosterCharacters, + PlayerIX, + [NewCharacter|Characters], + Map, + [btl_character:get_location(NewCharacter)|UsedLocations] + ). + -spec handle_rosters ( - list(rst_roster:type()) + list(rst_roster:type()), + list(btl_character:type()), + list(btl_player:type()), + non_neg_integer(), + btl_map:type(), + list(btl_location:type()) ) -> {list(btl_character:type()), list(btl_player:type())}. -handle_rosters (_Rosters) -> - %% TODO Unimplemented. - {[], []}. +handle_rosters ([], Characters, Players, _PlayersCount, _Map, _UsedLocations) -> + {Characters, lists:reverse(Players)}; +handle_rosters +( + [Roster|NextRosters], + Characters, + Players, + PlayersCount, + Map, + UsedLocations +) -> + NewPlayer = btl_player:new(PlayersCount, 0, rst_roster:get_owner(Roster)), + {NextCharacters, NextUsedLocations} = + handle_characters + ( + array:to_list(rst_roster:get_characters(Roster)), + PlayersCount, + Characters, + Map, + UsedLocations + ), + + handle_rosters + ( + NextRosters, + NextCharacters, + [NewPlayer|Players], + (PlayersCount + 1), + Map, + NextUsedLocations + ). + %%%% BATTLE CREATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec generate_battle @@ -170,7 +236,9 @@ generate_battle (ID, Map, Rosters) -> map_map:get_height(Map), TileInstances ), - {Characters, PlayersAsList} = handle_rosters(Rosters), + {Characters, PlayersAsList} = + handle_rosters(Rosters, [], [], 0, BattleMap, []), + {UsedWeaponIDs, UsedArmorIDs} = get_equipment_ids(Characters), UsedTileIDs = get_tile_ids(TileInstances), |