public void PlaceRelic(Relic relic, int Tries = 20) { //TODO: Avoid other relics & doors var sides = Helpers.Rnd.Float() > 0.5f; var topleft = Helpers.Rnd.Float() > 0.5f; relic.Position = !sides ? new Vector2(Helpers.Rnd.Float() > 0.5f ? Helpers.Rnd.Float(MainArea.Left, -40) : Helpers.Rnd.Float(40, MainArea.Right), topleft ? MainArea.Top - 12 : MainArea.Bottom + 26) : new Vector2(topleft ? MainArea.Left - 16 : MainArea.Right + 16, Helpers.Rnd.Float(MainArea.Top, MainArea.Bottom)); if (!sides) { if (!topleft) { relic.Rotate(2); } } else { relic.Rotate(topleft ? 3 : 1); } // check collision bool collision = false; Visit(e => { if (!collision && e != relic && (e is Relic r || e is Door) && Vector2.DistanceSquared(e.Position, relic.Position) < 30 * 30) { collision = true; } }); if (collision && Tries > 0) { PlaceRelic(relic, Tries - 1); } }
public GameLevel(int level) { LevelNumber = level; Add(new Entity() { TexturePath = $"World/level{Helpers.Rnd.Next(5)}", Depth = Depths.Background, }); MainArea = new Rectangle(-192, -104, 384, 192); PlayBounds.Add(MainArea); Add(new Fire(Math.Max(25, 180 - level * 2)) { Position = GetFreePosition() }); Settings = LevelGenerator.Generate(level); Puzzles = new Puzzle[Settings.Puzzles.Length]; for (int i = 0; i < Settings.Puzzles.Length; i++) { var item = Settings.Puzzles[i]; Add(Puzzles[i] = new Puzzle(item.Width, item.Height, item.Width * item.PieceSize, item.Height * item.PieceSize, 0, item.Image)); } for (int i = 0; i < Settings.Relics; i++) { var r = new Relic(); PlaceRelic(r); Add(r); } _returnDoor = new Door(this, new Vector2(10, 101), 0, p => { SetNextLevel(new TransitionLevel(p, this)); _returnedPlayer = p; }); _returnDoor.Open(true); Add(_returnDoor); _nextLevelDoor = new Door(this, new Vector2(-10, -101), 2, p => SetNextLevel(new TransitionLevel(!GameOver ? TransitionState.Next : TransitionState.GameOver, this))); Add(_nextLevelDoor); for (int i = 1; i < Helpers.Rnd.Next(1, 5); i++) { Add(new Rat()); } Add(new Torch() { Position = new Vector2(80, -120) }); Add(new Torch() { Position = new Vector2(180, -120) }); Add(new Torch() { Position = new Vector2(-80, -120), Effects = SpriteEffects.FlipHorizontally }); Add(new Torch() { Position = new Vector2(-180, -120), Effects = SpriteEffects.FlipHorizontally }); Add(oldman = new SpritesheetEntity() { TexturePath = "Player/oldman", FirstFrame = new Rectangle(0, 0, 32, 32), Depth = Depths.Players + 0.0001f, FrameCount = 4, FPS = 2, Position = new Vector2(MainArea.Right - 16, MainArea.Top + 20) }); }