summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-08-24 13:02:16 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-08-24 13:02:16 +0200
commit67345d58c55e513f9b11a5b3e1af33164a4103ef (patch)
treef8352892fdc002d43bf4b4d381264262351cabd1
parent6b1f8c043b61d27be473b90cf79a09a49297ce0f (diff)
Working on the character editor...
-rw-r--r--src/battle/query/btl_character_turn.erl4
-rw-r--r--src/battle/query/btl_load.erl18
-rw-r--r--src/character/chr_handler.erl40
-rw-r--r--src/character/chr_shim.erl25
-rw-r--r--src/character/query/chr_load.erl111
-rw-r--r--src/character/reply/chr_add_char.erl39
-rw-r--r--src/character/struct/chr_character.erl151
-rw-r--r--src/character/struct/chr_roster.erl127
-rw-r--r--src/map/query/map_load.erl17
-rw-r--r--src/map/query/map_update.erl18
-rw-r--r--src/shared/reply/shr_set_inventory.erl32
-rw-r--r--src/shared/shr_security.erl8
-rw-r--r--src/shared/struct/shr_armor.erl193
-rw-r--r--src/shared/struct/shr_armor.erl.m42
-rw-r--r--src/shared/struct/shr_glyph.erl21
-rw-r--r--src/shared/struct/shr_glyph_board.erl21
-rw-r--r--src/shared/struct/shr_inventory.erl152
-rw-r--r--src/shared/struct/shr_player.erl39
-rw-r--r--src/shared/struct/shr_weapon.erl447
-rw-r--r--src/shared/struct/shr_weapon.erl.m42
20 files changed, 793 insertions, 674 deletions
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'.