summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-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
10 files changed, 259 insertions, 658 deletions
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'.