summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-06-07 16:44:26 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-06-07 16:44:26 +0200
commit2155e43a7acdbc91ef561ae1cfd06eae297020e7 (patch)
treeaa404375e1c307484d2ddf709bab1597d26466f4 /src
parent54250bfbaf0eeeceaec86cde2df39797f83397fd (diff)
add_{armor,weapon}, coefs, db stores stats.
Diffstat (limited to 'src')
-rw-r--r--src/battlemap/bm_shim.erl27
-rw-r--r--src/battlemap/game-logic/bm_turn_actions.erl8
-rw-r--r--src/battlemap/reply/bm_add_armor.erl34
-rw-r--r--src/battlemap/reply/bm_add_weapon.erl54
-rw-r--r--src/battlemap/struct/bm_battle.erl26
-rw-r--r--src/battlemap/struct/bm_character.erl24
-rw-r--r--src/shared/struct/sh_armor.erl14
-rw-r--r--src/shared/struct/sh_statistics.erl15
-rw-r--r--src/shared/struct/sh_weapon.erl147
9 files changed, 277 insertions, 72 deletions
diff --git a/src/battlemap/bm_shim.erl b/src/battlemap/bm_shim.erl
index 3789ed0..fb5146b 100644
--- a/src/battlemap/bm_shim.erl
+++ b/src/battlemap/bm_shim.erl
@@ -101,6 +101,31 @@ generate_random_battle () ->
Battlemap = bm_battlemap:random(0, BattlemapWidth, BattlemapHeight),
Characters = generate_random_characters(1, 8, 8, 0, Battlemap, [], []),
PlayersAsList = [bm_player:new(<<"0">>), bm_player:new(<<"1">>)],
- Battle = bm_battle:new(<<"0">>, PlayersAsList, Battlemap, Characters),
+
+ {UsedWeaponIDs, UsedArmorIDs} =
+ lists:foldl
+ (
+ fun (Character, {UWIDs, UAIDs}) ->
+ {MWpID, SWpID} = bm_character:get_weapon_ids(Character),
+ AID = bm_character:get_armor_id(Character),
+ {
+ sets:add_element(MWpID, sets:add_element(SWpID, UWIDs)),
+ sets:add_element(AID, UAIDs)
+ }
+ end,
+ {sets:new(), sets:new()},
+ Characters
+ ),
+
+ Battle =
+ bm_battle:new
+ (
+ <<"0">>,
+ PlayersAsList,
+ Battlemap,
+ Characters,
+ sets:to_list(UsedWeaponIDs),
+ sets:to_list(UsedArmorIDs)
+ ),
Battle.
diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl
index e94d36a..0c16bbd 100644
--- a/src/battlemap/game-logic/bm_turn_actions.erl
+++ b/src/battlemap/game-logic/bm_turn_actions.erl
@@ -28,11 +28,12 @@ handle_switch_weapon (Update) ->
Character = bm_character_turn_data:get_character(Data),
CharacterIX = bm_character_turn_data:get_character_ix(Data),
CharacterAttributes = bm_character:get_attributes(Character),
+ ArmorID = bm_character:get_armor_id(Character),
{PrimaryWeaponID, SecondaryWeaponID} = bm_character:get_weapon_ids(Character),
UpdatedWeaponIDs = {SecondaryWeaponID, PrimaryWeaponID},
UpdatedCharacterStatistics =
- sh_statistics:new(CharacterAttributes, UpdatedWeaponIDs),
+ sh_statistics:new(CharacterAttributes, UpdatedWeaponIDs, ArmorID),
UpdatedCharacter =
bm_character:set_statistics
(
@@ -52,6 +53,11 @@ handle_switch_weapon (Update) ->
(
bm_character:get_weapons_field(),
UpdatedWeaponIDs
+ ),
+ sh_db_query:set_field
+ (
+ bm_character:get_statistics_field(),
+ UpdatedCharacterStatistics
)
]
),
diff --git a/src/battlemap/reply/bm_add_armor.erl b/src/battlemap/reply/bm_add_armor.erl
new file mode 100644
index 0000000..4f098bd
--- /dev/null
+++ b/src/battlemap/reply/bm_add_armor.erl
@@ -0,0 +1,34 @@
+-module(bm_add_armor).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export([generate/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec encode_category (sh_armor:category()) -> binary().
+encode_category (kinetic) -> <<"k">>;
+encode_category (leather) -> <<"l">>;
+encode_category (chain) -> <<"c">>;
+encode_category (plate) -> <<"p">>.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec generate (sh_armor:type()) -> {list(any())}.
+generate (Armor) ->
+ {
+ [
+ {<<"msg">>, <<"add_armor">>},
+ {<<"id">>, sh_armor:get_id(Armor)},
+ {<<"nam">>, sh_armor:get_name(Armor)},
+ {<<"ct">>, encode_category(sh_armor:get_category(Armor))},
+ {<<"cf">>, sh_armor:get_coefficient(Armor)}
+ ]
+ }.
diff --git a/src/battlemap/reply/bm_add_weapon.erl b/src/battlemap/reply/bm_add_weapon.erl
new file mode 100644
index 0000000..3473265
--- /dev/null
+++ b/src/battlemap/reply/bm_add_weapon.erl
@@ -0,0 +1,54 @@
+-module(bm_add_weapon).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export([generate/1]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec encode_range_type (sh_weapon:range_type()) -> binary().
+encode_range_type (melee) -> <<"m">>;
+encode_range_type (ranged) -> <<"r">>.
+
+-spec encode_range_modifier (sh_weapon:range_modifier()) -> binary().
+encode_range_modifier (long) -> <<"l">>;
+encode_range_modifier (short) -> <<"s">>.
+
+-spec encode_damage_type (sh_weapon:damage_type()) -> binary().
+encode_damage_type (slash) -> <<"s">>;
+encode_damage_type (pierce) -> <<"p">>;
+encode_damage_type (blunt) -> <<"b">>.
+
+-spec encode_damage_modifier (sh_weapon:damage_modifier()) -> binary().
+encode_damage_modifier (heavy) -> <<"h">>;
+encode_damage_modifier (light) -> <<"l">>.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec generate (sh_weapon:type()) -> {list(any())}.
+generate (Weapon) ->
+ {
+ [
+ {<<"msg">>, <<"add_weapon">>},
+ {<<"id">>, sh_weapon:get_id(Weapon)},
+ {<<"nam">>, sh_weapon:get_name(Weapon)},
+ {<<"rt">>, encode_range_type(sh_weapon:get_range_type(Weapon))},
+ {
+ <<"rm">>,
+ encode_range_modifier(sh_weapon:get_range_modifier(Weapon))
+ },
+ {<<"dt">>, encode_damage_type(sh_weapon:get_damage_type(Weapon))},
+ {
+ <<"dm">>,
+ encode_damage_modifier(sh_weapon:get_damage_modifier(Weapon))
+ },
+ {<<"cf">>, sh_weapon:get_coefficient(Weapon)}
+ ]
+ }.
diff --git a/src/battlemap/struct/bm_battle.erl b/src/battlemap/struct/bm_battle.erl
index 08c4943..c4207e8 100644
--- a/src/battlemap/struct/bm_battle.erl
+++ b/src/battlemap/struct/bm_battle.erl
@@ -10,6 +10,8 @@
battle,
{
id :: id(),
+ used_armor_ids:: list(sh_armor:id()),
+ used_weapon_ids :: list(sh_weapon:id()),
battlemap :: bm_battlemap:type(),
characters :: array:array(bm_character:type()),
players :: array:array(bm_player:type()),
@@ -29,6 +31,8 @@
(
[
get_id/1,
+ get_used_weapon_ids/1,
+ get_used_armor_ids/1,
get_battlemap/1,
get_characters/1,
get_character/2,
@@ -53,7 +57,7 @@
-export
(
[
- new/4
+ new/6
]
).
@@ -80,13 +84,17 @@ get_all_timelines (Result, CurrentIndex, EndPoint, ArraySize, Players) ->
-spec get_id (type()) -> id().
get_id (Battle) -> Battle#battle.id.
+-spec get_used_weapon_ids (type()) -> list(sh_weapon:id()).
+get_used_weapon_ids (Battle) -> Battle#battle.used_weapon_ids.
+
+-spec get_used_armor_ids (type()) -> list(sh_armor:id()).
+get_used_armor_ids (Battle) -> Battle#battle.used_armor_ids.
+
-spec get_battlemap (type()) -> bm_battlemap:type().
-get_battlemap (Battle) ->
- Battle#battle.battlemap.
+get_battlemap (Battle) -> Battle#battle.battlemap.
-spec get_characters (type()) -> array:array(bm_character:type()).
-get_characters (Battle) ->
- Battle#battle.characters.
+get_characters (Battle) -> Battle#battle.characters.
-spec get_character (non_neg_integer(), type()) -> bm_character:type().
get_character (IX, Battle) ->
@@ -173,13 +181,17 @@ set_current_player_turn (PlayerTurn, Battle) ->
id(),
list(bm_player:type()),
bm_battlemap:type(),
- list(bm_character:type())
+ list(bm_character:type()),
+ list(sh_weapon:id()),
+ list(sh_armor:id())
)
-> type().
-new (ID, PlayersAsList, Battlemap, CharactersAsList) ->
+new (ID, PlayersAsList, Battlemap, CharactersAsList, UWIDs, UAIDs) ->
#battle
{
id = ID,
+ used_weapon_ids = UWIDs,
+ used_armor_ids = UAIDs,
battlemap = Battlemap,
characters = array:from_list(CharactersAsList),
players = array:from_list(PlayersAsList),
diff --git a/src/battlemap/struct/bm_character.erl b/src/battlemap/struct/bm_character.erl
index 5552a02..594f9cd 100644
--- a/src/battlemap/struct/bm_character.erl
+++ b/src/battlemap/struct/bm_character.erl
@@ -17,6 +17,7 @@
attributes :: sh_attributes:type(),
statistics :: sh_statistics:type(),
weapon_ids :: {sh_weapon:id(), sh_weapon:id()},
+ armor_id :: sh_armor:id(),
location :: {non_neg_integer(), non_neg_integer()},
current_health :: non_neg_integer(),
active :: boolean()
@@ -41,12 +42,14 @@
get_attributes/1,
get_statistics/1,
get_weapon_ids/1,
+ get_armor_id/1,
get_location/1,
get_current_health/1,
get_is_alive/1,
get_is_active/1,
set_weapon_ids/2,
+ set_armor_id/2,
set_statistics/2,
set_location/2,
set_current_health/2,
@@ -117,6 +120,9 @@ get_portrait (Char) -> Char#character.portrait.
-spec get_attributes (type()) -> sh_attributes:type().
get_attributes (Char) -> Char#character.attributes.
+-spec get_armor_id (type()) -> sh_armor:id().
+get_armor_id (Char) -> Char#character.armor_id.
+
-spec get_weapon_ids (type()) -> {sh_weapon:id(), sh_weapon:id()}.
get_weapon_ids (Char) -> Char#character.weapon_ids.
@@ -169,12 +175,14 @@ set_is_active (Active, Char) ->
active = Active
}.
--spec set_weapon_ids
- (
- {sh_weapon:id(), sh_weapon:id()},
- type()
- )
- -> type().
+-spec set_armor_id (sh_armor:id(), type()) -> type().
+set_armor_id (ArmorID, Char) ->
+ Char#character
+ {
+ armor_id = ArmorID
+ }.
+
+-spec set_weapon_ids ({sh_weapon:id(), sh_weapon:id()}, type()) -> type().
set_weapon_ids (WeaponIDs, Char) ->
Char#character
{
@@ -207,8 +215,9 @@ random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
Location =
find_random_location(BattlemapWidth, BattlemapHeight, ForbiddenLocations),
WeaponIDs = {sh_weapon:random_id(), sh_weapon:random_id()},
+ ArmorID = sh_armor:random_id(),
Attributes = sh_attributes:random(),
- Statistics = sh_statistics:new(Attributes, WeaponIDs),
+ Statistics = sh_statistics:new(Attributes, WeaponIDs, ArmorID),
IDAsListString = integer_to_list(ID),
IDAsBinaryString = list_to_binary(IDAsListString),
@@ -221,6 +230,7 @@ random (ID, OwnerID, BattlemapWidth, BattlemapHeight, ForbiddenLocations) ->
portrait = IDAsBinaryString,
attributes = Attributes,
weapon_ids = WeaponIDs,
+ armor_id = ArmorID,
statistics = Statistics,
location = Location,
current_health = sh_statistics:get_health(Statistics),
diff --git a/src/shared/struct/sh_armor.erl b/src/shared/struct/sh_armor.erl
index 4156016..3ff1a61 100644
--- a/src/shared/struct/sh_armor.erl
+++ b/src/shared/struct/sh_armor.erl
@@ -32,7 +32,7 @@
[
get_id/1,
get_name/1,
- get_coef/1,
+ get_coefficient/1,
get_category/1
]
).
@@ -61,8 +61,8 @@ get_id (Ar) -> Ar#armor.id.
-spec get_name (type()) -> binary().
get_name (Ar) -> Ar#armor.name.
--spec get_coef (type()) -> float().
-get_coef (Ar) -> Ar#armor.coef.
+-spec get_coefficient (type()) -> float().
+get_coefficient (Ar) -> Ar#armor.coef.
-spec get_category (type()) -> category().
get_category (Ar) -> Ar#armor.category.
@@ -105,15 +105,15 @@ from_id (4) ->
}.
-spec random_id () -> id().
-random_id () -> sh_roll:between(0, 24).
+random_id () -> sh_roll:between(0, 4).
-spec apply_to_attributes
(
- sh_attributes:type(),
- type()
+ type(),
+ sh_attributes:type()
)
-> sh_attributes:type().
-apply_to_attributes (Att, Ar) ->
+apply_to_attributes (Ar, Att) ->
Dexterity = sh_attributes:get_dexterity(Att),
Speed = sh_attributes:get_speed(Att),
Strength = sh_attributes:get_strength(Att),
diff --git a/src/shared/struct/sh_statistics.erl b/src/shared/struct/sh_statistics.erl
index 92cd8d6..e2b8543 100644
--- a/src/shared/struct/sh_statistics.erl
+++ b/src/shared/struct/sh_statistics.erl
@@ -47,7 +47,7 @@
-export
(
[
- new/2
+ new/3
]
).
@@ -144,14 +144,21 @@ get_damages (Stats) ->
-spec new
(
sh_attributes:type(),
- {sh_weapon:id(), sh_weapon:id()}
+ {sh_weapon:id(), sh_weapon:id()},
+ sh_armor:id()
)
-> type().
-new (BaseAttributes, WeaponIDs) ->
+new (BaseAttributes, WeaponIDs, ArmorID) ->
{ActiveWeaponID, _} = WeaponIDs,
ActiveWeapon = sh_weapon:from_id(ActiveWeaponID),
{MinDamage, MaxDamage} = sh_weapon:get_damages(ActiveWeapon),
- Attributes = sh_weapon:apply_to_attributes(BaseAttributes, ActiveWeapon),
+ Armor = sh_armor:from_id(ArmorID),
+ Attributes =
+ sh_armor:apply_to_attributes
+ (
+ Armor,
+ sh_weapon:apply_to_attributes(ActiveWeapon, BaseAttributes)
+ ),
Constitution = sh_attributes:get_constitution(Attributes),
Dexterity = sh_attributes:get_dexterity(Attributes),
Intelligence = sh_attributes:get_intelligence(Attributes),
diff --git a/src/shared/struct/sh_weapon.erl b/src/shared/struct/sh_weapon.erl
index 30943b9..6bd3425 100644
--- a/src/shared/struct/sh_weapon.erl
+++ b/src/shared/struct/sh_weapon.erl
@@ -6,9 +6,9 @@
-opaque id() :: non_neg_integer().
-type range_type() :: 'ranged' | 'melee'.
--type range_mod() :: 'long' | 'short'.
+-type range_modifier() :: 'long' | 'short'.
-type damage_type() :: 'slash' | 'pierce' | 'blunt'.
--type damage_mod() :: 'heavy' | 'light'.
+-type damage_modifier() :: 'heavy' | 'light'.
-record
(
@@ -17,9 +17,10 @@
id :: id(),
name :: binary(),
range_type :: range_type(),
- range_mod :: range_mod(),
+ range_mod :: range_modifier(),
damage_type :: damage_type(),
- damage_mod :: damage_mod()
+ damage_mod :: damage_modifier(),
+ coef :: float()
}
).
@@ -30,9 +31,9 @@
(
[
range_type/0,
- range_mod/0,
+ range_modifier/0,
damage_type/0,
- damage_mod/0
+ damage_modifier/0
]
).
@@ -44,7 +45,12 @@
(
[
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
]
@@ -66,7 +72,7 @@
-spec ranges_of_type
(
range_type(),
- range_mod()
+ range_modifier()
)
-> {non_neg_integer(), non_neg_integer()}.
ranges_of_type (ranged, long) -> {2, 6};
@@ -77,7 +83,7 @@ ranges_of_type (melee, short) -> {0, 1}.
-spec damages_of_type
(
range_type(),
- damage_mod()
+ damage_modifier()
)
-> {non_neg_integer(), non_neg_integer()}.
damages_of_type (ranged, heavy) -> {10, 25};
@@ -92,16 +98,33 @@ damages_of_type (melee, light) -> {15, 30}.
-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) ->
- damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod).
+ Coef = Wp#weapon.coef,
+ {Min, Max} = damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod),
+ {erlang:ceil(Min * Coef), erlang:ceil(Max * Coef)}.
-spec can_parry (type()) -> boolean().
can_parry (Wp) -> (Wp#weapon.range_type == melee).
@@ -114,7 +137,8 @@ from_id (0) ->
range_type = melee,
range_mod = short,
damage_type = blunt,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (1) ->
#weapon{
@@ -123,7 +147,8 @@ from_id (1) ->
range_type = melee,
range_mod = short,
damage_type = slash,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (2) ->
#weapon{
@@ -132,7 +157,8 @@ from_id (2) ->
range_type = melee,
range_mod = short,
damage_type = slash,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (3) ->
#weapon{
@@ -141,7 +167,8 @@ from_id (3) ->
range_type = melee,
range_mod = long,
damage_type = slash,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (4) ->
#weapon{
@@ -150,7 +177,8 @@ from_id (4) ->
range_type = melee,
range_mod = long,
damage_type = slash,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (5) ->
#weapon{
@@ -159,7 +187,8 @@ from_id (5) ->
range_type = melee,
range_mod = short,
damage_type = pierce,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (6) ->
#weapon{
@@ -168,7 +197,8 @@ from_id (6) ->
range_type = melee,
range_mod = short,
damage_type = pierce,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (7) ->
#weapon{
@@ -177,7 +207,8 @@ from_id (7) ->
range_type = melee,
range_mod = long,
damage_type = pierce,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (8) ->
#weapon{
@@ -186,7 +217,8 @@ from_id (8) ->
range_type = melee,
range_mod = long,
damage_type = pierce,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (9) ->
#weapon{
@@ -195,7 +227,8 @@ from_id (9) ->
range_type = melee,
range_mod = short,
damage_type = blunt,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (10) ->
#weapon{
@@ -204,7 +237,8 @@ from_id (10) ->
range_type = melee,
range_mod = short,
damage_type = blunt,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (11) ->
#weapon{
@@ -213,7 +247,8 @@ from_id (11) ->
range_type = melee,
range_mod = long,
damage_type = blunt,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (12) ->
#weapon{
@@ -222,7 +257,8 @@ from_id (12) ->
range_type = melee,
range_mod = long,
damage_type = blunt,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (13) ->
#weapon{
@@ -231,7 +267,8 @@ from_id (13) ->
range_type = ranged,
range_mod = short,
damage_type = slash,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (14) ->
#weapon{
@@ -240,7 +277,8 @@ from_id (14) ->
range_type = ranged,
range_mod = short,
damage_type = blunt,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (15) ->
#weapon{
@@ -249,7 +287,8 @@ from_id (15) ->
range_type = ranged,
range_mod = short,
damage_type = pierce,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (16) ->
#weapon{
@@ -258,7 +297,8 @@ from_id (16) ->
range_type = ranged,
range_mod = long,
damage_type = slash,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (17) ->
#weapon{
@@ -267,7 +307,8 @@ from_id (17) ->
range_type = ranged,
range_mod = long,
damage_type = blunt,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (18) ->
#weapon{
@@ -276,7 +317,8 @@ from_id (18) ->
range_type = ranged,
range_mod = long,
damage_type = pierce,
- damage_mod = light
+ damage_mod = light,
+ coef = 1.0
};
from_id (19) ->
#weapon{
@@ -285,7 +327,8 @@ from_id (19) ->
range_type = ranged,
range_mod = short,
damage_type = slash,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (20) ->
#weapon{
@@ -294,7 +337,8 @@ from_id (20) ->
range_type = ranged,
range_mod = short,
damage_type = blunt,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (21) ->
#weapon{
@@ -303,7 +347,8 @@ from_id (21) ->
range_type = ranged,
range_mod = short,
damage_type = pierce,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (22) ->
#weapon{
@@ -312,7 +357,8 @@ from_id (22) ->
range_type = ranged,
range_mod = long,
damage_type = slash,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (23) ->
#weapon{
@@ -321,7 +367,8 @@ from_id (23) ->
range_type = ranged,
range_mod = long,
damage_type = blunt,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
};
from_id (24) ->
#weapon{
@@ -330,7 +377,8 @@ from_id (24) ->
range_type = ranged,
range_mod = long,
damage_type = pierce,
- damage_mod = heavy
+ damage_mod = heavy,
+ coef = 1.0
}.
-spec random_id () -> id().
@@ -338,23 +386,32 @@ random_id () -> sh_roll:between(0, 24).
-spec apply_to_attributes
(
- sh_attributes:type(),
- type()
+ type(),
+ sh_attributes:type()
)
-> sh_attributes:type().
-apply_to_attributes (Attributes, Weapon) ->
+apply_to_attributes (Weapon, Attributes) ->
Dexterity = sh_attributes:get_dexterity(Attributes),
Speed = sh_attributes:get_speed(Attributes),
RangeModifier = Weapon#weapon.range_mod,
DamageModifier = Weapon#weapon.damage_mod,
- WithRangeModifier =
+
+ Impact = (-20.0 * Weapon#weapon.coef),
+ FullImpact = erlang:ceil(Impact),
+ QuarterImpact = erlang:ceil(Impact / 4.0),
+
+ ResultingDexterity =
case RangeModifier of
- long ->
- sh_attributes:set_dexterity(max(0, (Dexterity - 20)), Attributes);
- _ -> Attributes
+ long -> (Dexterity - FullImpact);
+ short -> (Dexterity - QuarterImpact)
end,
- case DamageModifier of
- heavy -> sh_attributes:set_speed(max(0, (Speed - 20)), WithRangeModifier);
- _ -> WithRangeModifier
- end.
+ ResultingSpeed =
+ case DamageModifier of
+ heavy -> (Speed - FullImpact);
+ light -> (Speed - QuarterImpact)
+ end,
+
+ S0Attributes = sh_attributes:set_speed(ResultingSpeed, Attributes),
+ S1Attributes = sh_attributes:set_dexterity(ResultingDexterity, S0Attributes),
+ S1Attributes.