public void Update(float delta) { if (nextSingle == null) { nextSingle = new ModuleLink(fortress.CreateModule(registry.One[random.Next(registry.One.Length)]), 0, 0); } if (nextScaffold == null) { nextScaffold = new ModuleLink(fortress.CreateModule(registry.Two[random.Next(registry.Two.Length)]), 0, 0); } if (nextTriple == null) { nextTriple = new ModuleLink(fortress.CreateModule(registry.Three[random.Next(registry.Three.Length)]), 0, 0); } if (nextQuadruple == null) { nextQuadruple = new ModuleLink(fortress.CreateModule(registry.Four[random.Next(registry.Four.Length)]), 0, 0); } Vector2f targetPosition = (new Vector2f(game.RenderTarget.GetView().Left() + game.RenderTarget.GetView().Size.X / 5f, game.RenderTarget.GetView().Size.Y - 64f) - new Vector2f(nextSingle.Right - nextSingle.Left, nextSingle.Bottom - nextSingle.Top) * 8f); if (cash < 25) { targetPosition.Y += 100f; } singlePosition += (targetPosition - singlePosition) * 10f * delta; targetPosition = (new Vector2f(game.RenderTarget.GetView().Left() + game.RenderTarget.GetView().Size.X * 2f / 5f, game.RenderTarget.GetView().Size.Y - 64f) - new Vector2f(nextScaffold.Right - nextScaffold.Left, nextScaffold.Bottom - nextScaffold.Top) * 8f); if (cash < 50) { targetPosition.Y += 100f; } scaffoldPosition += (targetPosition - scaffoldPosition) * 10f * delta; targetPosition = (new Vector2f(game.RenderTarget.GetView().Left() + game.RenderTarget.GetView().Size.X * 3f / 5f, game.RenderTarget.GetView().Size.Y - 64f) - new Vector2f(nextTriple.Right - nextTriple.Left, nextTriple.Bottom - nextTriple.Top) * 8f); if (cash < 100) { targetPosition.Y += 100f; } triplePosition += (targetPosition - triplePosition) * 10f * delta; targetPosition = (new Vector2f(game.RenderTarget.GetView().Left() + game.RenderTarget.GetView().Size.X * 4f / 5f, game.RenderTarget.GetView().Size.Y - 64f) - new Vector2f(nextQuadruple.Right - nextQuadruple.Left, nextQuadruple.Bottom - nextQuadruple.Top) * 8f); if (cash < 200) { targetPosition.Y += 100f; } quadruplePosition += (targetPosition - quadruplePosition) * 10f * delta; singleText.Position = singlePosition.Round() - new Vector2f(singleText.GetLocalBounds().Width / 2f, 16f); scaffoldText.Position = scaffoldPosition.Round() - new Vector2f(singleText.GetLocalBounds().Width / 2f, 16f); tripleText.Position = triplePosition.Round() - new Vector2f(singleText.GetLocalBounds().Width / 2f, 16f); quadrupleText.Position = quadruplePosition.Round() - new Vector2f(singleText.GetLocalBounds().Width / 2f, 16f); if (shakeTimer > 0f) { shakeTimer -= delta; shake.X += shakeDirection * delta; if (shake.X >= 4f) { shakeDirection = -200f; } if (shake.X <= -4f) { shakeDirection = 200f; } } else { shake = new Vector2f(0f, 0f); } if (flashTimer > 0f) { flashTimer -= delta; } View view = game.RenderTarget.GetView(); view.Center = fortress.Position + new Vector2f(fortress.Width + 0.5f, fortress.Height + 0.5f) * 8f + new Vector2f((float)Math.Round(shake.X), (float)Math.Round(shake.Y)); game.RenderTarget.SetView(view); if (heldModule == null && !paused) { timer += delta; obstacleTimer += delta; if (obstacleTimer > obstacleTime) { obstacleTimer -= obstacleTime; obstacleTime *= 0.99f; obstacleTime = Math.Max(obstacleTime, 0.5f); obstacleSpeed += 1; obstacleSpeed = Math.Min(obstacleSpeed, 100); bool horizontal = random.Next(2) == 0; bool positive = random.Next(2) == 0; Vector2f position = new Vector2f(horizontal ? (positive ? game.RenderTarget.GetView().Left() - 48f : game.RenderTarget.GetView().Right() + 48f) : game.RenderTarget.GetView().Left() + (float)(game.RenderTarget.GetView().Size.X *random.NextDouble()), !horizontal ? (positive ? game.RenderTarget.GetView().Top() - 48f : game.RenderTarget.GetView().Bottom() + 48f) : game.RenderTarget.GetView().Top() + (float)(game.RenderTarget.GetView().Size.Y *random.NextDouble())); if (position.X > fortress.Width * 16f / 2f - 48f && position.X <= fortress.Width * 16f / 2f) { position.X = fortress.Width * 16f / 2f - 48f; } if (position.X < fortress.Width * 16f / 2f + 32f && position.X >= fortress.Width * 16f / 2f) { position.X = fortress.Width * 16f / 2f + 32f; } if (position.Y > fortress.Height * 16f / 2f - 48f && position.Y <= fortress.Height * 16f / 2f) { position.Y = fortress.Height * 16f / 2f - 48f; } if (position.Y < fortress.Height * 16f / 2f + 32f && position.Y >= fortress.Height * 16f / 2f) { position.Y = fortress.Height * 16f / 2f + 32f; } Vector2f velocity = new Vector2f(horizontal ? (positive ? random.Next(10, obstacleSpeed) : -random.Next(10, obstacleSpeed)) : 0f, !horizontal ? (positive ? random.Next(10, obstacleSpeed) : -random.Next(10, obstacleSpeed)) : 0f); //if (horizontal) //{ // if (position.Y < fortress.Height * 16f / 2f) // velocity.Y -= random.Next(obstacleSpeed); // else // velocity.Y += random.Next(obstacleSpeed); //} //else //{ // if (position.X < fortress.Width * 16f / 2f) // velocity.X -= random.Next(obstacleSpeed); // else // velocity.X += random.Next(obstacleSpeed); //} string texture = "Data/Textures/"; int width = 2; int height = 2; switch (random.Next(4)) { case 0: texture += "junk_barrel"; break; case 1: texture += "junk_doohicky"; break; case 2: texture += "junk_plate"; break; case 3: texture += "junk_large_plate"; width = 3; height = 3; break; } projectiles.Add(new Projectile(position, velocity, game.Textures.Load(texture += ".png"), game.Palette, 1, 1, width, height, fortress)); } foreach (Projectile projectile in projectiles) { projectile.Update(delta); if (projectile.Destroyed()) { shakeTimer = 0.2f; flashTimer = 0.1f; explosion.Play(); } } refreshTimer += delta; if (refreshTimer >= 0.5f) { refreshTimer -= 0.5f; foreach (IModule module in fortress) { cash += module.Income; } } paymentTimer -= delta; if (paymentTimer <= 0f) { paymentTimer = 10f; cash -= paymentAmount; paymentAmount += 100; flashTimer = 0.1f; if (cash >= -100) { payment.Play(); } else { game.Screens.Remove <GameScreen>(); game.Screens.Add(new LoseScreen(game, timer)); explosion.Play(); loop.Stop(); } } } text.DisplayedString = "Cash: $" + cash + "b"; text2.DisplayedString = "Next Payment ($" + paymentAmount + "b): " + Math.Round(paymentTimer) + "s"; float particleDelta = (heldModule != null || paused) ? delta / 64f : delta; particleTimer += particleDelta; while (particleTimer >= 0.01f) { particleTimer -= 0.01f; Sprite particle = new Sprite(game.Textures.Load("Data/Textures/palette.png"), new IntRect(random.Next(1, 4), 0, 1, 1)); particle.Position = game.RenderTarget.GetView().TopLeft() + new Vector2f(game.RenderTarget.GetView().Size.X, (float)(random.NextDouble() * game.RenderTarget.Size.Y)); particle.Color = game.Palette; particles.Add(particle); } for (int i = 0; i < particles.Count; i++) { particles[i].Position += new Vector2f(-FallSpeed * particleDelta, 0f); if (particles[i].Position.X < game.RenderTarget.GetView().Left()) { particles.RemoveAt(i); i--; } } if (borderDelay > 0f) { borderDelay -= delta; } if (game.Buttons["left_click"].JustHeld) { if (heldModule != null) { Vector2i mousePosition = Mouse.GetPosition(game.Window); Vector2f gamePosition = game.RenderTarget.MapPixelToCoords(mousePosition / 2); Vector2i modulePosition = new Vector2i((int)Math.Round((gamePosition.X + heldModuleOffset.X) / 16f), (int)Math.Round((gamePosition.Y + heldModuleOffset.Y) / 16f)); while (modulePosition.X + heldModule.Left <= 0) { modulePosition.X++; } while (modulePosition.X + heldModule.Right >= fortress.Width) { modulePosition.X--; } while (modulePosition.Y + heldModule.Top <= 0) { modulePosition.Y++; } while (modulePosition.Y + heldModule.Bottom >= fortress.Height) { modulePosition.Y--; } if (heldModule.Add(fortress, modulePosition.X, modulePosition.Y)) { if (fortress.ConnectedToSource(heldModule.Module)) { heldModule = null; place.Play(); } else { heldModule.Remove(fortress); } } } else { Vector2i mousePosition = Mouse.GetPosition(game.Window); Vector2f gamePosition = game.RenderTarget.MapPixelToCoords(mousePosition / 2); Vector2i targetPosition2 = new Vector2i((int)(gamePosition.X / 16f), (int)(gamePosition.Y / 16f)); if (targetPosition2.X > 0 && targetPosition2.Y > 0 && targetPosition2.X < fortress.Width - 1 && targetPosition2.Y < fortress.Height - 1) { IModule target = fortress[targetPosition2.X, targetPosition2.Y]; if (target != null && target != fortress.Source) { targetPosition2 = fortress.GetPosition(target); heldModule = fortress.RemoveChain(target); heldModuleOffset = new Vector2f(targetPosition2.X, targetPosition2.Y) * 16f - gamePosition; heldModulePosition = heldModuleOffset + gamePosition; pickup.Play(); } } } } if (game.Buttons["pause"].JustHeld) { paused = !paused; if (paused) { pause.Play(); } else { play.Play(); } } if (heldModule == null) { if (game.Buttons["1"].JustHeld) { if (cash >= 25) { heldModule = nextSingle; nextSingle = null; heldModulePosition = singlePosition; singlePosition = new Vector2f(game.RenderTarget.GetView().Center.X - 8f, game.RenderTarget.GetView().Bottom() + 16f); cash -= 25; } else { nope.Play(); } } else if (game.Buttons["2"].JustHeld) { if (cash >= 50) { heldModule = nextScaffold; nextScaffold = null; heldModulePosition = scaffoldPosition; scaffoldPosition = new Vector2f(game.RenderTarget.GetView().Center.X - 8f, game.RenderTarget.GetView().Bottom() + 16f); cash -= 50; } else { nope.Play(); } } else if (game.Buttons["3"].JustHeld) { if (cash >= 100) { heldModule = nextTriple; nextTriple = null; heldModulePosition = triplePosition; triplePosition = new Vector2f(game.RenderTarget.GetView().Center.X - 8f, game.RenderTarget.GetView().Bottom() + 16f); cash -= 100; } else { nope.Play(); } } else if (game.Buttons["4"].JustHeld) { if (cash >= 200) { heldModule = nextQuadruple; nextQuadruple = null; heldModulePosition = quadruplePosition; quadruplePosition = new Vector2f(game.RenderTarget.GetView().Center.X - 8f, game.RenderTarget.GetView().Bottom() + 16f); cash -= 200; } else { nope.Play(); } } if (heldModule != null) { heldModuleOffset = new Vector2f(-(heldModule.Right - heldModule.Left) * 16f / 2f, (heldModule.Top - heldModule.Bottom) * 16f / 2f); borderDelay = 0.2f; buy.Play(); } } if (heldModule != null) { Vector2i mousePosition = Mouse.GetPosition(game.Window); Vector2f gamePosition = game.RenderTarget.MapPixelToCoords(mousePosition / 2); Vector2f modulePosition = gamePosition + heldModuleOffset; modulePosition.X = (float)Math.Round(modulePosition.X / 16f); modulePosition.Y = (float)Math.Round(modulePosition.Y / 16f); while (modulePosition.X + heldModule.Left <= 0) { modulePosition.X++; } while (modulePosition.X + heldModule.Right >= fortress.Width) { modulePosition.X--; } while (modulePosition.Y + heldModule.Top <= 0) { modulePosition.Y++; } while (modulePosition.Y + heldModule.Bottom >= fortress.Height) { modulePosition.Y--; } modulePosition *= 16f; heldModulePosition += (modulePosition - heldModulePosition) * 20f * delta; } }