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

98 lines
3.7 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Things
{
internal class ObjStoneSpawner : GameObject
{
private readonly ObjSprite[] _objSprites = new ObjSprite[4];
private readonly DictAtlasEntry[] _stoneRectangleSource = new DictAtlasEntry[2];
private bool _isActive = true;
public override bool IsActive
{
set
{
for (var i = 0; i < _objSprites.Length; i++)
_objSprites[i].IsActive = value;
_isActive = value;
}
get => _isActive;
}
private bool _hidden;
public bool Hidden
{
set
{
for (var i = 0; i < _objSprites.Length; i++)
_objSprites[i].IsActive = !value;
_hidden = value;
}
get => _hidden;
}
private int _holeX;
private int _holeY;
public ObjStoneSpawner() : base("small_stones") { }
public ObjStoneSpawner(Map.Map map, int posX, int posY) : base(map)
{
_stoneRectangleSource[0] = Resources.GetSprite("small_stone_0");
_stoneRectangleSource[1] = Resources.GetSprite("small_stone_1");
EntityPosition = new CPosition(posX, posY, 0);
EntitySize = new Rectangle(0, 0, 16, 16);
_holeX = posX / 16;
_holeY = posY / 16;
var position = new Point(posX, posY);
// spawn the four stones
// set the placement of the stones depending on the position of the spawner
var stoneCount = (position.X + position.Y) / (Values.TileSize * 2) % 2 * 2 + 1;
for (var i = 0; i < 4; i++)
{
// ...
var stoneIndex = (stoneCount & 0b10) >> 1;
stoneCount++;
var fieldX = i % 2 * 8;
var fieldY = i / 2 * 8;
// deterministic offset of the stones depending on the position of the stone
// i really do not know if this is a good way of doing this...
var offsetIndex = (position.X + position.Y) / 8 + i;
var offsetX = offsetIndex % (8 - _stoneRectangleSource[stoneIndex].SourceRectangle.Width);
var offsetY = offsetIndex % (8 - _stoneRectangleSource[stoneIndex].SourceRectangle.Height);
var stonePosition = new Vector2(fieldX + offsetX, fieldY + offsetY);
var centerX = (int)(_stoneRectangleSource[stoneIndex].ScaledRectangle.Width / 2);
var strStoneSprite = "small_stone_" + stoneIndex;
_objSprites[i] = new ObjSprite(Map,
position.X + (int)stonePosition.X + centerX, position.Y + 5 + (int)stonePosition.Y,
strStoneSprite, Vector2.Zero, Values.LayerPlayer, strStoneSprite);
Map.Objects.SpawnObject(_objSprites[i]);
}
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
}
private void Update()
{
// hide rocks when there has been dug at the tile
if (!Hidden && Map.HoleMap != null &&
Map.HoleMap.ArrayTileMap[_holeX, _holeY, 0] != -1)
Hidden = true;
if (Hidden && Map.HoleMap != null &&
Map.HoleMap.ArrayTileMap[_holeX, _holeY, 0] == -1)
Hidden = false;
}
}
}