From 099ab6a43c807c53e1427ed04573f6004c7f9e8b Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 2 Dec 2016 11:21:53 +0100 Subject: Silicoids --- src/Sequence/Contact/Archetypes.hs | 166 +++++++++++++++++++++++++++++++++ src/Sequence/Contact/Tests.hs | 3 + src/Sequence/Contact/Types/Internal.hs | 41 ++++++++ src/Sequence/Utils.hs | 3 + 4 files changed, 213 insertions(+) diff --git a/src/Sequence/Contact/Archetypes.hs b/src/Sequence/Contact/Archetypes.hs index 85de197..e54c50f 100644 --- a/src/Sequence/Contact/Archetypes.hs +++ b/src/Sequence/Contact/Archetypes.hs @@ -25,6 +25,7 @@ import Data.Default import Data.Maybe import Data.Ratio import Data.ExtendedReal +import Data.Monoid import Data.List @@ -60,6 +61,10 @@ archetypes = [ ("Requisite", prop) , ("Zeta-Anführer", zetaLeader) , ("Zeta-Beobachter", zetaObserver) + , ("Silkoiden-Larve", silicoidLarva) + , ("Silkoid", rSilicoid) + , ("Mega-Silikoid", megaSilicoid) + , ("ATV", atv) , ("FAV", fav) , ("AUV", auv) @@ -459,6 +464,94 @@ dolphin = Dolphin , _sEquipment = [] } + +silicoid = Silicoid + { _sAStrength = vStrength + , _sAEndurance = vEndurance + , _sAMass = vMass + , _sAReflexes = vReflexes + , _sAMobility = vMobility + , _sADexterity = vDexterity + , _sAIntelligence = vIntelligence + , _sACharisma = vCharisma + , _sAPerception = vPerception + , _sAWillpower = vWillpower + + , _sSRamming = 30 + vReflexes * 2 + vPerception + , _sSMauling = 20 + vReflexes + vMobility `quot'` 2 + , _sSExcreting = 10 + vMass * 2 + + , _sMaxVitality = vEndurance * 2 + vMass * 2 + vWillpower + 10 + , _sSeqVal = vReflexes * 2 + vMobility + vPerception + 2 * d 10 + , _sPainTolerance = vMass `quot'` 2 + vWillpower + , _sFatigueTolerance = vWillpower `quot'` 2 + vEndurance + + , _sSeqEpsilon = False + + , _sHitzones = [ ("Auge", 0.05) + , ("Thorax", 0.45) + , ("Rechtes Vorderes Bein", 0.07) + , ("Linkes Vorderes Bein", 0.07) + , ("Rechtes Mittleres Bein", 0.06) + , ("Linkes Mittleres Bein", 0.06) + , ("Rechtes Hinteres Bein", 0.05) + , ("Linkes Hinteres Bein", 0.05) + , ("Schwanz", 0.14) + ] + , _sArmor = const def + , _sCripple = (!) $ [ ("Auge", def + & set seVal (sDamage' "Auge" . to return) + & set seBar (vitBar 0.2) + & set seReBar (vitBar 0.2) + & set seEffect ( cTable [ (1, 25, effect "Explosion") + , (26, 75, effect "Permanent desorientiert (nur rammen in zufällige Richtungen)") + , (76, 100, effect "Detonation in 3w10 AP") + ]) + ) + , ("Thorax", def + & set seVal (sDamage' "Thorax" . to return) + & set seBar (vitBar 0.65) + & set seReBar (vitBar 0.2) + & set seEffect ( cTable [ (1, 10, effect "Explosion") + , (11, 25, effect "Halbe Bewegung") + , (26, 65, effect "10 Schaden, Sprühattacke auf nächsten Charakter (Blut)") + , (66, 100, effect "3w10 Erschöpfung") + ]) + ) + , ("Schwanz", def + & set seVal (sDamage' "Schwanz" . to return) + & set seBar (vitBar 0.2) + & set seReBar (vitBar 0.2) + & set seEffect ( cTable [ (1, 25, effect "10 Schaden, Schwanzdrüse unbrauchbar") + , (26, 60, effect "3 Schaden, Sprühattacke auf nächsten Charakter (Blut)") + , (61, 100, effect "Amok und Detonation nach 1w10+6 AP") + ]) + ) + ] <> Map.fromList [(name, bein name) | side <- ["Rechtes", "Linkes"], length <- ["Vorderes", "Mittleres", "Hinteres"], let name = Hitzone . CI.mk $ side ++ " " ++ length ++ " Bein"] + + , _sDamage = const 0 + , _sFatigue = 0 + + , _sSequence = Nothing + , _sTimer = Nothing + + , _sPainShock = def + , _sFatigueShock = def + + , _sExtraSkills = [] + , _sModifiers = damageMods + + , _sEquipment = [] + } + where + bein name = def + & set seVal (sDamage' name . to return) + & set seBar (vitBar 0.3) + & set seReBar (vitBar 0.2) + & set seEffect ( cTable [ (1, 15, effect "Bein wird abgetrennt und fliegt 2w10 Meter und explodiert für Masse/10 explosiv in 2m Radius (+1 AP alle Bewegung)") + , (16, 75, effect "Bein ist nutzlos (+1AP alle Bewegung)") + , (76, 100, effect "Kreatur fängt an zu brennen, 12 Schaden am Ende jeder Runde + Amok") + ]) childOfMu = human & sAStrength +~ 2 @@ -675,3 +768,76 @@ zetaObserver = human where armor' Toxic = return PosInf armor' _ = return 15 + +silicoidLarva = silicoid + & sAStrength .~ 3 + & sAEndurance .~ 6 + & sAMass .~ 1 + & sAReflexes .~ 10 + & sAMobility .~ 15 + & sADexterity .~ 0 + & sAIntelligence .~ 0 + & sACharisma .~ 0 + & sAPerception .~ 5 + & sAWillpower .~ 20 + & sHitzones .~ [("Volumen", 1)] + & sCripple .~ const def + & sArmor .~ const armor' + & sSMauling +~ 10 + & sSExcreting +~ 32 + where + armor' Ballistic = return 5 + armor' Piercing = return 6 + armor' Blunt = return 6 + armor' Heat = return 24 + armor' Cold = return 8 + armor' Toxic = return 20 + armor' Explosive = return 5 + +rSilicoid = silicoid + & sAStrength .~ 10 + & sAEndurance .~ 8 + & sAMass .~ 5 + & sAReflexes .~ 10 + & sAMobility .~ 15 + & sADexterity .~ 0 + & sAIntelligence .~ 0 + & sACharisma .~ 0 + & sAPerception .~ 5 + & sAWillpower .~ 20 + & sArmor .~ const armor' + & sSMauling +~ 30 + & sSRamming +~ 7 + & sSExcreting +~ 37 + where + armor' Ballistic = return 10 + armor' Piercing = return 12 + armor' Blunt = return 12 + armor' Heat = return 26 + armor' Cold = return 12 + armor' Toxic = return 20 + armor' Explosive = return 10 + +megaSilicoid = silicoid + & sAStrength .~ 30 + & sAEndurance .~ 12 + & sAMass .~ 25 + & sAReflexes .~ 8 + & sAMobility .~ 10 + & sADexterity .~ 0 + & sAIntelligence .~ 0 + & sACharisma .~ 0 + & sAPerception .~ 5 + & sAWillpower .~ 20 + & sArmor .~ const armor' + & sSMauling +~ 49 + & sSRamming +~ 13 + & sSExcreting +~ 8 + where + armor' Ballistic = return 20 + armor' Piercing = return 22 + armor' Blunt = return 22 + armor' Heat = return 28 + armor' Cold = return 14 + armor' Toxic = return 20 + armor' Explosive = return 12 diff --git a/src/Sequence/Contact/Tests.hs b/src/Sequence/Contact/Tests.hs index 81b8d3c..561f5ad 100644 --- a/src/Sequence/Contact/Tests.hs +++ b/src/Sequence/Contact/Tests.hs @@ -80,6 +80,9 @@ tests = do , test "Rammen" $ sSRamming . skillTest , test "Zielerfassung" $ sSTargeting . skillTest , test "Verständnis" $ sSComprehension . skillTest + + , test "Zerfleischen" $ sSMauling . skillTest + , test "Ätzende Ausscheidung" $ sSExcreting . skillTest ] views sExtraSkills (baseTests <>) diff --git a/src/Sequence/Contact/Types/Internal.hs b/src/Sequence/Contact/Types/Internal.hs index 11116e9..40bb65f 100644 --- a/src/Sequence/Contact/Types/Internal.hs +++ b/src/Sequence/Contact/Types/Internal.hs @@ -270,5 +270,46 @@ data Stats = Prop , _sExtraSkills :: Map (CI String) (FormulaM Stats Test) , _sModifiers :: Set Modifier + , _sEquipment :: Map (CI String) Dynamic + } + | Silicoid + { _sAStrength + , _sAEndurance + , _sAMass + , _sAReflexes + , _sAMobility + , _sADexterity + , _sAIntelligence + , _sACharisma + , _sAPerception + , _sAWillpower + + , _sSRamming + , _sSMauling + , _sSExcreting + + , _sMaxVitality + , _sSeqVal + , _sPainTolerance + , _sFatigueTolerance :: Formula Stats + + , _sSeqEpsilon :: Bool + + , _sHitzones :: Table Hitzone + , _sArmor :: Hitzone -> Armor + , _sCripple :: Hitzone -> ShockEffect + + , _sDamage :: Hitzone -> Int + , _sFatigue :: Int + + , _sSequence :: Maybe SeqVal + , _sTimer :: Maybe Timer + + , _sPainShock :: ShockEffect + , _sFatigueShock :: ShockEffect + + , _sExtraSkills :: Map (CI String) (FormulaM Stats Test) + , _sModifiers :: Set Modifier + , _sEquipment :: Map (CI String) Dynamic } diff --git a/src/Sequence/Utils.hs b/src/Sequence/Utils.hs index bb29b86..eac71e9 100644 --- a/src/Sequence/Utils.hs +++ b/src/Sequence/Utils.hs @@ -231,6 +231,9 @@ statAccessors = [ ("Stärke", preview sAStrength) , ("Rammen", preview sSRamming) , ("Zielerfassung", preview sSTargeting) , ("Verständnis", preview sSComprehension) + + , ("Zerfleischen", preview sSMauling) + , ("Ätzende Ausscheidung", preview sSExcreting) , ("Maximale Vitalität", preview sMaxVitality) , ("Sequenzwert", preview sSeqVal) -- cgit v1.2.3