LADXHD/InGame/GameObjects/Things/ObjBridge.cs
2023-12-14 17:21:22 -05:00

118 lines
4.3 KiB
C#

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.GameObjects.NPCs;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
class ObjBridge : GameObject
{
private readonly Rectangle _sourceRectangle;
private readonly ObjMonkeyWorker[] _workers = new ObjMonkeyWorker[7];
private float _counter;
private const float Segment1Time = 5000;
private const float Segment2Time = Segment3Time + 1000;
private const float Segment3Time = Segment1Time + 1000;
private const float FinishedTime = Segment3Time + 1500;
private bool _isRunning;
private bool _spawnedMonkeys;
public ObjBridge() : base("bridge") { }
public ObjBridge(Map.Map map, int posX, int posY) : base(map)
{
_sourceRectangle = Resources.SourceRectangle("bridge");
EntityPosition = new CPosition(posX, posY + 48, 0);
EntitySize = new Rectangle(0, -48, 16, 48);
var value = Game1.GameManager.SaveManager.GetString("monkeyBusiness");
var finished = value == "3";
AddComponent(DrawComponent.Index, new DrawComponent(Draw, Values.LayerBottom, EntityPosition));
if (finished)
{
// make sure that the stick is there if it was not already collected
SpawnStick();
_counter = FinishedTime;
return;
}
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(KeyChangeListenerComponent.Index, new KeyChangeListenerComponent(KeyChanged));
// create the workers
for (var i = 0; i < _workers.Length; i++)
{
var randomDir = (Game1.RandomNumber.Next(0, 50) / 50.0f) * MathF.PI * 2;
var startPosition = new Vector2(EntityPosition.X + 8, EntityPosition.Y - 24) +
new Vector2(MathF.Sin(randomDir), MathF.Cos(randomDir)) * 150;
var workPosition = new Vector2(EntityPosition.X + 8, EntityPosition.Y - 36 * (i / 6.0f));
_workers[i] = new ObjMonkeyWorker(map, startPosition, workPosition, startPosition);
}
}
private void KeyChanged()
{
var value = Game1.GameManager.SaveManager.GetString("monkeyBusiness");
if (!_spawnedMonkeys && value == "2")
{
_isRunning = true;
_spawnedMonkeys = true;
for (var i = 0; i < _workers.Length; i++)
Map.Objects.SpawnObject(_workers[i]);
}
}
private void SpawnStick()
{
// spawn the stick
var objStick = new ObjItem(Map, (int)EntityPosition.X, (int)EntityPosition.Y - 32, "", "ow_trade4", "trade4", null);
if (!objStick.IsDead)
Map.Objects.SpawnObject(objStick);
}
private void Update()
{
if (!_isRunning)
return;
_counter += Game1.DeltaTime;
if (_counter > FinishedTime)
{
_isRunning = false;
Game1.GameManager.StartDialogPath("castle_monkey_business");
SpawnStick();
for (var i = 0; i < _workers.Length; i++)
{
_workers[i].ToLeave();
}
}
}
private void Draw(SpriteBatch spriteBatch)
{
// draw the segments of the bridge
if (_counter > Segment1Time)
spriteBatch.Draw(Resources.SprObjects, new Vector2(EntityPosition.X, EntityPosition.Y - 48), _sourceRectangle, Color.White);
if (_counter > Segment2Time)
spriteBatch.Draw(Resources.SprObjects, new Vector2(EntityPosition.X, EntityPosition.Y - 32), _sourceRectangle, Color.White);
if (_counter > Segment3Time)
spriteBatch.Draw(Resources.SprObjects, new Vector2(EntityPosition.X, EntityPosition.Y - 16), _sourceRectangle, Color.White);
}
}
}