summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/struct/shr_armor.erl.m4 | 155 | ||||
-rw-r--r-- | src/shared/struct/shr_weapon.erl.m4 | 174 |
2 files changed, 329 insertions, 0 deletions
diff --git a/src/shared/struct/shr_armor.erl.m4 b/src/shared/struct/shr_armor.erl.m4 new file mode 100644 index 0000000..02938e2 --- /dev/null +++ b/src/shared/struct/shr_armor.erl.m4 @@ -0,0 +1,155 @@ +-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(). +m4_include(__MAKEFILE_DATA_DIR/armor/global.m4.conf)m4_dnl +__ARMOR_USE_ERLANG_STYLE +m4_include(__MAKEFILE_DATA_DIR/armor/basic.m4d)m4_dnl +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_weapon.erl.m4 b/src/shared/struct/shr_weapon.erl.m4 new file mode 100644 index 0000000..d22adfb --- /dev/null +++ b/src/shared/struct/shr_weapon.erl.m4 @@ -0,0 +1,174 @@ +-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(). +m4_include(__MAKEFILE_DATA_DIR/weapon/global.m4.conf)m4_dnl +__WEAPON_USE_ERLANG_STYLE +m4_include(__MAKEFILE_DATA_DIR/weapon/basic.m4d)m4_dnl +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. |