summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/struct')
-rw-r--r--src/shared/struct/shr_armor.erl.m4155
-rw-r--r--src/shared/struct/shr_weapon.erl.m4174
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.