| 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. | 


