Spell list logic and reformat of JSON

This commit is contained in:
Nox Sluijtman 2023-02-01 12:39:32 +01:00
parent 09248c4e63
commit d4162eab2b
3 changed files with 84 additions and 50 deletions

View file

@ -15,39 +15,39 @@
"isKurthog": false "isKurthog": false
}, },
"stats":[ "stats":[
{"statName":"strength", "score":20, "proficient":false, "saveProficient":false }, {"name":"strength", "score":20, "proficient":false, "saveProficient":false },
{"statName":"dexterity", "score":1, "proficient":false, "saveProficient":false }, {"name":"dexterity", "score":1, "proficient":false, "saveProficient":false },
{"statName":"constitution", "score":15, "proficient":false, "saveProficient":false }, {"name":"constitution", "score":15, "proficient":false, "saveProficient":false },
{"statName":"intelligence", "score":10, "proficient":false, "saveProficient":false }, {"name":"intelligence", "score":10, "proficient":false, "saveProficient":false },
{"statName":"wisdom", "score":10, "proficient":false, "saveProficient":false }, {"name":"wisdom", "score":10, "proficient":false, "saveProficient":false },
{"statName":"charisma", "score":10, "proficient":false, "saveProficient":false } {"name":"charisma", "score":10, "proficient":false, "saveProficient":false }
], ],
"skills":[ "skills":[
{"skillName":"athletics", "proficient":true, "expertise":false, "baseStat":"strength"}, {"name":"athletics", "proficient":true, "expertise":false, "baseStat":"strength"},
{"skillName":"acrobatics", "proficient":false, "expertise":false, "baseStat":"dexterity"}, {"name":"acrobatics", "proficient":false, "expertise":false, "baseStat":"dexterity"},
{"skillName":"sleight_of_hand", "proficient":false, "expertise":false, "baseStat":"dexterity"}, {"name":"sleight_of_hand", "proficient":false, "expertise":false, "baseStat":"dexterity"},
{"skillName":"stealth", "proficient":false, "expertise":false, "baseStat":"dexterity"}, {"name":"stealth", "proficient":false, "expertise":false, "baseStat":"dexterity"},
{"skillName":"arcana", "proficient":false, "expertise":false, "baseStat":"intelligence"}, {"name":"arcana", "proficient":false, "expertise":false, "baseStat":"intelligence"},
{"skillName":"history", "proficient":false, "expertise":false, "baseStat":"intelligence"}, {"name":"history", "proficient":false, "expertise":false, "baseStat":"intelligence"},
{"skillName":"investigation", "proficient":false, "expertise":false, "baseStat":"intelligence"}, {"name":"investigation", "proficient":false, "expertise":false, "baseStat":"intelligence"},
{"skillName":"nature", "proficient":false, "expertise":false, "baseStat":"intelligence"}, {"name":"nature", "proficient":false, "expertise":false, "baseStat":"intelligence"},
{"skillName":"religion", "proficient":false, "expertise":false, "baseStat":"intelligence"}, {"name":"religion", "proficient":false, "expertise":false, "baseStat":"intelligence"},
{"skillName":"animal_handling", "proficient":false, "expertise":false, "baseStat":"wisdom"}, {"name":"animal_handling", "proficient":false, "expertise":false, "baseStat":"wisdom"},
{"skillName":"insight", "proficient":false, "expertise":false, "baseStat":"wisdom"}, {"name":"insight", "proficient":false, "expertise":false, "baseStat":"wisdom"},
{"skillName":"medicine", "proficient":false, "expertise":false, "baseStat":"wisdom"}, {"name":"medicine", "proficient":false, "expertise":false, "baseStat":"wisdom"},
{"skillName":"perception", "proficient":false, "expertise":false, "baseStat":"wisdom"}, {"name":"perception", "proficient":false, "expertise":false, "baseStat":"wisdom"},
{"skillName":"survival", "proficient":false, "expertise":false, "baseStat":"wisdom"}, {"name":"survival", "proficient":false, "expertise":false, "baseStat":"wisdom"},
{"skillName":"deception", "proficient":false, "expertise":false, "baseStat":"charisma"}, {"name":"deception", "proficient":false, "expertise":false, "baseStat":"charisma"},
{"skillName":"intimidation", "proficient":false, "expertise":true, "baseStat":"charisma"}, {"name":"intimidation", "proficient":false, "expertise":true, "baseStat":"charisma"},
{"skillName":"performance", "proficient":true, "expertise":false, "baseStat":"charisma"}, {"name":"performance", "proficient":true, "expertise":false, "baseStat":"charisma"},
{"skillName":"persuasion", "proficient":false, "expertise":false, "baseStat":"charisma"} {"name":"persuasion", "proficient":false, "expertise":false, "baseStat":"charisma"}
], ],
"spells":[ "spells":[
{"spellName":"Eldritch Blast", "level":0, "castingTime":"1 Action", "range": 120, "components":"v,s", "duration":"Instantaneous","attack_save":"Ranged", "damage_effect":"Force"}, {"name":"Eldritch Blast", "level":0, "castingTime":"1 Action", "range": 120, "components":"v,s", "duration":"Instantaneous","attack_save":"Ranged", "damage_effect":"Force", "school":"Evocation", "description":"A beam of crackling energy streaks toward a creature within range. Make a ranged spell attack against the target. On a hit, the target takes 1d10 force damage."},
{"spellName":"Eldritch Blast", "castingTime":"1 Action", "range": 120, "components":"v,s", "duration":"Instantaneous","attack_save":"Ranged", "damage_effect":"Force"} {"name":"Absorb Elements", "level":1, "castingTime":"1 Reaction", "range": 0, "components":"s", "duration":"1 Round","attack_save":"None", "damage_effect":"The Absorbed effect", "school":"Abjuration", "description":"The spell captures some of the incoming energy, lessening its effect on you and storing it for your next melee attack. You have resistance to the triggering damage type until the start of your next turn. Also, the first time you hit with a melee attack on your next turn, the target takes an extra 1d6 damage of the triggering type, and the spell ends."}
], ],
"feats":[ "feats":[
{"featName":"Boring", "featDescription":"Due to being excessivly generic, Bob gains... something"}, {"name":"Boring", "description":"Due to being excessivly generic, Bob gains... something"},
{"featName":"Test Dummy", "featDescription":"As the test dummy for this project, you gain the ability to use things from other classes willy nilly."} {"name":"Test Dummy", "description":"As the test dummy for this project, you gain the ability to use things from other classes willy nilly."}
] ]
} }

54
main.go
View file

@ -22,7 +22,7 @@ var (
char Character char Character
skillMap = make(map[string]int) skillMap = make(map[string]int)
statMap = make(map[string]int) statMap = make(map[string]int)
advantage, disadvantage, stat_list, skill_list, verbose, trivia, feats bool advantage, disadvantage, stat_list, skill_list, verbose, trivia, spells, feats bool
) )
func parseFlags() { func parseFlags() {
@ -43,6 +43,8 @@ func parseFlags() {
flag.BoolVar(&trivia, "t", false, "Print character name, level and proficiency") flag.BoolVar(&trivia, "t", false, "Print character name, level and proficiency")
flag.BoolVar(&trivia, "trivia", false, "Print character name, level and proficiency") flag.BoolVar(&trivia, "trivia", false, "Print character name, level and proficiency")
flag.BoolVar(&spells, "spells", false, "Print spells")
flag.BoolVar(&feats, "feats", false, "Print character feats") flag.BoolVar(&feats, "feats", false, "Print character feats")
flag.Parse() flag.Parse()
@ -80,11 +82,11 @@ func readJson() {
func initMaps() { func initMaps() {
for i := 0; i < len(char.Skills); i++ { for i := 0; i < len(char.Skills); i++ {
skillMap[char.Skills[i].SkillName] = i skillMap[char.Skills[i].Name] = i
} }
for i := 0; i < len(char.Stats); i++ { for i := 0; i < len(char.Stats); i++ {
statMap[char.Stats[i].StatName] = i statMap[char.Stats[i].Name] = i
} }
} }
@ -101,7 +103,7 @@ func main() {
fmt.Printf("\n") fmt.Printf("\n")
fmt.Printf("Personality trait: %s\n", char.Misc.PersonalityTrait) fmt.Printf("Personality traits: %s\n", char.Misc.PersonalityTrait)
fmt.Printf("Ideals: %s\n", char.Misc.Ideals) fmt.Printf("Ideals: %s\n", char.Misc.Ideals)
fmt.Printf("Bonds: %s\n", char.Misc.Bonds) fmt.Printf("Bonds: %s\n", char.Misc.Bonds)
fmt.Printf("Flaws: %s\n", char.Misc.Flaws) fmt.Printf("Flaws: %s\n", char.Misc.Flaws)
@ -115,6 +117,9 @@ func main() {
case feats: case feats:
listFeats() listFeats()
case spells:
listSpells(verbose)
case stat_list && skill_list: case stat_list && skill_list:
printStatList(verbose) printStatList(verbose)
printSkillList(verbose) printSkillList(verbose)
@ -257,7 +262,7 @@ func badCheck(errorMessage string, err error) {
func statErrorCheck() error { func statErrorCheck() error {
for i := 0; i < len(char.Stats); i++ { for i := 0; i < len(char.Stats); i++ {
if statString == char.Stats[i].StatName || saveString == char.Stats[i].StatName { if statString == char.Stats[i].Name || saveString == char.Stats[i].Name {
return nil return nil
} }
} }
@ -266,7 +271,7 @@ func statErrorCheck() error {
func skillErrorCheck() error { func skillErrorCheck() error {
for i := 0; i < len(char.Skills); i++ { for i := 0; i < len(char.Skills); i++ {
if skillString == char.Skills[i].SkillName { if skillString == char.Skills[i].Name {
return nil return nil
} }
} }
@ -335,7 +340,7 @@ func printStatList(verbose bool) {
if verbose { if verbose {
var proficiency string var proficiency string
for i := 0; i < len(char.Stats); i++ { for i := 0; i < len(char.Stats); i++ {
name := char.Stats[i].StatName name := char.Stats[i].Name
isProficient := char.Stats[i].Proficient isProficient := char.Stats[i].Proficient
if isProficient { if isProficient {
proficiency = "Proficient" proficiency = "Proficient"
@ -347,7 +352,7 @@ func printStatList(verbose bool) {
} }
} else { } else {
for i := 0; i < len(char.Stats); i++ { for i := 0; i < len(char.Stats); i++ {
fmt.Println(char.Stats[i].StatName) fmt.Println(char.Stats[i].Name)
} }
} }
} }
@ -358,7 +363,7 @@ func printSkillList(verbose bool) {
var expertise string var expertise string
if verbose { if verbose {
for i := 0; i < len(char.Skills); i++ { for i := 0; i < len(char.Skills); i++ {
name := char.Skills[i].SkillName name := char.Skills[i].Name
localModifier := GetModifier(GetStat(char.Skills[i].BaseStat)) localModifier := GetModifier(GetStat(char.Skills[i].BaseStat))
if char.Skills[i].Proficient { if char.Skills[i].Proficient {
proficiency = "Proficient" proficiency = "Proficient"
@ -376,7 +381,7 @@ func printSkillList(verbose bool) {
} }
} else { } else {
for i := 0; i < len(char.Skills); i++ { for i := 0; i < len(char.Skills); i++ {
fmt.Println(char.Skills[i].SkillName) fmt.Println(char.Skills[i].Name)
} }
} }
} }
@ -384,6 +389,33 @@ func printSkillList(verbose bool) {
func listFeats() { func listFeats() {
color.Magenta("Listing feats...") color.Magenta("Listing feats...")
for i := 0; i < len(char.Feats); i++ { for i := 0; i < len(char.Feats); i++ {
fmt.Printf("%25s\t%s\n", char.Feats[i].FeatName, char.Feats[i].FeatDescription) fmt.Printf("%25s\t%s\n", char.Feats[i].Name, char.Feats[i].Description)
}
}
func listSpells(verbose bool) {
color.Magenta("Listing spells...")
for i := 0; i < len(char.Spells); i++ {
fmt.Printf("Name: %s\t%s\n", char.Spells[i].Name, spellLevel(char.Spells[i].Level))
fmt.Printf("Casting Time: %s\tRange: %dft\n", char.Spells[i].CastingTime, char.Spells[i].Range)
fmt.Printf("Components: %s\t\tDuration: %s\n", char.Spells[i].Components, char.Spells[i].Duration)
fmt.Printf("Attack/Save: %s\tDamage/Effect: %s\n", char.Spells[i].Attack_Save, char.Spells[i].Damage_Effect)
if verbose {
fmt.Printf("\n")
fmt.Printf("%s\n", char.Spells[i].Description)
}
// hack for string formatting
if len(char.Spells) != (i + 1) {
fmt.Printf("\n")
}
}
}
func spellLevel(spellLevel int) string {
if spellLevel == 0 {
return "Cantrip"
} else {
return fmt.Sprintf("Level: %d", spellLevel)
} }
} }

View file

@ -4,6 +4,7 @@ type Character struct {
Misc Misc `json:"misc"` Misc Misc `json:"misc"`
Stats []Stat `json:"stats"` Stats []Stat `json:"stats"`
Skills []Skill `json:"skills"` Skills []Skill `json:"skills"`
Spells []Spell `json:"spells"`
Feats []Feat `json:"feats"` Feats []Feat `json:"feats"`
} }
@ -25,21 +26,21 @@ type Misc struct {
} }
type Skill struct { type Skill struct {
SkillName string `json:"skillName"` Name string `json:"name"`
Proficient bool `json:"proficient"` Proficient bool `json:"proficient"`
Expertise bool `json:"expertise"` Expertise bool `json:"expertise"`
BaseStat string `json:"baseStat"` BaseStat string `json:"baseStat"`
} }
type Stat struct { type Stat struct {
StatName string `json:"statName"` Name string `json:"name"`
Score int `json:"score"` Score int `json:"score"`
Proficient bool `json:"proficient"` Proficient bool `json:"proficient"`
SaveProficient bool `json:"saveProficient"` SaveProficient bool `json:"saveProficient"`
} }
type Spell struct { type Spell struct {
SpellName string `json:"spellName"` Name string `json:"name"`
Level int `json:"level"` Level int `json:"level"`
CastingTime string `json:"castingTime"` CastingTime string `json:"castingTime"`
Range int `json:"range"` Range int `json:"range"`
@ -47,9 +48,10 @@ type Spell struct {
Duration string `json:"duration"` Duration string `json:"duration"`
Attack_Save string `json:"attack_save"` Attack_Save string `json:"attack_save"`
Damage_Effect string `json:"damage_effect"` Damage_Effect string `json:"damage_effect"`
Description string `json:"description"`
} }
type Feat struct { type Feat struct {
FeatName string `json:"featName"` Name string `json:"name"`
FeatDescription string `json:"featDescription"` Description string `json:"description"`
} }