Monster som inte dyker upp förren runda X

This almost looks like a game now!
This commit is contained in:
Niklas Ulf Anders Cullberg
2012-10-31 12:00:55 +01:00
parent 1c7c8b600d
commit 3106c0ea63
6 changed files with 835 additions and 801 deletions
+256 -256
View File
@@ -1,256 +1,256 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using DepthsBelow.GUI; using DepthsBelow.GUI;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media; using Microsoft.Xna.Framework.Media;
namespace DepthsBelow namespace DepthsBelow
{ {
/// <summary> /// <summary>
/// This is the main type for your game /// This is the main type for your game
/// </summary> /// </summary>
public class Core : Microsoft.Xna.Framework.Game public class Core : Microsoft.Xna.Framework.Game
{ {
public static GraphicsDeviceManager GraphicsDeviceManager; public static GraphicsDeviceManager GraphicsDeviceManager;
private SpriteBatch spriteBatch; private SpriteBatch spriteBatch;
private Effect lightShader; private Effect lightShader;
private RenderTarget2D lightRenderTarget; private RenderTarget2D lightRenderTarget;
private RenderTarget2D sceneRenderTarget; private RenderTarget2D sceneRenderTarget;
public Lua Lua; public Lua Lua;
public TurnManager TurnManager; public TurnManager TurnManager;
public Camera Camera; public Camera Camera;
public Interface Interface; public Interface Interface;
public/* static*/ MouseInput MouseInput; public/* static*/ MouseInput MouseInput;
public static KeyboardInput KeyboardInput; public static KeyboardInput KeyboardInput;
public List<Soldier> Squad; public List<Soldier> Squad;
public DynamicGroupManager GroupManager; public DynamicGroupManager GroupManager;
public List<SmallEnemy> Swarm; public List<SmallEnemy> Swarm;
public List<Shot> Volley; public List<Shot> Volley;
public List<MonsterSpawn> Spawn; public List<MonsterSpawn> Spawn;
public static Map Map; public static Map Map;
public SmallEnemy TestMonster; public SmallEnemy TestMonster;
public int Brightness = 30; public int Brightness = 30;
public Core() public Core()
{ {
GraphicsDeviceManager = new GraphicsDeviceManager(this); GraphicsDeviceManager = new GraphicsDeviceManager(this);
GraphicsDeviceManager.PreferredBackBufferWidth = 1280; GraphicsDeviceManager.PreferredBackBufferWidth = 1280;
GraphicsDeviceManager.PreferredBackBufferHeight = 720; GraphicsDeviceManager.PreferredBackBufferHeight = 720;
GraphicsDeviceManager.IsFullScreen = false; GraphicsDeviceManager.IsFullScreen = false;
//graphics.SynchronizeWithVerticalRetrace = false; //graphics.SynchronizeWithVerticalRetrace = false;
GraphicsDeviceManager.ApplyChanges(); GraphicsDeviceManager.ApplyChanges();
this.IsFixedTimeStep = false; this.IsFixedTimeStep = false;
this.IsMouseVisible = true; this.IsMouseVisible = true;
Content.RootDirectory = "Content"; Content.RootDirectory = "Content";
} }
/// <summary> /// <summary>
/// Allows the game to perform any initialization it needs to before starting to run. /// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic /// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components /// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well. /// and initialize them as well.
/// </summary> /// </summary>
protected override void Initialize() protected override void Initialize()
{ {
GameServices.AddService<GraphicsDevice>(GraphicsDevice); GameServices.AddService<GraphicsDevice>(GraphicsDevice);
GameServices.AddService<ContentManager>(Content); GameServices.AddService<ContentManager>(Content);
Lua = new Lua(); Lua = new Lua();
TurnManager = new TurnManager(new string[] { "Player", "Computer" }); TurnManager = new TurnManager(new string[] { "Player", "Computer" });
Camera = new Camera(this); Camera = new Camera(this);
Interface = new Interface(this); Interface = new Interface(this);
Squad = new List<Soldier>(); Squad = new List<Soldier>();
Swarm = new List<SmallEnemy>(); Swarm = new List<SmallEnemy>();
Volley = new List<Shot>(); Volley = new List<Shot>();
Spawn = new List<MonsterSpawn>(); Spawn = new List<MonsterSpawn>();
base.Initialize(); base.Initialize();
} }
/// <summary> /// <summary>
/// LoadContent will be called once per game and is the place to load /// LoadContent will be called once per game and is the place to load
/// all of your content. /// all of your content.
/// </summary> /// </summary>
protected override void LoadContent() protected override void LoadContent()
{ {
// Create a new SpriteBatch, which can be used to draw textures. // Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice); spriteBatch = new SpriteBatch(GraphicsDevice);
lightShader = Content.Load<Effect>("shaders/LightEffect"); lightShader = Content.Load<Effect>("shaders/LightEffect");
lightRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents); lightRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);
sceneRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height); sceneRenderTarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
Map = Content.Load<Map>("maps/prototyp"); Map = Content.Load<Map>("maps/prototyp");
//Map = Content.Load<Map>("maps/Aztek.Test"); //Map = Content.Load<Map>("maps/Aztek.Test");
//Map = Content.Load<Map>("maps/Cave.Level1"); //Map = Content.Load<Map>("maps/Cave.Level1");
// Load map objects // Load map objects
Map.ParseObjects(this); Map.ParseObjects(this);
Squad[0].Name = "Dean H. Jones"; Squad[0].Name = "Dean H. Jones";
Squad[1].Name = "Walter L. Verville"; Squad[1].Name = "Walter L. Verville";
Squad[2].Name = "Patrick Y. Southerland"; Squad[2].Name = "Patrick Y. Southerland";
Squad[3].Name = "Andrew C. Friend"; Squad[3].Name = "Andrew C. Friend";
Squad[4].Name = "Gary B. Whitley"; Squad[4].Name = "Gary B. Whitley";
// Center the camera on a unit // Center the camera on a unit
Camera.Position = Squad[0].Transform.World.Position * -1 + new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); Camera.Position = Squad[0].Transform.World.Position * -1 + new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2);
GroupManager = new DynamicGroupManager(Squad.Cast<Entity>().ToList(), (float)Grid.TileSize * 1.5f); GroupManager = new DynamicGroupManager(Squad.Cast<Entity>().ToList(), (float)Grid.TileSize * 1.5f);
Interface.CreateUnitFrames(Squad); Interface.CreateUnitFrames(Squad);
// TODO: use this.Content to load your game content here // TODO: use this.Content to load your game content here
Soldier.LoadContent(); Soldier.LoadContent();
SmallEnemy.LoadContent(); SmallEnemy.LoadContent();
//Shot.LoadContent(); //Shot.LoadContent();
MouseInput = new MouseInput(this); MouseInput = new MouseInput(this);
MouseInput.LoadContent(); MouseInput.LoadContent();
KeyboardInput = new KeyboardInput(this); KeyboardInput = new KeyboardInput(this);
TestMonster = new SmallEnemy(ref Swarm); TestMonster = new SmallEnemy(ref Swarm);
TestMonster.X = 12; TestMonster.X = 12;
TestMonster.Y = 4; TestMonster.Y = 4;
Swarm.Add(TestMonster); Swarm.Add(TestMonster);
// Load Lua scripts after everything is created // Load Lua scripts after everything is created
Lua.LoadScripts(); Lua.LoadScripts();
} }
/// <summary> /// <summary>
/// UnloadContent will be called once per game and is the place to unload /// UnloadContent will be called once per game and is the place to unload
/// all content. /// all content.
/// </summary> /// </summary>
protected override void UnloadContent() protected override void UnloadContent()
{ {
// TODO: Unload any non ContentManager content here // TODO: Unload any non ContentManager content here
} }
/// <summary> /// <summary>
/// Allows the game to run logic such as updating the world, /// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio. /// checking for collisions, gathering input, and playing audio.
/// </summary> /// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param> /// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime) protected override void Update(GameTime gameTime)
{ {
// Allows the game to exit // Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit(); this.Exit();
Camera.Update(gameTime); Camera.Update(gameTime);
MouseInput.Update(gameTime); MouseInput.Update(gameTime);
KeyboardInput.Update(gameTime); KeyboardInput.Update(gameTime);
EntityManager.Update(gameTime); EntityManager.Update(gameTime);
Interface.Update(gameTime); Interface.Update(gameTime);
GUIManager.Update(gameTime); GUIManager.Update(gameTime);
base.Update(gameTime); base.Update(gameTime);
} }
/// <summary> /// <summary>
/// This is called when the game should draw itself. /// This is called when the game should draw itself.
/// </summary> /// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param> /// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime) protected override void Draw(GameTime gameTime)
{ {
MouseState ms = Mouse.GetState(); MouseState ms = Mouse.GetState();
// Draw to the lighting render target // Draw to the lighting render target
GraphicsDevice.SetRenderTarget(lightRenderTarget); GraphicsDevice.SetRenderTarget(lightRenderTarget);
GraphicsDevice.Clear(new Color(Brightness, Brightness, Brightness)); GraphicsDevice.Clear(new Color(Brightness, Brightness, Brightness));
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, null, null, null, spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, null, null, null,
Camera.Transform); Camera.Transform);
// Draw flashlights // Draw flashlights
foreach (var light in EntityManager.GetComponents<Component.Flashlight>()) foreach (var light in EntityManager.GetComponents<Component.Flashlight>())
light.Draw(spriteBatch); light.Draw(spriteBatch);
spriteBatch.End(); spriteBatch.End();
GraphicsDevice.SetRenderTarget(null); GraphicsDevice.SetRenderTarget(null);
// Draw the scene to a render target // Draw the scene to a render target
GraphicsDevice.SetRenderTarget(sceneRenderTarget); GraphicsDevice.SetRenderTarget(sceneRenderTarget);
GraphicsDevice.Clear(Color.Black); GraphicsDevice.Clear(Color.Black);
// Start drawing using the Camera transform // Start drawing using the Camera transform
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null,
Camera.Transform); Camera.Transform);
// Draw the level // Draw the level
Map.Draw(spriteBatch); Map.Draw(spriteBatch);
// Draw entities // Draw entities
foreach (var spriteRenderer in EntityManager.GetComponents<Component.SpriteRenderer>()) foreach (var spriteRenderer in EntityManager.GetComponents<Component.SpriteRenderer>())
{ {
// Only render illuminated entities // Only render illuminated entities
var position = Camera.WorldToScreen(spriteRenderer.Parent.Transform.World + spriteRenderer.Parent.Transform.World.Origin); var position = Camera.WorldToScreen(spriteRenderer.Parent.Transform.World + spriteRenderer.Parent.Transform.World.Origin);
var sourceRect = new Rectangle((int)position.X, (int)position.Y, 1, 1); var sourceRect = new Rectangle((int)position.X, (int)position.Y, 1, 1);
if ( if (
sourceRect.X >= 0 sourceRect.X >= 0
&& sourceRect.Y >= 0 && sourceRect.Y >= 0
&& sourceRect.X < lightRenderTarget.Width && sourceRect.X < lightRenderTarget.Width
&& sourceRect.Y < lightRenderTarget.Height && sourceRect.Y < lightRenderTarget.Height
) )
{ {
var lightData = new Color[1]; var lightData = new Color[1];
lightRenderTarget.GetData<Color>(0, sourceRect, lightData, 0, 1); lightRenderTarget.GetData<Color>(0, sourceRect, lightData, 0, 1);
if (lightData[0] != new Color(Brightness, Brightness, Brightness)) if (lightData[0] != new Color(Brightness, Brightness, Brightness))
spriteRenderer.Draw(spriteBatch); spriteRenderer.Draw(spriteBatch);
} }
} }
#if DEBUG /*#if DEBUG
var debugTexture = new Texture2D(GraphicsDevice, 1, 1); var debugTexture = new Texture2D(GraphicsDevice, 1, 1);
debugTexture.SetData(new Color[] { Color.White }); debugTexture.SetData(new Color[] { Color.White });
foreach (var collisionComponent in EntityManager.GetComponents<Component.Collision>()) foreach (var collisionComponent in EntityManager.GetComponents<Component.Collision>())
{ {
spriteBatch.Draw(debugTexture, collisionComponent.Rectangle, Color.Red * 0.5f); spriteBatch.Draw(debugTexture, collisionComponent.Rectangle, Color.Red * 0.5f);
} }
#endif #endif*/
// Draw mouse input visuals // Draw mouse input visuals
MouseInput.Draw(spriteBatch); MouseInput.Draw(spriteBatch);
spriteBatch.End(); spriteBatch.End();
GraphicsDevice.SetRenderTarget(null); GraphicsDevice.SetRenderTarget(null);
// Draw the scene from the render target with the light shader // Draw the scene from the render target with the light shader
lightShader.Parameters["LightsTexture"].SetValue(lightRenderTarget); lightShader.Parameters["LightsTexture"].SetValue(lightRenderTarget);
lightShader.CurrentTechnique.Passes[0].Apply(); lightShader.CurrentTechnique.Passes[0].Apply();
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, null, null, lightShader, spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, null, null, lightShader,
Matrix.Identity); Matrix.Identity);
spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White); spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White);
spriteBatch.End(); spriteBatch.End();
// Draw GUI components // Draw GUI components
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.AnisotropicClamp, null, null, null, Matrix.Identity); spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.AnisotropicClamp, null, null, null, Matrix.Identity);
GUIManager.Draw(spriteBatch); GUIManager.Draw(spriteBatch);
spriteBatch.End(); spriteBatch.End();
base.Draw(gameTime); base.Draw(gameTime);
} }
} }
} }
+197 -181
View File
@@ -1,181 +1,197 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
namespace DepthsBelow namespace DepthsBelow
{ {
public class MapTile public class MapTile
{ {
public int LocalId; public int LocalId;
public Texture2D Texture; public Texture2D Texture;
public Rectangle SourceRectangle; public Rectangle SourceRectangle;
public SpriteEffects SpriteEffects; public SpriteEffects SpriteEffects;
} }
public enum MapObjectType : byte public enum MapObjectType : byte
{ {
Plain, Plain,
Tile, Tile,
Polygon, Polygon,
Polyline Polyline
} }
public class MapObject public class MapObject
{ {
//public MapObjectType ObjectType; //public MapObjectType ObjectType;
public string Name; public string Name;
public string Type; public string Type;
public Rectangle Bounds; public Rectangle Bounds;
public List<Vector2> Points; public List<Vector2> Points;
} }
public class MapLayer public class MapLayer
{ {
public int Width; public int Width;
public int Height; public int Height;
public string Name; public string Name;
} }
public class MapTileLayer : MapLayer public class MapTileLayer : MapLayer
{ {
public MapTile[] Tiles; public MapTile[] Tiles;
} }
public class MapObjectLayer : MapLayer public class MapObjectLayer : MapLayer
{ {
public MapObject[] Objects; public MapObject[] Objects;
} }
public class Map public class Map
{ {
public int TileWidth; public int TileWidth;
public int TileHeight; public int TileHeight;
public List<MapLayer> Layers = new List<MapLayer>(); public List<MapLayer> Layers = new List<MapLayer>();
public Map() public Map()
{ {
} }
public void ParseObjects(Core core) public void ParseObjects(Core core)
{ {
foreach (var layer in Layers) foreach (var layer in Layers)
{ {
var objectLayer = layer as MapObjectLayer; var objectLayer = layer as MapObjectLayer;
if (objectLayer == null) if (objectLayer == null)
continue; continue;
foreach (var mapObject in objectLayer.Objects) foreach (var mapObject in objectLayer.Objects)
{ {
if (mapObject.Type == "SquadStart") if (mapObject.Type == "SquadStart")
{ {
var soldier = new Soldier(ref core.Squad); var soldier = new Soldier(ref core.Squad);
soldier.Name = "Derp"; soldier.Name = "Derp";
// HACK: For some reason, the tile object coordinates are offset by one tile on the Y-axis in the Tiled map file (https://github.com/bjorn/tiled/issues/91) // HACK: For some reason, the tile object coordinates are offset by one tile on the Y-axis in the Tiled map file (https://github.com/bjorn/tiled/issues/91)
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
soldier.X = mapObjectGridPos.X; soldier.X = mapObjectGridPos.X;
soldier.Y = mapObjectGridPos.Y; soldier.Y = mapObjectGridPos.Y;
core.Squad.Add(soldier); core.Squad.Add(soldier);
} }
if (mapObject.Type == "MonsterSpawn") if (mapObject.Type == "MonsterSpawn" || mapObject.Type == "EnemySpawn")
{ {
var enemy = new MonsterSpawn("Monster", ref core.Swarm); var enemy = new MonsterSpawn("Monster", 14, 0, ref core.Swarm);
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
enemy.X = mapObjectGridPos.X; enemy.X = mapObjectGridPos.X;
enemy.Y = mapObjectGridPos.Y; enemy.Y = mapObjectGridPos.Y;
} }
if (mapObject.Type == "BossSpawn") if (mapObject.Type == "AmbushMonsterSpawn" || mapObject.Type == "AmbushEnemySpawn")
{ {
var enemy = new MonsterSpawn("BUB", ref core.Swarm); var enemy = new MonsterSpawn("Monster", 2, 0, ref core.Swarm);
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize); var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
enemy.X = mapObjectGridPos.X; enemy.X = mapObjectGridPos.X;
enemy.Y = mapObjectGridPos.Y; enemy.Y = mapObjectGridPos.Y;
} }
if (mapObject.Type == "Door") if (mapObject.Type == "DelayedMonsterSpawn" || mapObject.Type == "DelayedEnemySpawn")
{ {
var door = new Door(); var enemy = new MonsterSpawn("Monster", 200, 8, ref core.Swarm);
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y); var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos); var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
door.X = mapObjectGridPos.X; enemy.X = mapObjectGridPos.X;
door.Y = mapObjectGridPos.Y; enemy.Y = mapObjectGridPos.Y;
} }
} /*if (mapObject.Type == "BossSpawn")
} {
} var enemy = new MonsterSpawn("BUB", 12, 0, ref core.Swarm);
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
public void Draw(SpriteBatch spriteBatch) var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
{ enemy.X = mapObjectGridPos.X;
foreach (var layer in Layers) enemy.Y = mapObjectGridPos.Y;
{ }*/
var tileLayer = layer as MapTileLayer; if (mapObject.Type == "Door")
{
if (tileLayer == null) var door = new Door();
continue; var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y);
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
// Don't draw the collision layer door.X = mapObjectGridPos.X;
if (tileLayer.Name == "Collision") door.Y = mapObjectGridPos.Y;
continue; }
}
for (int y = 0; y < tileLayer.Height; y++) }
{ }
for (int x = 0; x < tileLayer.Width; x++)
{ public void Draw(SpriteBatch spriteBatch)
MapTile mapTile = tileLayer.Tiles[y * layer.Width + x]; {
if (mapTile != null) foreach (var layer in Layers)
{ {
spriteBatch.Draw( var tileLayer = layer as MapTileLayer;
mapTile.Texture,
new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight), if (tileLayer == null)
mapTile.SourceRectangle, continue;
Color.White,
0, // Don't draw the collision layer
Vector2.Zero, if (tileLayer.Name == "Collision")
mapTile.SpriteEffects, continue;
0);
} for (int y = 0; y < tileLayer.Height; y++)
} {
} for (int x = 0; x < tileLayer.Width; x++)
} {
} MapTile mapTile = tileLayer.Tiles[y * layer.Width + x];
if (mapTile != null)
public byte[,] GetCollisionMap() {
{ spriteBatch.Draw(
byte[,] collisionMap = null; mapTile.Texture,
new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight),
foreach (var layer in Layers) mapTile.SourceRectangle,
{ Color.White,
var tileLayer = layer as MapTileLayer; 0,
Vector2.Zero,
if (tileLayer != null && tileLayer.Name == "Collision") mapTile.SpriteEffects,
{ 0);
collisionMap = new byte[1024,1024]; }
for (int y = 0; y < tileLayer.Height; y++) }
{ }
for (int x = 0; x < tileLayer.Width; x++) }
{ }
MapTile tile = tileLayer.Tiles[y * layer.Width + x];
if (tile == null || tile.LocalId == 0) public byte[,] GetCollisionMap()
collisionMap[x, y] = 1; {
else byte[,] collisionMap = null;
collisionMap[x, y] = 0;
} foreach (var layer in Layers)
} {
var tileLayer = layer as MapTileLayer;
break;
} if (tileLayer != null && tileLayer.Name == "Collision")
} {
collisionMap = new byte[1024,1024];
if (collisionMap == null) for (int y = 0; y < tileLayer.Height; y++)
Debug.WriteLine("Map lacks a Collision layer! Pathfinding won't work."); {
for (int x = 0; x < tileLayer.Width; x++)
return collisionMap; {
} MapTile tile = tileLayer.Tiles[y * layer.Width + x];
} if (tile == null || tile.LocalId == 0)
} collisionMap[x, y] = 1;
else
collisionMap[x, y] = 0;
}
}
break;
}
}
if (collisionMap == null)
Debug.WriteLine("Map lacks a Collision layer! Pathfinding won't work.");
return collisionMap;
}
}
}
+60 -57
View File
@@ -1,57 +1,60 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
namespace DepthsBelow namespace DepthsBelow
{ {
public class MonsterSpawn : Entity public class MonsterSpawn : Entity
{ {
//EntityManager entityManager; //EntityManager entityManager;
int wakingDistance = 7; int wakingDistance = 12;
int sleepingDistance = 6; int sleepingDistance = 6;
int wakingTurn = 0;
string type;
string type;
List<SmallEnemy> swarm;
List<SmallEnemy> swarm;
public MonsterSpawn(string _type, ref List<SmallEnemy> Swarm)
: base() public MonsterSpawn(string _type, int _wakingDistance, int _wakingTurn, ref List<SmallEnemy> Swarm)
{ : base()
//this.entityManager = entityManager; {
type = _type; //this.entityManager = entityManager;
swarm = Swarm; type = _type;
} swarm = Swarm;
wakingDistance = _wakingDistance;
public override void Update(GameTime gameTime) wakingTurn = _wakingTurn;
{ }
for (int index = 0; index < EntityManager.Entities.Count; index++)
{ public override void Update(GameTime gameTime)
var entity = EntityManager.Entities[index]; {
if (entity is Soldier) for (int index = 0; index < EntityManager.Entities.Count; index++)
{ {
Vector2 distance1 = new Vector2(this.GetComponent<Component.Transform>().Grid.Position.X, var entity = EntityManager.Entities[index];
this.GetComponent<Component.Transform>().Grid.Position.Y); if (entity is Soldier)
Vector2 distance2 = new Vector2(entity.GetComponent<Component.Transform>().Grid.Position.X, {
entity.GetComponent<Component.Transform>().Grid.Position.Y); Vector2 distance1 = new Vector2(this.GetComponent<Component.Transform>().Grid.Position.X,
if (Vector2.Distance(distance1, distance2) < wakingDistance/* && Vector2.Distance(distance1, distance2) > sleepingDistance*/) this.GetComponent<Component.Transform>().Grid.Position.Y);
{ Vector2 distance2 = new Vector2(entity.GetComponent<Component.Transform>().Grid.Position.X,
var enemy = new SmallEnemy(ref swarm); entity.GetComponent<Component.Transform>().Grid.Position.Y);
if (type == "BUB") if (Vector2.Distance(distance1, distance2) < wakingDistance && TurnManager.currentTurn >= wakingTurn/* && Vector2.Distance(distance1, distance2) > sleepingDistance*/)
{ {
enemy.LoadBoss(); var enemy = new SmallEnemy(ref swarm);
} if (type == "BUB")
enemy.X = this.X; {
enemy.Y = this.Y; enemy.LoadBoss();
swarm.Add(enemy); }
this.Remove(); enemy.X = this.X;
break; enemy.Y = this.Y;
} swarm.Add(enemy);
} this.Remove();
} break;
} }
} }
} }
}
}
}
+191 -191
View File
@@ -1,192 +1,192 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DepthsBelow.Component; using DepthsBelow.Component;
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input;
namespace DepthsBelow namespace DepthsBelow
{ {
public class SmallEnemy : Entity public class SmallEnemy : Entity
{ {
public static Texture2D Texture; public static Texture2D Texture;
public Color Color; public Color Color;
public static Point Origin; public static Point Origin;
private bool _selected; //I guess as in "currently doing something" private bool _selected; //I guess as in "currently doing something"
public List<SmallEnemy> Swarm; public List<SmallEnemy> Swarm;
private PathFinder.Node nextNode; private PathFinder.Node nextNode;
public int numberOfSteps = 5; public int numberOfSteps = 8;
public int currentStep = 0; public int currentStep = 0;
public bool AttackedThisTurn = false; public bool AttackedThisTurn = false;
public int step public int step
{ {
get { return currentStep; } get { return currentStep; }
set set
{ {
currentStep = value; currentStep = value;
} }
} }
public SmallEnemy(ref List<SmallEnemy> swarm) public SmallEnemy(ref List<SmallEnemy> swarm)
: base() : base()
{ {
if (Texture == null) if (Texture == null)
LoadContent(); LoadContent();
this.Swarm = swarm; this.Swarm = swarm;
Transform.World.Origin = new Vector2(20, 16); Transform.World.Origin = new Vector2(20, 16);
this.Color = Color.White; this.Color = Color.White;
var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White }; var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White };
AddComponent(rc); AddComponent(rc);
var cc = new Collision(this, 32, 32); var cc = new Collision(this, 32, 32);
cc.Solid = true; cc.Solid = true;
AddComponent(cc); AddComponent(cc);
var pfc = new PathFinder(this); var pfc = new PathFinder(this);
AddComponent(pfc); AddComponent(pfc);
var stat = new Component.Stat(this) var stat = new Component.Stat(this)
{ {
Life = 50, Life = 50,
Defence = 25, Defence = 25,
Strength = 26, Strength = 70,
GetAim = 100, GetAim = 100,
GetDodge = 50 GetDodge = 50
}; };
AddComponent(stat); AddComponent(stat);
} }
public override void Remove() public override void Remove()
{ {
Swarm.Remove(this); Swarm.Remove(this);
base.Remove(); base.Remove();
} }
public bool Selected public bool Selected
{ {
get { return _selected; } get { return _selected; }
set set
{ {
_selected = value; _selected = value;
GetComponent<SpriteRenderer>().Color = (value) ? Color.Blue : this.Color; GetComponent<SpriteRenderer>().Color = (value) ? Color.Blue : this.Color;
} }
} }
public static void LoadContent() public static void LoadContent()
{ {
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Monster"); Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Monster");
} }
public void LoadBoss() public void LoadBoss()
{ {
GetComponent<SpriteRenderer>().AlternativeTexture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Pineapple"); GetComponent<SpriteRenderer>().AlternativeTexture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Pineapple");
var stat = new Component.Stat(this) var stat = new Component.Stat(this)
{ {
Life = 500, Life = 500,
Defence = 15, Defence = 15,
Strength = 70, Strength = 70,
GetAim = 80, GetAim = 80,
GetDodge = 5 GetDodge = 5
}; };
} }
public override void Update(GameTime gameTime) public override void Update(GameTime gameTime)
{ {
base.Update(gameTime); base.Update(gameTime);
float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f; float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
if (nextNode == null) if (nextNode == null)
nextNode = GetComponent<PathFinder>().Next(); nextNode = GetComponent<PathFinder>().Next();
if (nextNode != null) if (nextNode != null)
{ {
List<Point> soldierCollisions = new List<Point>(); List<Point> soldierCollisions = new List<Point>();
// Collision with moving units // Collision with moving units
foreach (var body in Swarm) foreach (var body in Swarm)
{ {
if (body != this) if (body != this)
{ {
if (body.Transform.Grid == nextNode.Position) if (body.Transform.Grid == nextNode.Position)
{ {
soldierCollisions.Add(body.Transform.Grid); soldierCollisions.Add(body.Transform.Grid);
GetComponent<PathFinder>().RecreatePath(soldierCollisions); GetComponent<PathFinder>().RecreatePath(soldierCollisions);
nextNode = GetComponent<PathFinder>().Next(); nextNode = GetComponent<PathFinder>().Next();
break; break;
} }
} }
} }
if (nextNode != null) if (nextNode != null)
{ {
var nodeWorldPos = Grid.GridToWorld(nextNode.Position); var nodeWorldPos = Grid.GridToWorld(nextNode.Position);
// HACK: Make this work properly with other speeds... // HACK: Make this work properly with other speeds...
float speed = 4f; float speed = 4f;
if (Transform.World.X < nodeWorldPos.X) if (Transform.World.X < nodeWorldPos.X)
{ {
Transform.World.X += speed; Transform.World.X += speed;
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(0); GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(0);
} }
if (Transform.World.X > nodeWorldPos.X) if (Transform.World.X > nodeWorldPos.X)
{ {
Transform.World.X -= speed; Transform.World.X -= speed;
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(180); GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(180);
} }
if (Transform.World.Y < nodeWorldPos.Y) if (Transform.World.Y < nodeWorldPos.Y)
{ {
Transform.World.Y += speed; Transform.World.Y += speed;
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(90); GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(90);
} }
if (Transform.World.Y > nodeWorldPos.Y) if (Transform.World.Y > nodeWorldPos.Y)
{ {
Transform.World.Y -= speed; Transform.World.Y -= speed;
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(270); GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(270);
} }
if (Transform.World == nodeWorldPos) if (Transform.World == nodeWorldPos)
{ {
if (currentStep < numberOfSteps) if (currentStep < numberOfSteps)
{ {
currentStep++; currentStep++;
//lastLastNode = lastNode; //lastLastNode = lastNode;
//lastNode = nextNode; //lastNode = nextNode;
nextNode = GetComponent<PathFinder>().Next(); nextNode = GetComponent<PathFinder>().Next();
} }
else else
{ {
GetComponent<PathFinder>().Stop(); GetComponent<PathFinder>().Stop();
} }
foreach (var entity in EntityManager.Entities) foreach (var entity in EntityManager.Entities)
{ {
if (entity is Soldier) if (entity is Soldier)
{ {
if (entity.GetComponent<Component.Collision>().Rectangle.Intersects(this.GetComponent<Component.Collision>().Rectangle)) if (entity.GetComponent<Component.Collision>().Rectangle.Intersects(this.GetComponent<Component.Collision>().Rectangle))
{ {
if (AttackedThisTurn == false) if (AttackedThisTurn == false)
{ {
if (Utility.AttackTest(this.GetComponent<Component.Stat>(), entity, Utility.CalculateHitChance(this.GetComponent<Component.Stat>(), this.Transform.World.Position, entity))) if (Utility.AttackTest(this.GetComponent<Component.Stat>(), entity, Utility.CalculateHitChance(this.GetComponent<Component.Stat>(), this.Transform.World.Position, entity)))
{ {
AttackedThisTurn = true; AttackedThisTurn = true;
break; break;
} }
} }
} }
} }
} }
} }
} }
} }
} }
} }
} }
+122 -115
View File
@@ -1,115 +1,122 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
namespace DepthsBelow namespace DepthsBelow
{ {
/// <summary> /// <summary>
/// Keeps track of whose turn it is. /// Keeps track of whose turn it is.
/// </summary> /// </summary>
public class TurnManager public class TurnManager
{ {
/// <summary> public static int currentTurn = 0;
/// A player turn token.
/// </summary> /// <summary>
public class Token /// A player turn token.
{ /// </summary>
/// <summary> public class Token
/// Unique identifying name of the token. {
/// </summary> /// <summary>
public string Name { get; private set; } /// Unique identifying name of the token.
private TurnManager turnManager; /// </summary>
public string Name { get; private set; }
/// <summary> private TurnManager turnManager;
/// Initializes a new instance of the <see cref="Token" /> class.
/// Preferably use <see cref="TurnManager.CreateToken" /> instead. /// <summary>
/// </summary> /// Initializes a new instance of the <see cref="Token" /> class.
/// <param name="turnManager">The turn manager the token belongs to.</param> /// Preferably use <see cref="TurnManager.CreateToken" /> instead.
/// <param name="name">Unique identifying name of the token.</param> /// </summary>
public Token(TurnManager turnManager, string name) /// <param name="turnManager">The turn manager the token belongs to.</param>
{ /// <param name="name">Unique identifying name of the token.</param>
this.turnManager = turnManager; public Token(TurnManager turnManager, string name)
this.Name = name; {
turnManager.AddToken(this); this.turnManager = turnManager;
} this.Name = name;
} turnManager.AddToken(this);
}
/// <summary> }
/// Dictionary of turn tokens.
/// </summary> /// <summary>
public Dictionary<string, Token> Tokens; /// Dictionary of turn tokens.
private int currentTokenIndex; /// </summary>
public Dictionary<string, Token> Tokens;
/// <summary> private int currentTokenIndex;
/// The turn token belonging to a player.
/// </summary> /// <summary>
public Token CurrentTurn /// The turn token belonging to a player.
{ /// </summary>
get { return Tokens.ElementAt(currentTokenIndex).Value; } public Token CurrentTurn
} {
get { return Tokens.ElementAt(currentTokenIndex).Value; }
/// <summary> }
/// Get the turn token by the specified name.
/// </summary> /// <summary>
/// <param name="name">The identifying name of the player.</param> /// Get the turn token by the specified name.
/// <returns>Returns a player turn token.</returns> /// </summary>
public Token this[string name] /// <param name="name">The identifying name of the player.</param>
{ /// <returns>Returns a player turn token.</returns>
get { return this.Tokens[name]; } public Token this[string name]
} {
get { return this.Tokens[name]; }
/// <summary> }
/// Create a turn manager.
/// </summary> /// <summary>
public TurnManager() /// Create a turn manager.
{ /// </summary>
Tokens = new Dictionary<string, Token>(); public TurnManager()
} {
Tokens = new Dictionary<string, Token>();
/// <summary> }
/// Create a turn manager.
/// </summary> /// <summary>
/// <param name="tokenNames">Tokens of players.</param> /// Create a turn manager.
public TurnManager(string[] tokenNames) /// </summary>
: this() /// <param name="tokenNames">Tokens of players.</param>
{ public TurnManager(string[] tokenNames)
foreach (var tokenName in tokenNames) : this()
CreateToken(tokenName); {
} foreach (var tokenName in tokenNames)
CreateToken(tokenName);
/// <summary> }
/// Create a turn token.
/// </summary> /// <summary>
/// <param name="name">Name of the token.</param> /// Create a turn token.
/// <returns>Returns a player turn token.</returns> /// </summary>
public Token CreateToken(string name) /// <param name="name">Name of the token.</param>
{ /// <returns>Returns a player turn token.</returns>
return Tokens.ContainsKey(name) ? Tokens[name] : new Token(this, name); public Token CreateToken(string name)
} {
return Tokens.ContainsKey(name) ? Tokens[name] : new Token(this, name);
/// <summary> }
/// Add a turn token to
/// </summary> /// <summary>
/// <param name="token"></param> /// Add a turn token to
public void AddToken(Token token) /// </summary>
{ /// <param name="token"></param>
if (!Tokens.ContainsKey(token.Name)) public void AddToken(Token token)
Tokens.Add(token.Name, token); {
} if (!Tokens.ContainsKey(token.Name))
Tokens.Add(token.Name, token);
/// <summary> }
/// End the current turn, skipping to the next token in the dictionary.
/// </summary> /// <summary>
public void EndTurn() /// End the current turn, skipping to the next token in the dictionary.
{ /// </summary>
var prevTurn = CurrentTurn; public void EndTurn()
{
if (++currentTokenIndex > Tokens.Count - 1) var prevTurn = CurrentTurn;
currentTokenIndex = 0;
if (++currentTokenIndex > Tokens.Count - 1)
Debug.WriteLine(prevTurn.Name + " turn ended. Current turn: " + CurrentTurn.Name); currentTokenIndex = 0;
}
} Debug.WriteLine(prevTurn.Name + " turn ended. Current turn: " + CurrentTurn.Name);
} if (CurrentTurn.Name == "Player")
{
currentTurn++;
Console.WriteLine("Turn: " + currentTurn);
}
}
}
}
@@ -29,7 +29,7 @@
<object type="SquadStart" x="768" y="2720" width="32" height="32"/> <object type="SquadStart" x="768" y="2720" width="32" height="32"/>
<object type="BossSpawn" x="832" y="2720" width="32" height="32"/> <object type="BossSpawn" x="832" y="2720" width="32" height="32"/>
<object type="Door" x="640" y="2656" width="32" height="64"/> <object type="Door" x="640" y="2656" width="32" height="64"/>
<object type="EnemySpawn" x="992" y="2304" width="32" height="32"/> <object type="MonsterSpawn" x="992" y="2304" width="32" height="32"/>
<object type="EnemySpawn" x="1184" y="2144" width="32" height="32"/> <object type="EnemySpawn" x="1184" y="2144" width="32" height="32"/>
<object type="EnemySpawn" x="992" y="2688" width="32" height="32"/> <object type="EnemySpawn" x="992" y="2688" width="32" height="32"/>
<object type="EnemySpawn" x="1088" y="2560" width="32" height="32"/> <object type="EnemySpawn" x="1088" y="2560" width="32" height="32"/>
@@ -59,6 +59,14 @@
<object type="EnemySpawn" x="3424" y="800" width="32" height="32"/> <object type="EnemySpawn" x="3424" y="800" width="32" height="32"/>
<object type="EnemySpawn" x="3424" y="640" width="32" height="32"/> <object type="EnemySpawn" x="3424" y="640" width="32" height="32"/>
<object type="EnemySpawn" x="2112" y="640" width="32" height="32"/> <object type="EnemySpawn" x="2112" y="640" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="704" y="2624" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="736" y="2656" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="704" y="2720" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="800" y="2656" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="768" y="2720" width="32" height="32"/>
<object type="DelayedEnemySpawn" x="832" y="2720" width="32" height="32"/>
</objectgroup> </objectgroup>
<layer name="Collision" width="256" height="256"> <layer name="Collision" width="256" height="256">
<data encoding="base64" compression="zlib"> <data encoding="base64" compression="zlib">