diff --git a/README.md b/README.md index 838e4b1..3ee02e9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # draft -Generic library for generating "booster packs" with randomizable slots for foils and special rares. +Generic library for generating "booster packs" and drafting them in pods. + +Booster packs allow for randomizable slots for foils and special rares. The base library has generalized implementations of sets (think booster packs from boxes) and cube (which takes off cards from a list as they are put in packs). diff --git a/draft.go b/draft.go new file mode 100644 index 0000000..7479c49 --- /dev/null +++ b/draft.go @@ -0,0 +1,20 @@ +package draft // import "git.fromouter.space/mcg/draft" + +// PackProvider is a function that returns one or more packs, used for pods +type PackProvider func() []Pack + +// PacksFromSet is a PackProvider for a set +func PacksFromSet(count int, set Set) PackProvider { + return PacksFromSchema(count, set.PackSchema()) +} + +// PacksFromSchema is a PackProvider for a schema +func PacksFromSchema(count int, schema PackSchema) PackProvider { + return func() []Pack { + packs := make([]Pack, count) + for i := range packs { + packs[i] = MakePackWithSchema(schema) + } + return packs + } +} diff --git a/draft_test.go b/draft_test.go new file mode 100644 index 0000000..54f150c --- /dev/null +++ b/draft_test.go @@ -0,0 +1,19 @@ +package draft_test + +import ( + "testing" + + "git.fromouter.space/mcg/draft" +) + +// Tests PacksFromSet +func TestSetPackProvider(t *testing.T) { + testProvider := draft.PacksFromSet(3, testSet) + + for i, pack := range testProvider() { + t.Logf("Test pack #%d contains: %s\n", i, pack) + if len(pack) < PACKSIZE { + t.Fatalf("Expected %d cards in pack #%d but got %d\n", PACKSIZE, i, len(pack)) + } + } +} diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/mlp/i8pcube.go b/mlp/i8pcube.go index 42be5d1..283a686 100644 --- a/mlp/i8pcube.go +++ b/mlp/i8pcube.go @@ -191,3 +191,17 @@ func DefaultI8PSchema() I8PSchema { {Amount: 1, Type: I8PTypeAll}, } } + +// PackProvider returns a PackProvider for a given number of main and problem packs +func (c *I8PCube) PackProvider(mainPacks, problemPacks int) draft.PackProvider { + return func() []draft.Pack { + packs := make([]draft.Pack, mainPacks+problemPacks) + for main := 0; main < mainPacks; main++ { + packs[main] = draft.MakePack(c.Main) + } + for problem := 0; problem < problemPacks; problemPacks++ { + packs[mainPacks+problem] = draft.MakePack(c.Problems) + } + return packs + } +} diff --git a/pack.go b/pack.go index b98af41..2d7b5b7 100644 --- a/pack.go +++ b/pack.go @@ -1,4 +1,4 @@ -package draft // import "git.fromouter.space/mcg/draft" +package draft import ( "math/rand" diff --git a/pod.go b/pod.go new file mode 100644 index 0000000..003e286 --- /dev/null +++ b/pod.go @@ -0,0 +1,26 @@ +package draft + +// Pod is a group of players drafting packs/cubes +type Pod struct { + Players []*Player +} + +// Player is a single player partecipating in a pod +type Player struct { + Packs []Pack + Picks []Card +} + +// MakePod creates a pod with a specified number of players and a given set of packs +func MakePod(playerCount int, provider PackProvider) *Pod { + players := make([]*Player, playerCount) + for i := range players { + players[i] = &Player{ + Packs: provider(), + Picks: []Card{}, + } + } + return &Pod{ + Players: players, + } +} diff --git a/pod_test.go b/pod_test.go new file mode 100644 index 0000000..c7ac577 --- /dev/null +++ b/pod_test.go @@ -0,0 +1,34 @@ +package draft_test + +import ( + "log" + "testing" + + "git.fromouter.space/mcg/draft" +) + +// Tests that a pod can be created and seeded correctly +func TestCreatePod(t *testing.T) { + const PacksPerPlayer = 3 + const PlayersPerPod = 5 + + // Get provider for test set + testProvider := draft.PacksFromSet(PacksPerPlayer, testSet) + + // Create pod + pod := draft.MakePod(PlayersPerPod, testProvider) + + if len(pod.Players) != PlayersPerPod { + log.Fatalf("Expected %d players in pod but got %d\n", PlayersPerPod, len(pod.Players)) + } + + for i, player := range pod.Players { + t.Logf("Player #%d:", i) + for packi, pack := range player.Packs { + t.Logf(" - Pack #%d: %s", packi, pack) + } + if len(player.Packs) != PacksPerPlayer { + log.Fatalf("Player #%d has %d packs but should have %d\n", i, PacksPerPlayer, len(player.Packs)) + } + } +}