}
func (ctx *Context) ProcessChance() {
- for _, visitorID := range ctx.Visitors.Chance {
+ for {
+ visitorID, done := QueuePop(&ctx.Visitors.Chance)
+ if done {
+ break
+ }
+
card := ctx.Random.IntN(len(ChanceCards))
currentPos := ctx.Players.Alive[visitorID.Index()].CurrentSpaceID
package game
func (ctx *Context) ProcessChest() {
- for _, visitorID := range ctx.Visitors.Chest {
+ for {
+ visitorID, done := QueuePop(&ctx.Visitors.Chest)
+ if done {
+ break
+ }
card := ctx.Random.IntN(len(ChanceCards))
currentPos := ctx.Players.Alive[visitorID.Index()].CurrentSpaceID
}
func (ctx *Context) ProcessOwnedColors() {
- for _, oCV := range ctx.Visitors.Color {
+ for {
+ oCV, done := QueuePop(&ctx.Visitors.Color)
+ if done {
+ break
+ }
+
visitorID := oCV.VisitorID
ownerID := oCV.OwnerID
colorID := oCV.ColorID
func (ctx *Context) ProcessMovement() {
cID := ctx.Turn.Current
- dist := ctx.Turn.MoveQueue[0]
- ctx.Turn.MoveQueue = ctx.Turn.MoveQueue[1:]
- ctx.AdvancePlayer(cID, ctx.Players.Alive[cID.Index()].CurrentSpaceID, dist)
+ for {
+ dist := ctx.Turn.MoveQueue[0]
+ ctx.Turn.MoveQueue = ctx.Turn.MoveQueue[1:]
+ ctx.AdvancePlayer(cID, ctx.Players.Alive[cID.Index()].CurrentSpaceID, dist)
+ ctx.ProcessLanding()
+ if len(ctx.Turn.MoveQueue) == 0 {
+ break
+ }
- ctx.ProcessLanding()
+ }
}
}
func (ctx *Context) ProcessOwnedRailroad() {
- for _, oRV := range ctx.Visitors.Railroad {
+ for {
+ oRV, done := QueuePop(&ctx.Visitors.Railroad)
+ if done {
+ break
+ }
visitorID := oRV.VisitorID
ownerID := oRV.OwnerID
// railroadID := oRV.railroadID
package game
func (ctx *Context) ProcessTax() {
- for _, tV := range ctx.Visitors.Tax {
+ for {
+ tV, done := QueuePop(&ctx.Visitors.Tax)
+ if done {
+ break
+ }
playerID := tV.VisitorID
taxID := tV.TaxID
ctx.AdjustPlayerMoney(playerID, -TaxSpaces[taxID].Amount)
return last
}
+// first, done
+func QueuePop[T any](q *[]T) (T, bool) {
+ if len(*q) == 0 {
+ var zero T
+ return zero, true
+ }
+
+ lastIdx := len(*q) - 1
+
+ first := (*q)[lastIdx]
+ *q = (*q)[:lastIdx]
+ return first, false
+}
+
type Space struct {
PropertyType PropertyType
SubIndexID int32 // FK to resp. OwnableProperty types
package game
func (ctx *Context) ProcessUnowned() {
- // for _, uV := range ctx.Visitors.Unowned {
- // visitorID := uV.visitorID
- // propID := uV.propertyID
-
- // prop := ctx.Properties.Owners[propID.Index()]
-
- // TODO: trigger buy or auction
-
- // spaceID := prop.SpaceID
- // space := BoardSpaces[spaceID.Index()]
- //
- // var price int32 = 0
- //
- // switch space.PropertyType {
- // case TypeColor:
- // price = ColorProperties[space.SubIndexID].Price
- // case TypeUtility:
- // price = UtilityPrice
- // case TypeRailroad:
- // price = RailroadPrice
- // }
- //
- // ctx.AdjustPlayerMoney(visitorID, -price)
-
- // }
+ for {
+ _, done := QueuePop(&ctx.Visitors.Unowned)
+ if done {
+ break
+ }
+ ctx.Turn.EventStack = append(ctx.Turn.EventStack, EventLandUnowned)
+ }
}
}
func (ctx *Context) ProcessOwnedUtility() {
- for _, oUV := range ctx.Visitors.Utility {
+ for {
+ oUV, done := QueuePop(&ctx.Visitors.Utility)
+ if done {
+ break
+ }
visitorID := oUV.VisitorID
ownerID := oUV.OwnerID
// utilityID := oUV.utilityID