func (w *World) spawnSpiders(pos *s3dm.V3) { // Represents the gradually increasing difficulty as the player gets // farther from the center of Spider Forest. Every time the player // passes this threshold, another spider will definitely spawn upon // player movement. So if the player is 173 units from the center, // 173/50=3 spiders will spawn with a 23/50 chance to make it 4. // The lower this number, the more difficult the game will be. const LEVEL_DIST = 100. // Minimum and maximum distance from the player to spawn spiders const MIN_DIST = 40. const MAX_DIST = 60. // Find how many spiders will definitely spawn dist := pos.Length() count := 0 for dist >= LEVEL_DIST { dist -= LEVEL_DIST count++ } // Random chance for a spider to spawn if rand.Float64() <= dist/LEVEL_DIST { count++ } // Spawn spiders at a random point in a ring around the player // between MIN_DIST and MAX_DIST. reply := make(chan Msg) for i := 0; i < count; i++ { radius := rand.Float64()*(MAX_DIST-MIN_DIST) + MIN_DIST angle := rand.Float64() * 2. * math.Pi x := pos.X + radius*math.Cos(angle) y := pos.Y + radius*math.Sin(angle) // Create the spider entity and position it Send(w, w.svc.Game, game.MsgSpawnEntity{InitSpider, reply}) spider := Recv(w, reply).(*EntityDesc) Send(w, spider.Chan, MsgSetState{Position{s3dm.NewV3(x, y, 0.)}}) } }
// Puts the passed entity in an empty position as close to pos as possible. // TODO: Current implementation doesn't try very hard at closeness ;) func (w *World) putInEmptyPos(ent *EntityDesc, pos *s3dm.V3) { old_pos := pos.Copy() for { if _, ok := w.ents[hashV3(pos)]; !ok { break // Empty, proceed } inc := &s3dm.V3{1, 1, 0} pos = pos.Add(inc) } w.setPos(ent, pos, nil) if !pos.Equals(old_pos) { // Update with new pos Send(w, ent.Chan, MsgSetState{Position{pos}}) } }