|
|
|
|
|
|
|
|
import ( |
|
|
import ( |
|
|
"fmt" |
|
|
"fmt" |
|
|
"math/rand" |
|
|
"math/rand" |
|
|
"sort" |
|
|
|
|
|
|
|
|
// "sort" |
|
|
|
|
|
"strings" |
|
|
"time" |
|
|
"time" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
type Character struct { |
|
|
|
|
|
Name string |
|
|
|
|
|
TotalForces int |
|
|
|
|
|
CorporealForces int |
|
|
|
|
|
EtherealForces int |
|
|
|
|
|
CelestialForces int |
|
|
|
|
|
Strength int |
|
|
|
|
|
Agility int |
|
|
|
|
|
Intellect int |
|
|
|
|
|
Precision int |
|
|
|
|
|
Will int |
|
|
|
|
|
Perception int |
|
|
|
|
|
Skills map[string]int |
|
|
|
|
|
Songs map[string]int |
|
|
|
|
|
Attunements []string |
|
|
|
|
|
Distinctions []string |
|
|
|
|
|
Artifacts []string |
|
|
|
|
|
Vessels map[string]int |
|
|
|
|
|
Roles map[string][]int |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
func roll(x, y int) []int { |
|
|
func roll(x, y int) []int { |
|
|
rolls := make([]int, x) |
|
|
rolls := make([]int, x) |
|
|
for i := 0; i < x; i++ { |
|
|
for i := 0; i < x; i++ { |
|
|
|
|
|
|
|
|
return s |
|
|
return s |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func stats() []int { |
|
|
|
|
|
rolls := make([]int, 6) |
|
|
|
|
|
for i := 0; i < 6; i++ { |
|
|
|
|
|
thisRoll := roll(4, 6) |
|
|
|
|
|
sort.Ints(thisRoll) |
|
|
|
|
|
top3 := make([]int, 3) |
|
|
|
|
|
copy(top3, thisRoll[1:]) |
|
|
|
|
|
rolls[i] = sum(top3) |
|
|
|
|
|
|
|
|
func namegen() string { |
|
|
|
|
|
vowels := make([]string, 6) |
|
|
|
|
|
copy(vowels, strings.Split("aeiouy", "")) |
|
|
|
|
|
consonants := make([]string, 20) |
|
|
|
|
|
copy(consonants, strings.Split("bcdfghjklmnpqrstvwxz", "")) |
|
|
|
|
|
|
|
|
|
|
|
ln := rand.Intn(5) + 5 |
|
|
|
|
|
vorc := rand.Intn(2) |
|
|
|
|
|
i := 0 |
|
|
|
|
|
nm := make([]string, ln) |
|
|
|
|
|
for i < ln { |
|
|
|
|
|
sel, c := 0, "" |
|
|
|
|
|
if i%2 == vorc { |
|
|
|
|
|
sel = rand.Intn(6) |
|
|
|
|
|
c = vowels[sel] |
|
|
|
|
|
} else { |
|
|
|
|
|
sel = rand.Intn(20) |
|
|
|
|
|
c = consonants[sel] |
|
|
|
|
|
} |
|
|
|
|
|
if i == 0 { |
|
|
|
|
|
c = strings.ToUpper(c) |
|
|
|
|
|
} |
|
|
|
|
|
nm = append(nm, c) |
|
|
|
|
|
i++ |
|
|
} |
|
|
} |
|
|
return rolls |
|
|
|
|
|
|
|
|
return strings.Join(nm, "") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func main() { |
|
|
func main() { |
|
|
rand.Seed(time.Now().UnixNano()) |
|
|
|
|
|
fmt.Println("=== Generated D&D character ===") |
|
|
|
|
|
fmt.Println("Rolls: ", stats()) |
|
|
|
|
|
|
|
|
rand.Seed(time.Now().UnixNano()) // Keep this first in main() |
|
|
|
|
|
|
|
|
|
|
|
ply := Character{} |
|
|
|
|
|
ply.Name = namegen() |
|
|
|
|
|
ply.TotalForces = 9 |
|
|
|
|
|
ply.CorporealForces = 1 |
|
|
|
|
|
ply.EtherealForces = 1 |
|
|
|
|
|
ply.CelestialForces = 1 |
|
|
|
|
|
ply.Strength = 1 |
|
|
|
|
|
ply.Agility = 1 |
|
|
|
|
|
ply.Intellect = 1 |
|
|
|
|
|
ply.Precision = 1 |
|
|
|
|
|
ply.Will = 1 |
|
|
|
|
|
ply.Perception = 1 |
|
|
|
|
|
|
|
|
|
|
|
i := ply.TotalForces - (ply.CorporealForces + ply.EtherealForces + ply.CelestialForces) |
|
|
|
|
|
for i > 0 { |
|
|
|
|
|
r := rand.Intn(3) |
|
|
|
|
|
if r == 0 { |
|
|
|
|
|
ply.CorporealForces = ply.CorporealForces + 1 |
|
|
|
|
|
} else if r == 1 { |
|
|
|
|
|
ply.EtherealForces = ply.EtherealForces + 1 |
|
|
|
|
|
} else { |
|
|
|
|
|
ply.CelestialForces = ply.CelestialForces + 1 |
|
|
|
|
|
} |
|
|
|
|
|
i-- |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Corporeal |
|
|
|
|
|
coratt := (ply.CorporealForces * 4) - (ply.Strength + ply.Agility) |
|
|
|
|
|
for coratt > 0 { |
|
|
|
|
|
r := rand.Intn(2) |
|
|
|
|
|
if r == 0 { |
|
|
|
|
|
if ply.Strength == 12 || (ply.Strength >= (ply.Agility*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Strength = ply.Strength + 1 |
|
|
|
|
|
} else { |
|
|
|
|
|
if ply.Agility == 12 || (ply.Agility >= (ply.Strength*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Agility = ply.Agility + 1 |
|
|
|
|
|
} |
|
|
|
|
|
coratt-- |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Ethereal |
|
|
|
|
|
ethatt := (ply.EtherealForces * 4) - (ply.Intellect + ply.Precision) |
|
|
|
|
|
for ethatt > 0 { |
|
|
|
|
|
r := rand.Intn(2) |
|
|
|
|
|
if r == 0 { |
|
|
|
|
|
if ply.Intellect == 12 || (ply.Intellect >= (ply.Precision*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Intellect = ply.Intellect + 1 |
|
|
|
|
|
} else { |
|
|
|
|
|
if ply.Precision == 12 || (ply.Precision >= (ply.Intellect*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Precision = ply.Precision + 1 |
|
|
|
|
|
} |
|
|
|
|
|
ethatt-- |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Corporeal |
|
|
|
|
|
celatt := (ply.CelestialForces * 4) - (ply.Will + ply.Perception) |
|
|
|
|
|
for celatt > 0 { |
|
|
|
|
|
r := rand.Intn(2) |
|
|
|
|
|
if r == 0 { |
|
|
|
|
|
if ply.Will == 12 || (ply.Will >= (ply.Perception*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Will = ply.Will + 1 |
|
|
|
|
|
} else { |
|
|
|
|
|
if ply.Perception == 12 || (ply.Perception >= (ply.Will*2) && rand.Intn(3) == 0) { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
ply.Perception = ply.Perception + 1 |
|
|
|
|
|
} |
|
|
|
|
|
celatt-- |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fmt.Println("=== Generated In Nomine character ===") |
|
|
|
|
|
fmt.Println(ply.Name) |
|
|
|
|
|
fmt.Printf("Cor %d\tEth %d\tCel %d\n", |
|
|
|
|
|
ply.CorporealForces, |
|
|
|
|
|
ply.EtherealForces, |
|
|
|
|
|
ply.CelestialForces) |
|
|
|
|
|
fmt.Printf("Str %d\tInt %d\tCel %d\n", |
|
|
|
|
|
ply.Strength, |
|
|
|
|
|
ply.Intellect, |
|
|
|
|
|
ply.Will) |
|
|
|
|
|
fmt.Printf("Agi %d\tPre %d\tPer %d\n", |
|
|
|
|
|
ply.Agility, |
|
|
|
|
|
ply.Precision, |
|
|
|
|
|
ply.Perception) |
|
|
} |
|
|
} |