aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-07-05 22:34:00 -0400
committerFlorian Fischer <florian.fischer@muhq.space>2025-07-06 11:49:26 -0400
commit793286b8e3e14b3013d0fb7cc69e9c8b28e9d054 (patch)
tree74d301e19b37883c637471aa294353855d46eb53
parent28356bb5d54bd8a1a8359a8120b484c8e0a051ca (diff)
downloadmuhqs-game-793286b8e3e14b3013d0fb7cc69e9c8b28e9d054.tar.gz
muhqs-game-793286b8e3e14b3013d0fb7cc69e9c8b28e9d054.zip
allow to start a local draft with external values
-rw-r--r--go/activities/draft.go65
1 files changed, 51 insertions, 14 deletions
diff --git a/go/activities/draft.go b/go/activities/draft.go
index 19436075..f1b3fb58 100644
--- a/go/activities/draft.go
+++ b/go/activities/draft.go
@@ -1,6 +1,7 @@
package activities
import (
+ "errors"
"log"
"time"
@@ -31,6 +32,7 @@ type Draft struct {
deckView *ui.CardGrid
}
+// NewLocalDraft creates a draft activity ready to configure and start a local draft.
func NewLocalDraft(width, height int, playerName string) *Draft {
d := &Draft{
Collection: ui.Collection{Width: width, Height: height},
@@ -113,6 +115,22 @@ func NewLocalDraft(width, height int, playerName string) *Draft {
return d
}
+// StartNewLocalDraft creates a new draft from its inputs and immediatly starts it.
+// The started draft activiry is returned or any occured error.
+func StartNewLocalDraft(width, height int, playerName string, desc string, sets string, aiN int) (*Draft, error) {
+ d := &Draft{
+ Collection: ui.Collection{Width: width, Height: height},
+ done: make(chan struct{}),
+ }
+
+ d.player = game.NewDraftPlayer(playerName)
+ d.ctrl = game.NewChanPlayerControl(d.player)
+ d.player.Ctrl = d.ctrl
+ err := d.startDraft(desc, sets, aiN)
+ return d, err
+}
+
+// StartNewRemoteDraft returns a draft activity for the initial received pick notification.
func StartNewRemoteDraft(width, height int, ctrl game.PlayerControl, firstPack game.PlayerNotification) *Draft {
d := &Draft{
Collection: ui.Collection{Width: width, Height: height},
@@ -197,39 +215,35 @@ func (d *Draft) Layout(width, height int) (int, int) {
return d.Width, d.Height
}
-func (d *Draft) startDraft(desc string, setList string, aiN int) {
-
+func (d *Draft) startDraft(desc string, setList string, aiN int) error {
log.Printf("starting %s draft from '%s'\n", desc, setList)
var sets []game.SetIdentifier
var err error
if sets, err = game.SetListToSets(setList); err != nil {
- d.setInput.Bg(ui.WarningBg)
- d.setInput.SetInput("")
- return
+ return err
}
d.draft, err = game.NewDraft([]*game.Player{d.player}, desc, sets)
if err != nil {
- d.descInput.Bg(ui.WarningBg)
- d.descInput.SetInput("")
- return
+ return err
}
- log.Println(aiN)
for _ = range aiN {
- log.Println("add ai")
d.draft.AddRandomAi()
}
if !d.draft.Valid() {
- d.descInput.Bg(ui.WarningBg)
- d.descInput.SetInput("")
- return
+ return game.ErrInvalidDraft
}
+
d.Clear()
- d.deckList = ui.NewPocList(d.Width-SEALED_DECK_STRIP_WIDTH/2, d.Height-DRAFT_BUTTON_HEIGHT-20, d.player.Deck)
+ d.deckList = ui.NewPocList(
+ d.Width-SEALED_DECK_STRIP_WIDTH/2,
+ d.Height-DRAFT_BUTTON_HEIGHT-20,
+ d.player.Deck,
+ )
d.deckList.Bg(ui.Gray)
{
cardsInDeck := 0
@@ -257,8 +271,31 @@ func (d *Draft) startDraft(desc string, setList string, aiN int) {
d.draft.Run()
close(d.done)
}()
+
+ return nil
+}
+
+func (d *Draft) startDraftSafe(desc string, setList string, aiN int) {
+
+ err := d.startDraft(desc, setList, aiN)
+ if err == nil {
+ return
+ }
+
+ var descErr game.ErrParseDraftDesc
+ if errors.Is(err, game.ErrUnknownSet) {
+ d.setInput.Bg(ui.WarningBg)
+ d.setInput.SetInput("")
+ } else if errors.As(err, &descErr) {
+ d.descInput.Bg(ui.WarningBg)
+ d.descInput.SetInput("")
+ } else if errors.Is(err, game.ErrInvalidDraft) {
+ d.descInput.Bg(ui.WarningBg)
+ d.descInput.SetInput("")
+ }
}
+// GetDeckList returns the player's current deck list.
func (d *Draft) GetDeckList() string {
return d.player.Deck.ToList()
}