From 986c396be0a4faa4714c8bb284a603807e758eae Mon Sep 17 00:00:00 2001 From: Martin Janiczek Date: Sun, 6 Oct 2024 00:59:48 +0200 Subject: [PATCH] WIP ranged combat --- .ok | 2 + src/Backend.elm | 3 + src/Data/Enemy.elm | 77 +- src/Data/Fight.elm | 11 + src/Data/Fight/DamageType.elm | 11 + src/Data/Fight/Generator.elm | 429 ++- src/Data/Item.elm | 6538 +++++++++++++++++++++++---------- src/Data/Perk.elm | 21 +- src/Frontend/News.elm | 6 +- src/Logic.elm | 59 +- tests/LogicTest.elm | 37 - tests/TestHelpers.elm | 2 +- 12 files changed, 5170 insertions(+), 2026 deletions(-) create mode 100644 .ok create mode 100644 src/Data/Fight/DamageType.elm diff --git a/.ok b/.ok new file mode 100644 index 0000000..36c2d79 --- /dev/null +++ b/.ok @@ -0,0 +1,2 @@ +test: elm-test --compiler lamdera +watch: elm-test --compiler lamdera --watch diff --git a/src/Backend.elm b/src/Backend.elm index 5fd7260..1b48d9c 100644 --- a/src/Backend.elm +++ b/src/Backend.elm @@ -1895,6 +1895,9 @@ oneTimePerkEffects currentTime = Perk.NightVision -> Nothing + + Perk.BonusRangedDamage -> + Nothing in Perk.all |> List.filterMap (\perk -> oneTimeEffect perk |> Maybe.map (Tuple.pair perk)) diff --git a/src/Data/Enemy.elm b/src/Data/Enemy.elm index 5db2cd1..a856e89 100644 --- a/src/Data/Enemy.elm +++ b/src/Data/Enemy.elm @@ -3,7 +3,7 @@ module Data.Enemy exposing , actionPoints , addedSkillPercentages , aimedShotName - , allTypes + , all , criticalSpec , damageResistanceNormal , damageThresholdNormal @@ -17,6 +17,7 @@ module Data.Enemy exposing , forSmallChunk , hp , humanAimedShotName + , isLivingCreature , manCriticalSpec , meleeDamageBonus , name @@ -114,24 +115,24 @@ type Type | Radscorpion -allTypes : List Type -allTypes = - [ Brahmin +all : List Type +all = + [ SilverGecko + , ToughSilverGecko + , GoldenGecko + , ToughGoldenGecko + , FireGecko + , ToughFireGecko + , Brahmin , AngryBrahmin , WeakBrahmin , WildBrahmin , GiantAnt , ToughGiantAnt + , BlackRadscorpion + , LesserBlackRadscorpion , LesserRadscorpion , Radscorpion - , LesserBlackRadscorpion - , BlackRadscorpion - , SilverGecko - , ToughSilverGecko - , GoldenGecko - , ToughGoldenGecko - , FireGecko - , ToughFireGecko ] @@ -3740,3 +3741,55 @@ dropItemsGenerator { items } = ) |> Random.sequence |> Random.map Maybe.values + + +isLivingCreature : Type -> Bool +isLivingCreature type_ = + case type_ of + SilverGecko -> + True + + ToughSilverGecko -> + True + + GoldenGecko -> + True + + ToughGoldenGecko -> + True + + FireGecko -> + True + + ToughFireGecko -> + True + + Brahmin -> + True + + AngryBrahmin -> + True + + WeakBrahmin -> + True + + WildBrahmin -> + True + + GiantAnt -> + True + + ToughGiantAnt -> + True + + BlackRadscorpion -> + True + + LesserBlackRadscorpion -> + True + + LesserRadscorpion -> + True + + Radscorpion -> + True diff --git a/src/Data/Fight.elm b/src/Data/Fight.elm index 97c5502..3ecee4e 100644 --- a/src/Data/Fight.elm +++ b/src/Data/Fight.elm @@ -14,6 +14,7 @@ module Data.Fight exposing , isCriticalAttack , isMiss , isNPC + , isOpponentLivingCreature , isPlayer , opponentName , opponentXp @@ -604,3 +605,13 @@ isMiss action = _ -> False + + +isOpponentLivingCreature : Opponent -> Bool +isOpponentLivingCreature opponent = + case opponent.type_ of + Npc enemy -> + Enemy.isLivingCreature enemy + + Player _ -> + True diff --git a/src/Data/Fight/DamageType.elm b/src/Data/Fight/DamageType.elm new file mode 100644 index 0000000..cac11af --- /dev/null +++ b/src/Data/Fight/DamageType.elm @@ -0,0 +1,11 @@ +module Data.Fight.DamageType exposing (DamageType(..)) + + +type DamageType + = NormalDamage + | Fire + | Explosion + | Laser + | Plasma + | Electrical + | EMP diff --git a/src/Data/Fight/Generator.elm b/src/Data/Fight/Generator.elm index d444829..0e3332e 100644 --- a/src/Data/Fight/Generator.elm +++ b/src/Data/Fight/Generator.elm @@ -11,6 +11,7 @@ import Data.Fight as Fight exposing (CommandRejectionReason(..), Opponent, Who(. import Data.Fight.AimedShot as AimedShot exposing (AimedShot) import Data.Fight.AttackStyle as AttackStyle exposing (AttackStyle) import Data.Fight.Critical as Critical exposing (Critical) +import Data.Fight.DamageType as DamageType exposing (DamageType) import Data.FightStrategy as FightStrategy exposing ( Command(..) @@ -19,10 +20,10 @@ import Data.FightStrategy as FightStrategy , Operator(..) , Value(..) ) -import Data.Item as Item exposing (Item) +import Data.Item as Item exposing (Item, isWeaponArmorPenetrating) import Data.Message as Message exposing (Content(..)) import Data.Perk as Perk exposing (Perk) -import Data.Skill as Skill exposing (Skill) +import Data.Skill as Skill exposing (Skill(..)) import Data.Special as Special exposing (Special) import Data.Trait as Trait exposing (Trait) import Data.Xp as Xp @@ -175,7 +176,23 @@ updateOpponent who fn ongoing = { ongoing | target = fn ongoing.target } -rollDamageAndCriticalInfo : Who -> OngoingFight -> AttackStyle -> Maybe Critical.EffectCategory -> Generator ( Int, Maybe ( List Critical.Effect, String ) ) +weaponDamageType : Maybe Item.Kind -> Maybe DamageType +weaponDamageType equippedWeapon = + case equippedWeapon of + Nothing -> + -- unarmed! + Just DamageType.NormalDamage + + Just weapon -> + Item.weaponDamageType weapon + + +rollDamageAndCriticalInfo : + Who + -> OngoingFight + -> AttackStyle + -> Maybe Critical.EffectCategory + -> Generator ( Int, Maybe ( List Critical.Effect, String ) ) rollDamageAndCriticalInfo who ongoing attackStyle maybeCriticalEffectCategory = let opponent = @@ -184,6 +201,10 @@ rollDamageAndCriticalInfo who ongoing attackStyle maybeCriticalEffectCategory = otherOpponent = opponent_ (Fight.theOther who) ongoing + usedAmmo_ : UsedAmmo + usedAmmo_ = + usedAmmo who ongoing + criticalSpec : Maybe Critical.Spec criticalSpec = maybeCriticalEffectCategory @@ -213,131 +234,205 @@ rollDamageAndCriticalInfo who ongoing attackStyle maybeCriticalEffectCategory = Just spec -> Random.map Just <| rollCritical spec otherOpponent in - Random.map2 - (\damage maybeCritical -> - let - -- Damage formulas taken from https://falloutmods.fandom.com/wiki/Fallout_engine_calculations#Damage_and_combat_calculations - -- TODO check this against the code in https://fallout-archive.fandom.com/wiki/Fallout_and_Fallout_2_combat#Ranged_combat_2 - damage_ = - toFloat damage - - rangedBonus = - -- TODO ranged attacks and perks - 0 - - ammoDamageMultiplier = - -- TODO ammo in combat - 1 - - ammoDamageDivisor = - -- TODO ammo in combat - 1 - - shouldIgnoreArmor : Bool - shouldIgnoreArmor = - -- TODO armor ignoring attacks - False - - armorIgnore = - -- we'll later divide DT by this - if shouldIgnoreArmor then - 5 - - else - 1 + case weaponDamageType opponent.equippedWeapon of + Nothing -> + -- Attacking with something that doesn't have a damage type? + Random.constant ( 0, Nothing ) - livingAnatomyBonus = - -- TODO check if the opponent is a living creature - if Perk.rank Perk.LivingAnatomy opponent.perks > 0 then - 5 + Just damageType -> + Random.map2 + (\damage maybeCritical -> + let + -- Damage formulas taken from https://falloutmods.fandom.com/wiki/Fallout_engine_calculations#Damage_and_combat_calculations + -- TODO check this against the code in https://fallout-archive.fandom.com/wiki/Fallout_and_Fallout_2_combat#Ranged_combat_2 + -- This is also helpful: https://github.com/alexbatalov/fallout2-ce/blob/main/src/combat.cc + damage_ = + toFloat damage + + rangedBonus = + toFloat (Perk.rank Perk.BonusRangedDamage opponent.perks) * 2 + + ( ammoDamageMultiplier, ammoDamageDivisor ) = + case usedAmmo_ of + PreferredAmmo ammo -> + Item.ammoDamageModifier ammo + + FallbackAmmo ammo -> + Item.ammoDamageModifier ammo + + NoUsableAmmo -> + ( 1, 1 ) + + NoAmmoNeeded -> + ( 1, 1 ) + + isWeaponArmorPenetrating : Bool + isWeaponArmorPenetrating = + let + allGood () = + opponent.equippedWeapon + |> Maybe.map Item.isWeaponArmorPenetrating + |> Maybe.withDefault False + in + case usedAmmo_ of + PreferredAmmo _ -> + allGood () + + FallbackAmmo _ -> + allGood () + + NoUsableAmmo -> + False + + NoAmmoNeeded -> + False + + isUnarmedAttackArmorPiercing : Bool + isUnarmedAttackArmorPiercing = + {- TODO upgraded unarmed attacks + + - Dragon Punch (PALM_STRIKE) + - Force Punch (PIERCING_STRIKE) + - Jump Kick (HOOK_KICK) + - Death Blossom Kick (PIERCING_KICK) + -} + False + + armorIgnoreDtDivisor = + if + (isCriticalAttackArmorPiercing && not (damageType == DamageType.EMP)) + || isWeaponArmorPenetrating + || isUnarmedAttackArmorPiercing + then + 5 - else - 0 - - damageThreshold = - -- TODO we're not dealing with plasma/... right now, only _normal_ DT - toFloat <| - Logic.damageThresholdNormal - { naturalDamageThresholdNormal = - case otherOpponent.type_ of - Fight.Player _ -> - 0 - - Fight.Npc enemyType -> - Enemy.damageThresholdNormal enemyType - , equippedArmor = otherOpponent.equippedArmor - } + else + 1 - damageResistance = - -- TODO we're not dealing with plasma/... right now, only _normal_ DR - toFloat <| - Logic.damageResistanceNormal - { naturalDamageResistanceNormal = - case otherOpponent.type_ of - Fight.Player _ -> - 0 - - Fight.Npc enemyType -> - Enemy.damageResistanceNormal enemyType - , equippedArmor = otherOpponent.equippedArmor - , toughnessPerkRanks = Perk.rank Perk.Toughness otherOpponent.perks - } + criticalAttackDrDivisor = + if isCriticalAttackArmorPiercing && not (damageType == DamageType.EMP) then + 5 - ammoDamageResistanceModifier = - -- TODO ammo - 0 - - criticalHitDamageMultiplier : Int - criticalHitDamageMultiplier = - maybeCritical - |> Maybe.map .damageMultiplier - |> Maybe.withDefault 2 + else + 1 - maybeCriticalInfo = - Maybe.map - (\critical -> ( critical.effects, critical.message )) - maybeCritical + livingAnatomyBonus = + if + (Perk.rank Perk.LivingAnatomy opponent.perks > 0) + && Fight.isOpponentLivingCreature otherOpponent + then + 5 - finesseDamageResistanceModifier = - if Trait.isSelected Trait.Finesse opponent.traits then - 30 + else + 0 + + damageThreshold = + -- TODO we're not dealing with plasma/... right now, only _normal_ DT + toFloat <| + Logic.damageThresholdNormal + { naturalDamageThresholdNormal = + case otherOpponent.type_ of + Fight.Player _ -> + 0 + + Fight.Npc enemyType -> + Enemy.damageThresholdNormal enemyType + , equippedArmor = otherOpponent.equippedArmor + } - else - 0 + damageResistancePct : Int + damageResistancePct = + -- TODO we're not dealing with plasma/... right now, only _normal_ DR + Logic.damageResistanceNormal + { naturalDamageResistanceNormal = + case otherOpponent.type_ of + Fight.Player _ -> + 0 + + Fight.Npc enemyType -> + Enemy.damageResistanceNormal enemyType + , equippedArmor = otherOpponent.equippedArmor + , toughnessPerkRanks = Perk.rank Perk.Toughness otherOpponent.perks + } - finalDamageResistance = - -- TODO how should this be ignored by armor-bypassing attacks? - -- TODO beware the +/- signs for the ammo modifier - damageResistance + ammoDamageResistanceModifier + finesseDamageResistanceModifier + criticalHitDamageMultiplier : Int + criticalHitDamageMultiplier = + maybeCritical + |> Maybe.map .damageMultiplier + |> Maybe.withDefault 2 + + maybeCriticalInfo : Maybe ( List Critical.Effect, String ) + maybeCriticalInfo = + maybeCritical + |> Maybe.map (\critical -> ( critical.effects, critical.message )) + + isCriticalAttackArmorPiercing : Bool + isCriticalAttackArmorPiercing = + maybeCritical + |> Maybe.map (.effects >> List.member Critical.BypassArmor) + |> Maybe.withDefault False + + ammoDamageResistanceModifierPct : Int + ammoDamageResistanceModifierPct = + case usedAmmo_ of + PreferredAmmo ammo -> + Item.ammoDamageResistanceModifier ammo + + FallbackAmmo ammo -> + Item.ammoDamageResistanceModifier ammo + + NoUsableAmmo -> + 0 + + NoAmmoNeeded -> + 0 + + finesseDamageResistanceModifierPct : Int + finesseDamageResistanceModifierPct = + if + Trait.isSelected Trait.Finesse opponent.traits + && (not isCriticalAttackArmorPiercing || damageType == DamageType.EMP) + then + 30 - damageBeforeDamageResistance = - ((damage_ + rangedBonus) - * (ammoDamageMultiplier / ammoDamageDivisor) - * (toFloat criticalHitDamageMultiplier / 2) + else + 0 + + finalDamageResistancePct : Int + finalDamageResistancePct = + damageResistancePct + + ammoDamageResistanceModifierPct + + finesseDamageResistanceModifierPct + + damageBeforeDamageResistance = + ((damage_ + rangedBonus) + * (ammoDamageMultiplier / ammoDamageDivisor) + * (toFloat criticalHitDamageMultiplier / 2) + ) + - (damageThreshold / armorIgnoreDtDivisor) + + finalDamage = + livingAnatomyBonus + + (if damageBeforeDamageResistance > 0 then + max 1 <| + round <| + damageBeforeDamageResistance + / criticalAttackDrDivisor + * ((100 - min 90 (toFloat finalDamageResistancePct)) / 100) + + else + 0 + ) + in + ( finalDamage + , maybeCriticalInfo ) - - (damageThreshold / armorIgnore) - - finalDamage = - livingAnatomyBonus - + (if damageBeforeDamageResistance > 0 then - max 1 <| - round <| - damageBeforeDamageResistance - * ((100 - min 90 finalDamageResistance) / 100) - - else - 0 - ) - in - ( finalDamage - , maybeCriticalInfo - ) - ) - (Random.int - opponent.attackStats.minDamage - opponent.attackStats.maxDamage - ) - criticalGenerator + ) + (Random.int + opponent.attackStats.minDamage + opponent.attackStats.maxDamage + ) + criticalGenerator bothAlive : OngoingFight -> Bool @@ -1271,20 +1366,104 @@ evalValue who state value = n +type UsedAmmo + = PreferredAmmo Item.Kind + | FallbackAmmo Item.Kind + | NoUsableAmmo + | NoAmmoNeeded + + +{-| When trying to use a weapon, look at the user's preferences (equippedAmmo) +and their inventory (opponent.items) and choose which ammo will be used. +-} +usedAmmo : Who -> OngoingFight -> UsedAmmo +usedAmmo who ongoingFight = + let + opponent : Opponent + opponent = + opponent_ who ongoingFight + in + case opponent.equippedWeapon of + Nothing -> + -- This is going to be unarmed combat without anything equipped (so + -- no chance of eg. eating cells for Power Fist) + NoAmmoNeeded + + Just equippedWeapon -> + let + usableAmmo : SeqSet Item.Kind + usableAmmo = + Item.usableAmmo equippedWeapon + |> SeqSet.fromList + in + if SeqSet.isEmpty usableAmmo then + -- Eg. Solar Scorcher, I guess? Or any unarmed/melee weapon that doesn't eat ammo + NoAmmoNeeded + + else + let + fallback : () -> UsedAmmo + fallback () = + opponent.items + |> Dict.toList + |> List.filterMap + (\( _, { kind } ) -> + if SeqSet.member kind usableAmmo then + Just kind + + else + Nothing + ) + |> List.head + |> Maybe.map FallbackAmmo + |> Maybe.withDefault NoUsableAmmo + in + case opponent.equippedAmmo of + Just equippedAmmo -> + if SeqSet.member equippedAmmo usableAmmo then + -- We can use the preferred ammo (if we have it in our inventory!) + -- NOTE: we'd like it to be that if you sell/consume all of your equippedAmmo, it stops being equipped. + -- That would mean this being Just is a guarantee that it also exists in the inventory. + -- But let's check it exists in inventory anyways. + if Dict.any (\_ item -> item.kind == equippedAmmo) opponent.items then + PreferredAmmo equippedAmmo + + else + fallback () + + else + -- We need to fall back to anything else that's usable and that's in our inventory. + fallback () + + Nothing -> + -- We're free to try anything (it's going to be a Fallback ammo) + fallback () + + rangeNeeded : AttackStyle -> Who -> StrategyState -> Int rangeNeeded attackStyle who state = let opponent : Opponent opponent = opponent_ who state.ongoingFight - - equippedWeapon : Maybe Item.Kind - equippedWeapon = - opponent.equippedWeapon in - equippedWeapon - |> Maybe.map (Item.range attackStyle) - |> Maybe.withDefault Logic.unarmedRange + case opponent.equippedWeapon of + Nothing -> + Logic.unarmedRange + + Just equippedWeapon -> + case usedAmmo who state.ongoingFight of + PreferredAmmo _ -> + Item.range attackStyle equippedWeapon + + FallbackAmmo _ -> + Item.range attackStyle equippedWeapon + + NoAmmoNeeded -> + Item.range attackStyle equippedWeapon + + NoUsableAmmo -> + Logic.unarmedRange operatorFn : Operator -> (Int -> Int -> Bool) diff --git a/src/Data/Item.elm b/src/Data/Item.elm index 26d9e8c..4bf931f 100644 --- a/src/Data/Item.elm +++ b/src/Data/Item.elm @@ -10,23 +10,25 @@ module Data.Item exposing , allHealingNonempty , allNonempty , ammoArmorClassModifier + , ammoDamageModifier + , ammoDamageResistanceModifier , armorClass + , armorDamageResistanceEMP + , armorDamageResistanceElectrical + , armorDamageResistanceExplosion + , armorDamageResistanceFire + , armorDamageResistanceLaser + , armorDamageResistanceNormal + , armorDamageResistancePlasma + , armorDamageThresholdEMP + , armorDamageThresholdElectrical + , armorDamageThresholdExplosion + , armorDamageThresholdFire + , armorDamageThresholdLaser + , armorDamageThresholdNormal + , armorDamageThresholdPlasma , baseValue , create - , damageResistanceEMP - , damageResistanceElectrical - , damageResistanceExplosion - , damageResistanceFire - , damageResistanceLaser - , damageResistanceNormal - , damageResistancePlasma - , damageThresholdEMP - , damageThresholdElectrical - , damageThresholdExplosion - , damageThresholdFire - , damageThresholdLaser - , damageThresholdNormal - , damageThresholdPlasma , decoder , encode , encodeKind @@ -40,16 +42,20 @@ module Data.Item exposing , isHealing , isLongRangeWeapon , isWeapon + , isWeaponArmorPenetrating , kindDecoder , name , range - , strengthRequirement , typeName , types + , usableAmmo , usageEffects + , weaponDamageType + , weaponStrengthRequirement ) import Data.Fight.AttackStyle exposing (AttackStyle(..)) +import Data.Fight.DamageType exposing (DamageType(..)) import Data.Map.Location exposing (Size(..)) import Data.Skill as Skill exposing (Skill) import Dict exposing (Dict) @@ -157,9 +163,9 @@ type Kind -- Switchblade -- Knife -- Combat Knife - -- Wakizashi - -- "Little Jesus" - -- Ripper + | Wakizashi + | LittleJesus + | Ripper -- Throwing Knife (also in Throwing) -- Sharpened Pole (also in Throwing) -- Spear (also in Throwing) @@ -171,7 +177,7 @@ type Kind ---------------- -- SMALL GUNS -- ---------------- - -- 223 Pistol + | Pistol223 | Mauser9mm -- 10mm Pistol | Pistol14mm @@ -179,7 +185,7 @@ type Kind -- Desert Eagle (Exp. Mag.) -- 44 Magnum Revolver -- 44 Magnum (Speed Load) - -- Needler Pistol + | NeedlerPistol | GaussPistol -- Zip Gun ---------- @@ -227,12 +233,12 @@ type Kind -------------------- | AlienBlaster | LaserPistol - -- Magneto-Laser Pistol + | MagnetoLaserPistol -- Plasma Pistol -- Plasma Pistol (Ext. Cap.) -- Phazer | SolarScorcher - -- YK32 Pulse Pistol + | PulsePistol ------------ | GatlingLaser | LaserRifle @@ -249,7 +255,7 @@ type Kind -- Molotov cocktail -- Plasma grenade -- Pulse grenade - -- Holy hand grenade + | HolyHandGrenade -- Rock -- Gold nugget -- Uranium ore @@ -268,19 +274,18 @@ type Kind -- Jhp44Magnum -- Caliber45 -- Caseless47mm - -- Ap5mm + | Ap5mm -- Mm762 - -- Mm9 - -- Ball9mm - -- Ap10mm - -- Ap14mm - -- ExplosiveRocket - -- RocketAp + | Mm9 + | Ball9mm + | Ap10mm + | Ap14mm + | ExplosiveRocket + | RocketAp -- FlamethrowerFuel -- FlamethrowerFuelMk2 - -- HnNeedlerCartridge - -- HnApNeedlerCartridge - -- SmallEnergyCell + | HnNeedlerCartridge + | HnApNeedlerCartridge | ShotgunShell | Jhp10mm | Jhp5mm @@ -362,6 +367,13 @@ all = , BBAmmo , SmallEnergyCell , Fmj223 + , Ap5mm + , Mm9 + , Ball9mm + , Ap10mm + , Ap14mm + , ExplosiveRocket + , RocketAp , ShotgunShell , Jhp10mm , Jhp5mm @@ -379,6 +391,18 @@ all = , MotionSensor , K9 , MeatJerky + , Pistol223 + , Ripper + , Wakizashi + , LittleJesus + , Ripper + , Pistol223 + , NeedlerPistol + , MagnetoLaserPistol + , PulsePistol + , HolyHandGrenade + , HnNeedlerCartridge + , HnApNeedlerCartridge ] @@ -669,34 +693,65 @@ baseValue kind = Flare -> 35 + Ap5mm -> + 120 -ammoArmorClassModifier : Kind -> Int -ammoArmorClassModifier kind = - case kind of - BBAmmo -> - 0 + Mm9 -> + 100 - SmallEnergyCell -> - 0 + Ball9mm -> + 100 - Fmj223 -> - 20 + Ap10mm -> + 100 - ShotgunShell -> - 10 + Ap14mm -> + 150 - Jhp10mm -> - 0 + ExplosiveRocket -> + 200 - Jhp5mm -> - 0 + RocketAp -> + 400 - MicrofusionCell -> - 0 + Pistol223 -> + 3500 - Ec2mm -> - 30 + Wakizashi -> + 200 + + LittleJesus -> + 200 + + Ripper -> + 900 + + NeedlerPistol -> + 550 + + MagnetoLaserPistol -> + -- Balance? + 350 + PulsePistol -> + 12500 + + HolyHandGrenade -> + -- Balance? + 1 + + HnNeedlerCartridge -> + 250 + + HnApNeedlerCartridge -> + 300 + + +{-| This can be both positive and negative, so you need to ADD it in calculations, not SUBTRACT. +-} +ammoDamageResistanceModifier : Kind -> Int +ammoDamageResistanceModifier kind = + case kind of Beer -> 0 @@ -757,9 +812,21 @@ ammoArmorClassModifier kind = MegaPowerFist -> 0 + CattleProd -> + 0 + + SuperCattleProd -> + 0 + SuperSledge -> 0 + Mauser9mm -> + 0 + + Pistol14mm -> + 0 + GaussPistol -> 0 @@ -790,9 +857,18 @@ ammoArmorClassModifier kind = GaussRifle -> 0 + CombatShotgun -> + 0 + + HkCaws -> + 0 + PancorJackhammer -> 0 + Shotgun -> + 0 + SawedOffShotgun -> 0 @@ -805,9 +881,15 @@ ammoArmorClassModifier kind = RocketLauncher -> 0 + AlienBlaster -> + 0 + LaserPistol -> 0 + SolarScorcher -> + 0 + GatlingLaser -> 0 @@ -826,9 +908,36 @@ ammoArmorClassModifier kind = PulseRifle -> 0 + Flare -> + 0 + FragGrenade -> 0 + BBAmmo -> + 0 + + SmallEnergyCell -> + 0 + + Fmj223 -> + -20 + + ShotgunShell -> + 0 + + Jhp10mm -> + 25 + + Jhp5mm -> + 35 + + MicrofusionCell -> + 0 + + Ec2mm -> + -20 + Tool -> 0 @@ -865,289 +974,367 @@ ammoArmorClassModifier kind = MeatJerky -> 0 - CattleProd -> + Ap5mm -> + -35 + + Mm9 -> + 10 + + Ball9mm -> 0 - SuperCattleProd -> + Ap10mm -> + -25 + + Ap14mm -> + -50 + + ExplosiveRocket -> + -25 + + RocketAp -> + -50 + + Pistol223 -> 0 - Mauser9mm -> + Wakizashi -> 0 - Pistol14mm -> + LittleJesus -> 0 - CombatShotgun -> + Ripper -> 0 - HkCaws -> + NeedlerPistol -> 0 - Shotgun -> + MagnetoLaserPistol -> 0 - AlienBlaster -> + PulsePistol -> 0 - SolarScorcher -> + HolyHandGrenade -> 0 - Flare -> + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> 0 -armorClass : Kind -> Int -armorClass kind = +ammoDamageModifier : Kind -> ( Float, Float ) +ammoDamageModifier kind = case kind of - Robes -> - 5 + BBAmmo -> + ( 1, 1 ) - LeatherJacket -> - 8 + SmallEnergyCell -> + ( 1, 1 ) - LeatherArmor -> - 15 + Fmj223 -> + ( 1, 1 ) - MetalArmor -> - 10 + Ap5mm -> + ( 1, 2 ) - TeslaArmor -> - 15 + Mm9 -> + ( 1, 2 ) - CombatArmor -> - 20 + Ball9mm -> + ( 1, 1 ) - CombatArmorMk2 -> - 25 + Ap10mm -> + ( 1, 2 ) - PowerArmor -> - 25 + Ap14mm -> + ( 1, 2 ) - Fruit -> - 0 + ExplosiveRocket -> + ( 1, 1 ) - HealingPowder -> - 0 + RocketAp -> + ( 1, 1 ) - MeatJerky -> - 0 + ShotgunShell -> + ( 1, 1 ) + + Jhp10mm -> + ( 2, 1 ) + + Jhp5mm -> + ( 2, 1 ) + + MicrofusionCell -> + ( 1, 1 ) + + Ec2mm -> + ( 3, 2 ) + -- Beer -> - 0 + ( 1, 1 ) + + Fruit -> + ( 1, 1 ) + + HealingPowder -> + ( 1, 1 ) Stimpak -> - 0 + ( 1, 1 ) SuperStimpak -> - 0 + ( 1, 1 ) BigBookOfScience -> - 0 + ( 1, 1 ) DeansElectronics -> - 0 + ( 1, 1 ) FirstAidBook -> - 0 + ( 1, 1 ) GunsAndBullets -> - 0 + ( 1, 1 ) ScoutHandbook -> - 0 + ( 1, 1 ) + + Robes -> + ( 1, 1 ) + + LeatherJacket -> + ( 1, 1 ) + + LeatherArmor -> + ( 1, 1 ) + + MetalArmor -> + ( 1, 1 ) + + TeslaArmor -> + ( 1, 1 ) + + CombatArmor -> + ( 1, 1 ) + + CombatArmorMk2 -> + ( 1, 1 ) + + PowerArmor -> + ( 1, 1 ) PowerFist -> - 0 + ( 1, 1 ) MegaPowerFist -> - 0 + ( 1, 1 ) - SuperSledge -> - 0 + CattleProd -> + ( 1, 1 ) - FragGrenade -> - 0 + SuperCattleProd -> + ( 1, 1 ) - RedRyderLEBBGun -> - 0 + SuperSledge -> + ( 1, 1 ) - HuntingRifle -> - 0 + Mauser9mm -> + ( 1, 1 ) - ScopedHuntingRifle -> - 0 + Pistol14mm -> + ( 1, 1 ) - Bozar -> - 0 + GaussPistol -> + ( 1, 1 ) - SawedOffShotgun -> - 0 + Smg10mm -> + ( 1, 1 ) - SniperRifle -> - 0 + HkP90c -> + ( 1, 1 ) AssaultRifle -> - 0 + ( 1, 1 ) ExpandedAssaultRifle -> - 0 + ( 1, 1 ) - PancorJackhammer -> - 0 + HuntingRifle -> + ( 1, 1 ) - HkP90c -> - 0 + ScopedHuntingRifle -> + ( 1, 1 ) - LaserPistol -> - 0 + RedRyderLEBBGun -> + ( 1, 1 ) - PlasmaRifle -> - 0 + SniperRifle -> + ( 1, 1 ) - GatlingLaser -> - 0 + GaussRifle -> + ( 1, 1 ) - TurboPlasmaRifle -> - 0 + CombatShotgun -> + ( 1, 1 ) - GaussRifle -> - 0 + HkCaws -> + ( 1, 1 ) - GaussPistol -> - 0 + PancorJackhammer -> + ( 1, 1 ) - PulseRifle -> - 0 + Shotgun -> + ( 1, 1 ) - BBAmmo -> - 0 + SawedOffShotgun -> + ( 1, 1 ) - SmallEnergyCell -> - 0 + Minigun -> + ( 1, 1 ) - Fmj223 -> - 0 + Bozar -> + ( 1, 1 ) - ShotgunShell -> - 0 + RocketLauncher -> + ( 1, 1 ) - Smg10mm -> - 0 + AlienBlaster -> + ( 1, 1 ) - Jhp10mm -> - 0 + LaserPistol -> + ( 1, 1 ) - Jhp5mm -> - 0 + SolarScorcher -> + ( 1, 1 ) - MicrofusionCell -> - 0 + GatlingLaser -> + ( 1, 1 ) - Ec2mm -> - 0 + LaserRifle -> + ( 1, 1 ) + + LaserRifleExtCap -> + ( 1, 1 ) + + PlasmaRifle -> + ( 1, 1 ) + + TurboPlasmaRifle -> + ( 1, 1 ) + + PulseRifle -> + ( 1, 1 ) + + Flare -> + ( 1, 1 ) + + FragGrenade -> + ( 1, 1 ) Tool -> - 0 + ( 1, 1 ) LockPicks -> - 0 + ( 1, 1 ) ElectronicLockpick -> - 0 + ( 1, 1 ) AbnormalBrain -> - 0 + ( 1, 1 ) ChimpanzeeBrain -> - 0 + ( 1, 1 ) HumanBrain -> - 0 + ( 1, 1 ) CyberneticBrain -> - 0 + ( 1, 1 ) GECK -> - 0 + ( 1, 1 ) SkynetAim -> - 0 + ( 1, 1 ) MotionSensor -> - 0 + ( 1, 1 ) K9 -> - 0 + ( 1, 1 ) - Minigun -> - 0 + MeatJerky -> + ( 1, 1 ) - RocketLauncher -> - 0 + Pistol223 -> + ( 1, 1 ) - LaserRifle -> - 0 + Wakizashi -> + ( 1, 1 ) - LaserRifleExtCap -> - 0 + LittleJesus -> + ( 1, 1 ) - CattleProd -> - 0 + Ripper -> + ( 1, 1 ) - SuperCattleProd -> - 0 + NeedlerPistol -> + ( 1, 1 ) - Mauser9mm -> - 0 + MagnetoLaserPistol -> + ( 1, 1 ) - Pistol14mm -> - 0 + PulsePistol -> + ( 1, 1 ) - CombatShotgun -> - 0 + HolyHandGrenade -> + ( 1, 1 ) - HkCaws -> - 0 + HnNeedlerCartridge -> + ( 1, 1 ) - Shotgun -> - 0 + HnApNeedlerCartridge -> + ( 2, 1 ) - AlienBlaster -> - 0 - SolarScorcher -> +{-| This can be negative, you need to ADD it in calculations, not SUBTRACT. +-} +ammoArmorClassModifier : Kind -> Int +ammoArmorClassModifier kind = + case kind of + BBAmmo -> 0 - Flare -> + SmallEnergyCell -> 0 + Fmj223 -> + -20 -damageThresholdNormal : Kind -> Int -damageThresholdNormal kind = - case kind of - Robes -> - 0 + ShotgunShell -> + -10 - LeatherJacket -> + Jhp10mm -> 0 - LeatherArmor -> - 2 - - MetalArmor -> - 4 - - TeslaArmor -> - 4 + Jhp5mm -> + 0 - CombatArmor -> - 5 + MicrofusionCell -> + 0 - CombatArmorMk2 -> - 6 + Ec2mm -> + -30 - PowerArmor -> - 12 + Beer -> + 0 Fruit -> 0 @@ -1155,12 +1342,6 @@ damageThresholdNormal kind = HealingPowder -> 0 - MeatJerky -> - 0 - - Beer -> - 0 - Stimpak -> 0 @@ -1182,94 +1363,106 @@ damageThresholdNormal kind = ScoutHandbook -> 0 - PowerFist -> + Robes -> 0 - MegaPowerFist -> + LeatherJacket -> 0 - SuperSledge -> + LeatherArmor -> 0 - FragGrenade -> + MetalArmor -> 0 - RedRyderLEBBGun -> + TeslaArmor -> 0 - HuntingRifle -> + CombatArmor -> 0 - ScopedHuntingRifle -> + CombatArmorMk2 -> 0 - Bozar -> + PowerArmor -> 0 - SawedOffShotgun -> + PowerFist -> 0 - SniperRifle -> + MegaPowerFist -> 0 - AssaultRifle -> + SuperSledge -> 0 - ExpandedAssaultRifle -> + GaussPistol -> 0 - PancorJackhammer -> + Smg10mm -> 0 HkP90c -> 0 - LaserPistol -> + AssaultRifle -> 0 - PlasmaRifle -> + ExpandedAssaultRifle -> 0 - GatlingLaser -> + HuntingRifle -> 0 - TurboPlasmaRifle -> + ScopedHuntingRifle -> + 0 + + RedRyderLEBBGun -> + 0 + + SniperRifle -> 0 GaussRifle -> 0 - GaussPistol -> + PancorJackhammer -> 0 - PulseRifle -> + SawedOffShotgun -> 0 - BBAmmo -> + Minigun -> 0 - SmallEnergyCell -> + Bozar -> 0 - Fmj223 -> + RocketLauncher -> 0 - ShotgunShell -> + LaserPistol -> 0 - Smg10mm -> + GatlingLaser -> 0 - Jhp10mm -> + LaserRifle -> 0 - Jhp5mm -> + LaserRifleExtCap -> 0 - MicrofusionCell -> + PlasmaRifle -> 0 - Ec2mm -> + TurboPlasmaRifle -> + 0 + + PulseRifle -> + 0 + + FragGrenade -> 0 Tool -> @@ -1305,16 +1498,7 @@ damageThresholdNormal kind = K9 -> 0 - Minigun -> - 0 - - RocketLauncher -> - 0 - - LaserRifle -> - 0 - - LaserRifleExtCap -> + MeatJerky -> 0 CattleProd -> @@ -1347,33 +1531,84 @@ damageThresholdNormal kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + -15 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + -10 + + HnApNeedlerCartridge -> + -10 -damageThresholdExplosion : Kind -> Int -damageThresholdExplosion kind = + +armorClass : Kind -> Int +armorClass kind = case kind of Robes -> - 0 + 5 LeatherJacket -> - 0 + 8 LeatherArmor -> - 0 + 15 MetalArmor -> - 4 + 10 TeslaArmor -> - 4 + 15 CombatArmor -> - 6 + 20 CombatArmorMk2 -> - 9 + 25 PowerArmor -> - 20 + 25 Fruit -> 0 @@ -1573,74 +1808,125 @@ damageThresholdExplosion kind = Flare -> 0 - -damageThresholdElectrical : Kind -> Int -damageThresholdElectrical kind = - case kind of - Robes -> + Ap5mm -> 0 - LeatherJacket -> + Mm9 -> 0 - LeatherArmor -> + Ball9mm -> 0 - MetalArmor -> + Ap10mm -> 0 - TeslaArmor -> - 12 - - CombatArmor -> - 2 - - CombatArmorMk2 -> - 3 - - PowerArmor -> - 12 - - Fruit -> + Ap14mm -> 0 - HealingPowder -> + ExplosiveRocket -> 0 - MeatJerky -> + RocketAp -> 0 - Beer -> + Pistol223 -> 0 - Stimpak -> + Wakizashi -> 0 - SuperStimpak -> + LittleJesus -> 0 - BigBookOfScience -> + Ripper -> 0 - DeansElectronics -> + NeedlerPistol -> 0 - FirstAidBook -> + MagnetoLaserPistol -> 0 - GunsAndBullets -> + PulsePistol -> 0 - ScoutHandbook -> + HolyHandGrenade -> 0 - PowerFist -> + HnNeedlerCartridge -> 0 - MegaPowerFist -> + HnApNeedlerCartridge -> 0 - SuperSledge -> + +armorDamageThresholdNormal : Kind -> Int +armorDamageThresholdNormal kind = + case kind of + Robes -> + 0 + + LeatherJacket -> + 0 + + LeatherArmor -> + 2 + + MetalArmor -> + 4 + + TeslaArmor -> + 4 + + CombatArmor -> + 5 + + CombatArmorMk2 -> + 6 + + PowerArmor -> + 12 + + Fruit -> + 0 + + HealingPowder -> + 0 + + MeatJerky -> + 0 + + Beer -> + 0 + + Stimpak -> + 0 + + SuperStimpak -> + 0 + + BigBookOfScience -> + 0 + + DeansElectronics -> + 0 + + FirstAidBook -> + 0 + + GunsAndBullets -> + 0 + + ScoutHandbook -> + 0 + + PowerFist -> + 0 + + MegaPowerFist -> + 0 + + SuperSledge -> 0 FragGrenade -> @@ -1799,9 +2085,60 @@ damageThresholdElectrical kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageThresholdEMP : Kind -> Int -damageThresholdEMP kind = +armorDamageThresholdExplosion : Kind -> Int +armorDamageThresholdExplosion kind = case kind of Robes -> 0 @@ -1813,19 +2150,19 @@ damageThresholdEMP kind = 0 MetalArmor -> - 0 + 4 TeslaArmor -> - 0 + 4 CombatArmor -> - 0 + 6 CombatArmorMk2 -> - 0 + 9 PowerArmor -> - 0 + 20 Fruit -> 0 @@ -2025,9 +2362,60 @@ damageThresholdEMP kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageThresholdLaser : Kind -> Int -damageThresholdLaser kind = +armorDamageThresholdElectrical : Kind -> Int +armorDamageThresholdElectrical kind = case kind of Robes -> 0 @@ -2039,19 +2427,19 @@ damageThresholdLaser kind = 0 MetalArmor -> - 6 + 0 TeslaArmor -> - 19 + 12 CombatArmor -> - 8 + 2 CombatArmorMk2 -> - 9 + 3 PowerArmor -> - 18 + 12 Fruit -> 0 @@ -2251,9 +2639,60 @@ damageThresholdLaser kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageThresholdFire : Kind -> Int -damageThresholdFire kind = +armorDamageThresholdEMP : Kind -> Int +armorDamageThresholdEMP kind = case kind of Robes -> 0 @@ -2265,19 +2704,19 @@ damageThresholdFire kind = 0 MetalArmor -> - 4 + 0 TeslaArmor -> - 4 + 0 CombatArmor -> - 4 + 0 CombatArmorMk2 -> - 5 + 0 PowerArmor -> - 12 + 0 Fruit -> 0 @@ -2477,9 +2916,60 @@ damageThresholdFire kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageThresholdPlasma : Kind -> Int -damageThresholdPlasma kind = +armorDamageThresholdLaser : Kind -> Int +armorDamageThresholdLaser kind = case kind of Robes -> 0 @@ -2491,19 +2981,19 @@ damageThresholdPlasma kind = 0 MetalArmor -> - 4 + 6 TeslaArmor -> - 10 + 19 CombatArmor -> - 4 + 8 CombatArmorMk2 -> - 5 + 9 PowerArmor -> - 10 + 18 Fruit -> 0 @@ -2703,33 +3193,84 @@ damageThresholdPlasma kind = Flare -> 0 + Ap5mm -> + 0 -damageResistanceNormal : Kind -> Int -damageResistanceNormal kind = - case kind of - Robes -> - 20 + Mm9 -> + 0 - LeatherJacket -> - 20 + Ball9mm -> + 0 - LeatherArmor -> - 25 + Ap10mm -> + 0 - MetalArmor -> - 30 + Ap14mm -> + 0 - TeslaArmor -> - 20 + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +armorDamageThresholdFire : Kind -> Int +armorDamageThresholdFire kind = + case kind of + Robes -> + 0 + + LeatherJacket -> + 0 + + LeatherArmor -> + 0 + + MetalArmor -> + 4 + + TeslaArmor -> + 4 CombatArmor -> - 40 + 4 CombatArmorMk2 -> - 40 + 5 PowerArmor -> - 40 + 12 Fruit -> 0 @@ -2929,33 +3470,84 @@ damageResistanceNormal kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageResistanceExplosion : Kind -> Int -damageResistanceExplosion kind = +armorDamageThresholdPlasma : Kind -> Int +armorDamageThresholdPlasma kind = case kind of Robes -> - 20 + 0 LeatherJacket -> - 20 + 0 LeatherArmor -> - 20 + 0 MetalArmor -> - 25 + 4 TeslaArmor -> - 20 + 10 CombatArmor -> - 40 + 4 CombatArmorMk2 -> - 45 + 5 PowerArmor -> - 50 + 10 Fruit -> 0 @@ -3155,30 +3747,81 @@ damageResistanceExplosion kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageResistanceElectrical : Kind -> Int -damageResistanceElectrical kind = +armorDamageResistanceNormal : Kind -> Int +armorDamageResistanceNormal kind = case kind of Robes -> - 40 + 20 LeatherJacket -> - 30 + 20 LeatherArmor -> - 30 + 25 MetalArmor -> - 0 + 30 TeslaArmor -> - 80 + 20 CombatArmor -> - 50 + 40 CombatArmorMk2 -> - 55 + 40 PowerArmor -> 40 @@ -3381,33 +4024,84 @@ damageResistanceElectrical kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageResistanceEMP : Kind -> Int -damageResistanceEMP kind = +armorDamageResistanceExplosion : Kind -> Int +armorDamageResistanceExplosion kind = case kind of Robes -> - 500 + 20 LeatherJacket -> - 500 + 20 LeatherArmor -> - 500 + 20 MetalArmor -> - 500 + 25 TeslaArmor -> - 500 + 20 CombatArmor -> - 500 + 40 CombatArmorMk2 -> - 500 + 45 PowerArmor -> - 500 + 50 Fruit -> 0 @@ -3607,33 +4301,84 @@ damageResistanceEMP kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageResistanceLaser : Kind -> Int -damageResistanceLaser kind = +armorDamageResistanceElectrical : Kind -> Int +armorDamageResistanceElectrical kind = case kind of Robes -> - 25 + 40 LeatherJacket -> - 20 + 30 LeatherArmor -> - 20 + 30 MetalArmor -> - 75 + 0 TeslaArmor -> - 90 + 80 CombatArmor -> - 60 + 50 CombatArmorMk2 -> - 65 + 55 PowerArmor -> - 80 + 40 Fruit -> 0 @@ -3833,33 +4578,84 @@ damageResistanceLaser kind = Flare -> 0 + Ap5mm -> + 0 -damageResistanceFire : Kind -> Int -damageResistanceFire kind = - case kind of - Robes -> - 10 + Mm9 -> + 0 - LeatherJacket -> - 10 + Ball9mm -> + 0 - LeatherArmor -> - 20 + Ap10mm -> + 0 - MetalArmor -> - 10 + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +armorDamageResistanceEMP : Kind -> Int +armorDamageResistanceEMP kind = + case kind of + Robes -> + 500 + + LeatherJacket -> + 500 + + LeatherArmor -> + 500 + + MetalArmor -> + 500 TeslaArmor -> - 10 + 500 CombatArmor -> - 30 + 500 CombatArmorMk2 -> - 35 + 500 PowerArmor -> - 60 + 500 Fruit -> 0 @@ -4059,33 +4855,84 @@ damageResistanceFire kind = Flare -> 0 + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + -damageResistancePlasma : Kind -> Int -damageResistancePlasma kind = +armorDamageResistanceLaser : Kind -> Int +armorDamageResistanceLaser kind = case kind of Robes -> - 10 + 25 LeatherJacket -> - 10 + 20 LeatherArmor -> - 10 + 20 MetalArmor -> - 20 + 75 TeslaArmor -> - 180 + 90 CombatArmor -> - 50 + 60 CombatArmorMk2 -> - 50 + 65 PowerArmor -> - 40 + 80 Fruit -> 0 @@ -4285,1416 +5132,3107 @@ damageResistancePlasma kind = Flare -> 0 + Ap5mm -> + 0 -encode : Item -> JE.Value -encode item = - JE.object - [ ( "id", JE.int item.id ) - , ( "kind", encodeKind item.kind ) - , ( "count", JE.int item.count ) - ] + Mm9 -> + 0 + Ball9mm -> + 0 -decoder : Decoder Item -decoder = - JD.succeed Item - |> JD.andMap (JD.field "id" JD.int) - |> JD.andMap (JD.field "kind" kindDecoder) - |> JD.andMap (JD.field "count" JD.int) + Ap10mm -> + 0 + Ap14mm -> + 0 -encodeKind : Kind -> JE.Value -encodeKind kind = - case kind of - Beer -> - JE.string "Beer" + ExplosiveRocket -> + 0 - Fruit -> - JE.string "Fruit" + RocketAp -> + 0 - HealingPowder -> - JE.string "HealingPowder" + Pistol223 -> + 0 - Stimpak -> - JE.string "Stimpak" + Wakizashi -> + 0 - SuperStimpak -> - JE.string "SuperStimpak" + LittleJesus -> + 0 - BigBookOfScience -> - JE.string "BigBookOfScience" + Ripper -> + 0 - DeansElectronics -> - JE.string "DeansElectronics" + NeedlerPistol -> + 0 - FirstAidBook -> - JE.string "FirstAidBook" + MagnetoLaserPistol -> + 0 - GunsAndBullets -> - JE.string "GunsAndBullets" + PulsePistol -> + 0 - ScoutHandbook -> - JE.string "ScoutHandbook" + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + +armorDamageResistanceFire : Kind -> Int +armorDamageResistanceFire kind = + case kind of Robes -> - JE.string "Robes" + 10 LeatherJacket -> - JE.string "LeatherJacket" + 10 LeatherArmor -> - JE.string "LeatherArmor" + 20 MetalArmor -> - JE.string "MetalArmor" + 10 TeslaArmor -> - JE.string "TeslaArmor" + 10 CombatArmor -> - JE.string "CombatArmor" + 30 CombatArmorMk2 -> - JE.string "CombatArmorMk2" + 35 PowerArmor -> - JE.string "PowerArmor" + 60 - PowerFist -> - JE.string "PowerFist" + Fruit -> + 0 - MegaPowerFist -> - JE.string "MegaPowerFist" + HealingPowder -> + 0 - CattleProd -> - JE.string "CattleProd" + MeatJerky -> + 0 - SuperCattleProd -> - JE.string "SuperCattleProd" + Beer -> + 0 - SuperSledge -> - JE.string "SuperSledge" + Stimpak -> + 0 - Mauser9mm -> - JE.string "Mauser9mm" + SuperStimpak -> + 0 - Pistol14mm -> - JE.string "Pistol14mm" + BigBookOfScience -> + 0 - GaussPistol -> - JE.string "GaussPistol" + DeansElectronics -> + 0 - Smg10mm -> - JE.string "Smg10mm" + FirstAidBook -> + 0 - HkP90c -> - JE.string "HkP90c" + GunsAndBullets -> + 0 - AssaultRifle -> - JE.string "AssaultRifle" + ScoutHandbook -> + 0 - ExpandedAssaultRifle -> - JE.string "ExpandedAssaultRifle" + PowerFist -> + 0 + + MegaPowerFist -> + 0 + + SuperSledge -> + 0 + + FragGrenade -> + 0 + + RedRyderLEBBGun -> + 0 HuntingRifle -> - JE.string "HuntingRifle" + 0 ScopedHuntingRifle -> - JE.string "ScopedHuntingRifle" + 0 - RedRyderLEBBGun -> - JE.string "RedRyderLEBBGun" + Bozar -> + 0 - SniperRifle -> - JE.string "SniperRifle" + SawedOffShotgun -> + 0 - GaussRifle -> - JE.string "GaussRifle" + SniperRifle -> + 0 - CombatShotgun -> - JE.string "CombatShotgun" + AssaultRifle -> + 0 - HkCaws -> - JE.string "HkCaws" + ExpandedAssaultRifle -> + 0 PancorJackhammer -> - JE.string "PancorJackhammer" + 0 - Shotgun -> - JE.string "Shotgun" - - SawedOffShotgun -> - JE.string "SawedOffShotgun" - - Minigun -> - JE.string "Minigun" - - Bozar -> - JE.string "Bozar" - - RocketLauncher -> - JE.string "RocketLauncher" - - AlienBlaster -> - JE.string "AlienBlaster" + HkP90c -> + 0 LaserPistol -> - JE.string "LaserPistol" + 0 - SolarScorcher -> - JE.string "SolarScorcher" + PlasmaRifle -> + 0 GatlingLaser -> - JE.string "GatlingLaser" - - LaserRifle -> - JE.string "LaserRifle" - - LaserRifleExtCap -> - JE.string "LaserRifleExtCap" - - PlasmaRifle -> - JE.string "PlasmaRifle" + 0 TurboPlasmaRifle -> - JE.string "TurboPlasmaRifle" + 0 - PulseRifle -> - JE.string "PulseRifle" + GaussRifle -> + 0 - Flare -> - JE.string "Flare" + GaussPistol -> + 0 - FragGrenade -> - JE.string "FragGrenade" + PulseRifle -> + 0 BBAmmo -> - JE.string "BBAmmo" + 0 SmallEnergyCell -> - JE.string "SmallEnergyCell" + 0 Fmj223 -> - JE.string "Fmj223" + 0 ShotgunShell -> - JE.string "ShotgunShell" + 0 + + Smg10mm -> + 0 Jhp10mm -> - JE.string "Jhp10mm" + 0 Jhp5mm -> - JE.string "Jhp5mm" + 0 MicrofusionCell -> - JE.string "MicrofusionCell" + 0 Ec2mm -> - JE.string "Ec2mm" + 0 Tool -> - JE.string "Tool" + 0 LockPicks -> - JE.string "LockPicks" + 0 ElectronicLockpick -> - JE.string "ElectronicLockpick" + 0 AbnormalBrain -> - JE.string "AbnormalBrain" + 0 ChimpanzeeBrain -> - JE.string "ChimpanzeeBrain" + 0 HumanBrain -> - JE.string "HumanBrain" + 0 CyberneticBrain -> - JE.string "CyberneticBrain" + 0 GECK -> - JE.string "GECK" + 0 SkynetAim -> - JE.string "SkynetAim" + 0 MotionSensor -> - JE.string "MotionSensor" + 0 K9 -> - JE.string "K9" - - MeatJerky -> - JE.string "MeatJerky" + 0 + Minigun -> + 0 -kindDecoder : Decoder Kind -kindDecoder = - JD.field "tag" JD.string - |> JD.andThen - (\ctor -> - case ctor of - "Beer" -> - JD.succeed Beer + RocketLauncher -> + 0 - "Fruit" -> - JD.succeed Fruit + LaserRifle -> + 0 - "HealingPowder" -> - JD.succeed HealingPowder + LaserRifleExtCap -> + 0 - "Stimpak" -> - JD.succeed Stimpak + CattleProd -> + 0 - "SuperStimpak" -> - JD.succeed SuperStimpak + SuperCattleProd -> + 0 - "BigBookOfScience" -> - JD.succeed BigBookOfScience + Mauser9mm -> + 0 - "DeansElectronics" -> - JD.succeed DeansElectronics + Pistol14mm -> + 0 - "FirstAidBook" -> - JD.succeed FirstAidBook + CombatShotgun -> + 0 - "GunsAndBullets" -> - JD.succeed GunsAndBullets + HkCaws -> + 0 - "ScoutHandbook" -> - JD.succeed ScoutHandbook + Shotgun -> + 0 - "Robes" -> - JD.succeed Robes + AlienBlaster -> + 0 - "LeatherJacket" -> - JD.succeed LeatherJacket + SolarScorcher -> + 0 - "LeatherArmor" -> - JD.succeed LeatherArmor + Flare -> + 0 - "MetalArmor" -> - JD.succeed MetalArmor + Ap5mm -> + 0 - "TeslaArmor" -> - JD.succeed TeslaArmor + Mm9 -> + 0 - "CombatArmor" -> - JD.succeed CombatArmor + Ball9mm -> + 0 - "CombatArmorMk2" -> - JD.succeed CombatArmorMk2 + Ap10mm -> + 0 - "PowerArmor" -> - JD.succeed PowerArmor + Ap14mm -> + 0 - "PowerFist" -> - JD.succeed PowerFist + ExplosiveRocket -> + 0 - "MegaPowerFist" -> - JD.succeed MegaPowerFist + RocketAp -> + 0 - "CattleProd" -> - JD.succeed CattleProd + Pistol223 -> + 0 - "SuperCattleProd" -> - JD.succeed SuperCattleProd + Wakizashi -> + 0 - "SuperSledge" -> - JD.succeed SuperSledge + LittleJesus -> + 0 - "Mauser9mm" -> - JD.succeed Mauser9mm + Ripper -> + 0 - "Pistol14mm" -> - JD.succeed Pistol14mm + NeedlerPistol -> + 0 - "GaussPistol" -> - JD.succeed GaussPistol + MagnetoLaserPistol -> + 0 - "Smg10mm" -> - JD.succeed Smg10mm + PulsePistol -> + 0 - "HkP90c" -> - JD.succeed HkP90c + HolyHandGrenade -> + 0 - "AssaultRifle" -> - JD.succeed AssaultRifle + HnNeedlerCartridge -> + 0 - "ExpandedAssaultRifle" -> - JD.succeed ExpandedAssaultRifle + HnApNeedlerCartridge -> + 0 - "HuntingRifle" -> - JD.succeed HuntingRifle - "ScopedHuntingRifle" -> - JD.succeed ScopedHuntingRifle +armorDamageResistancePlasma : Kind -> Int +armorDamageResistancePlasma kind = + case kind of + Robes -> + 10 - "RedRyderLEBBGun" -> - JD.succeed RedRyderLEBBGun + LeatherJacket -> + 10 - "SniperRifle" -> - JD.succeed SniperRifle + LeatherArmor -> + 10 - "GaussRifle" -> - JD.succeed GaussRifle + MetalArmor -> + 20 - "CombatShotgun" -> - JD.succeed CombatShotgun + TeslaArmor -> + 180 - "HkCaws" -> - JD.succeed HkCaws + CombatArmor -> + 50 - "PancorJackhammer" -> - JD.succeed PancorJackhammer + CombatArmorMk2 -> + 50 - "Shotgun" -> - JD.succeed Shotgun + PowerArmor -> + 40 - "SawedOffShotgun" -> - JD.succeed SawedOffShotgun + Fruit -> + 0 - "Minigun" -> - JD.succeed Minigun + HealingPowder -> + 0 - "Bozar" -> - JD.succeed Bozar + MeatJerky -> + 0 - "RocketLauncher" -> - JD.succeed RocketLauncher + Beer -> + 0 + + Stimpak -> + 0 + + SuperStimpak -> + 0 + + BigBookOfScience -> + 0 + + DeansElectronics -> + 0 + + FirstAidBook -> + 0 + + GunsAndBullets -> + 0 + + ScoutHandbook -> + 0 + + PowerFist -> + 0 + + MegaPowerFist -> + 0 + + SuperSledge -> + 0 + + FragGrenade -> + 0 + + RedRyderLEBBGun -> + 0 + + HuntingRifle -> + 0 + + ScopedHuntingRifle -> + 0 + + Bozar -> + 0 + + SawedOffShotgun -> + 0 + + SniperRifle -> + 0 + + AssaultRifle -> + 0 + + ExpandedAssaultRifle -> + 0 + + PancorJackhammer -> + 0 + + HkP90c -> + 0 + + LaserPistol -> + 0 + + PlasmaRifle -> + 0 + + GatlingLaser -> + 0 + + TurboPlasmaRifle -> + 0 + + GaussRifle -> + 0 + + GaussPistol -> + 0 + + PulseRifle -> + 0 + + BBAmmo -> + 0 + + SmallEnergyCell -> + 0 + + Fmj223 -> + 0 + + ShotgunShell -> + 0 + + Smg10mm -> + 0 + + Jhp10mm -> + 0 + + Jhp5mm -> + 0 + + MicrofusionCell -> + 0 + + Ec2mm -> + 0 + + Tool -> + 0 + + LockPicks -> + 0 + + ElectronicLockpick -> + 0 + + AbnormalBrain -> + 0 + + ChimpanzeeBrain -> + 0 + + HumanBrain -> + 0 + + CyberneticBrain -> + 0 + + GECK -> + 0 + + SkynetAim -> + 0 + + MotionSensor -> + 0 + + K9 -> + 0 + + Minigun -> + 0 + + RocketLauncher -> + 0 + + LaserRifle -> + 0 + + LaserRifleExtCap -> + 0 + + CattleProd -> + 0 + + SuperCattleProd -> + 0 + + Mauser9mm -> + 0 + + Pistol14mm -> + 0 + + CombatShotgun -> + 0 + + HkCaws -> + 0 + + Shotgun -> + 0 + + AlienBlaster -> + 0 + + SolarScorcher -> + 0 + + Flare -> + 0 + + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +encode : Item -> JE.Value +encode item = + JE.object + [ ( "id", JE.int item.id ) + , ( "kind", encodeKind item.kind ) + , ( "count", JE.int item.count ) + ] + + +decoder : Decoder Item +decoder = + JD.succeed Item + |> JD.andMap (JD.field "id" JD.int) + |> JD.andMap (JD.field "kind" kindDecoder) + |> JD.andMap (JD.field "count" JD.int) + + +encodeKind : Kind -> JE.Value +encodeKind kind = + case kind of + Beer -> + JE.string "Beer" + + Fruit -> + JE.string "Fruit" + + HealingPowder -> + JE.string "HealingPowder" + + Stimpak -> + JE.string "Stimpak" + + SuperStimpak -> + JE.string "SuperStimpak" + + BigBookOfScience -> + JE.string "BigBookOfScience" + + DeansElectronics -> + JE.string "DeansElectronics" + + FirstAidBook -> + JE.string "FirstAidBook" + + GunsAndBullets -> + JE.string "GunsAndBullets" + + ScoutHandbook -> + JE.string "ScoutHandbook" + + Robes -> + JE.string "Robes" + + LeatherJacket -> + JE.string "LeatherJacket" + + LeatherArmor -> + JE.string "LeatherArmor" + + MetalArmor -> + JE.string "MetalArmor" + + TeslaArmor -> + JE.string "TeslaArmor" + + CombatArmor -> + JE.string "CombatArmor" + + CombatArmorMk2 -> + JE.string "CombatArmorMk2" + + PowerArmor -> + JE.string "PowerArmor" + + PowerFist -> + JE.string "PowerFist" + + MegaPowerFist -> + JE.string "MegaPowerFist" + + CattleProd -> + JE.string "CattleProd" + + SuperCattleProd -> + JE.string "SuperCattleProd" + + Wakizashi -> + JE.string "Wakizashi" + + LittleJesus -> + JE.string "LittleJesus" + + Ripper -> + JE.string "Ripper" + + SuperSledge -> + JE.string "SuperSledge" + + Pistol223 -> + JE.string "Pistol223" + + Mauser9mm -> + JE.string "Mauser9mm" + + Pistol14mm -> + JE.string "Pistol14mm" + + NeedlerPistol -> + JE.string "NeedlerPistol" + + GaussPistol -> + JE.string "GaussPistol" + + Smg10mm -> + JE.string "Smg10mm" + + HkP90c -> + JE.string "HkP90c" + + AssaultRifle -> + JE.string "AssaultRifle" + + ExpandedAssaultRifle -> + JE.string "ExpandedAssaultRifle" + + HuntingRifle -> + JE.string "HuntingRifle" + + ScopedHuntingRifle -> + JE.string "ScopedHuntingRifle" + + RedRyderLEBBGun -> + JE.string "RedRyderLEBBGun" + + SniperRifle -> + JE.string "SniperRifle" + + GaussRifle -> + JE.string "GaussRifle" + + CombatShotgun -> + JE.string "CombatShotgun" + + HkCaws -> + JE.string "HkCaws" + + PancorJackhammer -> + JE.string "PancorJackhammer" + + Shotgun -> + JE.string "Shotgun" + + SawedOffShotgun -> + JE.string "SawedOffShotgun" + + Minigun -> + JE.string "Minigun" + + Bozar -> + JE.string "Bozar" + + RocketLauncher -> + JE.string "RocketLauncher" + + AlienBlaster -> + JE.string "AlienBlaster" + + LaserPistol -> + JE.string "LaserPistol" + + MagnetoLaserPistol -> + JE.string "MagnetoLaserPistol" + + SolarScorcher -> + JE.string "SolarScorcher" + + PulsePistol -> + JE.string "PulsePistol" + + GatlingLaser -> + JE.string "GatlingLaser" + + LaserRifle -> + JE.string "LaserRifle" + + LaserRifleExtCap -> + JE.string "LaserRifleExtCap" + + PlasmaRifle -> + JE.string "PlasmaRifle" + + TurboPlasmaRifle -> + JE.string "TurboPlasmaRifle" + + PulseRifle -> + JE.string "PulseRifle" + + Flare -> + JE.string "Flare" + + FragGrenade -> + JE.string "FragGrenade" + + HolyHandGrenade -> + JE.string "HolyHandGrenade" + + BBAmmo -> + JE.string "BBAmmo" + + SmallEnergyCell -> + JE.string "SmallEnergyCell" + + Fmj223 -> + JE.string "Fmj223" + + Ap5mm -> + JE.string "Ap5mm" + + Mm9 -> + JE.string "Mm9" + + Ball9mm -> + JE.string "Ball9mm" + + Ap10mm -> + JE.string "Ap10mm" + + Ap14mm -> + JE.string "Ap14mm" + + ExplosiveRocket -> + JE.string "ExplosiveRocket" + + RocketAp -> + JE.string "RocketAp" + + HnNeedlerCartridge -> + JE.string "HnNeedlerCartridge" + + HnApNeedlerCartridge -> + JE.string "HnApNeedlerCartridge" + + ShotgunShell -> + JE.string "ShotgunShell" + + Jhp10mm -> + JE.string "Jhp10mm" + + Jhp5mm -> + JE.string "Jhp5mm" + + MicrofusionCell -> + JE.string "MicrofusionCell" + + Ec2mm -> + JE.string "Ec2mm" + + Tool -> + JE.string "Tool" + + LockPicks -> + JE.string "LockPicks" + + ElectronicLockpick -> + JE.string "ElectronicLockpick" + + AbnormalBrain -> + JE.string "AbnormalBrain" + + ChimpanzeeBrain -> + JE.string "ChimpanzeeBrain" + + HumanBrain -> + JE.string "HumanBrain" + + CyberneticBrain -> + JE.string "CyberneticBrain" + + GECK -> + JE.string "GECK" + + SkynetAim -> + JE.string "SkynetAim" + + MotionSensor -> + JE.string "MotionSensor" + + K9 -> + JE.string "K9" + + MeatJerky -> + JE.string "MeatJerky" + + +kindDecoder : Decoder Kind +kindDecoder = + JD.field "tag" JD.string + |> JD.andThen + (\ctor -> + case ctor of + "Beer" -> + JD.succeed Beer + + "Fruit" -> + JD.succeed Fruit + + "HealingPowder" -> + JD.succeed HealingPowder + + "Stimpak" -> + JD.succeed Stimpak + + "SuperStimpak" -> + JD.succeed SuperStimpak + + "BigBookOfScience" -> + JD.succeed BigBookOfScience + + "DeansElectronics" -> + JD.succeed DeansElectronics + + "FirstAidBook" -> + JD.succeed FirstAidBook + + "GunsAndBullets" -> + JD.succeed GunsAndBullets + + "ScoutHandbook" -> + JD.succeed ScoutHandbook + + "Robes" -> + JD.succeed Robes + + "LeatherJacket" -> + JD.succeed LeatherJacket + + "LeatherArmor" -> + JD.succeed LeatherArmor + + "MetalArmor" -> + JD.succeed MetalArmor + + "TeslaArmor" -> + JD.succeed TeslaArmor + + "CombatArmor" -> + JD.succeed CombatArmor + + "CombatArmorMk2" -> + JD.succeed CombatArmorMk2 + + "PowerArmor" -> + JD.succeed PowerArmor + + "PowerFist" -> + JD.succeed PowerFist + + "MegaPowerFist" -> + JD.succeed MegaPowerFist + + "CattleProd" -> + JD.succeed CattleProd + + "SuperCattleProd" -> + JD.succeed SuperCattleProd + + "Wakizashi" -> + JD.succeed Wakizashi + + "LittleJesus" -> + JD.succeed LittleJesus + + "Ripper" -> + JD.succeed Ripper + + "SuperSledge" -> + JD.succeed SuperSledge + + "Pistol223" -> + JD.succeed Pistol223 + + "Mauser9mm" -> + JD.succeed Mauser9mm + + "Pistol14mm" -> + JD.succeed Pistol14mm + + "NeedlerPistol" -> + JD.succeed NeedlerPistol + + "GaussPistol" -> + JD.succeed GaussPistol + + "Smg10mm" -> + JD.succeed Smg10mm + + "HkP90c" -> + JD.succeed HkP90c + + "AssaultRifle" -> + JD.succeed AssaultRifle + + "ExpandedAssaultRifle" -> + JD.succeed ExpandedAssaultRifle + + "HuntingRifle" -> + JD.succeed HuntingRifle + + "ScopedHuntingRifle" -> + JD.succeed ScopedHuntingRifle + + "RedRyderLEBBGun" -> + JD.succeed RedRyderLEBBGun + + "SniperRifle" -> + JD.succeed SniperRifle + + "GaussRifle" -> + JD.succeed GaussRifle + + "CombatShotgun" -> + JD.succeed CombatShotgun + + "HkCaws" -> + JD.succeed HkCaws + + "PancorJackhammer" -> + JD.succeed PancorJackhammer + + "Shotgun" -> + JD.succeed Shotgun + + "SawedOffShotgun" -> + JD.succeed SawedOffShotgun + + "Minigun" -> + JD.succeed Minigun + + "Bozar" -> + JD.succeed Bozar + + "RocketLauncher" -> + JD.succeed RocketLauncher "AlienBlaster" -> JD.succeed AlienBlaster - "LaserPistol" -> - JD.succeed LaserPistol + "LaserPistol" -> + JD.succeed LaserPistol + + "MagnetoLaserPistol" -> + JD.succeed MagnetoLaserPistol + + "SolarScorcher" -> + JD.succeed SolarScorcher + + "PulsePistol" -> + JD.succeed PulsePistol + + "GatlingLaser" -> + JD.succeed GatlingLaser + + "LaserRifle" -> + JD.succeed LaserRifle + + "LaserRifleExtCap" -> + JD.succeed LaserRifleExtCap + + "PlasmaRifle" -> + JD.succeed PlasmaRifle + + "TurboPlasmaRifle" -> + JD.succeed TurboPlasmaRifle + + "PulseRifle" -> + JD.succeed PulseRifle + + "Flare" -> + JD.succeed Flare + + "FragGrenade" -> + JD.succeed FragGrenade + + "HolyHandGrenade" -> + JD.succeed HolyHandGrenade + + "BBAmmo" -> + JD.succeed BBAmmo + + "SmallEnergyCell" -> + JD.succeed SmallEnergyCell + + "Fmj223" -> + JD.succeed Fmj223 + + "Ap5mm" -> + JD.succeed Ap5mm + + "Mm9" -> + JD.succeed Mm9 + + "Ball9mm" -> + JD.succeed Ball9mm + + "Ap10mm" -> + JD.succeed Ap10mm + + "Ap14mm" -> + JD.succeed Ap14mm + + "ExplosiveRocket" -> + JD.succeed ExplosiveRocket + + "RocketAp" -> + JD.succeed RocketAp + + "HnNeedlerCartridge" -> + JD.succeed HnNeedlerCartridge + + "HnApNeedlerCartridge" -> + JD.succeed HnApNeedlerCartridge + + "ShotgunShell" -> + JD.succeed ShotgunShell + + "Jhp10mm" -> + JD.succeed Jhp10mm + + "Jhp5mm" -> + JD.succeed Jhp5mm + + "MicrofusionCell" -> + JD.succeed MicrofusionCell + + "Ec2mm" -> + JD.succeed Ec2mm + + "Tool" -> + JD.succeed Tool + + "LockPicks" -> + JD.succeed LockPicks + + "ElectronicLockpick" -> + JD.succeed ElectronicLockpick + + "AbnormalBrain" -> + JD.succeed AbnormalBrain + + "ChimpanzeeBrain" -> + JD.succeed ChimpanzeeBrain + + "HumanBrain" -> + JD.succeed HumanBrain + + "CyberneticBrain" -> + JD.succeed CyberneticBrain + + "GECK" -> + JD.succeed GECK + + "SkynetAim" -> + JD.succeed SkynetAim + + "MotionSensor" -> + JD.succeed MotionSensor + + "K9" -> + JD.succeed K9 + + "MeatJerky" -> + JD.succeed MeatJerky + + _ -> + JD.fail "Unrecognized constructor" + ) + + +name : Kind -> String +name kind = + case kind of + Fruit -> + "Fruit" + + HealingPowder -> + "Healing Powder" + + MeatJerky -> + "Meat Jerky" + + Stimpak -> + "Stimpak" + + BigBookOfScience -> + "Big Book of Science" + + DeansElectronics -> + "Dean's Electronics" + + FirstAidBook -> + "First Aid Book" + + GunsAndBullets -> + "Guns and Bullets" + + ScoutHandbook -> + "Scout Handbook" + + Robes -> + "Robes" + + LeatherJacket -> + "Leather Jacket" + + LeatherArmor -> + "Leather Armor" + + MetalArmor -> + "Metal Armor" + + Beer -> + "Beer" + + RedRyderLEBBGun -> + "Red Ryder LE BB Gun" + + BBAmmo -> + "BB Ammo" + + ElectronicLockpick -> + "Electronic Lockpick" + + AbnormalBrain -> + "Abnormal Brain" + + ChimpanzeeBrain -> + "Chimpanzee Brain" + + HumanBrain -> + "Human Brain" + + CyberneticBrain -> + "Cybernetic Brain" + + HuntingRifle -> + "Hunting Rifle" + + ScopedHuntingRifle -> + "Scoped Hunting Rifle" + + SuperStimpak -> + "Super Stimpak" + + TeslaArmor -> + "Tesla Armor" + + CombatArmor -> + "Combat Armor" + + CombatArmorMk2 -> + "Combat Armor MK2" + + PowerArmor -> + "Power Armor" + + SuperSledge -> + "Super Sledge" + + PowerFist -> + "Power Fist" + + MegaPowerFist -> + "Mega Power Fist" + + FragGrenade -> + "Frag Grenade" + + Bozar -> + "Bozar" + + SawedOffShotgun -> + "Sawed-off Shotgun" + + SniperRifle -> + "Sniper Rifle" + + AssaultRifle -> + "Assault Rifle" + + ExpandedAssaultRifle -> + "Expanded Assault Rifle" + + PancorJackhammer -> + "Pancor Jackhammer" + + HkP90c -> + "HK P90c" + + LaserPistol -> + "Laser Pistol" + + PlasmaRifle -> + "Plasma Rifle" + + GatlingLaser -> + "Gatling Laser" + + TurboPlasmaRifle -> + "Turbo Plasma Rifle" + + GaussRifle -> + "Gauss Rifle" + + GaussPistol -> + "Gauss Pistol" + + PulseRifle -> + "YK42B Pulse Rifle" + + SmallEnergyCell -> + "Small Energy Cell" + + Fmj223 -> + ".223 FMJ" + + ShotgunShell -> + "Shotgun Shell" + + Smg10mm -> + "10mm SMG" + + Jhp10mm -> + "10mm JHP" + + Jhp5mm -> + "5mm JHP" + + MicrofusionCell -> + "Microfusion Cell" + + Ec2mm -> + "2mm EC" + + Tool -> + "Tool" + + GECK -> + "GECK" + + SkynetAim -> + "Skynet Aim" + + MotionSensor -> + "Motion Sensor" + + K9 -> + "K9" + + LockPicks -> + "Lock Picks" + + Minigun -> + "Minigun" + + RocketLauncher -> + "Rocket Launcher" + + LaserRifle -> + "Laser Rifle" + + LaserRifleExtCap -> + "Laser Rifle (Extended Capacity)" + + CattleProd -> + "Cattle Prod" + + SuperCattleProd -> + "Super Cattle Prod" + + Mauser9mm -> + "9mm Mauser" + + Pistol14mm -> + "14mm Pistol" + + CombatShotgun -> + "Combat Shotgun" + + HkCaws -> + "H&K CAWS" + + Shotgun -> + "Shotgun" + + AlienBlaster -> + "Alien Blaster" + + SolarScorcher -> + "Solar Scorcher" + + Flare -> + "Flare" + + Ap5mm -> + "5mm AP" + + Mm9 -> + "9mm" + + Ball9mm -> + "9mm Ball" + + Ap10mm -> + "10mm AP" + + Ap14mm -> + "14mm AP" + + ExplosiveRocket -> + "Explosive Rocekt" + + RocketAp -> + "Rocket AP" + + Pistol223 -> + ".223 Pistol" + + Wakizashi -> + "Wakizashi" + + LittleJesus -> + "\"Little Jesus\"" + + Ripper -> + "Ripper" + + NeedlerPistol -> + "Needler Pistol" + + MagnetoLaserPistol -> + "Magneto-Laser Pistol" + + PulsePistol -> + "YK32 Pulse Pistol" + + HolyHandGrenade -> + "Holy Hand Grenade" + + HnNeedlerCartridge -> + "HN Needler Cartridge" + + HnApNeedlerCartridge -> + "HN AP Needler Cartridge" + + +create : + { lastId : Int + , uniqueKey : UniqueKey + , count : Int + } + -> ( Item, Int ) +create { lastId, uniqueKey, count } = + let + newLastId : Int + newLastId = + lastId + 1 + + item : Item + item = + { id = newLastId + , kind = uniqueKey.kind + , count = count + } + in + ( item, newLastId ) + + +{-| This identifies item. + +---- the below written before we tried to do mods a bit differently ---- + +Right now this is just the item Kind (eg. +HuntingRifle) but later when we add Mods, UniqueKey will also contain them and +so you will be able to differentiate between (HuntingRifle, []) and +(HuntingRifle, [HuntingRifleUpgrade]) or +(HuntingRifle, [HasAmmo (24, Ammo223FMJ)]) or something. + +This hopefully will prevent bugs like player with upgraded weapon buying a +non-upgraded one and it becoming automatically (wrongly) upgraded too. + +-} +type alias UniqueKey = + -- TODO mods + { kind : Kind + } + + +getUniqueKey : Item -> UniqueKey +getUniqueKey item = + { kind = item.kind } + + +findMergeableId : Item -> Dict Id Item -> Maybe Id +findMergeableId item items = + let + uniqueKey : UniqueKey + uniqueKey = + getUniqueKey item + in + items + |> Dict.find (\_ item_ -> getUniqueKey item_ == uniqueKey) + |> Maybe.map Tuple.first + + +usageEffects : Kind -> List Effect +usageEffects kind = + case kind of + Fruit -> + -- TODO radiation +1 after some time (2x) + [ Heal { min = 1, max = 4 } + , RemoveAfterUse + ] + + HealingPowder -> + -- TODO temporary perception -1? + [ Heal { min = 8, max = 18 } + , RemoveAfterUse + ] + + Stimpak -> + [ Heal { min = 10, max = 20 } + , RemoveAfterUse + ] + + MeatJerky -> + [] + + BigBookOfScience -> + [ RemoveAfterUse + , BookRemoveTicks + , BookAddSkillPercent Skill.Science + ] + + DeansElectronics -> + [ RemoveAfterUse + , BookRemoveTicks + , BookAddSkillPercent Skill.Repair + ] + + FirstAidBook -> + [ RemoveAfterUse + , BookRemoveTicks + , BookAddSkillPercent Skill.FirstAid + ] + + GunsAndBullets -> + [ RemoveAfterUse + , BookRemoveTicks + , BookAddSkillPercent Skill.SmallGuns + ] + + ScoutHandbook -> + [ RemoveAfterUse + , BookRemoveTicks + , BookAddSkillPercent Skill.Outdoorsman + ] + + Robes -> + [] + + LeatherJacket -> + [] + + LeatherArmor -> + [] + + MetalArmor -> + [] + + Beer -> + [] + + RedRyderLEBBGun -> + [] + + BBAmmo -> + [] + + ElectronicLockpick -> + [] + + AbnormalBrain -> + [] + + ChimpanzeeBrain -> + [] + + HumanBrain -> + [] + + CyberneticBrain -> + [] + + HuntingRifle -> + [] + + ScopedHuntingRifle -> + [] + + SuperStimpak -> + -- TODO lose HP after some time + [ Heal { min = 75, max = 75 } + , RemoveAfterUse + ] + + TeslaArmor -> + [] + + CombatArmor -> + [] + + CombatArmorMk2 -> + [] + + PowerArmor -> + [] + + SuperSledge -> + [] + + PowerFist -> + [] + + MegaPowerFist -> + [] + + FragGrenade -> + [] + + Bozar -> + [] + + SawedOffShotgun -> + [] + + SniperRifle -> + [] + + AssaultRifle -> + [] + + ExpandedAssaultRifle -> + [] + + PancorJackhammer -> + [] + + HkP90c -> + [] + + LaserPistol -> + [] + + PlasmaRifle -> + [] + + GatlingLaser -> + [] + + TurboPlasmaRifle -> + [] + + GaussRifle -> + [] + + GaussPistol -> + [] + + PulseRifle -> + [] + + SmallEnergyCell -> + [] + + Fmj223 -> + [] + + ShotgunShell -> + [] + + Smg10mm -> + [] + + Jhp10mm -> + [] + + Jhp5mm -> + [] + + MicrofusionCell -> + [] + + Ec2mm -> + [] + + Tool -> + [] + + GECK -> + -- TODO what do we want to do with this one? + [] + + SkynetAim -> + [] + + MotionSensor -> + [] + + K9 -> + [] + + LockPicks -> + [] + + Minigun -> + [] + + RocketLauncher -> + [] + + LaserRifle -> + [] + + LaserRifleExtCap -> + [] + + CattleProd -> + [] + + SuperCattleProd -> + [] + + Mauser9mm -> + [] + + Pistol14mm -> + [] + + CombatShotgun -> + [] + + HkCaws -> + [] + + Shotgun -> + [] + + AlienBlaster -> + [] + + SolarScorcher -> + [] + + Flare -> + -- Maybe reduce darkness? Probably has no use in this game. + [] + + Ap5mm -> + [] + + Mm9 -> + [] + + Ball9mm -> + [] + + Ap10mm -> + [] + + Ap14mm -> + [] + + ExplosiveRocket -> + [] + + RocketAp -> + [] + + Pistol223 -> + [] + + Wakizashi -> + [] + + LittleJesus -> + [] + + Ripper -> + [] + + NeedlerPistol -> + [] + + MagnetoLaserPistol -> + [] + + PulsePistol -> + [] + + HolyHandGrenade -> + [] + + HnNeedlerCartridge -> + [] + + HnApNeedlerCartridge -> + [] + + +type Type + = Consumable + | Armor + | UnarmedWeapon + | MeleeWeapon + | ThrownWeapon + | SmallGun + | BigGun + | EnergyWeapon + | Book + | Misc + | Ammo + + +isWeaponType : Type -> Bool +isWeaponType type__ = + case type__ of + Consumable -> + False + + Armor -> + False + + UnarmedWeapon -> + True + + MeleeWeapon -> + True + + ThrownWeapon -> + True + + SmallGun -> + True + + BigGun -> + True + + EnergyWeapon -> + True + + Book -> + False + + Misc -> + False + + Ammo -> + False + + +isAmmoType : Type -> Bool +isAmmoType type__ = + case type__ of + Ammo -> + True + + Consumable -> + False + + Armor -> + False + + UnarmedWeapon -> + False + + MeleeWeapon -> + False + + ThrownWeapon -> + False + + SmallGun -> + False + + BigGun -> + False + + EnergyWeapon -> + False + + Book -> + False + + Misc -> + False + + +{-| Why the List: some weapons can be used in melee and be thrown, eg. Rock. +Logic.neededSkill needs to take this + the chosen AttackStyle into account. +-} +types : Kind -> List Type +types kind = + case kind of + Fruit -> + [ Consumable ] + + HealingPowder -> + [ Consumable ] + + Stimpak -> + [ Consumable ] + + BigBookOfScience -> + [ Book ] + + DeansElectronics -> + [ Book ] + + FirstAidBook -> + [ Book ] + + GunsAndBullets -> + [ Book ] + + ScoutHandbook -> + [ Book ] + + Robes -> + [ Armor ] + + LeatherJacket -> + [ Armor ] + + LeatherArmor -> + [ Armor ] + + MetalArmor -> + [ Armor ] + + Beer -> + [ Misc ] + + RedRyderLEBBGun -> + [ SmallGun ] + + BBAmmo -> + [ Ammo ] + + ElectronicLockpick -> + [ Misc ] + + AbnormalBrain -> + [ Misc ] + + ChimpanzeeBrain -> + [ Misc ] + + HumanBrain -> + [ Misc ] + + CyberneticBrain -> + [ Misc ] + + MeatJerky -> + [ Misc ] - "SolarScorcher" -> - JD.succeed SolarScorcher + HuntingRifle -> + [ SmallGun ] - "GatlingLaser" -> - JD.succeed GatlingLaser + ScopedHuntingRifle -> + [ SmallGun ] - "LaserRifle" -> - JD.succeed LaserRifle + SuperStimpak -> + [ Consumable ] - "LaserRifleExtCap" -> - JD.succeed LaserRifleExtCap + TeslaArmor -> + [ Armor ] - "PlasmaRifle" -> - JD.succeed PlasmaRifle + CombatArmor -> + [ Armor ] - "TurboPlasmaRifle" -> - JD.succeed TurboPlasmaRifle + CombatArmorMk2 -> + [ Armor ] - "PulseRifle" -> - JD.succeed PulseRifle + PowerArmor -> + [ Armor ] - "Flare" -> - JD.succeed Flare + SuperSledge -> + [ MeleeWeapon ] - "FragGrenade" -> - JD.succeed FragGrenade + PowerFist -> + [ UnarmedWeapon ] - "BBAmmo" -> - JD.succeed BBAmmo + MegaPowerFist -> + [ UnarmedWeapon ] - "SmallEnergyCell" -> - JD.succeed SmallEnergyCell + FragGrenade -> + [ ThrownWeapon ] - "Fmj223" -> - JD.succeed Fmj223 + Bozar -> + [ BigGun ] - "ShotgunShell" -> - JD.succeed ShotgunShell + SawedOffShotgun -> + [ SmallGun ] - "Jhp10mm" -> - JD.succeed Jhp10mm + SniperRifle -> + [ SmallGun ] - "Jhp5mm" -> - JD.succeed Jhp5mm + AssaultRifle -> + [ SmallGun ] - "MicrofusionCell" -> - JD.succeed MicrofusionCell + ExpandedAssaultRifle -> + [ SmallGun ] - "Ec2mm" -> - JD.succeed Ec2mm + PancorJackhammer -> + [ SmallGun ] - "Tool" -> - JD.succeed Tool + HkP90c -> + [ SmallGun ] - "LockPicks" -> - JD.succeed LockPicks + LaserPistol -> + [ EnergyWeapon ] + + PlasmaRifle -> + [ EnergyWeapon ] + + GatlingLaser -> + [ EnergyWeapon ] + + TurboPlasmaRifle -> + [ EnergyWeapon ] + + GaussRifle -> + [ SmallGun ] + + GaussPistol -> + [ SmallGun ] + + PulseRifle -> + [ EnergyWeapon ] + + SmallEnergyCell -> + [ Ammo ] + + Fmj223 -> + [ Ammo ] + + ShotgunShell -> + [ Ammo ] + + Smg10mm -> + [ SmallGun ] + + Jhp10mm -> + [ Ammo ] + + Jhp5mm -> + [ Ammo ] + + MicrofusionCell -> + [ Ammo ] + + Ec2mm -> + [ Ammo ] + + Tool -> + [ Misc ] + + GECK -> + [ Misc ] + + SkynetAim -> + [ Misc ] + + MotionSensor -> + [ Misc ] + + K9 -> + [ Misc ] + + LockPicks -> + [ Misc ] + + Minigun -> + [ BigGun ] + + RocketLauncher -> + [ BigGun ] + + LaserRifle -> + [ EnergyWeapon ] + + LaserRifleExtCap -> + [ EnergyWeapon ] + + CattleProd -> + [ MeleeWeapon ] + + SuperCattleProd -> + [ MeleeWeapon ] + + Mauser9mm -> + [ SmallGun ] + + Pistol14mm -> + [ SmallGun ] + + CombatShotgun -> + [ SmallGun ] + + HkCaws -> + [ SmallGun ] + + Shotgun -> + [ SmallGun ] + + AlienBlaster -> + [ EnergyWeapon ] + + SolarScorcher -> + [ EnergyWeapon ] + + Flare -> + [ ThrownWeapon ] + + Ap5mm -> + [ Ammo ] + + Mm9 -> + [ Ammo ] + + Ball9mm -> + [ Ammo ] + + Ap10mm -> + [ Ammo ] + + Ap14mm -> + [ Ammo ] + + ExplosiveRocket -> + [ Ammo ] + + RocketAp -> + [ Ammo ] + + Pistol223 -> + [ SmallGun ] + + Wakizashi -> + [ MeleeWeapon ] + + LittleJesus -> + [ MeleeWeapon ] + + Ripper -> + [ MeleeWeapon ] + + NeedlerPistol -> + [ SmallGun ] + + MagnetoLaserPistol -> + [ EnergyWeapon ] + + PulsePistol -> + [ EnergyWeapon ] + + HolyHandGrenade -> + [ ThrownWeapon ] + + HnNeedlerCartridge -> + [ Ammo ] + + HnApNeedlerCartridge -> + [ Ammo ] + + +isWeapon : Kind -> Bool +isWeapon kind = + List.any isWeaponType (types kind) + + +isAmmo : Kind -> Bool +isAmmo kind = + List.any isAmmoType (types kind) + + +isArmor : Kind -> Bool +isArmor kind = + List.member Armor (types kind) + + +typeName : Type -> String +typeName type__ = + case type__ of + Consumable -> + "Consumable" + + Book -> + "Book" + + Armor -> + "Armor" + + Misc -> + "Miscellaneous" + + UnarmedWeapon -> + "Unarmed Weapon" + + MeleeWeapon -> + "Melee Weapon" + + ThrownWeapon -> + "Thrown Weapon" - "ElectronicLockpick" -> - JD.succeed ElectronicLockpick + SmallGun -> + "Small Gun" - "AbnormalBrain" -> - JD.succeed AbnormalBrain + BigGun -> + "Big Gun" - "ChimpanzeeBrain" -> - JD.succeed ChimpanzeeBrain + EnergyWeapon -> + "Energy Weapon" - "HumanBrain" -> - JD.succeed HumanBrain + Ammo -> + "Ammo" - "CyberneticBrain" -> - JD.succeed CyberneticBrain - "GECK" -> - JD.succeed GECK +healAmount : Kind -> Maybe { min : Int, max : Int } +healAmount kind = + kind + |> usageEffects + |> List.filterMap getHealingEffect + |> List.head - "SkynetAim" -> - JD.succeed SkynetAim - "MotionSensor" -> - JD.succeed MotionSensor +healAmountGenerator : Kind -> Generator Int +healAmountGenerator kind = + case healAmount kind of + Just r -> + healAmountGenerator_ r - "K9" -> - JD.succeed K9 + Nothing -> + Random.constant 0 - "MeatJerky" -> - JD.succeed MeatJerky - _ -> - JD.fail "Unrecognized constructor" - ) +healAmountGenerator_ : { min : Int, max : Int } -> Generator Int +healAmountGenerator_ { min, max } = + Random.int min max -name : Kind -> String -name kind = +unaimedRange : Kind -> Int +unaimedRange kind = case kind of Fruit -> - "Fruit" + 0 HealingPowder -> - "Healing Powder" + 0 MeatJerky -> - "Meat Jerky" + 0 Stimpak -> - "Stimpak" + 0 BigBookOfScience -> - "Big Book of Science" + 0 DeansElectronics -> - "Dean's Electronics" + 0 FirstAidBook -> - "First Aid Book" + 0 GunsAndBullets -> - "Guns and Bullets" + 0 ScoutHandbook -> - "Scout Handbook" + 0 Robes -> - "Robes" + 0 LeatherJacket -> - "Leather Jacket" + 0 LeatherArmor -> - "Leather Armor" + 0 MetalArmor -> - "Metal Armor" + 0 Beer -> - "Beer" + 0 RedRyderLEBBGun -> - "Red Ryder LE BB Gun" + 30 BBAmmo -> - "BB Ammo" + 0 ElectronicLockpick -> - "Electronic Lockpick" + 0 AbnormalBrain -> - "Abnormal Brain" + 0 ChimpanzeeBrain -> - "Chimpanzee Brain" + 0 HumanBrain -> - "Human Brain" + 0 CyberneticBrain -> - "Cybernetic Brain" + 0 HuntingRifle -> - "Hunting Rifle" + 40 ScopedHuntingRifle -> - "Scoped Hunting Rifle" + 40 SuperStimpak -> - "Super Stimpak" + 0 TeslaArmor -> - "Tesla Armor" + 0 CombatArmor -> - "Combat Armor" + 0 CombatArmorMk2 -> - "Combat Armor MK2" + 0 PowerArmor -> - "Power Armor" + 0 SuperSledge -> - "Super Sledge" + 2 PowerFist -> - "Power Fist" + 1 MegaPowerFist -> - "Mega Power Fist" + 1 FragGrenade -> - "Frag Grenade" + 15 Bozar -> - "Bozar" + 35 SawedOffShotgun -> - "Sawed-off Shotgun" + 7 SniperRifle -> - "Sniper Rifle" + 50 AssaultRifle -> - "Assault Rifle" + 45 ExpandedAssaultRifle -> - "Expanded Assault Rifle" + 45 PancorJackhammer -> - "Pancor Jackhammer" + 35 HkP90c -> - "HK P90c" + 30 LaserPistol -> - "Laser Pistol" + 35 PlasmaRifle -> - "Plasma Rifle" + 25 GatlingLaser -> - "Gatling Laser" + 40 TurboPlasmaRifle -> - "Turbo Plasma Rifle" + 35 GaussRifle -> - "Gauss Rifle" + 50 GaussPistol -> - "Gauss Pistol" + 50 PulseRifle -> - "Pulse Rifle" + 30 SmallEnergyCell -> - "Small Energy Cell" + 0 Fmj223 -> - ".223 FMJ" + 0 ShotgunShell -> - "Shotgun Shell" + 0 Smg10mm -> - "10mm SMG" + 25 Jhp10mm -> - "10mm JHP" + 0 Jhp5mm -> - "5mm JHP" + 0 MicrofusionCell -> - "Microfusion Cell" + 0 Ec2mm -> - "2mm EC" + 0 Tool -> - "Tool" + 0 GECK -> - "GECK" + 0 SkynetAim -> - "Skynet Aim" + 0 MotionSensor -> - "Motion Sensor" + 0 K9 -> - "K9" + 0 LockPicks -> - "Lock Picks" + 0 Minigun -> - "Minigun" + 0 RocketLauncher -> - "Rocket Launcher" + 40 LaserRifle -> - "Laser Rifle" + 45 LaserRifleExtCap -> - "Laser Rifle (Extended Capacity)" + 45 CattleProd -> - "Cattle Prod" + 1 SuperCattleProd -> - "Super Cattle Prod" + 1 Mauser9mm -> - "9mm Mauser" + 22 Pistol14mm -> - "14mm Pistol" + 24 CombatShotgun -> - "Combat Shotgun" + 22 HkCaws -> - "H&K CAWS" + 30 Shotgun -> - "Shotgun" + 14 AlienBlaster -> - "Alien Blaster" + 10 SolarScorcher -> - "Solar Scorcher" + 20 Flare -> - "Flare" + 15 + Ap5mm -> + 0 -create : - { lastId : Int - , uniqueKey : UniqueKey - , count : Int - } - -> ( Item, Int ) -create { lastId, uniqueKey, count } = - let - newLastId : Int - newLastId = - lastId + 1 + Mm9 -> + 0 - item : Item - item = - { id = newLastId - , kind = uniqueKey.kind - , count = count - } - in - ( item, newLastId ) + Ball9mm -> + 0 + Ap10mm -> + 0 -{-| This identifies item. + Ap14mm -> + 0 ----- the below written before we tried to do mods a bit differently ---- + ExplosiveRocket -> + 0 -Right now this is just the item Kind (eg. -HuntingRifle) but later when we add Mods, UniqueKey will also contain them and -so you will be able to differentiate between (HuntingRifle, []) and -(HuntingRifle, [HuntingRifleUpgrade]) or -(HuntingRifle, [HasAmmo (24, Ammo223FMJ)]) or something. + RocketAp -> + 0 -This hopefully will prevent bugs like player with upgraded weapon buying a -non-upgraded one and it becoming automatically (wrongly) upgraded too. + Pistol223 -> + 30 --} -type alias UniqueKey = - -- TODO mods - { kind : Kind - } + Wakizashi -> + 1 + LittleJesus -> + 1 -getUniqueKey : Item -> UniqueKey -getUniqueKey item = - { kind = item.kind } + Ripper -> + 1 + NeedlerPistol -> + 24 -findMergeableId : Item -> Dict Id Item -> Maybe Id -findMergeableId item items = - let - uniqueKey : UniqueKey - uniqueKey = - getUniqueKey item - in - items - |> Dict.find (\_ item_ -> getUniqueKey item_ == uniqueKey) - |> Maybe.map Tuple.first + MagnetoLaserPistol -> + 35 + PulsePistol -> + 15 -usageEffects : Kind -> List Effect -usageEffects kind = + HolyHandGrenade -> + 20 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +aimedRange : Kind -> Int +aimedRange kind = case kind of Fruit -> - -- TODO radiation +1 after some time (2x) - [ Heal { min = 1, max = 4 } - , RemoveAfterUse - ] + 0 HealingPowder -> - -- TODO temporary perception -1? - [ Heal { min = 8, max = 18 } - , RemoveAfterUse - ] - - Stimpak -> - [ Heal { min = 10, max = 20 } - , RemoveAfterUse - ] + 0 MeatJerky -> - [] + 0 + + Stimpak -> + 0 BigBookOfScience -> - [ RemoveAfterUse - , BookRemoveTicks - , BookAddSkillPercent Skill.Science - ] + 0 DeansElectronics -> - [ RemoveAfterUse - , BookRemoveTicks - , BookAddSkillPercent Skill.Repair - ] + 0 FirstAidBook -> - [ RemoveAfterUse - , BookRemoveTicks - , BookAddSkillPercent Skill.FirstAid - ] + 0 GunsAndBullets -> - [ RemoveAfterUse - , BookRemoveTicks - , BookAddSkillPercent Skill.SmallGuns - ] + 0 ScoutHandbook -> - [ RemoveAfterUse - , BookRemoveTicks - , BookAddSkillPercent Skill.Outdoorsman - ] + 0 Robes -> - [] + 0 LeatherJacket -> - [] + 0 LeatherArmor -> - [] + 0 MetalArmor -> - [] + 0 Beer -> - [] + 0 RedRyderLEBBGun -> - [] + 30 BBAmmo -> - [] + 0 ElectronicLockpick -> - [] + 0 AbnormalBrain -> - [] + 0 ChimpanzeeBrain -> - [] + 0 HumanBrain -> - [] + 0 CyberneticBrain -> - [] + 0 HuntingRifle -> - [] + 45 ScopedHuntingRifle -> - [] + 40 SuperStimpak -> - -- TODO lose HP after some time - [ Heal { min = 75, max = 75 } - , RemoveAfterUse - ] + 0 TeslaArmor -> - [] + 0 CombatArmor -> - [] + 0 CombatArmorMk2 -> - [] + 0 PowerArmor -> - [] + 0 SuperSledge -> - [] + 2 PowerFist -> - [] + 1 MegaPowerFist -> - [] + 1 FragGrenade -> - [] + 15 Bozar -> - [] + 35 SawedOffShotgun -> - [] + 7 SniperRifle -> - [] + 50 AssaultRifle -> - [] + 45 ExpandedAssaultRifle -> - [] + 45 PancorJackhammer -> - [] + 35 HkP90c -> - [] + 30 LaserPistol -> - [] + 35 PlasmaRifle -> - [] + 25 GatlingLaser -> - [] + 40 TurboPlasmaRifle -> - [] + 35 GaussRifle -> - [] + 50 GaussPistol -> - [] + 50 PulseRifle -> - [] + 30 SmallEnergyCell -> - [] + 0 Fmj223 -> - [] + 0 ShotgunShell -> - [] + 0 Smg10mm -> - [] + 25 Jhp10mm -> - [] + 0 Jhp5mm -> - [] + 0 MicrofusionCell -> - [] + 0 Ec2mm -> - [] + 0 Tool -> - [] + 0 GECK -> - -- TODO what do we want to do with this one? - [] + 0 SkynetAim -> - [] + 0 MotionSensor -> - [] + 0 K9 -> - [] + 0 LockPicks -> - [] + 0 Minigun -> - [] + 0 RocketLauncher -> - [] + 0 LaserRifle -> - [] + 45 LaserRifleExtCap -> - [] + 45 CattleProd -> - [] + 1 SuperCattleProd -> - [] + 1 Mauser9mm -> - [] + 22 Pistol14mm -> - [] + 24 CombatShotgun -> - [] + 22 HkCaws -> - [] + 30 Shotgun -> - [] + 14 AlienBlaster -> - [] + 10 SolarScorcher -> - [] + 20 Flare -> - -- Maybe reduce darkness? Probably has no use in this game. - [] + 0 + Ap5mm -> + 0 -type Type - = Consumable - | Armor - | UnarmedWeapon - | MeleeWeapon - | ThrownWeapon - | SmallGun - | BigGun - | EnergyWeapon - | Book - | Misc - | Ammo + Mm9 -> + 0 + + Ball9mm -> + 0 + Ap10mm -> + 0 -isWeaponType : Type -> Bool -isWeaponType type__ = - case type__ of - Consumable -> - False + Ap14mm -> + 0 - Armor -> - False + ExplosiveRocket -> + 0 - UnarmedWeapon -> - True + RocketAp -> + 0 - MeleeWeapon -> + Pistol223 -> + 30 + + Wakizashi -> + 1 + + LittleJesus -> + 1 + + Ripper -> + 1 + + NeedlerPistol -> + 24 + + MagnetoLaserPistol -> + 35 + + PulsePistol -> + 15 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +isAccurateWeapon : Kind -> Bool +isAccurateWeapon kind = + case kind of + Mauser9mm -> True - ThrownWeapon -> + Pistol14mm -> True - SmallGun -> + AlienBlaster -> True - BigGun -> + CattleProd -> True - EnergyWeapon -> + CombatShotgun -> True - Book -> - False - - Misc -> - False + Flare -> + True - Ammo -> - False + GaussPistol -> + True + GaussRifle -> + True -isAmmoType : Type -> Bool -isAmmoType type__ = - case type__ of - Ammo -> + HkCaws -> True - Consumable -> - False + PancorJackhammer -> + True - Armor -> - False + SawedOffShotgun -> + True - UnarmedWeapon -> - False + Shotgun -> + True - MeleeWeapon -> - False + SolarScorcher -> + True - ThrownWeapon -> - False + SuperCattleProd -> + True - SmallGun -> + Beer -> False - BigGun -> + Fruit -> False - EnergyWeapon -> + HealingPowder -> False - Book -> + Stimpak -> False - Misc -> + SuperStimpak -> False - -{-| Why the List: some weapons can be used in melee and be thrown, eg. Rock. -Logic.neededSkill needs to take this + the chosen AttackStyle into account. --} -types : Kind -> List Type -types kind = - case kind of - Fruit -> - [ Consumable ] - - HealingPowder -> - [ Consumable ] - - Stimpak -> - [ Consumable ] - BigBookOfScience -> - [ Book ] + False DeansElectronics -> - [ Book ] + False FirstAidBook -> - [ Book ] + False GunsAndBullets -> - [ Book ] + False ScoutHandbook -> - [ Book ] + False Robes -> - [ Armor ] + False LeatherJacket -> - [ Armor ] + False LeatherArmor -> - [ Armor ] + False MetalArmor -> - [ Armor ] - - Beer -> - [ Misc ] - - RedRyderLEBBGun -> - [ SmallGun ] - - BBAmmo -> - [ Ammo ] - - ElectronicLockpick -> - [ Misc ] - - AbnormalBrain -> - [ Misc ] - - ChimpanzeeBrain -> - [ Misc ] - - HumanBrain -> - [ Misc ] - - CyberneticBrain -> - [ Misc ] - - MeatJerky -> - [ Misc ] - - HuntingRifle -> - [ SmallGun ] - - ScopedHuntingRifle -> - [ SmallGun ] - - SuperStimpak -> - [ Consumable ] + False TeslaArmor -> - [ Armor ] + False CombatArmor -> - [ Armor ] + False CombatArmorMk2 -> - [ Armor ] + False PowerArmor -> - [ Armor ] - - SuperSledge -> - [ MeleeWeapon ] + False PowerFist -> - [ UnarmedWeapon ] + False MegaPowerFist -> - [ UnarmedWeapon ] - - FragGrenade -> - [ ThrownWeapon ] + False - Bozar -> - [ BigGun ] + SuperSledge -> + False - SawedOffShotgun -> - [ SmallGun ] + Smg10mm -> + False - SniperRifle -> - [ SmallGun ] + HkP90c -> + False AssaultRifle -> - [ SmallGun ] + False ExpandedAssaultRifle -> - [ SmallGun ] - - PancorJackhammer -> - [ SmallGun ] - - HkP90c -> - [ SmallGun ] - - LaserPistol -> - [ EnergyWeapon ] - - PlasmaRifle -> - [ EnergyWeapon ] - - GatlingLaser -> - [ EnergyWeapon ] - - TurboPlasmaRifle -> - [ EnergyWeapon ] - - GaussRifle -> - [ SmallGun ] - - GaussPistol -> - [ SmallGun ] - - PulseRifle -> - [ EnergyWeapon ] - - SmallEnergyCell -> - [ Ammo ] + False - Fmj223 -> - [ Ammo ] + HuntingRifle -> + False - ShotgunShell -> - [ Ammo ] + ScopedHuntingRifle -> + False - Smg10mm -> - [ SmallGun ] + RedRyderLEBBGun -> + False - Jhp10mm -> - [ Ammo ] + SniperRifle -> + False - Jhp5mm -> - [ Ammo ] + Minigun -> + False - MicrofusionCell -> - [ Ammo ] + Bozar -> + False - Ec2mm -> - [ Ammo ] + RocketLauncher -> + False - Tool -> - [ Misc ] + LaserPistol -> + False - GECK -> - [ Misc ] + GatlingLaser -> + False - SkynetAim -> - [ Misc ] + LaserRifle -> + False - MotionSensor -> - [ Misc ] + LaserRifleExtCap -> + False - K9 -> - [ Misc ] + PlasmaRifle -> + False - LockPicks -> - [ Misc ] + TurboPlasmaRifle -> + False - Minigun -> - [ BigGun ] + PulseRifle -> + False - RocketLauncher -> - [ BigGun ] + FragGrenade -> + False - LaserRifle -> - [ EnergyWeapon ] + BBAmmo -> + False - LaserRifleExtCap -> - [ EnergyWeapon ] + SmallEnergyCell -> + False - CattleProd -> - [ MeleeWeapon ] + Fmj223 -> + False - SuperCattleProd -> - [ MeleeWeapon ] + ShotgunShell -> + False - Mauser9mm -> - [ SmallGun ] + Jhp10mm -> + False - Pistol14mm -> - [ SmallGun ] + Jhp5mm -> + False - CombatShotgun -> - [ SmallGun ] + MicrofusionCell -> + False - HkCaws -> - [ SmallGun ] + Ec2mm -> + False - Shotgun -> - [ SmallGun ] + Tool -> + False - AlienBlaster -> - [ EnergyWeapon ] + LockPicks -> + False - SolarScorcher -> - [ EnergyWeapon ] + ElectronicLockpick -> + False - Flare -> - [ ThrownWeapon ] + AbnormalBrain -> + False + ChimpanzeeBrain -> + False -isWeapon : Kind -> Bool -isWeapon kind = - List.any isWeaponType (types kind) + HumanBrain -> + False + CyberneticBrain -> + False -isAmmo : Kind -> Bool -isAmmo kind = - List.any isAmmoType (types kind) + GECK -> + False + SkynetAim -> + False -isArmor : Kind -> Bool -isArmor kind = - List.member Armor (types kind) + MotionSensor -> + False + K9 -> + False -typeName : Type -> String -typeName type__ = - case type__ of - Consumable -> - "Consumable" + MeatJerky -> + False - Book -> - "Book" + Ap5mm -> + False - Armor -> - "Armor" + Mm9 -> + False - Misc -> - "Miscellaneous" + Ball9mm -> + False - UnarmedWeapon -> - "Unarmed Weapon" + Ap10mm -> + False - MeleeWeapon -> - "Melee Weapon" + Ap14mm -> + False - ThrownWeapon -> - "Thrown Weapon" + ExplosiveRocket -> + False - SmallGun -> - "Small Gun" + RocketAp -> + False - BigGun -> - "Big Gun" + Pistol223 -> + False - EnergyWeapon -> - "Energy Weapon" + Wakizashi -> + False - Ammo -> - "Ammo" + LittleJesus -> + False + Ripper -> + False -healAmount : Kind -> Maybe { min : Int, max : Int } -healAmount kind = - kind - |> usageEffects - |> List.filterMap getHealingEffect - |> List.head + NeedlerPistol -> + False + MagnetoLaserPistol -> + False -healAmountGenerator : Kind -> Generator Int -healAmountGenerator kind = - case healAmount kind of - Just r -> - healAmountGenerator_ r + PulsePistol -> + False - Nothing -> - Random.constant 0 + HolyHandGrenade -> + False + HnNeedlerCartridge -> + False -healAmountGenerator_ : { min : Int, max : Int } -> Generator Int -healAmountGenerator_ { min, max } = - Random.int min max + HnApNeedlerCartridge -> + False -unaimedRange : Kind -> Int -unaimedRange kind = +burstRange : Kind -> Int +burstRange kind = case kind of Fruit -> 0 @@ -5760,7 +8298,7 @@ unaimedRange kind = 0 HuntingRifle -> - 40 + 45 ScopedHuntingRifle -> 40 @@ -5802,16 +8340,16 @@ unaimedRange kind = 50 AssaultRifle -> - 45 + 38 ExpandedAssaultRifle -> - 45 + 38 PancorJackhammer -> 35 HkP90c -> - 30 + 25 LaserPistol -> 35 @@ -5844,7 +8382,7 @@ unaimedRange kind = 0 Smg10mm -> - 25 + 20 Jhp10mm -> 0 @@ -5873,323 +8411,453 @@ unaimedRange kind = K9 -> 0 - LockPicks -> - 0 + LockPicks -> + 0 + + Minigun -> + 35 + + RocketLauncher -> + 0 + + LaserRifle -> + 0 + + LaserRifleExtCap -> + 0 + + CattleProd -> + 0 + + SuperCattleProd -> + 0 + + Mauser9mm -> + 0 + + Pistol14mm -> + 0 + + CombatShotgun -> + 18 + + HkCaws -> + 20 + + Shotgun -> + 0 + + AlienBlaster -> + 0 + + SolarScorcher -> + 0 + + Flare -> + 0 + + Ap5mm -> + 0 + + Mm9 -> + 0 + + Ball9mm -> + 0 + + Ap10mm -> + 0 + + Ap14mm -> + 0 + + ExplosiveRocket -> + 0 + + RocketAp -> + 0 + + Pistol223 -> + 0 + + Wakizashi -> + 0 + + LittleJesus -> + 0 + + Ripper -> + 0 + + NeedlerPistol -> + 0 + + MagnetoLaserPistol -> + 0 + + PulsePistol -> + 0 + + HolyHandGrenade -> + 0 + + HnNeedlerCartridge -> + 0 + + HnApNeedlerCartridge -> + 0 + + +range : AttackStyle -> Kind -> Int +range attackStyle kind = + case attackStyle of + UnarmedUnaimed -> + unaimedRange kind + + UnarmedAimed _ -> + aimedRange kind + + MeleeUnaimed -> + unaimedRange kind + + MeleeAimed _ -> + aimedRange kind + + Throw -> + unaimedRange kind + + ShootSingleUnaimed -> + unaimedRange kind + + ShootSingleAimed _ -> + aimedRange kind + + ShootBurst -> + burstRange kind + + +{-| In other words, does the Weapon Penetrate perk apply? +-} +isWeaponArmorPenetrating : Kind -> Bool +isWeaponArmorPenetrating kind = + case kind of + Pistol223 -> + True + + Wakizashi -> + True + + LittleJesus -> + True + + Ripper -> + True + + NeedlerPistol -> + True + + MagnetoLaserPistol -> + True + + PulsePistol -> + True + + HolyHandGrenade -> + True + + PulseRifle -> + True - Minigun -> - 0 + PowerFist -> + True - RocketLauncher -> - 40 + MegaPowerFist -> + True - LaserRifle -> - 45 + -- The rest are Falses + AssaultRifle -> + False - LaserRifleExtCap -> - 45 + ExpandedAssaultRifle -> + False - CattleProd -> - 1 + GatlingLaser -> + False - SuperCattleProd -> - 1 + HuntingRifle -> + False - Mauser9mm -> - 22 + LaserRifle -> + False - Pistol14mm -> - 24 + LaserRifleExtCap -> + False - CombatShotgun -> - 22 + Minigun -> + False - HkCaws -> - 30 + PlasmaRifle -> + False - Shotgun -> - 14 + RedRyderLEBBGun -> + False - AlienBlaster -> - 10 + RocketLauncher -> + False - SolarScorcher -> - 20 + SniperRifle -> + False - Flare -> - 15 + TurboPlasmaRifle -> + False + Beer -> + False -aimedRange : Kind -> Int -aimedRange kind = - case kind of Fruit -> - 0 + False HealingPowder -> - 0 - - MeatJerky -> - 0 + False Stimpak -> - 0 + False + + SuperStimpak -> + False BigBookOfScience -> - 0 + False DeansElectronics -> - 0 + False FirstAidBook -> - 0 + False GunsAndBullets -> - 0 + False ScoutHandbook -> - 0 + False Robes -> - 0 + False LeatherJacket -> - 0 + False LeatherArmor -> - 0 + False MetalArmor -> - 0 - - Beer -> - 0 - - RedRyderLEBBGun -> - 30 - - BBAmmo -> - 0 - - ElectronicLockpick -> - 0 - - AbnormalBrain -> - 0 - - ChimpanzeeBrain -> - 0 - - HumanBrain -> - 0 - - CyberneticBrain -> - 0 - - HuntingRifle -> - 45 - - ScopedHuntingRifle -> - 40 - - SuperStimpak -> - 0 + False TeslaArmor -> - 0 + False CombatArmor -> - 0 + False CombatArmorMk2 -> - 0 + False PowerArmor -> - 0 + False SuperSledge -> - 2 - - PowerFist -> - 1 - - MegaPowerFist -> - 1 - - FragGrenade -> - 15 - - Bozar -> - 35 + False - SawedOffShotgun -> - 7 + GaussPistol -> + False - SniperRifle -> - 50 + HkP90c -> + False - AssaultRifle -> - 45 + ScopedHuntingRifle -> + False - ExpandedAssaultRifle -> - 45 + GaussRifle -> + False PancorJackhammer -> - 35 - - HkP90c -> - 30 - - LaserPistol -> - 35 - - PlasmaRifle -> - 25 + False - GatlingLaser -> - 40 + SawedOffShotgun -> + False - TurboPlasmaRifle -> - 35 + Bozar -> + False - GaussRifle -> - 50 + LaserPistol -> + False - GaussPistol -> - 50 + FragGrenade -> + False - PulseRifle -> - 30 + BBAmmo -> + False SmallEnergyCell -> - 0 + False Fmj223 -> - 0 + False ShotgunShell -> - 0 + False Smg10mm -> - 25 + False Jhp10mm -> - 0 + False Jhp5mm -> - 0 + False MicrofusionCell -> - 0 + False Ec2mm -> - 0 + False Tool -> - 0 + False - GECK -> - 0 + LockPicks -> + False - SkynetAim -> - 0 + ElectronicLockpick -> + False - MotionSensor -> - 0 + AbnormalBrain -> + False - K9 -> - 0 + ChimpanzeeBrain -> + False - LockPicks -> - 0 + HumanBrain -> + False - Minigun -> - 0 + CyberneticBrain -> + False - RocketLauncher -> - 0 + GECK -> + False - LaserRifle -> - 45 + SkynetAim -> + False - LaserRifleExtCap -> - 45 + MotionSensor -> + False + + K9 -> + False + + MeatJerky -> + False CattleProd -> - 1 + False SuperCattleProd -> - 1 + False Mauser9mm -> - 22 + False Pistol14mm -> - 24 + False CombatShotgun -> - 22 + False HkCaws -> - 30 + False Shotgun -> - 14 + False AlienBlaster -> - 10 + False SolarScorcher -> - 20 + False Flare -> - 0 + False + Ap5mm -> + False -isAccurateWeapon : Kind -> Bool -isAccurateWeapon kind = - case kind of - Mauser9mm -> - True + Mm9 -> + False - Pistol14mm -> - True + Ball9mm -> + False - AlienBlaster -> + Ap10mm -> + False + + Ap14mm -> + False + + ExplosiveRocket -> + False + + RocketAp -> + False + + HnNeedlerCartridge -> + False + + HnApNeedlerCartridge -> + False + + +{-| In other words, does the Weapon Long Range perk apply? +-} +isLongRangeWeapon : Kind -> Bool +isLongRangeWeapon kind = + case kind of + AssaultRifle -> True - CattleProd -> + ExpandedAssaultRifle -> True - CombatShotgun -> + GatlingLaser -> True - Flare -> + HuntingRifle -> True - GaussPistol -> + LaserRifle -> True - GaussRifle -> + LaserRifleExtCap -> True - HkCaws -> + Minigun -> True - PancorJackhammer -> + PlasmaRifle -> True - SawedOffShotgun -> + RedRyderLEBBGun -> True - Shotgun -> + RocketLauncher -> True - SolarScorcher -> + SniperRifle -> True - SuperCattleProd -> + TurboPlasmaRifle -> True + -- The rest are Falses Beer -> False @@ -6253,828 +8921,1008 @@ isAccurateWeapon kind = SuperSledge -> False - Smg10mm -> + GaussPistol -> False HkP90c -> False - AssaultRifle -> + ScopedHuntingRifle -> False - ExpandedAssaultRifle -> + GaussRifle -> False - HuntingRifle -> + PancorJackhammer -> False - ScopedHuntingRifle -> + SawedOffShotgun -> False - RedRyderLEBBGun -> + Bozar -> False - SniperRifle -> + LaserPistol -> False - Minigun -> + PulseRifle -> False - Bozar -> + FragGrenade -> False - RocketLauncher -> + BBAmmo -> False - LaserPistol -> + SmallEnergyCell -> False - GatlingLaser -> + Fmj223 -> False - LaserRifle -> + ShotgunShell -> False - LaserRifleExtCap -> + Smg10mm -> False - PlasmaRifle -> + Jhp10mm -> False - TurboPlasmaRifle -> + Jhp5mm -> False - PulseRifle -> + MicrofusionCell -> False - FragGrenade -> + Ec2mm -> False - BBAmmo -> + Tool -> False - SmallEnergyCell -> + LockPicks -> False - Fmj223 -> + ElectronicLockpick -> False - ShotgunShell -> + AbnormalBrain -> False - Jhp10mm -> + ChimpanzeeBrain -> False - Jhp5mm -> + HumanBrain -> False - MicrofusionCell -> + CyberneticBrain -> False - Ec2mm -> + GECK -> False - Tool -> + SkynetAim -> False - LockPicks -> + MotionSensor -> False - ElectronicLockpick -> + K9 -> False - AbnormalBrain -> + MeatJerky -> + False + + CattleProd -> + False + + SuperCattleProd -> + False + + Mauser9mm -> + False + + Pistol14mm -> + False + + CombatShotgun -> + False + + HkCaws -> + False + + Shotgun -> + False + + AlienBlaster -> + False + + SolarScorcher -> + False + + Flare -> + False + + Ap5mm -> + False + + Mm9 -> + False + + Ball9mm -> + False + + Ap10mm -> + False + + Ap14mm -> + False + + ExplosiveRocket -> + False + + RocketAp -> + False + + Pistol223 -> + False + + Wakizashi -> + False + + LittleJesus -> + False + + Ripper -> + False + + NeedlerPistol -> + False + + MagnetoLaserPistol -> False - ChimpanzeeBrain -> - False + PulsePistol -> + False + + HolyHandGrenade -> + False + + HnNeedlerCartridge -> + False + + HnApNeedlerCartridge -> + False + + +weaponStrengthRequirement : Kind -> Int +weaponStrengthRequirement kind = + case kind of + PowerFist -> + 1 + + MegaPowerFist -> + 1 + + SuperSledge -> + 5 + + GaussPistol -> + 4 + + Smg10mm -> + 4 + + HkP90c -> + 4 + + AssaultRifle -> + 5 + + ExpandedAssaultRifle -> + 5 + + HuntingRifle -> + 5 + + ScopedHuntingRifle -> + 5 + + RedRyderLEBBGun -> + 4 + + SniperRifle -> + 5 + + GaussRifle -> + 6 + + PancorJackhammer -> + 5 + + SawedOffShotgun -> + 4 + + Minigun -> + 7 + + Bozar -> + 6 + + RocketLauncher -> + 6 + + LaserPistol -> + 3 - HumanBrain -> - False + GatlingLaser -> + 6 - CyberneticBrain -> - False + LaserRifle -> + 6 - GECK -> - False + LaserRifleExtCap -> + 6 - SkynetAim -> - False + PlasmaRifle -> + 6 - MotionSensor -> - False + TurboPlasmaRifle -> + 6 - K9 -> - False + PulseRifle -> + 6 - MeatJerky -> - False + FragGrenade -> + 3 + Beer -> + 1 -burstRange : Kind -> Int -burstRange kind = - case kind of Fruit -> - 0 + 1 HealingPowder -> - 0 - - MeatJerky -> - 0 + 1 Stimpak -> - 0 + 1 + + SuperStimpak -> + 1 BigBookOfScience -> - 0 + 1 DeansElectronics -> - 0 + 1 FirstAidBook -> - 0 + 1 GunsAndBullets -> - 0 + 1 ScoutHandbook -> - 0 + 1 Robes -> - 0 + 1 LeatherJacket -> - 0 + 1 LeatherArmor -> - 0 + 1 MetalArmor -> - 0 - - Beer -> - 0 - - RedRyderLEBBGun -> - 30 + 1 - BBAmmo -> - 0 + TeslaArmor -> + 1 - ElectronicLockpick -> - 0 + CombatArmor -> + 1 - AbnormalBrain -> - 0 + CombatArmorMk2 -> + 1 - ChimpanzeeBrain -> - 0 + PowerArmor -> + 1 - HumanBrain -> - 0 + BBAmmo -> + 1 - CyberneticBrain -> - 0 + SmallEnergyCell -> + 1 - HuntingRifle -> - 45 + Fmj223 -> + 1 - ScopedHuntingRifle -> - 40 + ShotgunShell -> + 1 - SuperStimpak -> - 0 + Jhp10mm -> + 1 - TeslaArmor -> - 0 + Jhp5mm -> + 1 - CombatArmor -> - 0 + MicrofusionCell -> + 1 - CombatArmorMk2 -> - 0 + Ec2mm -> + 1 - PowerArmor -> - 0 + Tool -> + 1 - SuperSledge -> - 2 + LockPicks -> + 1 - PowerFist -> + ElectronicLockpick -> 1 - MegaPowerFist -> + AbnormalBrain -> 1 - FragGrenade -> - 15 + ChimpanzeeBrain -> + 1 - Bozar -> - 35 + HumanBrain -> + 1 - SawedOffShotgun -> - 7 + CyberneticBrain -> + 1 - SniperRifle -> - 50 + GECK -> + 1 - AssaultRifle -> - 38 + SkynetAim -> + 1 - ExpandedAssaultRifle -> - 38 + MotionSensor -> + 1 - PancorJackhammer -> - 35 + K9 -> + 1 - HkP90c -> - 25 + MeatJerky -> + 1 - LaserPistol -> - 35 + CattleProd -> + 4 - PlasmaRifle -> - 25 + SuperCattleProd -> + 4 - GatlingLaser -> - 40 + Mauser9mm -> + 3 - TurboPlasmaRifle -> - 35 + Pistol14mm -> + 4 - GaussRifle -> - 50 + CombatShotgun -> + 5 - GaussPistol -> - 50 + HkCaws -> + 6 - PulseRifle -> - 30 + Shotgun -> + 4 - SmallEnergyCell -> - 0 + AlienBlaster -> + 2 - Fmj223 -> - 0 + SolarScorcher -> + 3 - ShotgunShell -> - 0 + Flare -> + 1 - Smg10mm -> - 20 + Ap5mm -> + 1 - Jhp10mm -> - 0 + Mm9 -> + 1 - Jhp5mm -> - 0 + Ball9mm -> + 1 - MicrofusionCell -> - 0 + Ap10mm -> + 1 - Ec2mm -> - 0 + Ap14mm -> + 1 - Tool -> - 0 + ExplosiveRocket -> + 1 - GECK -> - 0 + RocketAp -> + 1 - SkynetAim -> - 0 + Pistol223 -> + 5 - MotionSensor -> - 0 + Wakizashi -> + 2 - K9 -> - 0 + LittleJesus -> + 2 - LockPicks -> - 0 + Ripper -> + 4 - Minigun -> - 35 + NeedlerPistol -> + 3 - RocketLauncher -> - 0 + MagnetoLaserPistol -> + 3 - LaserRifle -> - 0 + PulsePistol -> + 3 - LaserRifleExtCap -> - 0 + HolyHandGrenade -> + 2 - CattleProd -> - 0 + HnNeedlerCartridge -> + 1 - SuperCattleProd -> - 0 + HnApNeedlerCartridge -> + 1 - Mauser9mm -> - 0 - Pistol14mm -> - 0 +weaponDamageType : Kind -> Maybe DamageType +weaponDamageType kind = + case kind of + PowerFist -> + Just NormalDamage - CombatShotgun -> - 18 + MegaPowerFist -> + Just NormalDamage - HkCaws -> - 20 + SuperSledge -> + Just NormalDamage - Shotgun -> - 0 + GaussPistol -> + Just NormalDamage - AlienBlaster -> - 0 + Smg10mm -> + Just NormalDamage - SolarScorcher -> - 0 + HkP90c -> + Just NormalDamage - Flare -> - 0 + AssaultRifle -> + Just NormalDamage + ExpandedAssaultRifle -> + Just NormalDamage -range : AttackStyle -> Kind -> Int -range attackStyle kind = - case attackStyle of - UnarmedUnaimed -> - unaimedRange kind + HuntingRifle -> + Just NormalDamage - UnarmedAimed _ -> - aimedRange kind + ScopedHuntingRifle -> + Just NormalDamage - MeleeUnaimed -> - unaimedRange kind + RedRyderLEBBGun -> + Just NormalDamage - MeleeAimed _ -> - aimedRange kind + SniperRifle -> + Just NormalDamage - Throw -> - unaimedRange kind + GaussRifle -> + Just NormalDamage - ShootSingleUnaimed -> - unaimedRange kind + PancorJackhammer -> + Just NormalDamage - ShootSingleAimed _ -> - aimedRange kind + SawedOffShotgun -> + Just NormalDamage - ShootBurst -> - burstRange kind + Minigun -> + Just NormalDamage + Bozar -> + Just NormalDamage -{-| In other words, does the Weapon Long Range perk apply? --} -isLongRangeWeapon : Kind -> Bool -isLongRangeWeapon kind = - case kind of - AssaultRifle -> - True + RocketLauncher -> + Just Explosion - ExpandedAssaultRifle -> - True + LaserPistol -> + Just Laser GatlingLaser -> - True - - HuntingRifle -> - True + Just Laser LaserRifle -> - True + Just Laser LaserRifleExtCap -> - True - - Minigun -> - True + Just Laser PlasmaRifle -> - True - - RedRyderLEBBGun -> - True + Just Plasma - RocketLauncher -> - True + TurboPlasmaRifle -> + Just Plasma - SniperRifle -> - True + PulseRifle -> + Just Electrical - TurboPlasmaRifle -> - True + FragGrenade -> + Just Explosion - -- The rest are Falses Beer -> - False + Nothing Fruit -> - False + Nothing HealingPowder -> - False + Nothing Stimpak -> - False + Nothing SuperStimpak -> - False + Nothing BigBookOfScience -> - False + Nothing DeansElectronics -> - False + Nothing FirstAidBook -> - False + Nothing GunsAndBullets -> - False + Nothing ScoutHandbook -> - False + Nothing Robes -> - False + Nothing LeatherJacket -> - False + Nothing LeatherArmor -> - False + Nothing MetalArmor -> - False + Nothing TeslaArmor -> - False + Nothing CombatArmor -> - False + Nothing CombatArmorMk2 -> - False + Nothing PowerArmor -> - False + Nothing - PowerFist -> - False + BBAmmo -> + Nothing - MegaPowerFist -> - False + SmallEnergyCell -> + Nothing - SuperSledge -> - False + Fmj223 -> + Nothing - GaussPistol -> - False + ShotgunShell -> + Nothing - HkP90c -> - False + Jhp10mm -> + Nothing - ScopedHuntingRifle -> - False + Jhp5mm -> + Nothing - GaussRifle -> - False + MicrofusionCell -> + Nothing - PancorJackhammer -> - False + Ec2mm -> + Nothing - SawedOffShotgun -> - False + Tool -> + Nothing - Bozar -> - False + LockPicks -> + Nothing - LaserPistol -> - False + ElectronicLockpick -> + Nothing - PulseRifle -> - False + AbnormalBrain -> + Nothing - FragGrenade -> - False + ChimpanzeeBrain -> + Nothing - BBAmmo -> - False + HumanBrain -> + Nothing - SmallEnergyCell -> - False + CyberneticBrain -> + Nothing - Fmj223 -> - False + GECK -> + Nothing - ShotgunShell -> - False + SkynetAim -> + Nothing - Smg10mm -> - False + MotionSensor -> + Nothing - Jhp10mm -> - False + K9 -> + Nothing - Jhp5mm -> - False + MeatJerky -> + Nothing - MicrofusionCell -> - False + CattleProd -> + Just Electrical - Ec2mm -> - False + SuperCattleProd -> + Just Electrical - Tool -> - False + Mauser9mm -> + Just NormalDamage - LockPicks -> - False + Pistol14mm -> + Just NormalDamage - ElectronicLockpick -> - False + CombatShotgun -> + Just NormalDamage - AbnormalBrain -> - False + HkCaws -> + Just NormalDamage - ChimpanzeeBrain -> - False + Shotgun -> + Just NormalDamage + + AlienBlaster -> + Just Electrical + + SolarScorcher -> + Just Laser + + Flare -> + Just NormalDamage + + Ap5mm -> + Nothing + + Mm9 -> + Nothing + + Ball9mm -> + Nothing + + Ap10mm -> + Nothing + + Ap14mm -> + Nothing + + ExplosiveRocket -> + Nothing + + RocketAp -> + Nothing + + Pistol223 -> + Just NormalDamage + + Wakizashi -> + Just NormalDamage + + LittleJesus -> + Just NormalDamage + + Ripper -> + Just NormalDamage + + NeedlerPistol -> + Just NormalDamage + + MagnetoLaserPistol -> + Just Laser + + PulsePistol -> + Just Electrical + + HolyHandGrenade -> + Just Explosion + + HnNeedlerCartridge -> + Nothing + + HnApNeedlerCartridge -> + Nothing - HumanBrain -> - False - CyberneticBrain -> - False +usableAmmo : Kind -> List Kind +usableAmmo kind = + case kind of + Beer -> + [] - GECK -> - False + Fruit -> + [] - SkynetAim -> - False + HealingPowder -> + [] - MotionSensor -> - False + Stimpak -> + [] - K9 -> - False + SuperStimpak -> + [] - MeatJerky -> - False + BigBookOfScience -> + [] - CattleProd -> - False + DeansElectronics -> + [] - SuperCattleProd -> - False + FirstAidBook -> + [] - Mauser9mm -> - False + GunsAndBullets -> + [] - Pistol14mm -> - False + ScoutHandbook -> + [] - CombatShotgun -> - False + Robes -> + [] - HkCaws -> - False + LeatherJacket -> + [] - Shotgun -> - False + LeatherArmor -> + [] - AlienBlaster -> - False + MetalArmor -> + [] - SolarScorcher -> - False + TeslaArmor -> + [] - Flare -> - False + CombatArmor -> + [] + CombatArmorMk2 -> + [] + + PowerArmor -> + [] -strengthRequirement : Kind -> Int -strengthRequirement kind = - case kind of PowerFist -> - 1 + [ SmallEnergyCell ] MegaPowerFist -> - 1 + [ SmallEnergyCell ] + + CattleProd -> + [ SmallEnergyCell ] + + SuperCattleProd -> + [ SmallEnergyCell ] SuperSledge -> - 5 + [] + + Mauser9mm -> + [ Mm9, Ball9mm ] + + Pistol14mm -> + [ Ap14mm ] GaussPistol -> - 4 + [ Ec2mm ] Smg10mm -> - 4 + [ Ap10mm, Jhp10mm ] HkP90c -> - 4 + [ Ap10mm, Jhp10mm ] AssaultRifle -> - 5 + [ Ap5mm, Jhp5mm ] ExpandedAssaultRifle -> - 5 + [ Ap5mm, Jhp5mm ] HuntingRifle -> - 5 + [ Fmj223 ] ScopedHuntingRifle -> - 5 + [ Fmj223 ] RedRyderLEBBGun -> - 4 + [ BBAmmo ] SniperRifle -> - 5 + [ Fmj223 ] GaussRifle -> - 6 + [ Ec2mm ] + + CombatShotgun -> + [ ShotgunShell ] + + HkCaws -> + [ ShotgunShell ] PancorJackhammer -> - 5 + [ ShotgunShell ] + + Shotgun -> + [ ShotgunShell ] SawedOffShotgun -> - 4 + [ ShotgunShell ] Minigun -> - 7 + [ Ap5mm, Jhp5mm ] Bozar -> - 6 + [ Fmj223 ] RocketLauncher -> - 6 + [ ExplosiveRocket, RocketAp ] + + AlienBlaster -> + [ SmallEnergyCell ] LaserPistol -> - 3 + [ SmallEnergyCell ] + + SolarScorcher -> + -- TODO if we ever have darkness, this weapon needs to stop working + [] GatlingLaser -> - 6 + [ MicrofusionCell ] LaserRifle -> - 6 + [ MicrofusionCell ] LaserRifleExtCap -> - 6 + [ MicrofusionCell ] PlasmaRifle -> - 6 + [ MicrofusionCell ] TurboPlasmaRifle -> - 6 + [ MicrofusionCell ] PulseRifle -> - 6 - - FragGrenade -> - 3 - - Beer -> - 1 - - Fruit -> - 1 - - HealingPowder -> - 1 - - Stimpak -> - 1 - - SuperStimpak -> - 1 - - BigBookOfScience -> - 1 - - DeansElectronics -> - 1 - - FirstAidBook -> - 1 - - GunsAndBullets -> - 1 - - ScoutHandbook -> - 1 - - Robes -> - 1 - - LeatherJacket -> - 1 - - LeatherArmor -> - 1 + [ MicrofusionCell ] - MetalArmor -> - 1 - - TeslaArmor -> - 1 - - CombatArmor -> - 1 - - CombatArmorMk2 -> - 1 + Flare -> + [] - PowerArmor -> - 1 + FragGrenade -> + [] BBAmmo -> - 1 + [] SmallEnergyCell -> - 1 + [] Fmj223 -> - 1 + [] ShotgunShell -> - 1 + [] Jhp10mm -> - 1 + [] Jhp5mm -> - 1 + [] MicrofusionCell -> - 1 + [] Ec2mm -> - 1 + [] Tool -> - 1 + [] LockPicks -> - 1 + [] ElectronicLockpick -> - 1 + [] AbnormalBrain -> - 1 + [] ChimpanzeeBrain -> - 1 + [] HumanBrain -> - 1 + [] CyberneticBrain -> - 1 + [] GECK -> - 1 + [] SkynetAim -> - 1 + [] MotionSensor -> - 1 + [] K9 -> - 1 + [] MeatJerky -> - 1 + [] - CattleProd -> - 4 + Ap5mm -> + [] - SuperCattleProd -> - 4 + Mm9 -> + [] - Mauser9mm -> - 3 + Ball9mm -> + [] - Pistol14mm -> - 4 + Ap10mm -> + [] - CombatShotgun -> - 5 + Ap14mm -> + [] - HkCaws -> - 6 + ExplosiveRocket -> + [] - Shotgun -> - 4 + RocketAp -> + [] - AlienBlaster -> - 2 + Pistol223 -> + [ Fmj223 ] - SolarScorcher -> - 3 + Wakizashi -> + [] - Flare -> - 1 + LittleJesus -> + [] + + Ripper -> + [ SmallEnergyCell ] + + NeedlerPistol -> + [ HnNeedlerCartridge, HnApNeedlerCartridge ] + + MagnetoLaserPistol -> + [ SmallEnergyCell ] + + PulsePistol -> + [ SmallEnergyCell ] + + HolyHandGrenade -> + [] + + HnNeedlerCartridge -> + [] + + HnApNeedlerCartridge -> + [] diff --git a/src/Data/Perk.elm b/src/Data/Perk.elm index 0f2415a..77b2b12 100644 --- a/src/Data/Perk.elm +++ b/src/Data/Perk.elm @@ -43,7 +43,7 @@ type Perk -- lvl 6 | AdrenalineRush -- TODO Bonus Move -- would need move-only APs and some intelligent use of movement in combat - -- TODO Bonus Ranged Damage -- would need ranged combat + | BonusRangedDamage | Educated -- TODO Empathy -- would need dialogues | FortuneFinder @@ -114,6 +114,7 @@ all = , Awareness , BetterCriticals , BonusHthAttacks + , BonusRangedDamage , BonusRateOfFire , BonusHthDamage , CautiousNature @@ -291,6 +292,9 @@ name perk = NightVision -> "Night Vision" + BonusRangedDamage -> + "Bonus Ranged Damage" + {-| -} @@ -429,6 +433,9 @@ maxRank perk = GeckoSkinning -> 1 + BonusRangedDamage -> + 2 + encode : Perk -> JE.Value encode perk = @@ -566,6 +573,9 @@ encode perk = GeckoSkinning -> "gecko-skinning" + BonusRangedDamage -> + "bonus-ranged-damage" + decoder : Decoder Perk decoder = @@ -573,6 +583,9 @@ decoder = |> JD.andThen (\perk -> case perk of + "bonus-ranged-damage" -> + JD.succeed BonusRangedDamage + "earlier-sequence" -> JD.succeed EarlierSequence @@ -878,6 +891,9 @@ isApplicableForLevelup r perk = GeckoSkinning -> False + + BonusRangedDamage -> + r.level >= 6 && s.agility >= 6 && s.luck >= 6 ) @@ -1016,3 +1032,6 @@ description perk = GeckoSkinning -> "You have the knowledge of how to skin geckos properly to get their hides." + + BonusRangedDamage -> + "Your training in firearms and other ranged weapons has made you more deadly in ranged combat. For each level of this Perk, you do +2 points of damage with ranged weapons." diff --git a/src/Frontend/News.elm b/src/Frontend/News.elm index d3fea6c..c52f3be 100644 --- a/src/Frontend/News.elm +++ b/src/Frontend/News.elm @@ -28,12 +28,16 @@ items = - more "normal" unarmed+melee weapons, and make them part of shops - Fast Shot trait -> can't use aimed shots +- Are we adding bonus to Critical Chance based on AimedShot? + +- Add upgraded unarmed attacks: https://fallout.fandom.com/wiki/Unarmed_(Fallout) + EQUIPPED AMMO - show it in the inventory - show which types are usable for the current weapon - don't allow equipping incompatible ammo - when unequipping weapon unequip the ammo too -- when it runs out during the fight, do we want to default to another compatible ammo? So should it be only preferredAmmo? +- Use it in the fight, switch to another compatible ammo (even in the SPlayer afterwards!) when it runs out and unequip when it runs out (switching back to unarmed content) - FightStrategy: walk away diff --git a/src/Logic.elm b/src/Logic.elm index d9e6b38..c5e1a9d 100644 --- a/src/Logic.elm +++ b/src/Logic.elm @@ -570,7 +570,7 @@ rangedChanceToHit r = -- weapon long range perk is already factored into the distancePenalty + weaponAccuratePerk - distancePenalty_ - - ((r.targetArmorClass * (100 - ammoArmorClassModifier)) // 100) + - ((r.targetArmorClass * (100 + ammoArmorClassModifier)) // 100) - lightingPenalty_ - strengthRequirementPenalty - shotPenalty @@ -1168,7 +1168,7 @@ damageThresholdNormal r = let armorDamageThreshold = r.equippedArmor - |> Maybe.map Item.damageThresholdNormal + |> Maybe.map Item.armorDamageThresholdNormal |> Maybe.withDefault 0 in r.naturalDamageThresholdNormal + armorDamageThreshold @@ -1184,7 +1184,7 @@ damageResistanceNormal r = let fromArmor = r.equippedArmor - |> Maybe.map Item.damageResistanceNormal + |> Maybe.map Item.armorDamageResistanceNormal |> Maybe.withDefault 0 fromToughnessPerk = @@ -1481,6 +1481,57 @@ attackStyleAndApCost kind = Flare -> [ ( Throw, 1 ) ] + Ap5mm -> + [] + + Mm9 -> + [] + + Ball9mm -> + [] + + Ap10mm -> + [] + + Ap14mm -> + [] + + ExplosiveRocket -> + [] + + RocketAp -> + [] + + Wakizashi -> + meleeAttackStyleAndApCost 3 + + LittleJesus -> + meleeAttackStyleAndApCost 3 + + Ripper -> + meleeAttackStyleAndApCost 4 + + Pistol223 -> + shootAttackStyleAndApCost 5 + + NeedlerPistol -> + shootAttackStyleAndApCost 5 + + MagnetoLaserPistol -> + shootAttackStyleAndApCost 5 + + PulsePistol -> + shootAttackStyleAndApCost 4 + + HolyHandGrenade -> + [ ( Throw, 4 ) ] + + HnNeedlerCartridge -> + [] + + HnApNeedlerCartridge -> + [] + canBurst : Item.Kind -> Bool canBurst kind = @@ -1496,6 +1547,6 @@ strengthRequirementChanceToHitPenalty : strengthRequirementChanceToHitPenalty r = let strengthRequirement = - Item.strengthRequirement r.equippedWeapon + Item.weaponStrengthRequirement r.equippedWeapon in max 0 (strengthRequirement - r.strength) * 20 diff --git a/tests/LogicTest.elm b/tests/LogicTest.elm index d985928..d45a0fc 100644 --- a/tests/LogicTest.elm +++ b/tests/LogicTest.elm @@ -86,43 +86,6 @@ test = ] -log : - { attackerAddedSkillPercentages : SeqDict Skill Int - , attackerPerks : SeqDict Perk Int - , attackerSpecial : Special - , distanceHexes : Int - , equippedWeapon : Maybe Item.Kind - , equippedAmmo : Maybe Item.Kind - , targetArmorClass : Int - , attackStyle : AttackStyle - } - -> - { attackerAddedSkillPercentages : SeqDict Skill Int - , attackerPerks : SeqDict Perk Int - , attackerSpecial : Special - , distanceHexes : Int - , equippedWeapon : Maybe Item.Kind - , equippedAmmo : Maybe Item.Kind - , targetArmorClass : Int - , attackStyle : AttackStyle - } -log args = - let - _ = - { attackerAddedSkillPercentages = SeqDict.toList args.attackerAddedSkillPercentages - , attackerPerks = SeqDict.toList args.attackerPerks - , attackerSpecial = args.attackerSpecial - , distanceHexes = args.distanceHexes - , equippedWeapon = args.equippedWeapon - , equippedAmmo = args.equippedAmmo - , targetArmorClass = args.targetArmorClass - , attackStyle = args.attackStyle - } - |> Debug.log "chanceToHit args" - in - args - - chanceToHitArgsFuzzer : Fuzzer { attackerAddedSkillPercentages : SeqDict Skill Int diff --git a/tests/TestHelpers.elm b/tests/TestHelpers.elm index 2c16782..1db60d3 100644 --- a/tests/TestHelpers.elm +++ b/tests/TestHelpers.elm @@ -327,7 +327,7 @@ randomSeedFuzzer = enemyTypeFuzzer : Fuzzer Enemy.Type enemyTypeFuzzer = - Fuzz.oneOfValues Enemy.allTypes + Fuzz.oneOfValues Enemy.all traitsFuzzer : Fuzzer (SeqSet Trait)