mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
406 lines
15 KiB
C#
406 lines
15 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Input;
|
|
using ProjectZ.Base;
|
|
using ProjectZ.InGame.Controls;
|
|
using ProjectZ.InGame.GameObjects.Base;
|
|
using ProjectZ.InGame.GameObjects.Base.Components;
|
|
using ProjectZ.InGame.GameObjects.Dungeon;
|
|
using ProjectZ.InGame.GameObjects.Things;
|
|
using ProjectZ.InGame.Map;
|
|
using ProjectZ.InGame.SaveLoad;
|
|
using ProjectZ.InGame.Things;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
|
|
namespace ProjectZ.InGame.Tests
|
|
{
|
|
public class MapTest
|
|
{
|
|
private Dictionary<string, int> _keyList = new Dictionary<string, int>();
|
|
|
|
private List<string> _doorSaveList = new List<string>();
|
|
private List<string> _doorList = new List<string>();
|
|
|
|
private List<string> _mapList = new List<string>();
|
|
private const int StartIndex = 5;
|
|
private int _currentMapIndex = StartIndex;
|
|
|
|
private Vector2 _cameraPosition;
|
|
|
|
private float _counter;
|
|
private float ChangeTime = 25;
|
|
|
|
private float DigTime = 500;
|
|
private bool _hasDug;
|
|
|
|
private float BombTime = 650;
|
|
private bool _hasBombed;
|
|
|
|
private float BallTime = 350;
|
|
private bool _hasSpawnedBalls;
|
|
|
|
private bool _isRunning;
|
|
private bool _paused = true;
|
|
|
|
public MapTest()
|
|
{
|
|
var mapPaths = Directory.GetFiles(Values.PathMapsFolder);
|
|
|
|
for (var i = 0; i < mapPaths.Length; i++)
|
|
{
|
|
if (mapPaths[i].EndsWith(".map") && !mapPaths[i].Contains("test map"))
|
|
{
|
|
_mapList.Add(mapPaths[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
_isRunning = true;
|
|
_counter = ChangeTime;
|
|
|
|
Game1.ScreenManager.ChangeScreen(Values.ScreenNameGame);
|
|
|
|
LoadMap(_mapList[_currentMapIndex]);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (InputHandler.KeyPressed(Keys.V))
|
|
SpawnCurrentTester();
|
|
if (InputHandler.KeyPressed(Keys.B))
|
|
SpawnBalls();
|
|
|
|
return;
|
|
|
|
if (!_isRunning)
|
|
{
|
|
if (Game1.FinishedLoading)
|
|
Start();
|
|
|
|
return;
|
|
}
|
|
|
|
if (InputHandler.KeyPressed(Keys.Space))
|
|
{
|
|
_paused = !_paused;
|
|
InputHandler.ResetInputState();
|
|
}
|
|
if (InputHandler.KeyPressed(Keys.D1))
|
|
{
|
|
_paused = true;
|
|
OffsetMap(-1);
|
|
}
|
|
if (InputHandler.KeyPressed(Keys.D2))
|
|
{
|
|
_paused = true;
|
|
OffsetMap(1);
|
|
}
|
|
|
|
var direction = ControlHandler.GetMoveVector2();
|
|
if (direction.Length() > 0)
|
|
{
|
|
_cameraPosition += direction * Game1.TimeMultiplier * 2.5f;
|
|
Game1.GameManager.MapManager.CurrentMap.CameraTarget = _cameraPosition;
|
|
MapManager.Camera.ForceUpdate(Game1.GameManager.MapManager.GetCameraTarget());
|
|
}
|
|
|
|
// close the textbox overlay
|
|
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
|
|
Game1.GameManager.InGameOverlay.TextboxOverlay.Init();
|
|
|
|
if (!_paused)
|
|
_counter -= Game1.DeltaTime;
|
|
|
|
|
|
//if (_counter < BombTime && !_hasBombed)
|
|
//{
|
|
// Bomb();
|
|
// DestroyStones();
|
|
// _hasBombed = true;
|
|
//}
|
|
|
|
//if (_counter < DigTime && !_hasDug)
|
|
//{
|
|
// Dig();
|
|
// _hasDug = true;
|
|
//}
|
|
|
|
//if (_counter < BallTime && !_hasSpawnedBalls)
|
|
//{
|
|
// SpawnBallsField();
|
|
// _hasSpawnedBalls = true;
|
|
//}
|
|
|
|
// change map?
|
|
if (_counter < 0)
|
|
{
|
|
_counter = ChangeTime;
|
|
_hasDug = false;
|
|
_hasBombed = false;
|
|
_hasSpawnedBalls = false;
|
|
|
|
if (!UpdateView())
|
|
OffsetMap(1);
|
|
}
|
|
}
|
|
|
|
private void OffsetMap(int offset)
|
|
{
|
|
_currentMapIndex = (_currentMapIndex + offset) % _mapList.Count;
|
|
if (_currentMapIndex < 0)
|
|
_currentMapIndex += _mapList.Count;
|
|
|
|
LoadMap(_mapList[_currentMapIndex]);
|
|
}
|
|
|
|
private bool UpdateView()
|
|
{
|
|
_cameraPosition.X += 160;
|
|
if (_cameraPosition.X > Game1.GameManager.MapManager.CurrentMap.MapWidth * Values.TileSize)
|
|
{
|
|
_cameraPosition.X = 80;
|
|
_cameraPosition.Y += 128;
|
|
}
|
|
|
|
if (_cameraPosition.Y - 64 > Game1.GameManager.MapManager.CurrentMap.MapHeight * Values.TileSize)
|
|
return false;
|
|
|
|
Game1.GameManager.MapManager.CurrentMap.CameraTarget = _cameraPosition;
|
|
MapManager.Camera.ForceUpdate(Game1.GameManager.MapManager.GetCameraTarget());
|
|
|
|
return true;
|
|
}
|
|
|
|
private void LoadMap(string path)
|
|
{
|
|
if (_currentMapIndex == StartIndex)
|
|
{
|
|
_keyList.Clear();
|
|
_doorSaveList.Clear();
|
|
_doorList.Clear();
|
|
}
|
|
|
|
var mapFileName = Path.GetFileName(path);
|
|
|
|
// load the map file
|
|
SaveLoadMap.LoadMap(mapFileName, Game1.GameManager.MapManager.NextMap);
|
|
|
|
// create the objects
|
|
Game1.GameManager.MapManager.NextMap.Objects.LoadObjects();
|
|
|
|
var oldMap = Game1.GameManager.MapManager.CurrentMap;
|
|
Game1.GameManager.MapManager.CurrentMap = Game1.GameManager.MapManager.NextMap;
|
|
Game1.GameManager.MapManager.NextMap = oldMap;
|
|
|
|
// center the camera
|
|
_cameraPosition = new Vector2(
|
|
80 + Game1.GameManager.MapManager.CurrentMap.MapOffsetX * Values.TileSize,
|
|
64 + Game1.GameManager.MapManager.CurrentMap.MapOffsetY * Values.TileSize);
|
|
Game1.GameManager.MapManager.CurrentMap.CameraTarget = _cameraPosition;
|
|
MapManager.Camera.ForceUpdate(Game1.GameManager.MapManager.GetCameraTarget());
|
|
|
|
//CheckMusic();
|
|
|
|
GetDoorList();
|
|
|
|
//CheckKeys();
|
|
}
|
|
|
|
private void GetDoorList()
|
|
{
|
|
var doors = new List<GameObject>();
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.GetObjectsOfType(doors, typeof(ObjDoor), 0, 0,
|
|
Game1.GameManager.MapManager.CurrentMap.MapWidth * Values.TileSize,
|
|
Game1.GameManager.MapManager.CurrentMap.MapHeight * Values.TileSize);
|
|
foreach (var door in doors)
|
|
{
|
|
var doorObj = ((ObjDoor)door);
|
|
if (doorObj._savePosition && doorObj._entryId != null)
|
|
{
|
|
_doorSaveList.Add(Game1.GameManager.MapManager.CurrentMap.MapName + " : " + doorObj._entryId);
|
|
}
|
|
if (!doorObj._savePosition && doorObj._entryId != null)
|
|
{
|
|
_doorList.Add(Game1.GameManager.MapManager.CurrentMap.MapName + " : " + doorObj._entryId);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Check if there are keys that are used in multiple cases
|
|
/// </summary>
|
|
private void CheckKeys()
|
|
{
|
|
var items = new List<GameObject>();
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.GetObjectsOfType(items, typeof(ObjItem), 0, 0,
|
|
Game1.GameManager.MapManager.CurrentMap.MapWidth * Values.TileSize,
|
|
Game1.GameManager.MapManager.CurrentMap.MapHeight * Values.TileSize);
|
|
foreach (var item in items)
|
|
{
|
|
var saveKey = ((ObjItem)item).SaveKey;
|
|
if (saveKey != null)
|
|
{
|
|
if (_keyList.ContainsKey(saveKey))
|
|
{
|
|
Debug.Assert(false);
|
|
_keyList[saveKey]++;
|
|
}
|
|
else
|
|
_keyList.Add(saveKey, 1);
|
|
}
|
|
}
|
|
|
|
var chests = new List<GameObject>();
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.GetObjectsOfType(chests, typeof(ObjChest), 0, 0,
|
|
Game1.GameManager.MapManager.CurrentMap.MapWidth * Values.TileSize,
|
|
Game1.GameManager.MapManager.CurrentMap.MapHeight * Values.TileSize);
|
|
foreach (var chest in chests)
|
|
{
|
|
var saveKey = ((ObjChest)chest).ItemKey;
|
|
if (saveKey != null)
|
|
{
|
|
if (_keyList.ContainsKey(saveKey))
|
|
{
|
|
Debug.Assert(false);
|
|
_keyList[saveKey]++;
|
|
}
|
|
else
|
|
_keyList.Add(saveKey, 1);
|
|
}
|
|
}
|
|
|
|
var barriers = new List<GameObject>();
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.GetObjectsOfType(barriers, typeof(ObjDestroyableBarrier), 0, 0,
|
|
Game1.GameManager.MapManager.CurrentMap.MapWidth * Values.TileSize,
|
|
Game1.GameManager.MapManager.CurrentMap.MapHeight * Values.TileSize);
|
|
foreach (var barrier in barriers)
|
|
{
|
|
var saveKey = ((ObjDestroyableBarrier)barrier).SaveKey;
|
|
if (saveKey != null)
|
|
{
|
|
if (_keyList.ContainsKey(saveKey))
|
|
{
|
|
Debug.Assert(false);
|
|
_keyList[saveKey]++;
|
|
}
|
|
else
|
|
_keyList.Add(saveKey, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void CheckMusic()
|
|
{
|
|
if (Game1.GameManager.MapManager.CurrentMap.MapMusic[0] == -1)
|
|
_paused = true;
|
|
}
|
|
|
|
private void SpawnBalls()
|
|
{
|
|
for (var i = 0; i < 100; i++)
|
|
{
|
|
var ball = new ObjTestObject(Game1.GameManager.MapManager.CurrentMap, (int)_cameraPosition.X, (int)_cameraPosition.Y);
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.SpawnObject(ball);
|
|
}
|
|
}
|
|
|
|
private void SpawnCurrentTester()
|
|
{
|
|
for (var y = -10; y < 10; y++)
|
|
for (var x = -10; x < 10; x++)
|
|
{
|
|
var posX = (int)(MapManager.ObjLink.EntityPosition.X / 16) * 16 + 8;
|
|
var posY = (int)(MapManager.ObjLink.EntityPosition.Y / 16) * 16 + 8;
|
|
var ball = new ObjWaterCurrentTester(Game1.GameManager.MapManager.CurrentMap, posX + x * 16, posY + y * 16);
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.SpawnObject(ball);
|
|
}
|
|
}
|
|
|
|
private void SpawnBallsField()
|
|
{
|
|
for (var y = 0; y < 8; y++)
|
|
{
|
|
for (var x = 0; x < 10; x++)
|
|
{
|
|
var ballPosition = new Vector2(
|
|
(int)(_cameraPosition.X - 80) + x * Values.TileSize + 8,
|
|
(int)(_cameraPosition.Y - 64) + y * Values.TileSize + 8);
|
|
|
|
Box box = Box.Empty;
|
|
if (!Game1.GameManager.MapManager.CurrentMap.Objects.Collision(
|
|
new Box(ballPosition.X - 2, ballPosition.Y - 2, 0, 4, 4, 8), Box.Empty, Values.CollisionTypes.Normal, 0, 0, ref box))
|
|
{
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
var ball = new ObjTestObject(Game1.GameManager.MapManager.CurrentMap, (int)ballPosition.X, (int)ballPosition.Y);
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.SpawnObject(ball);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Bomb()
|
|
{
|
|
for (var y = 0; y < 8; y++)
|
|
{
|
|
for (var x = 0; x < 10; x++)
|
|
{
|
|
var bombPosition = new Vector2(
|
|
(int)(_cameraPosition.X - 80) + x * Values.TileSize,
|
|
(int)(_cameraPosition.Y - 64) + y * Values.TileSize);
|
|
|
|
Game1.GameManager.MapManager.CurrentMap.Objects.Hit(MapManager.ObjLink, new Vector2(bombPosition.X + 8, bombPosition.Y + 8),
|
|
new Box(bombPosition.X, bombPosition.Y, 0, 16, 16, 16), HitType.Bomb, 2, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DestroyStones()
|
|
{
|
|
for (var y = 0; y < 8; y++)
|
|
{
|
|
for (var x = 0; x < 10; x++)
|
|
{
|
|
var position = new Vector2(
|
|
(int)(_cameraPosition.X - 80) + x * Values.TileSize,
|
|
(int)(_cameraPosition.Y - 64) + y * Values.TileSize);
|
|
|
|
var recInteraction = new RectangleF(position.X + 4, position.Y + 4, 8, 8);
|
|
|
|
// find an object to carry
|
|
var grabbedObject = Game1.GameManager.MapManager.CurrentMap.Objects.GetCarryableObjects(recInteraction);
|
|
if (grabbedObject != null)
|
|
{
|
|
var carriableComponent = grabbedObject.Components[CarriableComponent.Index] as CarriableComponent;
|
|
if (carriableComponent != null && carriableComponent.Owner is ObjStone)
|
|
{
|
|
carriableComponent.StartGrabbing?.Invoke();
|
|
carriableComponent.Throw?.Invoke(new Vector2(0, 0));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Dig()
|
|
{
|
|
for (var y = 0; y < 8; y++)
|
|
{
|
|
for (var x = 0; x < 10; x++)
|
|
{
|
|
var digPosition = new Point(
|
|
(int)(_cameraPosition.X - 80) / Values.TileSize + x,
|
|
(int)(_cameraPosition.Y - 64) / Values.TileSize + y);
|
|
|
|
if (Game1.GameManager.MapManager.CurrentMap.CanDig(digPosition))
|
|
Game1.GameManager.MapManager.CurrentMap.Dig(digPosition, new Vector2(digPosition.X, digPosition.Y + 8), 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|