summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/character/src/Struct/Weapon.elm')
-rw-r--r--src/character/src/Struct/Weapon.elm248
1 files changed, 248 insertions, 0 deletions
diff --git a/src/character/src/Struct/Weapon.elm b/src/character/src/Struct/Weapon.elm
new file mode 100644
index 0000000..d572ed6
--- /dev/null
+++ b/src/character/src/Struct/Weapon.elm
@@ -0,0 +1,248 @@
+module Struct.Weapon exposing
+ (
+ Type,
+ Ref,
+ RangeType(..),
+ RangeModifier(..),
+ DamageType(..),
+ DamageModifier(..),
+ new,
+ get_id,
+ get_name,
+ get_range_type,
+ get_range_modifier,
+ get_damage_type,
+ get_damage_modifier,
+ get_attack_range,
+ get_defense_range,
+ get_max_damage,
+ get_min_damage,
+ decoder,
+ none,
+ apply_to_attributes
+ )
+
+-- Elm -------------------------------------------------------------------------
+import Json.Decode
+import Json.Decode.Pipeline
+
+-- Map -------------------------------------------------------------------
+import Struct.Attributes
+
+--------------------------------------------------------------------------------
+-- TYPES -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+type alias PartiallyDecoded =
+ {
+ id : Int,
+ nam : String,
+ rt : String,
+ rm : String,
+ dt : String,
+ dm : String,
+ cf : Float
+ }
+
+type alias Type =
+ {
+ id : Int,
+ name : String,
+ coef : Float,
+ range_type : RangeType,
+ range_mod : RangeModifier,
+ dmg_type : DamageType,
+ dmg_mod : DamageModifier,
+ def_range : Int,
+ atk_range : Int,
+ dmg_min : Int,
+ dmg_max : Int
+ }
+
+type alias Ref = Int
+
+type RangeType = Ranged | Melee
+type RangeModifier = Long | Short
+-- Having multiple types at the same time, like Warframe does, would be nice.
+type DamageType = Slash | Blunt | Pierce
+type DamageModifier = Heavy | Light
+
+type alias WeaponType =
+ {
+ range : RangeType,
+ range_mod : RangeModifier,
+ dmg_type : DamageType
+ }
+
+--------------------------------------------------------------------------------
+-- LOCAL -----------------------------------------------------------------------
+--------------------------------------------------------------------------------
+get_ranges : RangeType -> RangeModifier -> (Int, Int)
+get_ranges rt rm =
+ case (rt, rm) of
+ (Ranged, Long) -> (2, 6)
+ (Ranged, Short) -> (1, 4)
+ (Melee, Long) -> (0, 2)
+ (Melee, Short) -> (0, 1)
+
+get_damages : Float -> RangeType -> DamageModifier -> (Int, Int)
+get_damages coef rt dm =
+ case (rt, dm) of
+ (Ranged, Heavy) -> ((ceiling (15.0 * coef)), (ceiling (30.0 * coef)))
+ (Ranged, Light) -> ((ceiling (10.0 * coef)), (ceiling (25.0 * coef)))
+ (Melee, Heavy) -> ((ceiling (20.0 * coef)), (ceiling (35.0 * coef)))
+ (Melee, Light) -> ((ceiling (15.0 * coef)), (ceiling (30.0 * coef)))
+
+--------------------------------------------------------------------------------
+-- EXPORTED --------------------------------------------------------------------
+--------------------------------------------------------------------------------
+new : (
+ Int ->
+ String ->
+ Float ->
+ RangeType ->
+ RangeModifier ->
+ DamageType ->
+ DamageModifier ->
+ Type
+ )
+new
+ id name coef
+ range_type range_mod
+ dmg_type dmg_mod
+ =
+ let
+ (def_range, atk_range) = (get_ranges range_type range_mod)
+ (dmg_min, dmg_max) = (get_damages coef range_type dmg_mod)
+ in
+ {
+ id = id,
+ name = name,
+ coef = coef,
+ range_type = range_type,
+ range_mod = range_mod,
+ dmg_type = dmg_type,
+ dmg_mod = dmg_mod,
+ def_range = def_range,
+ atk_range = atk_range,
+ dmg_min = dmg_min,
+ dmg_max = dmg_max
+ }
+
+get_id : Type -> Int
+get_id wp = wp.id
+
+get_name : Type -> String
+get_name wp = wp.name
+
+get_range_type : Type -> RangeType
+get_range_type wp = wp.range_type
+
+get_range_modifier : Type -> RangeModifier
+get_range_modifier wp = wp.range_mod
+
+get_damage_type : Type -> DamageType
+get_damage_type wp = wp.dmg_type
+
+get_damage_modifier : Type -> DamageModifier
+get_damage_modifier wp = wp.dmg_mod
+
+get_attack_range : Type -> Int
+get_attack_range wp = wp.atk_range
+
+get_defense_range : Type -> Int
+get_defense_range wp = wp.def_range
+
+get_max_damage : Type -> Int
+get_max_damage wp = wp.dmg_max
+
+get_min_damage : Type -> Int
+get_min_damage wp = wp.dmg_min
+
+apply_to_attributes : Type -> Struct.Attributes.Type -> Struct.Attributes.Type
+apply_to_attributes wp atts =
+ let
+ impact = (20.0 * wp.coef)
+ full_impact = (-1 * (ceiling impact))
+ quarter_impact = (-1 * (ceiling (impact / 4.0)))
+ in
+ case (wp.range_mod, wp.dmg_mod) of
+ (Long, Heavy) ->
+ (Struct.Attributes.mod_dexterity
+ full_impact
+ (Struct.Attributes.mod_speed full_impact atts)
+ )
+
+ (Long, Light) ->
+ (Struct.Attributes.mod_dexterity
+ full_impact
+ (Struct.Attributes.mod_speed quarter_impact atts)
+ )
+
+ (Short, Heavy) ->
+ (Struct.Attributes.mod_dexterity
+ quarter_impact
+ (Struct.Attributes.mod_speed full_impact atts)
+ )
+
+ (Short, Light) ->
+ (Struct.Attributes.mod_dexterity
+ quarter_impact
+ (Struct.Attributes.mod_speed quarter_impact atts)
+ )
+
+finish_decoding : PartiallyDecoded -> Type
+finish_decoding add_weapon =
+ (new
+ add_weapon.id
+ add_weapon.nam
+ add_weapon.cf
+ (
+ case add_weapon.rt of
+ "m" -> Melee
+ _ -> Ranged
+ )
+ (
+ case add_weapon.rm of
+ "l" -> Long
+ _ -> Short
+ )
+ (
+ case add_weapon.dt of
+ "s" -> Slash
+ "p" -> Pierce
+ _ -> Blunt
+ )
+ (
+ case add_weapon.dm of
+ "l" -> Light
+ _ -> Heavy
+ )
+ )
+
+decoder : (Json.Decode.Decoder Type)
+decoder =
+ (Json.Decode.map
+ (finish_decoding)
+ (Json.Decode.Pipeline.decode
+ PartiallyDecoded
+ |> (Json.Decode.Pipeline.required "id" Json.Decode.int)
+ |> (Json.Decode.Pipeline.required "nam" Json.Decode.string)
+ |> (Json.Decode.Pipeline.required "rt" Json.Decode.string)
+ |> (Json.Decode.Pipeline.required "rm" Json.Decode.string)
+ |> (Json.Decode.Pipeline.required "dt" Json.Decode.string)
+ |> (Json.Decode.Pipeline.required "dm" Json.Decode.string)
+ |> (Json.Decode.Pipeline.required "cf" Json.Decode.float)
+ )
+ )
+
+none : Type
+none =
+ (new
+ 0
+ "None"
+ 0.0
+ Melee
+ Short
+ Blunt
+ Light
+ )