| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2018-06-07 16:44:26 +0200 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2018-06-07 16:44:26 +0200 | 
| commit | 2155e43a7acdbc91ef561ae1cfd06eae297020e7 (patch) | |
| tree | aa404375e1c307484d2ddf709bab1597d26466f4 | |
| parent | 54250bfbaf0eeeceaec86cde2df39797f83397fd (diff) | |
add_{armor,weapon}, coefs, db stores stats.
| -rw-r--r-- | src/battlemap/bm_shim.erl | 27 | ||||
| -rw-r--r-- | src/battlemap/game-logic/bm_turn_actions.erl | 8 | ||||
| -rw-r--r-- | src/battlemap/reply/bm_add_armor.erl | 34 | ||||
| -rw-r--r-- | src/battlemap/reply/bm_add_weapon.erl | 54 | ||||
| -rw-r--r-- | src/battlemap/struct/bm_battle.erl | 26 | ||||
| -rw-r--r-- | src/battlemap/struct/bm_character.erl | 24 | ||||
| -rw-r--r-- | src/shared/struct/sh_armor.erl | 14 | ||||
| -rw-r--r-- | src/shared/struct/sh_statistics.erl | 15 | ||||
| -rw-r--r-- | src/shared/struct/sh_weapon.erl | 147 | 
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.  | 


