summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/struct/weapon.erl')
-rw-r--r--src/struct/weapon.erl110
1 files changed, 77 insertions, 33 deletions
diff --git a/src/struct/weapon.erl b/src/struct/weapon.erl
index 41f99f8..d96886c 100644
--- a/src/struct/weapon.erl
+++ b/src/struct/weapon.erl
@@ -3,19 +3,39 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-opaque id() :: non_neg_integer().
+
+-type range_type() :: 'ranged' | 'melee'.
+-type range_mod() :: 'long' | 'short'.
+-type damage_type() :: 'slash' | 'pierce' | 'blunt'.
+-type damage_mod() :: 'heavy' | 'light'.
+
-record
(
weapon,
{
- id,
- name,
- range_type,
- range_mod,
- damage_type,
- damage_mod
+ id :: id(),
+ name :: binary(),
+ range_type :: range_type(),
+ range_mod :: range_mod(),
+ damage_type :: damage_type(),
+ damage_mod :: damage_mod()
}
).
+-opaque struct() :: #weapon{}.
+
+-export_type([struct/0, id/0]).
+-export_type
+(
+ [
+ range_type/0,
+ range_mod/0,
+ damage_type/0,
+ damage_mod/0
+ ]
+).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -42,11 +62,23 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec ranges_of_type
+ (
+ range_type(),
+ range_mod()
+ )
+ -> {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_mod()
+ )
+ -> {non_neg_integer(), non_neg_integer()}.
damages_of_type (ranged, heavy) -> {10, 25};
damages_of_type (ranged, light) -> {5, 20};
damages_of_type (melee, heavy) -> {20, 35};
@@ -56,19 +88,25 @@ damages_of_type (melee, light) -> {15, 30}.
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
+-spec get_id (struct()) -> id().
get_id (Wp) -> Wp#weapon.id.
+-spec get_range_type (struct()) -> range_type().
get_range_type (Wp) -> Wp#weapon.range_type.
+-spec get_ranges (struct()) -> {non_neg_integer(), non_neg_integer()}.
get_ranges (Wp) ->
ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod).
+
+-spec get_damages (struct()) -> {non_neg_integer(), non_neg_integer()}.
get_damages (Wp) ->
damages_of_type(Wp#weapon.range_type, Wp#weapon.damage_mod).
+-spec from_id (id()) -> struct().
from_id (0) ->
#weapon{
id = 0,
- name = "None",
+ name = <<"None">>,
range_type = melee,
range_mod = short,
damage_type = blunt,
@@ -77,7 +115,7 @@ from_id (0) ->
from_id (1) ->
#weapon{
id = 1,
- name = "Dagger",
+ name = <<"Dagger">>,
range_type = melee,
range_mod = short,
damage_type = slash,
@@ -86,7 +124,7 @@ from_id (1) ->
from_id (2) ->
#weapon{
id = 2,
- name = "Sword",
+ name = <<"Sword">>,
range_type = melee,
range_mod = short,
damage_type = slash,
@@ -95,7 +133,7 @@ from_id (2) ->
from_id (3) ->
#weapon{
id = 3,
- name = "Claymore",
+ name = <<"Claymore">>,
range_type = melee,
range_mod = long,
damage_type = slash,
@@ -104,7 +142,7 @@ from_id (3) ->
from_id (4) ->
#weapon{
id = 4,
- name = "Bardiche",
+ name = <<"Bardiche">>,
range_type = melee,
range_mod = long,
damage_type = slash,
@@ -113,7 +151,7 @@ from_id (4) ->
from_id (5) ->
#weapon{
id = 5,
- name = "Stiletto",
+ name = <<"Stiletto">>,
range_type = melee,
range_mod = short,
damage_type = pierce,
@@ -122,7 +160,7 @@ from_id (5) ->
from_id (6) ->
#weapon{
id = 6,
- name = "Pickaxe",
+ name = <<"Pickaxe">>,
range_type = melee,
range_mod = short,
damage_type = pierce,
@@ -131,7 +169,7 @@ from_id (6) ->
from_id (7) ->
#weapon{
id = 7,
- name = "Rapier",
+ name = <<"Rapier">>,
range_type = melee,
range_mod = long,
damage_type = pierce,
@@ -140,7 +178,7 @@ from_id (7) ->
from_id (8) ->
#weapon{
id = 8,
- name = "Pike",
+ name = <<"Pike">>,
range_type = melee,
range_mod = long,
damage_type = pierce,
@@ -149,7 +187,7 @@ from_id (8) ->
from_id (9) ->
#weapon{
id = 9,
- name = "Club",
+ name = <<"Club">>,
range_type = melee,
range_mod = short,
damage_type = blunt,
@@ -158,7 +196,7 @@ from_id (9) ->
from_id (10) ->
#weapon{
id = 10,
- name = "Mace",
+ name = <<"Mace">>,
range_type = melee,
range_mod = short,
damage_type = blunt,
@@ -167,7 +205,7 @@ from_id (10) ->
from_id (11) ->
#weapon{
id = 11,
- name = "Staff",
+ name = <<"Staff">>,
range_type = melee,
range_mod = long,
damage_type = blunt,
@@ -176,7 +214,7 @@ from_id (11) ->
from_id (12) ->
#weapon{
id = 12,
- name = "War Hammer",
+ name = <<"War Hammer">>,
range_type = melee,
range_mod = long,
damage_type = blunt,
@@ -185,7 +223,7 @@ from_id (12) ->
from_id (13) ->
#weapon{
id = 13,
- name = "Short Bow (Broadhead)",
+ name = <<"Short Bow (Broadhead)">>,
range_type = ranged,
range_mod = short,
damage_type = slash,
@@ -194,7 +232,7 @@ from_id (13) ->
from_id (14) ->
#weapon{
id = 14,
- name = "Short Bow (Blunt)",
+ name = <<"Short Bow (Blunt)">>,
range_type = ranged,
range_mod = short,
damage_type = blunt,
@@ -203,7 +241,7 @@ from_id (14) ->
from_id (15) ->
#weapon{
id = 15,
- name = "Short Bow (Bodkin Point)",
+ name = <<"Short Bow (Bodkin Point)">>,
range_type = ranged,
range_mod = short,
damage_type = pierce,
@@ -212,7 +250,7 @@ from_id (15) ->
from_id (16) ->
#weapon{
id = 16,
- name = "Long Bow (Broadhead)",
+ name = <<"Long Bow (Broadhead)">>,
range_type = ranged,
range_mod = long,
damage_type = slash,
@@ -221,7 +259,7 @@ from_id (16) ->
from_id (17) ->
#weapon{
id = 17,
- name = "Long Bow (Blunt)",
+ name = <<"Long Bow (Blunt)">>,
range_type = ranged,
range_mod = long,
damage_type = blunt,
@@ -230,7 +268,7 @@ from_id (17) ->
from_id (18) ->
#weapon{
id = 18,
- name = "Long Bow (Bodkin Point)",
+ name = <<"Long Bow (Bodkin Point)">>,
range_type = ranged,
range_mod = long,
damage_type = pierce,
@@ -239,7 +277,7 @@ from_id (18) ->
from_id (19) ->
#weapon{
id = 19,
- name = "Crossbow (Broadhead)",
+ name = <<"Crossbow (Broadhead)">>,
range_type = ranged,
range_mod = short,
damage_type = slash,
@@ -248,7 +286,7 @@ from_id (19) ->
from_id (20) ->
#weapon{
id = 20,
- name = "Crossbow (Blunt)",
+ name = <<"Crossbow (Blunt)">>,
range_type = ranged,
range_mod = short,
damage_type = blunt,
@@ -257,7 +295,7 @@ from_id (20) ->
from_id (21) ->
#weapon{
id = 21,
- name = "Crossbow (Bodkin Point)",
+ name = <<"Crossbow (Bodkin Point)">>,
range_type = ranged,
range_mod = short,
damage_type = pierce,
@@ -266,7 +304,7 @@ from_id (21) ->
from_id (22) ->
#weapon{
id = 22,
- name = "Arbalest (Broadhead)",
+ name = <<"Arbalest (Broadhead)">>,
range_type = ranged,
range_mod = long,
damage_type = slash,
@@ -275,7 +313,7 @@ from_id (22) ->
from_id (23) ->
#weapon{
id = 23,
- name = "Arbalest (Blunt)",
+ name = <<"Arbalest (Blunt)">>,
range_type = ranged,
range_mod = long,
damage_type = blunt,
@@ -284,16 +322,22 @@ from_id (23) ->
from_id (24) ->
#weapon{
id = 24,
- name = "Arbalest (Bodkin Point)",
+ name = <<"Arbalest (Bodkin Point)">>,
range_type = ranged,
range_mod = long,
damage_type = pierce,
damage_mod = heavy
}.
-random_id () ->
- roll:between(0, 24).
+-spec random_id () -> id().
+random_id () -> roll:between(0, 24).
+-spec apply_to_attributes
+ (
+ attributes:struct(),
+ weapon:struct()
+ )
+ -> attributes:struct().
apply_to_attributes (Attributes, Weapon) ->
Dexterity = attributes:get_dexterity(Attributes),
Speed = attributes:get_speed(Attributes),