summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | conf/yaws.conf.m4 | 2 | ||||
-rw-r--r-- | other/db_bounty.txt | 18 | ||||
-rw-r--r-- | src/battle/query/btl_join.erl (renamed from src/battle/query/btl_join.erl.next) | 75 | ||||
-rw-r--r-- | src/battle/reply/btl_add_portrait.erl | 29 | ||||
-rw-r--r-- | src/battle/struct/btl_pending_battle.erl | 3 | ||||
-rw-r--r-- | src/bounty/bnt_generate_player.erl (renamed from src/special/spe_player.erl) | 8 | ||||
-rw-r--r-- | src/bounty/bnt_grant_land.erl (renamed from src/special/spe_map.erl) | 8 | ||||
-rw-r--r-- | src/bounty/bnt_join_battle.erl (renamed from src/special/spe_battle.erl) | 295 | ||||
-rw-r--r-- | src/login/query/lgn_sign_up.erl | 2 | ||||
-rw-r--r-- | src/map/struct/map_map.erl | 2 | ||||
-rw-r--r-- | src/query/qry_shim.erl | 8 |
11 files changed, 280 insertions, 170 deletions
diff --git a/conf/yaws.conf.m4 b/conf/yaws.conf.m4 index 00dfe16..0773310 100644 --- a/conf/yaws.conf.m4 +++ b/conf/yaws.conf.m4 @@ -110,7 +110,7 @@ keepalive_timeout = 30000 listen = 0.0.0.0 docroot = __MAKEFILE_WWW_DIR auth_log = true - appmods = btl_character_turn btl_load map_load map_update lgn_sign_in lgn_sign_up lgn_recovery lgn_get_player_id rst_load rst_update plr_load plr_get_battles + appmods = btl_character_turn btl_load btl_join map_load map_update lgn_sign_in lgn_sign_up lgn_recovery lgn_get_player_id rst_load rst_update plr_load plr_get_battles start_mod = qry_handler partial_post_size = 1000000 </server> diff --git a/other/db_bounty.txt b/other/db_bounty.txt new file mode 100644 index 0000000..d31226a --- /dev/null +++ b/other/db_bounty.txt @@ -0,0 +1,18 @@ +Designing with a "it can crash at any point" mentality ++ can't combine DB queries in an atomic manner += Potential for partially completed tasks, "corrupting" the global DB. + +A solution could be having "bounty" entries, which work as follows: +A process P0 needs to do tasks T0, then T1, then T2. +P0 creates a bounty B0: +{ + not_before: 60s. + task: T0_T1_T2. + params: [{T0.id, T1.id, 20] +} +P0 adds B0 to the Bounty DB. +P0 attempts T0, T1, and T2. +P0 removes B0 from the Bounty DB. + +There are other processes trying to access available bounties (i.e. bounties +for which the "not_before" has expired) to complete them. diff --git a/src/battle/query/btl_join.erl.next b/src/battle/query/btl_join.erl index 3ab7be8..a723a8b 100644 --- a/src/battle/query/btl_join.erl.next +++ b/src/battle/query/btl_join.erl @@ -16,20 +16,14 @@ mode :: mode(), size :: non_neg_integer(), roster_ixs :: list(non_neg_integer()), - map_id :: string() + map_id :: ataxia_id:type() } ). --record -( - query_state, - { - battle :: btl_battle:type() - } -). -type input() :: #input{}. --type query_state() :: #query_state{}. +-type defend_query_state() :: 'ok'. +-type attack_query_state() :: 'ok'. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -48,7 +42,7 @@ parse_input (Req) -> Mode = case maps:get(<<"m">>, JSONReqMap) of <<"a">> -> attack; - <<"b">> -> defend; + <<"d">> -> defend; V -> {invalid, V} end, @@ -87,13 +81,15 @@ authenticate_user (Input) -> _ -> error end. --spec handle_new_attack (input()) -> query_state(). -handle_new_attack (Input) -> - PlayerID = <<"">>, +-spec handle_attack (input()) -> 'ok'. +handle_attack (Input) -> + PlayerID = Input#input.player_id, + SelectedCharacterIXs = Input#input.roster_ixs, PlayerDBUser = ataxia_security:user_from_id(PlayerID), - PartySize = 8, + PartySize = length(SelectedCharacterIXs), - AvailableBattle = + % TODO: be less brutal if none is found. + {ok, AvailablePendingBattle, _ID} = ataxia_client:update_and_fetch_any ( btl_pending, @@ -125,34 +121,53 @@ handle_new_attack (Input) -> ) ), - ... - + bnt_join_battle:attempt + ( + PlayerID, + SelectedCharacterIXs, + AvailablePendingBattle + ), --spec fetch_data (input()) -> query_state(). -fetch_data (Input) -> + ok. +-spec handle_defend (input()) -> 'ok'. +handle_defend (Input) -> PlayerID = Input#input.player_id, - BattleID = Input#input.battle_id, + SelectedCharacterIXs = Input#input.roster_ixs, + MapID = Input#input.map_id, - Battle = shr_timed_cache:fetch(battle_db, PlayerID, BattleID), + bnt_join_battle:generate(PlayerID, MapID, SelectedCharacterIXs), - #query_state - { - battle = Battle - }. + ok. + +-spec fetch_attack_data (input()) -> attack_query_state(). +fetch_attack_data (_Input) -> ok. % TODO +-spec fetch_defend_data (input()) -> defend_query_state(). +fetch_defend_data (_Input) -> ok. % TODO --spec generate_reply(query_state(), input()) -> binary(). -generate_reply (QueryState, Input) -> +-spec authorize_attack (attack_query_state(), input()) -> 'ok'. +authorize_attack (_QueryState, _Input) -> ok. % TODO - Output. +-spec authorize_defend (defend_query_state(), input()) -> 'ok'. +authorize_defend (_QueryState, _Input) -> ok. % TODO -spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), case authenticate_user(Input) of ok -> - QueryState = fetch_data(Input), - generate_reply(QueryState, Input); + case Input#input.mode of + attack -> + QueryState = fetch_attack_data(Input), + ok = authorize_attack(QueryState, Input), + handle_attack(Input); + + defend -> + QueryState = fetch_defend_data(Input), + ok = authorize_defend(QueryState, Input), + handle_defend(Input) + end, + jiffy:encode([shr_okay:generate()]); error -> jiffy:encode([shr_disconnected:generate()]) end. diff --git a/src/battle/reply/btl_add_portrait.erl b/src/battle/reply/btl_add_portrait.erl new file mode 100644 index 0000000..a634a04 --- /dev/null +++ b/src/battle/reply/btl_add_portrait.erl @@ -0,0 +1,29 @@ +-module(btl_add_portrait). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (shr_portrait:type()) -> {list(any())}. +generate (Portrait) -> + { + [ + {<<"msg">>, <<"add_portrait">>}, + {<<"id">>, shr_portrait:get_id(Portrait)}, + {<<"nam">>, shr_portrait:get_name(Portrait)}, + {<<"bid">>, shr_portrait:get_body_id(Portrait)}, + {<<"iid">>, shr_portrait:get_icon_id(Portrait)} + ] + }. diff --git a/src/battle/struct/btl_pending_battle.erl b/src/battle/struct/btl_pending_battle.erl index 6e21f79..cecaeb5 100644 --- a/src/battle/struct/btl_pending_battle.erl +++ b/src/battle/struct/btl_pending_battle.erl @@ -18,6 +18,9 @@ -opaque type() :: #pending_battle{}. -export_type([type/0, id/0]). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/special/spe_player.erl b/src/bounty/bnt_generate_player.erl index 00086fd..e02a94b 100644 --- a/src/special/spe_player.erl +++ b/src/bounty/bnt_generate_player.erl @@ -1,4 +1,4 @@ --module(spe_player). +-module(bnt_generate_player). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -7,7 +7,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/3]). +-export([attempt/3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -101,8 +101,8 @@ generate_roster (PlayerID) -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate (binary(), binary(), binary()) -> shr_player:type(). -generate (Username, Password, Email) -> +-spec attempt (binary(), binary(), binary()) -> shr_player:type(). +attempt (Username, Password, Email) -> UsernameLC = string:lowercase(Username), EmailLC = string:lowercase(Email), diff --git a/src/special/spe_map.erl b/src/bounty/bnt_grant_land.erl index afb5647..1a8a62e 100644 --- a/src/special/spe_map.erl +++ b/src/bounty/bnt_grant_land.erl @@ -1,4 +1,4 @@ --module(spe_map). +-module(bnt_grant_land). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -7,7 +7,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([grant_additional/1]). +-export([attempt/1]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,8 +16,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec grant_additional (ataxia_id:type()) -> map_map:type(). -grant_additional (OwnerID) -> +-spec attempt (ataxia_id:type()) -> map_map:type(). +attempt (OwnerID) -> Map = map_map:default(OwnerID), {ok, MapID} = diff --git a/src/special/spe_battle.erl b/src/bounty/bnt_join_battle.erl index d907224..1028166 100644 --- a/src/special/spe_battle.erl +++ b/src/bounty/bnt_join_battle.erl @@ -1,4 +1,4 @@ --module(spe_battle). +-module(bnt_join_battle). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -7,7 +7,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export([generate/2, add_to/2]). +-export([generate/3, attempt/3]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -173,7 +173,7 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) -> -spec handle_characters ( - list({non_neg_integer(), rst_character:type()}), + list(rst_character:type()), non_neg_integer(), btl_map:type(), ordsets:ordset(btl_location:type()), @@ -199,7 +199,7 @@ handle_characters {Characters, AtaxicUpdates}; handle_characters ( - [{_, RosterCharacter}|NextRosterCharacters], + [RosterCharacter|NextRosterCharacters], PlayerIX, Map, UsedLocations, @@ -235,143 +235,67 @@ handle_characters [NewUpdate|AtaxicUpdates] ). --spec handle_roster +-spec add_player ( - rst_roster:type(), - btl_map:type(), - ordsets:ordset(btl_location:type()), + shr_player:id(), btl_battle:type() ) - -> {btl_battle:type(), ataxic:basic()}. -handle_roster -( - Roster, - Map, - UsedLocations, - Battle -) -> + -> {btl_battle:type(), non_neg_integer(), ataxic:basic()}. +add_player (PlayerID, Battle) -> Players = btl_battle:get_players(Battle), - NextPlayerIX = orddict:size(Players), - NewPlayer = btl_player:new(NextPlayerIX, 0, rst_roster:get_owner(Roster)), - NewPlayers = orddict:store(NextPlayerIX, NewPlayer, Players), - Characters = btl_battle:get_characters(Battle), - {NewCharacters, CharactersUpdates} = - handle_characters - ( - orddict:to_list(rst_roster:get_characters(Roster)), - NextPlayerIX, - Map, - UsedLocations, - orddict:size(Characters), - Characters, - [] - ), + PlayerIX = orddict:size(Players), + NewPlayer = btl_player:new(PlayerIX, 0, PlayerID), - NewBattle = - btl_battle:set_characters - ( - NewCharacters, - btl_battle:set_players - ( - NewPlayers, - Battle - ) - ), + NewPlayers = orddict:store(PlayerIX, NewPlayer, Players), + S0Battle = btl_battle:set_players(NewPlayers, Battle), Update = - ataxic:sequence - ( - [ - ataxic:update_field - ( - btl_battle:get_players_field(), - ataxic:apply_function - ( - orddict, - store, - [ - ataxic:constant(NextPlayerIX), - ataxic:constant(NewPlayer), - ataxic:current_value() - ] - ) - ), - ataxic:update_field - ( - btl_battle:get_characters_field(), - ataxic:sequence(CharactersUpdates) - ) - ] - ), - - {NewBattle, Update}. - -%%%% BATTLE CREATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate_battle (map_map:type(), rst_roster:type()) -> btl_battle:type(). -generate_battle (Map, Roster) -> - TileInstances = map_map:get_tile_instances(Map), - BattleMap = - btl_map:from_instances_tuple - ( - map_map:get_width(Map), - map_map:get_height(Map), - TileInstances - ), - - Battle = btl_battle:new(BattleMap), - {S0Battle, _AtaxicUpdate} = - handle_roster(Roster, BattleMap, ordsets:new(), Battle), - - {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs} = - get_equipment_ids(btl_battle:get_characters(S0Battle)), - - S1Battle = - btl_battle:set_used_portrait_ids + ataxic:update_field ( - UsedPortraitIDs, - btl_battle:set_used_weapon_ids + btl_battle:get_players_field(), + ataxic:apply_function ( - UsedWeaponIDs, - btl_battle:set_used_armor_ids - ( - UsedArmorIDs, - S0Battle - ) + orddict, + store, + [ + ataxic:constant(PlayerIX), + ataxic:constant(NewPlayer), + ataxic:current_value() + ] ) ), - S1Battle. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate (map_map:type(), rst_roster:type()) -> btl_battle:type(). -generate (Map, Roster) -> - Battle = generate_battle(Map, Roster), - Battle. + {S0Battle, PlayerIX, Update}. --spec add_to +-spec add_characters ( - rst_roster:type(), + list(rst_character:type()), + non_neg_integer(), btl_battle:type() ) -> {btl_battle:type(), ataxic:basic()}. -add_to (Roster, Battle) -> - BattleMap = btl_battle:get_map(Battle), +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), - {S0Battle, AtaxicUpdate} = - handle_roster + {NewCharacters, CharactersUpdates} = + handle_characters ( - Roster, - BattleMap, + RosterCharacters, + PlayerIX, + Map, ForbiddenLocations, - Battle + NextCharacterIX, + CurrentCharacters, + [] ), {UsedPortraitIDs, UsedWeaponIDs, UsedArmorIDs} = - get_equipment_ids(rst_roster:get_characters(Roster)), + get_equipment_ids(RosterCharacters), OldPortraitIDs = btl_battle:get_used_portrait_ids(Battle), PortraitIDsUpdate = @@ -397,6 +321,7 @@ add_to (Roster, Battle) -> update_ordset(UsedArmorIDs, OldArmorIDs) ), + S0Battle = btl_battle:set_characters(NewCharacters, Battle), S1Battle = btl_battle:set_used_armor_ids ( @@ -418,21 +343,141 @@ add_to (Roster, Battle) -> [ ataxic:update_field ( - btl_battle:get_used_portrait_ids_field(), - PortraitIDsUpdate + btl_battle:get_characters_field(), + ataxic:sequence(CharactersUpdates) ), + PortraitIDsUpdate, + WeaponIDsUpdate, + ArmorIDsUpdate + ] + ), + + {S1Battle, Update}. + +-spec get_roster_characters + ( + shr_player:id(), + list(non_neg_integer()) + ) + -> list(rst_character:type()). +get_roster_characters (PlayerID, SelectedRosterCharacterIXs) -> + Player = shr_timed_cache:fetch(player_db, ataxia_security:any(), PlayerID), + RosterID = shr_player:get_roster_id(Player), + Roster = + shr_timed_cache:fetch + ( + roster_db, + ataxia_security:user_from_id(PlayerID), + RosterID + ), + + RosterCharacters = rst_roster:get_characters(Roster), + + lists:map + ( + fun (CharIX) -> + orddict:fetch(CharIX, RosterCharacters) + end, + SelectedRosterCharacterIXs + ). + +%%%% BATTLE CREATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate_battle (shr_player:id(), map_map:id()) -> btl_battle:type(). +generate_battle (PlayerID, MapID) -> + Map = + shr_timed_cache:fetch + ( + map_db, + ataxia_security:user_from_id(PlayerID), + MapID + ), + TileInstances = map_map:get_tile_instances(Map), + BattleMap = + btl_map:from_instances_tuple + ( + map_map:get_width(Map), + map_map:get_height(Map), + TileInstances + ), + + Battle = btl_battle:new(BattleMap), + + Battle. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate + ( + shr_player:id(), + map_map:id(), + list(non_neg_integer()) + ) + -> btl_pending_battle:type(). +generate (PlayerID, MapID, SelectedRosterCharacterIXs) -> + Battle = generate_battle(PlayerID, MapID), + PendingBattle = + btl_pending_battle:new + ( + <<"">>, + % TODO: More options than 1 vs N. + (length(SelectedRosterCharacterIXs) * 2), + Battle + ), + + attempt(PlayerID, SelectedRosterCharacterIXs, PendingBattle). + +-spec attempt + ( + shr_player:id(), + list(non_neg_integer()), + btl_pending_battle:type() + ) + -> btl_pending_battle:type(). +attempt (PlayerID, SelectedRosterCharacterIXs, PendingBattle) -> + Battle = btl_pending_battle:get_battle(PendingBattle), + RemainingSlots = + ( + btl_pending_battle:get_free_slots(PendingBattle) + - length(SelectedRosterCharacterIXs) + ), + + NewCharacters = get_roster_characters(PlayerID, SelectedRosterCharacterIXs), + {S0Battle, PlayerIX, BattleUpdate0} = add_player(PlayerID, Battle), + {S1Battle, BattleUpdate1} = + add_characters(NewCharacters, PlayerIX, S0Battle), + + S0PendingBattle = btl_pending_battle:set_battle(S1Battle, PendingBattle), + S1PendingBattle = + btl_pending_battle:set_free_slots(RemainingSlots, S0PendingBattle), + + Update = + ataxic:sequence + ( + [ ataxic:update_field ( - btl_battle:get_used_weapon_ids_field(), - WeaponIDsUpdate + btl_pending_battle:get_battle_field(), + ataxic:sequence + ( + [ + BattleUpdate0, + BattleUpdate1 + ] + ) ), ataxic:update_field ( - btl_battle:get_used_armor_ids_field(), - ArmorIDsUpdate - ), - AtaxicUpdate + btl_pending_battle:get_free_slots_field(), + ataxic:constant(RemainingSlots) + ) ] ), - {S1Battle, Update}. + {S1PendingBattle, Update}, + + S1PendingBattle. + + % TODO: + % if RemainingSlots = 0 -> del this, new Battle. + % Link either new Battle or current Pending Battle to player account. diff --git a/src/login/query/lgn_sign_up.erl b/src/login/query/lgn_sign_up.erl index 0632ac1..0d974ff 100644 --- a/src/login/query/lgn_sign_up.erl +++ b/src/login/query/lgn_sign_up.erl @@ -54,7 +54,7 @@ register_user (Input) -> Password = Input#input.password, Email = Input#input.email, - GeneratedPlayer = spe_player:generate(Username, Password, Email), + GeneratedPlayer = bnt_generate_player:attempt(Username, Password, Email), #query_state { diff --git a/src/map/struct/map_map.erl b/src/map/struct/map_map.erl index bfa9e5a..b8d37c9 100644 --- a/src/map/struct/map_map.erl +++ b/src/map/struct/map_map.erl @@ -3,7 +3,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type id() :: binary(). +-type id() :: ataxia_id:type(). -record ( diff --git a/src/query/qry_shim.erl b/src/query/qry_shim.erl index 473a14c..3933c73 100644 --- a/src/query/qry_shim.erl +++ b/src/query/qry_shim.erl @@ -15,14 +15,14 @@ -spec generate_player_0 () -> shr_player:type(). generate_player_0 () -> Player = - spe_player:generate + bnt_generate_player:attempt ( <<"Player1">>, <<"Kalimer0">>, <<"Player1@tacticians.online">> ), - spe_map:grant_additional(shr_player:get_id(Player)), + bnt_grant_land:attempt(shr_player:get_id(Player)), Player. @@ -30,14 +30,14 @@ generate_player_0 () -> -spec generate_player_1 () -> shr_player:type(). generate_player_1 () -> Player = - spe_player:generate + bnt_generate_player:attempt ( <<"Player2">>, <<"Kalimer1">>, <<"Player2@tacticians.online">> ), - spe_map:grant_additional(shr_player:get_id(Player)), + bnt_grant_land:attempt(shr_player:get_id(Player)), Player. |