From 67345d58c55e513f9b11a5b3e1af33164a4103ef Mon Sep 17 00:00:00 2001 From: nsensfel Date: Fri, 24 Aug 2018 13:02:16 +0200 Subject: Working on the character editor... --- src/battle/query/btl_character_turn.erl | 4 +- src/battle/query/btl_load.erl | 18 +- src/character/chr_handler.erl | 40 +++ src/character/chr_shim.erl | 25 ++ src/character/query/chr_load.erl | 111 ++++++++ src/character/reply/chr_add_char.erl | 39 +++ src/character/struct/chr_character.erl | 151 +++++++++++ src/character/struct/chr_roster.erl | 127 +++++++++ src/map/query/map_load.erl | 17 +- src/map/query/map_update.erl | 18 +- src/shared/reply/shr_set_inventory.erl | 32 +++ src/shared/shr_security.erl | 8 +- src/shared/struct/shr_armor.erl | 193 -------------- src/shared/struct/shr_armor.erl.m4 | 2 +- src/shared/struct/shr_glyph.erl | 21 ++ src/shared/struct/shr_glyph_board.erl | 21 ++ src/shared/struct/shr_inventory.erl | 152 +++++++++++ src/shared/struct/shr_player.erl | 39 ++- src/shared/struct/shr_weapon.erl | 447 -------------------------------- src/shared/struct/shr_weapon.erl.m4 | 2 +- 20 files changed, 793 insertions(+), 674 deletions(-) create mode 100644 src/character/chr_handler.erl create mode 100644 src/character/chr_shim.erl create mode 100644 src/character/query/chr_load.erl create mode 100644 src/character/reply/chr_add_char.erl create mode 100644 src/character/struct/chr_character.erl create mode 100644 src/character/struct/chr_roster.erl create mode 100644 src/shared/reply/shr_set_inventory.erl delete mode 100644 src/shared/struct/shr_armor.erl create mode 100644 src/shared/struct/shr_glyph.erl create mode 100644 src/shared/struct/shr_glyph_board.erl create mode 100644 src/shared/struct/shr_inventory.erl delete mode 100644 src/shared/struct/shr_weapon.erl diff --git a/src/battle/query/btl_character_turn.erl b/src/battle/query/btl_character_turn.erl index a65dc91..b23a02e 100644 --- a/src/battle/query/btl_character_turn.erl +++ b/src/battle/query/btl_character_turn.erl @@ -30,7 +30,9 @@ authenticate_user (Request) -> PlayerID = btl_character_turn_request:get_player_id(Request), SessionToken = btl_character_turn_request:get_session_token(Request), - shr_security:assert_identity(PlayerID, SessionToken), + Player = shr_timed_cache:fetch(player_db, any, PlayerID), + + shr_security:assert_identity(SessionToken, Player), shr_security:lock_queries(PlayerID), ok. diff --git a/src/battle/query/btl_load.erl b/src/battle/query/btl_load.erl index 551ec41..a93120e 100644 --- a/src/battle/query/btl_load.erl +++ b/src/battle/query/btl_load.erl @@ -48,6 +48,17 @@ parse_input (Req) -> battle_id = BattleID }. +-spec authenticate_user (input()) -> 'ok'. +authenticate_user (Input) -> + PlayerID = Input#input.player_id, + SessionToken = Input#input.session_token, + + Player = shr_timed_cache:fetch(player_db, any, PlayerID), + + shr_security:assert_identity(SessionToken, Player), + + ok. + -spec fetch_data (input()) -> query_state(). fetch_data (Input) -> PlayerID = Input#input.player_id, @@ -60,6 +71,7 @@ fetch_data (Input) -> battle = Battle }. + -spec generate_reply(query_state(), input()) -> binary(). generate_reply (QueryState, Input) -> PlayerID = Input#input.player_id, @@ -138,11 +150,7 @@ generate_reply (QueryState, Input) -> -spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), - shr_security:assert_identity - ( - Input#input.player_id, - Input#input.session_token - ), + authenticate_user(Input), shr_security:lock_queries(Input#input.player_id), QueryState = fetch_data(Input), shr_security:unlock_queries(Input#input.player_id), diff --git a/src/character/chr_handler.erl b/src/character/chr_handler.erl new file mode 100644 index 0000000..7697bcd --- /dev/null +++ b/src/character/chr_handler.erl @@ -0,0 +1,40 @@ +-module(chr_handler). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([start/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec start (pid()) -> 'ok'. +start (TimedCachesManagerPid) -> + case shr_database:fetch(char_roster_db, <<"0">>, admin) of + {ok, _} -> ok; + not_found -> + shr_database:insert_at + ( + char_roster_db, + <<"0">>, + any, + any, + chr_shim:generate_random_character_roster() + ) + end, + shr_timed_caches_manager:new_cache + ( + TimedCachesManagerPid, + char_roster_db, + none + ), + + ok. diff --git a/src/character/chr_shim.erl b/src/character/chr_shim.erl new file mode 100644 index 0000000..d7e688f --- /dev/null +++ b/src/character/chr_shim.erl @@ -0,0 +1,25 @@ +-module(chr_shim). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate_random_character_roster/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate_random_character_roster () -> chr_roster:type(). +generate_random_character_roster () -> + Result = chr_roster:new(<<"0">>, <<"0">>), + + %% TODO: unimplemented. + + Result. diff --git a/src/character/query/chr_load.erl b/src/character/query/chr_load.erl new file mode 100644 index 0000000..290ea37 --- /dev/null +++ b/src/character/query/chr_load.erl @@ -0,0 +1,111 @@ +-module(chr_load). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-include("../../../include/yaws_api.hrl"). + +-record +( + input, + { + player_id :: binary(), + session_token :: binary() + } +). + +-record +( + query_state, + { + player :: shr_player:type(), + inventory :: shr_inventory:type(), + roster :: chr_roster:type() + } +). + +-type input() :: #input{}. +-type query_state() :: #query_state{}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([out/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec parse_input (binary()) -> input(). +parse_input (Req) -> + JSONReqMap = jiffy:decode(Req, [return_maps]), + PlayerID = maps:get(<<"pid">>, JSONReqMap), + SessionToken = maps:get(<<"stk">>, JSONReqMap), + + #input + { + player_id = PlayerID, + session_token = SessionToken + }. + +-spec authenticate_user (input()) -> {'ok', shr_player:type()}. +authenticate_user (Input) -> + PlayerID = Input#input.player_id, + SessionToken = Input#input.session_token, + + Player = shr_timed_cache:fetch(player_db, any, PlayerID), + + shr_security:assert_identity(SessionToken, Player), + + {ok, Player}. + +-spec fetch_data (shr_player:type(), input()) -> query_state(). +fetch_data (Player, Input) -> + PlayerID = Input#input.player_id, + RosterID = shr_player:get_roster_id(Player), + InventoryID = shr_player:get_inventory_id(Player), + + Roster = shr_timed_cache:fetch(char_roster_db, PlayerID, RosterID), + Inventory = shr_timed_cache:fetch(char_roster_db, PlayerID, InventoryID), + + #query_state + { + player = Player, + roster = Roster, + inventory = Inventory + }. + +-spec generate_reply(query_state()) -> binary(). +generate_reply (QueryState) -> + Roster = QueryState#query_state.roster, + Inventory = QueryState#query_state.inventory, + + RosterCharacters = chr_roster:get_characters(Roster), + SetInventory = shr_set_inventory:generate(Inventory), + EncodedRoster = + array:to_list + ( + array:sparse_map(fun chr_add_char:generate/2, RosterCharacters) + ), + + Output = jiffy:encode([SetInventory|EncodedRoster]), + + Output. + +-spec handle (binary()) -> binary(). +handle (Req) -> + Input = parse_input(Req), + {ok, Player} = authenticate_user(Input), + shr_security:lock_queries(Input#input.player_id), + QueryState = fetch_data(Player, Input), + shr_security:unlock_queries(Input#input.player_id), + generate_reply(QueryState). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +out(A) -> + { + content, + "application/json; charset=UTF-8", + handle(A#arg.clidata) + }. diff --git a/src/character/reply/chr_add_char.erl b/src/character/reply/chr_add_char.erl new file mode 100644 index 0000000..53a62d6 --- /dev/null +++ b/src/character/reply/chr_add_char.erl @@ -0,0 +1,39 @@ +-module(chr_add_char). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/2]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate + ( + non_neg_integer(), + chr_character:type() + ) + -> {list(any())}. +generate (IX, Character) -> + {ActiveWeapon, SecondaryWeapon} = chr_character:get_weapon_ids(Character), + + { + [ + {<<"msg">>, <<"add_char">>}, + {<<"ix">>, IX}, + {<<"nam">>, chr_character:get_name(Character)}, + {<<"awp">>, ActiveWeapon}, + {<<"swp">>, SecondaryWeapon}, + {<<"ar">>, chr_character:get_armor_id(Character)}, + {<<"gls">>, array:to_list(chr_character:get_glyph_ids(Character))}, + {<<"gb">>, chr_character:get_glyph_board_id(Character)} + ] + }. diff --git a/src/character/struct/chr_character.erl b/src/character/struct/chr_character.erl new file mode 100644 index 0000000..a9ef52d --- /dev/null +++ b/src/character/struct/chr_character.erl @@ -0,0 +1,151 @@ +-module(chr_character). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + character, + { + name :: binary(), + portrait :: binary(), + weapon_ids :: {shr_weapon:id(), shr_weapon:id()}, + armor_id :: shr_armor:id(), + glyph_ids :: array:array(shr_glyph:id()), + glyph_board_id :: shr_glyph_board:id() + } +). + +-opaque type() :: #character{}. + +-export_type([type/0]). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_name/1, + get_portrait/1, + get_weapon_ids/1, + get_armor_id/1, + get_glyph_ids/1, + get_glyph_board_id/1, + + set_name/2, + set_portrait/2, + set_weapon_ids/2, + set_armor_id/2, + set_glyph_ids/2, + set_glyph_board_id/2, + + get_name_field/0, + get_portrait_field/0, + get_weapon_ids_field/0, + get_armor_id_field/0, + get_glyph_ids_field/0, + get_glyph_board_id_field/0 + ] +). + +-export +( + [ + random/0 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_name (type()) -> binary(). +get_name (Char) -> Char#character.name. + +-spec get_portrait (type()) -> binary(). +get_portrait (Char) -> Char#character.portrait. + +-spec get_weapon_ids (type()) -> {shr_weapon:id(), shr_weapon:id()}. +get_weapon_ids (Char) -> Char#character.weapon_ids. + +-spec get_armor_id (type()) -> shr_armor:id(). +get_armor_id (Char) -> Char#character.armor_id. + +-spec get_glyph_ids (type()) -> array:array(shr_glyph:id()). +get_glyph_ids (Char) -> Char#character.glyph_ids. + +-spec get_glyph_board_id (type()) -> shr_glyph_board:id(). +get_glyph_board_id (Char) -> Char#character.glyph_board_id. + + +-spec set_name (binary(), type()) -> type(). +set_name (Name, Char) -> + Char#character + { + name = Name + }. + +-spec set_portrait (binary(), type()) -> type(). +set_portrait (PortraitID, Char) -> + Char#character + { + portrait = PortraitID + }. + +-spec set_armor_id (shr_armor:id(), type()) -> type(). +set_armor_id (ArmorID, Char) -> + Char#character + { + armor_id = ArmorID + }. + +-spec set_weapon_ids ({shr_weapon:id(), shr_weapon:id()}, type()) -> type(). +set_weapon_ids (WeaponIDs, Char) -> + Char#character + { + weapon_ids = WeaponIDs + }. + +-spec set_glyph_ids (array:array(shr_glyph:id()), type()) -> type(). +set_glyph_ids (GlyphIDs, Char) -> + Char#character + { + glyph_ids = GlyphIDs + }. + +-spec set_glyph_board_id (shr_glyph_board:id(), type()) -> type(). +set_glyph_board_id (GlyphBoardID, Char) -> + Char#character + { + glyph_board_id = GlyphBoardID + }. + +-spec random () -> type(). +random () -> + #character + { + name = <<"">>, + portrait = <<"0">>, + weapon_ids = {0, 0}, + armor_id = 0, + glyph_ids = array:new(), + glyph_board_id = <<"0">> + }. + +-spec get_name_field () -> non_neg_integer(). +get_name_field () -> #character.name. +-spec get_portrait_field () -> non_neg_integer(). +get_portrait_field () -> #character.portrait. +-spec get_armor_id_field () -> non_neg_integer(). +get_armor_id_field () -> #character.armor_id. +-spec get_weapon_ids_field () -> non_neg_integer(). +get_weapon_ids_field () -> #character.weapon_ids. +-spec get_glyph_ids_field () -> non_neg_integer(). +get_glyph_ids_field () -> #character.glyph_ids. +-spec get_glyph_board_id_field () -> non_neg_integer(). +get_glyph_board_id_field () -> #character.glyph_board_id. diff --git a/src/character/struct/chr_roster.erl b/src/character/struct/chr_roster.erl new file mode 100644 index 0000000..99a82fc --- /dev/null +++ b/src/character/struct/chr_roster.erl @@ -0,0 +1,127 @@ +-module(chr_roster). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-type id() :: binary(). + +-record +( + roster, + { + id :: id(), + owner :: binary(), + characters :: array:array(chr_character:type()) + } +). + +-opaque type() :: #roster{}. + +-export_type([type/0, id/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_id/1, + get_owner/1, + get_characters/1, + get_character/2, + + set_characters/2, + set_character/3, + + add_character/2, + remove_character/2 + ] +). + +-export +( + [ + get_characters_field/0 + ] +). + +-export +( + [ + new/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_id (type()) -> id(). +get_id (Roster) -> Roster#roster.id. + +-spec get_owner (type()) -> binary(). +get_owner (Roster) -> Roster#roster.owner. + +-spec get_characters (type()) -> array:array(chr_character:type()). +get_characters (Roster) -> Roster#roster.characters. + +-spec get_character (non_neg_integer(), type()) -> chr_character:type(). +get_character (IX, Roster) -> array:get(IX, Roster#roster.characters). + +-spec set_characters (array:array(chr_character:type()), type()) -> type(). +set_characters (Characters, Roster) -> Roster#roster{ characters = Characters }. + +-spec set_character + ( + non_neg_integer(), + chr_character:type(), + type() + ) + -> type(). +set_character (IX, Character, Roster) -> + Roster#roster + { + characters = array:set(IX, Character, Roster#roster.characters) + }. + +-spec add_character (chr_character:type(), type()) -> type(). +add_character (Character, Roster) -> + CurrentCharacters = Roster#roster.characters, + CurrentSize = array:size(CurrentCharacters), + + Roster#roster + { + characters = array:set(CurrentSize, Character, CurrentCharacters) + }. + +-spec remove_character (non_neg_integer(), type()) -> type(). +remove_character (IX, Roster) -> + CurrentCharacters = Roster#roster.characters, + CurrentSize = array:size(CurrentCharacters), + NewSize = (CurrentSize - 1), + LastCharacter = array:get(NewSize, CurrentCharacters), + + S0Characters = array:set(IX, LastCharacter, CurrentCharacters), + S1Characters = array:resize(NewSize, S0Characters), + + Roster#roster + { + characters = S1Characters + }. + +-spec get_characters_field () -> non_neg_integer(). +get_characters_field () -> #roster.characters. + +-spec new (binary(), binary()) -> type(). +new (ID, Owner) -> + #roster + { + id = ID, + owner = Owner, + characters = array:new() + }. diff --git a/src/map/query/map_load.erl b/src/map/query/map_load.erl index 8365521..3357c4f 100644 --- a/src/map/query/map_load.erl +++ b/src/map/query/map_load.erl @@ -48,6 +48,17 @@ parse_input (Req) -> map_id = MapID }. +-spec authenticate_user (input()) -> 'ok'. +authenticate_user (Input) -> + PlayerID = Input#input.player_id, + SessionToken = Input#input.session_token, + + Player = shr_timed_cache:fetch(player_db, any, PlayerID), + + shr_security:assert_identity(SessionToken, Player), + + ok. + -spec fetch_data (input()) -> query_state(). fetch_data (Input) -> PlayerID = Input#input.player_id, @@ -72,11 +83,7 @@ generate_reply (QueryState) -> -spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), - shr_security:assert_identity - ( - Input#input.player_id, - Input#input.session_token - ), + authenticate_user(Input), shr_security:lock_queries(Input#input.player_id), QueryState = fetch_data(Input), shr_security:unlock_queries(Input#input.player_id), diff --git a/src/map/query/map_update.erl b/src/map/query/map_update.erl index d2d8690..4c38ddf 100644 --- a/src/map/query/map_update.erl +++ b/src/map/query/map_update.erl @@ -47,6 +47,7 @@ parse_input (Req) -> MapHeight = maps:get(<<"h">>, JSONReqMap), MapContent = maps:get(<<"t">>, JSONReqMap), + %% TODO: those checks should be done while queries are locked. true = (MapWidth > 0), true = (MapHeight > 0), true = (length(MapContent) == (MapWidth * MapHeight)), @@ -83,6 +84,17 @@ parse_input (Req) -> t = MapContent }. +-spec authenticate_user (input()) -> 'ok'. +authenticate_user (Input) -> + PlayerID = Input#input.player_id, + SessionToken = Input#input.session_token, + + Player = shr_timed_cache:fetch(player_db, any, PlayerID), + + shr_security:assert_identity(SessionToken, Player), + + ok. + -spec fetch_data (input()) -> query_state(). fetch_data (Input) -> PlayerID = Input#input.player_id, @@ -152,11 +164,7 @@ generate_reply () -> -spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), - shr_security:assert_identity - ( - Input#input.player_id, - Input#input.session_token - ), + authenticate_user(Input), shr_security:lock_queries(Input#input.player_id), QueryState = fetch_data(Input), Update = update_data(QueryState, Input), diff --git a/src/shared/reply/shr_set_inventory.erl b/src/shared/reply/shr_set_inventory.erl new file mode 100644 index 0000000..8c04606 --- /dev/null +++ b/src/shared/reply/shr_set_inventory.erl @@ -0,0 +1,32 @@ +-module(shr_set_inventory). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-export([generate/1]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec encode_set (sets:set(binary())) -> list(binary()). +encode_set (Set) -> sets:to_list(Set). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec generate (shr_inventory:type()) -> {list(any())}. +generate (Inventory) -> + { + [ + {<<"msg">>, <<"set_inventory">>}, + {<<"pts">>, encode_set(shr_inventory:get_portrait_ids(Inventory))}, + {<<"gls">>, encode_set(shr_inventory:get_glyph_ids(Inventory))}, + {<<"gbs">>, encode_set(shr_inventory:get_glyph_board_ids(Inventory))}, + {<<"wps">>, encode_set(shr_inventory:get_weapon_ids(Inventory))}, + {<<"ars">>, encode_set(shr_inventory:get_armor_ids(Inventory))} + ] + }. diff --git a/src/shared/shr_security.erl b/src/shared/shr_security.erl index f48ba92..3e9fb34 100644 --- a/src/shared/shr_security.erl +++ b/src/shared/shr_security.erl @@ -23,11 +23,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec assert_identity (any(), any()) -> 'ok'. -assert_identity (PlayerID, SessionToken) -> - %Player = shr_timed_cache:fetch(player_db, any, PlayerID), - - %true = (shr_player:get_token(Player) == SessionToken), +-spec assert_identity (binary(), shr_player:type()) -> 'ok'. +assert_identity (SessionToken, Player) -> + true = (shr_player:get_token(Player) == SessionToken), ok. diff --git a/src/shared/struct/shr_armor.erl b/src/shared/struct/shr_armor.erl deleted file mode 100644 index fa516f3..0000000 --- a/src/shared/struct/shr_armor.erl +++ /dev/null @@ -1,193 +0,0 @@ --module(shr_armor). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: non_neg_integer(). - --type category() :: 'kinetic' | 'leather' | 'chain' | 'plate'. - --record -( - armor, - { - id :: id(), - name :: binary(), - category :: category(), - coef :: float() - } -). - --opaque type() :: #armor{}. - --export_type([type/0, id/0]). --export_type ([category/0]). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --export -( - [ - get_id/1, - get_name/1, - get_coefficient/1, - get_category/1 - ] -). - --export -( - [ - random_id/0, - from_id/1, - apply_to_attributes/2, - get_resistance_to/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --spec get_id (type()) -> id(). -get_id (Ar) -> Ar#armor.id. - --spec get_name (type()) -> binary(). -get_name (Ar) -> Ar#armor.name. - --spec get_coefficient (type()) -> float(). -get_coefficient (Ar) -> Ar#armor.coef. - --spec get_category (type()) -> category(). -get_category (Ar) -> Ar#armor.category. - --spec from_id (id()) -> type(). - -from_id (0) -> - #armor - { - id = 0, - name = <<"None">>, - category = leather, - coef = 0.0 - }; -from_id (1) -> - #armor - { - id = 1, - name = <<"Last Meal's Pelts">>, - category = leather, - coef = 0.5 - }; -from_id (2) -> - #armor - { - id = 2, - name = <<"Bits of Wall">>, - category = plate, - coef = 0.5 - }; -from_id (3) -> - #armor - { - id = 3, - name = <<"Garden Fence">>, - category = chain, - coef = 0.5 - }; -from_id (4) -> - #armor - { - id = 4, - name = <<"Morrigan's Pity">>, - category = kinetic, - coef = 0.5 - }; -from_id(_) -> - from_id(0). - --spec random_id () -> id(). -random_id () -> shr_roll:between(0, 4). - --spec apply_to_attributes - ( - type(), - shr_attributes:type() - ) - -> shr_attributes:type(). -apply_to_attributes (Ar, Att) -> - Constitution = shr_attributes:get_constitution(Att), - Dexterity = shr_attributes:get_dexterity(Att), - Speed = shr_attributes:get_speed(Att), - Strength = shr_attributes:get_strength(Att), - Mind = shr_attributes:get_mind(Att), - Impact = shr_math_util:ceil(20.0 * Ar#armor.coef), - HalfImpact = shr_math_util:ceil(10.0 * Ar#armor.coef), - Category = Ar#armor.category, - - case Category of - kinetic -> shr_attributes:set_unsafe_mind((Mind - Impact), Att); - leather -> - shr_attributes:set_unsafe_constitution - ( - (Constitution - HalfImpact), - shr_attributes:set_unsafe_dexterity((Dexterity - HalfImpact), Att) - ); - - chain -> - shr_attributes:set_unsafe_constitution - ( - (Constitution - HalfImpact), - shr_attributes:set_unsafe_dexterity - ( - (Dexterity - HalfImpact), - shr_attributes:set_unsafe_speed((Speed - Impact), Att) - ) - ); - - plate -> - shr_attributes:set_unsafe_constitution - ( - (Constitution - HalfImpact), - shr_attributes:set_unsafe_dexterity - ( - (Dexterity - HalfImpact), - shr_attributes:set_unsafe_speed - ( - (Speed - Impact), - shr_attributes:set_unsafe_strength((Strength - Impact), Att) - ) - ) - ) - end. - --spec get_resistance_to (shr_weapon:damage_type(), type()) -> non_neg_integer(). -get_resistance_to (DamageType, Armor) -> - ArmorCategory = Armor#armor.category, - BaseResistance = - case {DamageType, ArmorCategory} of - {slash, kinetic} -> 0.0; - {slash, leather} -> 20.0; - {slash, chain} -> 30.0; - {slash, plate} -> 30.0; - {blunt, kinetic} -> 20.0; - {blunt, leather} -> 20.0; - {blunt, chain} -> 20.0; - {blunt, plate} -> 20.0; - {pierce, kinetic} -> 20.0; - {pierce, leather} -> 20.0; - {pierce, chain} -> 20.0; - {pierce, plate} -> 30.0 - end, - - ArmorCoefficient = Armor#armor.coef, - ActualResistance = (ArmorCoefficient * BaseResistance), - - shr_math_util:ceil(ActualResistance). diff --git a/src/shared/struct/shr_armor.erl.m4 b/src/shared/struct/shr_armor.erl.m4 index 02938e2..e72ba47 100644 --- a/src/shared/struct/shr_armor.erl.m4 +++ b/src/shared/struct/shr_armor.erl.m4 @@ -3,7 +3,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: non_neg_integer(). +-type id() :: non_neg_integer(). -type category() :: 'kinetic' | 'leather' | 'chain' | 'plate'. diff --git a/src/shared/struct/shr_glyph.erl b/src/shared/struct/shr_glyph.erl new file mode 100644 index 0000000..cb971d1 --- /dev/null +++ b/src/shared/struct/shr_glyph.erl @@ -0,0 +1,21 @@ +-module(shr_glyph). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-type id() :: binary(). + +-export_type([id/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/src/shared/struct/shr_glyph_board.erl b/src/shared/struct/shr_glyph_board.erl new file mode 100644 index 0000000..ad1545f --- /dev/null +++ b/src/shared/struct/shr_glyph_board.erl @@ -0,0 +1,21 @@ +-module(shr_glyph_board). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-type id() :: binary(). + +-export_type([id/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/src/shared/struct/shr_inventory.erl b/src/shared/struct/shr_inventory.erl new file mode 100644 index 0000000..5d70720 --- /dev/null +++ b/src/shared/struct/shr_inventory.erl @@ -0,0 +1,152 @@ +-module(shr_inventory). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + inventory, + { + owner_id :: shr_player:id(), + portrait_ids :: sets:set(binary()), + glyph_ids :: sets:set(binary()), + glyph_board_ids :: sets:set(binary()), + weapon_ids :: sets:set(binary()), + armor_ids :: sets:set(binary()) + } +). + +-opaque type() :: #inventory{}. + +-export_type([type/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_owner_id/1, + + get_portrait_ids/1, + get_glyph_ids/1, + get_glyph_board_ids/1, + get_weapon_ids/1, + get_armor_ids/1, + + set_portrait_ids/2, + set_glyph_ids/2, + set_glyph_board_ids/2, + set_weapon_ids/2, + set_armor_ids/2 + ] +). + +-export +( + [ + get_portrait_ids_field/0, + get_glyph_ids_field/0, + get_glyph_board_ids_field/0, + get_weapon_ids_field/0, + get_armor_ids_field/0 + ] +). + +-export +( + [ + new/1 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_owner_id (type()) -> shr_player:id(). +get_owner_id (Inv) -> Inv#inventory.owner_id. + +-spec get_portrait_ids (type()) -> sets:set(binary()). +get_portrait_ids (Inv) -> Inv#inventory.portrait_ids. + +-spec get_glyph_ids (type()) -> sets:set(binary()). +get_glyph_ids (Inv) -> Inv#inventory.glyph_ids. + +-spec get_glyph_board_ids (type()) -> sets:set(binary()). +get_glyph_board_ids (Inv) -> Inv#inventory.glyph_board_ids. + +-spec get_weapon_ids (type()) -> sets:set(binary()). +get_weapon_ids (Inv) -> Inv#inventory.weapon_ids. + +-spec get_armor_ids (type()) -> sets:set(binary()). +get_armor_ids (Inv) -> Inv#inventory.armor_ids. + +-spec set_portrait_ids (sets:set(binary()), type()) -> type(). +set_portrait_ids (Value, Inv) -> + Inv#inventory + { + portrait_ids = Value + }. + +-spec set_glyph_ids (sets:set(binary()), type()) -> type(). +set_glyph_ids (Value, Inv) -> + Inv#inventory + { + glyph_ids = Value + }. + +-spec set_glyph_board_ids (sets:set(binary()), type()) -> type(). +set_glyph_board_ids (Value, Inv) -> + Inv#inventory + { + glyph_board_ids = Value + }. + +-spec set_weapon_ids (sets:set(binary()), type()) -> type(). +set_weapon_ids (Value, Inv) -> + Inv#inventory + { + weapon_ids = Value + }. + +-spec set_armor_ids (sets:set(binary()), type()) -> type(). +set_armor_ids (Value, Inv) -> + Inv#inventory + { + armor_ids = Value + }. + +-spec get_portrait_ids_field () -> non_neg_integer(). +get_portrait_ids_field () -> #inventory.portrait_ids. + +-spec get_glyph_ids_field () -> non_neg_integer(). +get_glyph_ids_field () -> #inventory.glyph_ids. + +-spec get_glyph_board_ids_field () -> non_neg_integer(). +get_glyph_board_ids_field () -> #inventory.glyph_board_ids. + +-spec get_weapon_ids_field () -> non_neg_integer(). +get_weapon_ids_field () -> #inventory.weapon_ids. + +-spec get_armor_ids_field () -> non_neg_integer(). +get_armor_ids_field () -> #inventory.armor_ids. + +-spec new (shr_player:id()) -> type(). +new (OwnerID) -> + EmptySet = sets:new(), + + #inventory + { + owner_id = OwnerID, + portrait_ids = EmptySet, + glyph_ids = EmptySet, + glyph_board_ids = EmptySet, + weapon_ids = EmptySet, + armor_ids = EmptySet + }. diff --git a/src/shared/struct/shr_player.erl b/src/shared/struct/shr_player.erl index 2b394c6..13fa1ed 100644 --- a/src/shared/struct/shr_player.erl +++ b/src/shared/struct/shr_player.erl @@ -17,7 +17,8 @@ email :: binary(), last_active :: integer(), maps :: list(binary()), - characters :: list(binary()) + roster_id :: binary(), + inventory_id :: binary() } ). @@ -46,7 +47,8 @@ get_email/1, get_last_active/1, get_maps/1, - get_characters/1, + get_inventory_id/1, + get_roster_id/1, set_id/2, set_username/2, @@ -55,7 +57,8 @@ set_email/2, refresh_active/1, set_maps/2, - set_characters/2 + set_inventory_id/2, + set_roster_id/2 ] ). @@ -69,7 +72,8 @@ get_email_field/0, get_last_active_field/0, get_maps_field/0, - get_characters_field/0 + get_inventory_id_field/0, + get_roster_id_field/0 ] ). @@ -85,6 +89,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec secure_value (binary(), binary()) -> binary(). secure_value (Salt, Val) -> + % TODO: Maybe it would be a good idea to include the user's IP in there as + % well. This would ensure that sessions alway use the same server (and thus, + % the same caches), and make timed cache exploits easier to prevent. SaltedVal = erlang:iolist_to_binary([Salt, Val]), HashedSaltedVal = crypto:hash(sha384, SaltedVal), @@ -105,7 +112,8 @@ new (ID, Username, Password, Email) -> email = Email, last_active = 0, maps = [], - characters = [] + inventory_id = <<"0">>, + roster_id = <<"0">> }, S0Result = set_password(Password, Result), @@ -136,8 +144,11 @@ get_last_active (Player) -> Player#player.last_active. -spec get_maps (type()) -> list(binary()). get_maps (Player) -> Player#player.maps. --spec get_characters (type()) -> list(binary()). -get_characters (Player) -> Player#player.characters. +-spec get_roster_id (type()) -> binary(). +get_roster_id (Player) -> Player#player.roster_id. + +-spec get_inventory_id (type()) -> binary(). +get_inventory_id (Player) -> Player#player.inventory_id. -spec set_id (binary(), type()) -> type(). set_id (Val, Player) -> Player#player{ id = Val }. @@ -175,8 +186,11 @@ refresh_active (Player) -> -spec set_maps (list(binary()), type()) -> type(). set_maps (Maps, Player) -> Player#player{ maps = Maps }. --spec set_characters (list(binary()), type()) -> type(). -set_characters (Characters, Player) -> Player#player{ characters = Characters }. +-spec set_roster_id (binary(), type()) -> type(). +set_roster_id (RosterID, Player) -> Player#player{ roster_id = RosterID }. + +-spec set_inventory_id (binary(), type()) -> type(). +set_inventory_id (InvID, Player) -> Player#player{ inventory_id = InvID }. -spec get_id_field () -> non_neg_integer(). get_id_field () -> #player.id. @@ -199,8 +213,11 @@ get_last_active_field () -> #player.last_active. -spec get_maps_field () -> non_neg_integer(). get_maps_field () -> #player.maps. --spec get_characters_field () -> non_neg_integer(). -get_characters_field () -> #player.characters. +-spec get_roster_id_field () -> non_neg_integer(). +get_roster_id_field () -> #player.roster_id. + +-spec get_inventory_id_field () -> non_neg_integer(). +get_inventory_id_field () -> #player.inventory_id. -spec password_is (binary(), type()) -> boolean(). password_is (Val, Player) -> diff --git a/src/shared/struct/shr_weapon.erl b/src/shared/struct/shr_weapon.erl deleted file mode 100644 index ade46f8..0000000 --- a/src/shared/struct/shr_weapon.erl +++ /dev/null @@ -1,447 +0,0 @@ --module(shr_weapon). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: non_neg_integer(). - --type range_type() :: 'ranged' | 'melee'. --type range_modifier() :: 'long' | 'short'. --type damage_type() :: 'slash' | 'pierce' | 'blunt'. --type damage_modifier() :: 'heavy' | 'light'. - --record -( - weapon, - { - id :: id(), - name :: binary(), - range_type :: range_type(), - range_mod :: range_modifier(), - damage_type :: damage_type(), - damage_mod :: damage_modifier(), - coef :: float() - } -). - --opaque type() :: #weapon{}. - --export_type([type/0, id/0]). --export_type -( - [ - range_type/0, - range_modifier/0, - damage_type/0, - damage_modifier/0 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --export -( - [ - get_id/1, - get_name/1, - get_range_type/1, - get_range_modifier/1, - get_damage_type/1, - get_damage_modifier/1, - get_coefficient/1, - get_ranges/1, - get_damages/1 - ] -). - --export -( - [ - random_id/0, - from_id/1, - can_parry/1, - apply_to_attributes/2 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec ranges_of_type - ( - range_type(), - range_modifier() - ) - -> {non_neg_integer(), non_neg_integer()}. -ranges_of_type (ranged, long) -> {2, 6}; -ranges_of_type (ranged, short) -> {1, 4}; -ranges_of_type (melee, long) -> {0, 2}; -ranges_of_type (melee, short) -> {0, 1}. - --spec damages_of_type - ( - range_type(), - damage_modifier() - ) - -> {non_neg_integer(), non_neg_integer()}. -damages_of_type (ranged, heavy) -> {15, 30}; -damages_of_type (ranged, light) -> {10, 25}; -damages_of_type (melee, heavy) -> {20, 35}; -damages_of_type (melee, light) -> {15, 30}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% Accessors --spec get_id (type()) -> id(). -get_id (Wp) -> Wp#weapon.id. - --spec get_name (type()) -> binary(). -get_name (Wp) -> Wp#weapon.name. - --spec get_range_type (type()) -> range_type(). -get_range_type (Wp) -> Wp#weapon.range_type. - --spec get_range_modifier (type()) -> range_modifier(). -get_range_modifier (Wp) -> Wp#weapon.range_mod. - --spec get_damage_type (type()) -> damage_type(). -get_damage_type (Wp) -> Wp#weapon.damage_type. - --spec get_damage_modifier (type()) -> damage_modifier(). -get_damage_modifier (Wp) -> Wp#weapon.damage_mod. - --spec get_coefficient (type()) -> float(). -get_coefficient (Wp) -> Wp#weapon.coef. - --spec get_ranges (type()) -> {non_neg_integer(), non_neg_integer()}. -get_ranges (Wp) -> - ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod). - --spec get_damages (type()) -> {non_neg_integer(), non_neg_integer()}. -get_damages (Wp) -> - Coef = Wp#weapon.coef, - {Min, Max} = damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod), - {shr_math_util:ceil(Min * Coef), shr_math_util:ceil(Max * Coef)}. - --spec can_parry (type()) -> boolean(). -can_parry (Wp) -> (Wp#weapon.range_type == melee). - --spec from_id (id()) -> type(). - -from_id (0) -> - #weapon - { - id = 0, - name = <<"None">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = light, - coef = 0.3 - }; -from_id (1) -> - #weapon - { - id = 1, - name = <<"Dagger">>, - range_type = melee, - range_mod = short, - damage_type = slash, - damage_mod = light, - coef = 1.0 - }; -from_id (2) -> - #weapon - { - id = 2, - name = <<"Sword">>, - range_type = melee, - range_mod = short, - damage_type = slash, - damage_mod = heavy, - coef = 1.0 - }; -from_id (3) -> - #weapon - { - id = 3, - name = <<"Claymore">>, - range_type = melee, - range_mod = long, - damage_type = slash, - damage_mod = light, - coef = 1.0 - }; -from_id (4) -> - #weapon - { - id = 4, - name = <<"Bardiche">>, - range_type = melee, - range_mod = long, - damage_type = slash, - damage_mod = heavy, - coef = 1.0 - }; -from_id (5) -> - #weapon - { - id = 5, - name = <<"Stiletto">>, - range_type = melee, - range_mod = short, - damage_type = pierce, - damage_mod = light, - coef = 1.0 - }; -from_id (6) -> - #weapon - { - id = 6, - name = <<"Pickaxe">>, - range_type = melee, - range_mod = short, - damage_type = pierce, - damage_mod = heavy, - coef = 1.0 - }; -from_id (7) -> - #weapon - { - id = 7, - name = <<"Rapier">>, - range_type = melee, - range_mod = long, - damage_type = pierce, - damage_mod = light, - coef = 1.0 - }; -from_id (8) -> - #weapon - { - id = 8, - name = <<"Pike">>, - range_type = melee, - range_mod = long, - damage_type = pierce, - damage_mod = heavy, - coef = 1.0 - }; -from_id (9) -> - #weapon - { - id = 9, - name = <<"Club">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = light, - coef = 1.0 - }; -from_id (10) -> - #weapon - { - id = 10, - name = <<"Mace">>, - range_type = melee, - range_mod = short, - damage_type = blunt, - damage_mod = heavy, - coef = 1.0 - }; -from_id (11) -> - #weapon - { - id = 11, - name = <<"Staff">>, - range_type = melee, - range_mod = long, - damage_type = blunt, - damage_mod = light, - coef = 1.0 - }; -from_id (12) -> - #weapon - { - id = 12, - name = <<"War Hammer">>, - range_type = melee, - range_mod = long, - damage_type = blunt, - damage_mod = heavy, - coef = 1.0 - }; -from_id (13) -> - #weapon - { - id = 13, - name = <<"Short Bow (Broadhead)">>, - range_type = ranged, - range_mod = short, - damage_type = slash, - damage_mod = light, - coef = 1.0 - }; -from_id (14) -> - #weapon - { - id = 14, - name = <<"Short Bow (Blunt)">>, - range_type = ranged, - range_mod = short, - damage_type = blunt, - damage_mod = light, - coef = 1.0 - }; -from_id (15) -> - #weapon - { - id = 15, - name = <<"Short Bow (Bodkin Point)">>, - range_type = ranged, - range_mod = short, - damage_type = pierce, - damage_mod = light, - coef = 1.0 - }; -from_id (16) -> - #weapon - { - id = 16, - name = <<"Long Bow (Broadhead)">>, - range_type = ranged, - range_mod = long, - damage_type = slash, - damage_mod = light, - coef = 1.0 - }; -from_id (17) -> - #weapon - { - id = 17, - name = <<"Long Bow (Blunt)">>, - range_type = ranged, - range_mod = long, - damage_type = blunt, - damage_mod = light, - coef = 1.0 - }; -from_id (18) -> - #weapon - { - id = 18, - name = <<"Long Bow (Bodkin Point)">>, - range_type = ranged, - range_mod = long, - damage_type = pierce, - damage_mod = light, - coef = 1.0 - }; -from_id (19) -> - #weapon - { - id = 19, - name = <<"Crossbow (Broadhead)">>, - range_type = ranged, - range_mod = short, - damage_type = slash, - damage_mod = heavy, - coef = 1.0 - }; -from_id (20) -> - #weapon - { - id = 20, - name = <<"Crossbow (Blunt)">>, - range_type = ranged, - range_mod = short, - damage_type = blunt, - damage_mod = heavy, - coef = 1.0 - }; -from_id (21) -> - #weapon - { - id = 21, - name = <<"Crossbow (Bodkin Point)">>, - range_type = ranged, - range_mod = short, - damage_type = pierce, - damage_mod = heavy, - coef = 1.0 - }; -from_id (22) -> - #weapon - { - id = 22, - name = <<"Arbalest (Broadhead)">>, - range_type = ranged, - range_mod = long, - damage_type = slash, - damage_mod = heavy, - coef = 1.0 - }; -from_id (23) -> - #weapon - { - id = 23, - name = <<"Arbalest (Blunt)">>, - range_type = ranged, - range_mod = long, - damage_type = blunt, - damage_mod = heavy, - coef = 1.0 - }; -from_id (24) -> - #weapon - { - id = 24, - name = <<"Arbalest (Bodkin Point)">>, - range_type = ranged, - range_mod = long, - damage_type = pierce, - damage_mod = heavy, - coef = 1.0 - }; -from_id (_) -> - from_id(0). - - --spec random_id () -> id(). -random_id () -> shr_roll:between(0, 24). - --spec apply_to_attributes - ( - type(), - shr_attributes:type() - ) - -> shr_attributes:type(). -apply_to_attributes (Weapon, Attributes) -> - Dexterity = shr_attributes:get_dexterity(Attributes), - Speed = shr_attributes:get_speed(Attributes), - RangeModifier = Weapon#weapon.range_mod, - DamageModifier = Weapon#weapon.damage_mod, - - Impact = (20.0 * Weapon#weapon.coef), - FullImpact = shr_math_util:ceil(Impact), - QuarterImpact = shr_math_util:ceil(Impact / 4.0), - - ResultingDexterity = - case RangeModifier of - long -> (Dexterity - FullImpact); - short -> (Dexterity - QuarterImpact) - end, - ResultingSpeed = - case DamageModifier of - heavy -> (Speed - FullImpact); - light -> (Speed - QuarterImpact) - end, - - S0Attributes = shr_attributes:set_unsafe_speed(ResultingSpeed, Attributes), - S1Attributes = - shr_attributes:set_unsafe_dexterity(ResultingDexterity, S0Attributes), - - S1Attributes. diff --git a/src/shared/struct/shr_weapon.erl.m4 b/src/shared/struct/shr_weapon.erl.m4 index d22adfb..251c308 100644 --- a/src/shared/struct/shr_weapon.erl.m4 +++ b/src/shared/struct/shr_weapon.erl.m4 @@ -3,7 +3,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --opaque id() :: non_neg_integer(). +-type id() :: non_neg_integer(). -type range_type() :: 'ranged' | 'melee'. -type range_modifier() :: 'long' | 'short'. -- cgit v1.2.3-70-g09d2