func (self *Game) start(c common.SkinnyContext) (err error) { if self.State != common.GameStateCreated { err = fmt.Errorf("%+v is already started", self) return } self.State = common.GameStateStarted self.Closed = true if err = c.DB().Set(self); err != nil { return } var startState *state.State if self.Variant == common.ClassicalString { startState = classical.Start() } else { err = fmt.Errorf("Unknown variant %v", self.Variant) return } startPhase := startState.Phase() epoch, err := epoch.Get(c.DB()) if err != nil { return } phase := &Phase{ GameId: self.Id, Ordinal: 0, Orders: map[dip.Nation]map[dip.Province][]string{}, Resolutions: map[dip.Province]string{}, Season: startPhase.Season(), Year: startPhase.Year(), Type: startPhase.Type(), Deadline: epoch + (time.Minute * time.Duration(self.Deadlines[startPhase.Type()])), } phase.Units, phase.SupplyCenters, phase.Dislodgeds, phase.Dislodgers, phase.Bounces, _ = startState.Dump() if err = c.DB().Set(phase); err != nil { return } if err = self.allocate(c.DB(), phase); err != nil { return } if err = phase.Schedule(c); err != nil { return } phase.SendScheduleEmails(c, self) return }