Refactor of skills and start of dice module

This commit is contained in:
Nox Sluijtman 2024-11-18 17:09:16 +01:00
parent 554a26fff6
commit f12134bf55
Signed by: Egg
SSH key fingerprint: SHA256:2sG9X3C7Xvq2svGumz1/k7cm8l4G9+qAtAeugqB4J9M
8 changed files with 104 additions and 54 deletions

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

View file

@ -5,11 +5,11 @@
"systems": "systems" "systems": "systems"
}, },
"locked": { "locked": {
"lastModified": 1694529238, "lastModified": 1731533236,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384", "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1699169573, "lastModified": 1704290814,
"narHash": "sha256-cvUb1xZkvOp3W2SzylStrTirhVd9zCeo5utJl9nSIhw=", "narHash": "sha256-LWvKHp7kGxk/GEtlrGYV68qIvPHkU9iToomNFGagixU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "aeefe2054617cae501809b82b44a8e8f7be7cc4b", "rev": "70bdadeb94ffc8806c0570eb5c2695ad29f0e421",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -2,8 +2,10 @@ module DND
( module DND.Sheet.Content ( module DND.Sheet.Content
, module DND.Sheet.Parser , module DND.Sheet.Parser
, module DND.Bob , module DND.Bob
, module DND.Dice
) where ) where
import DND.Sheet.Content import DND.Sheet.Content
import DND.Sheet.Parser import DND.Sheet.Parser
import DND.Dice
import DND.Bob import DND.Bob

View file

@ -3,7 +3,7 @@ module DND.Bob (bob) where
import DND.Sheet.Content import DND.Sheet.Content
bob :: Character bob :: Character
bob = Character testPreamble testTrivia testStats (Just testSpells) bob = Character {skills=testSkills, trivia=testTrivia, stats=testStats, spells=Just testSpells, preamble=testPreamble, feats=Just testFeatures}
testStats :: [Stat] testStats :: [Stat]
testStats = [strStat,dexStat,conStat,intStat,wisStat,chaStat] testStats = [strStat,dexStat,conStat,intStat,wisStat,chaStat]
@ -15,65 +15,72 @@ testTrivia :: Trivia
testTrivia = Trivia "farmer" "none" "I me likey fun things" "yay" "all" "idk" testTrivia = Trivia "farmer" "none" "I me likey fun things" "yay" "all" "idk"
strStat :: Stat strStat :: Stat
strStat = Stat "Strength" 10 False strSkills strStat = Stat "Strength" 10 False
strSkills :: [Skill] strSkills :: [Skill]
strSkills = [ Skill "Athletics" None ] strSkills = [ Skill "Athletics" None "Strength" ]
dexStat :: Stat dexStat :: Stat
dexStat = Stat "Dexterity" 10 False dexSkills dexStat = Stat "Dexterity" 10 False
dexSkills :: [Skill] dexSkills :: [Skill]
dexSkills = [ Skill "Acrobatics" None dexSkills = [ Skill "Acrobatics" None "Dexterity"
, Skill "Sleight of Hand" None , Skill "Sleight of Hand" None "Dexterity"
, Skill "Stealth" None , Skill "Stealth" None "Dexterity"
] ]
conStat :: Stat conStat :: Stat
conStat = Stat "Constitution" 10 False [] conStat = Stat "Constitution" 10 False
intStat :: Stat intStat :: Stat
intStat = Stat "Intelligence" 10 False intSkills intStat = Stat "Intelligence" 10 False
intSkills :: [Skill] intSkills :: [Skill]
intSkills = [ Skill "Arcana" None intSkills = [ Skill "Arcana" None "Intelligence"
, Skill "History" None , Skill "History" None "Intelligence"
, Skill "Investigation" None , Skill "Investigation" None "Intelligence"
, Skill "Nature" None , Skill "Nature" None "Intelligence"
, Skill "Religion" None , Skill "Religion" None "Intelligence"
] ]
wisStat :: Stat wisStat :: Stat
wisStat = Stat "Wisdom" 10 False wisSkills wisStat = Stat "Wisdom" 10 False
wisSkills :: [Skill] wisSkills :: [Skill]
wisSkills = [ Skill "Animal Handling" None wisSkills = [ Skill "Animal Handling" None "Wisdom"
, Skill "Insight" None , Skill "Insight" None "Wisdom"
, Skill "Medicine" None , Skill "Medicine" None "Wisdom"
, Skill "Perception" None , Skill "Perception" None "Wisdom"
, Skill "Survival" None , Skill "Survival" None "Wisdom"
] ]
chaStat :: Stat chaStat :: Stat
chaStat = Stat "Charisma" 10 False chaSkills chaStat = Stat "Charisma" 10 False
chaSkills :: [Skill] chaSkills :: [Skill]
chaSkills = [ Skill "Deception" None chaSkills = [ Skill "Deception" None "Charisma"
, Skill "Intimidation" None , Skill "Intimidation" None "Charisma"
, Skill "Performance" None , Skill "Performance" None "Charisma"
, Skill "Persuasion" None , Skill "Persuasion" None "Charisma"
] ]
testSkills :: [Skill]
testSkills = strSkills ++ dexSkills ++ intSkills ++ wisSkills ++ chaSkills
testSpells :: [Spell] testSpells :: [Spell]
testSpells = [ Spell "Firetesticle" -- spellName testSpells = [ Spell { spellName = "Firetesticle"
3 -- spellLevel , spellLevel = 3
"3 Minutes" -- castingTime , castingTime = "3 Minutes"
50 -- range , range = 50
[Verbal, Somatic] -- components , components = [Verbal, Somatic]
"Instant" -- duration , duration = "Instant"
"Dexterity" -- attackSave , attackSave = "Dexterity"
"Fire" -- damge/effect , damageEffect = "Fire"
"Shoots a huge testicle shaped fireball" -- description , description = "Shoots a huge testicle shaped fireball"
"Conjuration" -- school , school = "Conjuration"
"Cast more of the sodding things" -- atHighLevel , atHighLevel = "Cast more of the sodding things"
}
] ]
testFeatures :: [Feature]
testFeatures = [ Roleplay FeatInfo { featName = "fiets", featDescription = "allows you to ride a 'fiets'" } ]

16
lib/DND/Dice.hs Normal file
View file

@ -0,0 +1,16 @@
module DND.Dice
( rolls
, d20
, advantage
) where
import System.Random
rolls :: RandomGen a => Int -> Int -> a -> [Int]
rolls x y = take x . randomRs (1, y)
d20 :: RandomGen a => a -> Int
d20 = minimum . rolls 1 20
advantage :: RandomGen a => a -> Int
advantage = maximum . rolls 2 20

View file

@ -10,6 +10,8 @@ module DND.Sheet.Content
, Spell(..) , Spell(..)
, SpellComponent(..) , SpellComponent(..)
, Feature(..) , Feature(..)
, FeatInfo(..)
, fiets
) where ) where
import Data.Aeson ( FromJSON, ToJSON ) import Data.Aeson ( FromJSON, ToJSON )
@ -36,6 +38,12 @@ instance ToJSON ScoreMod
instance FromJSON Spell instance FromJSON Spell
instance ToJSON Spell instance ToJSON Spell
instance FromJSON Feature
instance ToJSON Feature
instance FromJSON FeatInfo
instance ToJSON FeatInfo
instance FromJSON SpellComponent instance FromJSON SpellComponent
instance ToJSON SpellComponent instance ToJSON SpellComponent
@ -48,8 +56,9 @@ data Character = Character
{ preamble :: Preamble { preamble :: Preamble
, trivia :: Trivia , trivia :: Trivia
, stats :: [Stat] , stats :: [Stat]
, skills :: [Skill]
, spells :: Maybe [Spell] , spells :: Maybe [Spell]
--, feats :: [Feat] , feats :: Maybe [Feature]
} deriving ( Show, Eq, Ord, Generic) } deriving ( Show, Eq, Ord, Generic)
data Preamble = Preamble data Preamble = Preamble
@ -72,13 +81,18 @@ data Trivia = Trivia
data Skill = Skill data Skill = Skill
{ skillName :: String { skillName :: String
, skillMod :: ScoreMod , skillMod :: ScoreMod
, relatedStat :: String
} deriving ( Show, Eq, Ord, Generic) } deriving ( Show, Eq, Ord, Generic)
fiets = Skill { skillName = "Stuff"
, skillMod = None
, relatedStat = "Strength"
}
data Stat = Stat data Stat = Stat
{ stat :: String { statName :: String
, score :: Int , score :: Int
, proficient :: Bool , proficient :: Bool
, skills :: [Skill]
} deriving ( Show, Eq, Ord, Generic) } deriving ( Show, Eq, Ord, Generic)
data Spell = Spell data Spell = Spell
@ -100,21 +114,25 @@ data SpellComponent = Verbal
| Material | Material
deriving ( Show, Eq, Ord, Generic) deriving ( Show, Eq, Ord, Generic)
data FeatInfo = FeatInfo { featName :: String
, featDescription :: String
} deriving ( Show, Eq, Ord, Generic)
data Feature = StatIncrease data Feature = StatIncrease
{ increase :: [Stat] } { featInfo :: FeatInfo
, increase :: [Stat] }
| SetProficiency | SetProficiency
{ changeModState :: [ScoreMod] { featInfo :: FeatInfo
, featDescription :: String , changeModState :: [ScoreMod]
} }
| SetExpertise | SetExpertise
{ changeModState :: [ScoreMod] { featInfo :: FeatInfo
, featDescription :: String , changeModState :: [ScoreMod]
} }
| AddSpell | AddSpell
{ addSpell :: [Spell] { featInfo :: FeatInfo
, featDescription :: String , addSpell :: [Spell]
} }
| Roleplay | Roleplay
{ featDescription :: String { featInfo :: FeatInfo }
}
deriving ( Show, Eq, Ord, Generic) deriving ( Show, Eq, Ord, Generic)

View file

@ -4,6 +4,7 @@ module DND.Sheet.Parser
, listSkills , listSkills
, createExample , createExample
, getName , getName
, getStat
, listSkillNames , listSkillNames
) where ) where
@ -34,3 +35,6 @@ createExample = flip encodeFile bob
getName :: Character -> String getName :: Character -> String
getName = charName . preamble getName = charName . preamble
getStat :: Character -> String -> Stat
getStat char s = head . filter (\a -> statName a == s) . stats $ char

View file

@ -58,6 +58,7 @@ library
exposed-modules: DND exposed-modules: DND
, DND.Bob , DND.Bob
, DND.Dice
, DND.Sheet , DND.Sheet
, DND.Sheet.Content , DND.Sheet.Content
, DND.Sheet.Parser , DND.Sheet.Parser
@ -66,6 +67,7 @@ library
, aeson , aeson
, bytestring , bytestring
, utf8-string , utf8-string
, random
hs-source-dirs: lib hs-source-dirs: lib