Compare commits
91 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 31394b1e7c | |||
| d9bff905b5 | |||
| dee5ed9e69 | |||
| e85f98bb2c | |||
| 23814c45ad | |||
| bfeb94f9cb | |||
| 1a9d27d9e3 | |||
| 5757d818fd | |||
| 778869ce44 | |||
| b7f5b103fb | |||
| be5b073f31 | |||
| 105a31d38b | |||
| 5179088158 | |||
| 7ecf6dabce | |||
| 3106c0ea63 | |||
| 1c7c8b600d | |||
| e8353e2002 | |||
| 450ffdb68c | |||
| 2dbad13a64 | |||
| adb18a6e77 | |||
| 860637fb20 | |||
| d80a2104bf | |||
| a785067218 | |||
| 8f0b981bd3 | |||
| f14623c882 | |||
| f2b1b731e5 | |||
| d1b3661eed | |||
| 82ad94eb4f | |||
| e708c62a50 | |||
| 81e102fe44 | |||
| 9ba26cae70 | |||
| ed0953ff50 | |||
| ef13987044 | |||
| 3c40dd354e | |||
| 600661b911 | |||
| 236d6c2859 | |||
| 9a0ff658b4 | |||
| 4a60e4e2d5 | |||
| 5c59a2277b | |||
| 7d42fb1bf0 | |||
| b9f49712db | |||
| c62a00ab80 | |||
| 723215294b | |||
| 5007e0b50e | |||
| cd913a8401 | |||
| 5f44eb257b | |||
| 35bcd8d9cc | |||
| 10d2160a8b | |||
| 89376478b0 | |||
| d36592318f | |||
| dca73efe29 | |||
| cf3bc09a4a | |||
| 6f6ee2d340 | |||
| 2fe63f51c0 | |||
| 6034dbf3b2 | |||
| f8c1422eeb | |||
| 9d92736932 | |||
| 0c923357b4 | |||
| ce2264c737 | |||
| 5cb05d1c3f | |||
| d376031193 | |||
| 9f47ad9a57 | |||
| c59ff9778a | |||
| 8e1f18d233 | |||
| c7a1317a32 | |||
| 28b6e20f94 | |||
| 00159095ed | |||
| 2a12df147b | |||
| 092dc176a8 | |||
| 4f8a5ccdb2 | |||
| bcbddf1b2c | |||
| 9f838a6d39 | |||
| a6391527ec | |||
| 275727f861 | |||
| 16f2d57aec | |||
| 9df0077257 | |||
| d38e93dc19 | |||
| 0a4eafefa3 | |||
| 0b98d60753 | |||
| ff17d421fe | |||
| 047899b43d | |||
| 29288df309 | |||
| ff4e874d47 | |||
| 7ea3b0be99 | |||
| 6e3b2f2f94 | |||
| 0c9e99b146 | |||
| e89a657740 | |||
| b1f723580d | |||
| b4dc13e420 | |||
| 2d554faeb3 | |||
| 4658decf32 |
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<startup useLegacyV2RuntimeActivationPolicy="true">
|
||||
<supportedRuntime version="v4.0"/>
|
||||
</startup>
|
||||
</configuration>
|
||||
@@ -35,11 +35,25 @@ namespace DepthsBelow
|
||||
return Vector2.Transform(screenPos, Matrix.Invert(Transform));
|
||||
}
|
||||
|
||||
public Rectangle ScreenToWorld(Rectangle screenRectangle)
|
||||
{
|
||||
var pos = ScreenToWorld(new Vector2(screenRectangle.X, screenRectangle.Y));
|
||||
var size = ScreenToWorld(new Vector2(screenRectangle.X + screenRectangle.Width, screenRectangle.Y + screenRectangle.Height)) - pos;
|
||||
return new Rectangle((int)pos.X, (int)pos.Y, (int)size.X, (int)size.Y);
|
||||
}
|
||||
|
||||
public Vector2 WorldToScreen(Vector2 worldPos)
|
||||
{
|
||||
return Vector2.Transform(worldPos, Transform);
|
||||
}
|
||||
|
||||
public Rectangle WorldToScreen(Rectangle worldRectangle)
|
||||
{
|
||||
var pos = WorldToScreen(new Vector2(worldRectangle.X, worldRectangle.Y));
|
||||
var size = WorldToScreen(new Vector2(worldRectangle.X + worldRectangle.Width, worldRectangle.Y + worldRectangle.Height)) - pos;
|
||||
return new Rectangle((int)pos.X, (int)pos.Y, (int)size.X, (int)size.Y);
|
||||
}
|
||||
|
||||
public void Update(GameTime gameTime)
|
||||
{
|
||||
float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
|
||||
@@ -85,6 +99,11 @@ namespace DepthsBelow
|
||||
Transform *= Matrix.CreateTranslation(new Vector3(change.X, change.Y, 0));
|
||||
}
|
||||
|
||||
Transform = Matrix.Identity
|
||||
* Matrix.CreateRotationZ(Rotation)
|
||||
* Matrix.CreateScale(Zoom)
|
||||
* Matrix.CreateTranslation(new Vector3(Position.X, Position.Y, 0));
|
||||
|
||||
lastMouseState = ms;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,25 +8,58 @@ using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Component for handling collisions.
|
||||
/// Contains a rectangle which defines its hitbox.
|
||||
/// </summary>
|
||||
public class Collision : Component
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// The collision rectangle.
|
||||
/// </summary>
|
||||
public Rectangle Rectangle;
|
||||
|
||||
public int Width;
|
||||
public int Height;
|
||||
/// <summary>
|
||||
/// Whether the entity is solid to other entities.
|
||||
/// </summary>
|
||||
public bool Solid = false;
|
||||
|
||||
/// <summary>
|
||||
/// Width of the collision rectangle.
|
||||
/// </summary>
|
||||
public int Width
|
||||
{
|
||||
get { return this.Rectangle.Width; }
|
||||
set { this.Rectangle.Width = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Height of the collision rectangle.
|
||||
/// </summary>
|
||||
public int Height
|
||||
{
|
||||
get { return this.Rectangle.Height; }
|
||||
set { this.Rectangle.Height = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a collision component.
|
||||
/// </summary>
|
||||
/// <param name="parent">Parent entity.</param>
|
||||
/// <param name="width">Width of the collision rectangle.</param>
|
||||
/// <param name="height">Height of the collision rectangle.</param>
|
||||
public Collision(Entity parent, int width, int height)
|
||||
: base(parent)
|
||||
{
|
||||
this.Width = width;
|
||||
this.Height = height;
|
||||
this.Rectangle = new Rectangle(0, 0, width, height);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the position of the collision rectangle to the position of its parent entity.
|
||||
/// </summary>
|
||||
/// <param name="gameTime"></param>
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
Transform transform = this.Parent.GetComponent<Transform>();
|
||||
var transform = this.Parent.GetComponent<Transform>();
|
||||
this.Rectangle.X = (int)transform.World.X;
|
||||
this.Rectangle.Y = (int)transform.World.Y;
|
||||
}
|
||||
|
||||
@@ -6,8 +6,14 @@ using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Base component.
|
||||
/// </summary>
|
||||
public class Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Parent entity of which the component belongs.
|
||||
/// </summary>
|
||||
public Entity Parent;
|
||||
|
||||
public Component(Entity parent)
|
||||
@@ -15,6 +21,10 @@ namespace DepthsBelow.Component
|
||||
Parent = parent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Virtual component update function.
|
||||
/// </summary>
|
||||
/// <param name="gameTime"></param>
|
||||
public virtual void Update(GameTime gameTime)
|
||||
{
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
public class Flashlight : Component
|
||||
{
|
||||
public float Scale = 1f;
|
||||
public float Intensity = 1f;
|
||||
public float Angle = 0;
|
||||
public Vector2 Position { get; private set; }
|
||||
public Vector2 Origin;
|
||||
public Texture2D Texture;
|
||||
public Color Color;
|
||||
|
||||
public bool IsOn = true;
|
||||
|
||||
public Flashlight(Entity parent)
|
||||
: base(parent)
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/lights/spot_wide");
|
||||
Color = Color.White;
|
||||
Origin = new Vector2(50, Texture.Height / 2f);
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
Position = Parent.Transform.World + Parent.Transform.World.Origin;
|
||||
Angle = Parent.Transform.World.Rotation;
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
if (IsOn)
|
||||
spriteBatch.Draw(Texture, Position, null, Color * Intensity, Angle, Origin, Scale, SpriteEffects.None, 0);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
[Obsolete("Deprecated in favour of Component.Transform")]
|
||||
public class GridTransform : Component
|
||||
{
|
||||
public Point Position;
|
||||
public int X
|
||||
{
|
||||
get
|
||||
{
|
||||
return Position.X;
|
||||
}
|
||||
set
|
||||
{
|
||||
Position.X = value;
|
||||
}
|
||||
}
|
||||
public int Y
|
||||
{
|
||||
get
|
||||
{
|
||||
return Position.Y;
|
||||
}
|
||||
set
|
||||
{
|
||||
Position.Y = value;
|
||||
}
|
||||
}
|
||||
|
||||
public GridTransform(Entity parent) : base(parent)
|
||||
{
|
||||
Position = Point.Zero;
|
||||
}
|
||||
|
||||
public Vector2 ToWorld()
|
||||
{
|
||||
return Grid.GridToWorld(Position);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,118 +1,212 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AStar;
|
||||
using Microsoft.Xna.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AStar;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Component that handles pathfinding.
|
||||
/// </summary>
|
||||
public class PathFinder : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// A pathfinder node.
|
||||
/// </summary>
|
||||
public class Node
|
||||
{
|
||||
/// <summary>
|
||||
/// Grid position of the node.
|
||||
/// </summary>
|
||||
public Point Position;
|
||||
/// <summary>
|
||||
/// A* F-score
|
||||
/// </summary>
|
||||
public int F;
|
||||
/// <summary>
|
||||
/// A* G-score
|
||||
/// </summary>
|
||||
public int G;
|
||||
|
||||
/// <summary>
|
||||
/// Explicit conversion between A* library node and Node object.
|
||||
/// </summary>
|
||||
/// <param name="aStarNode"></param>
|
||||
/// <returns></returns>
|
||||
public static explicit operator Node(AStar.PathFinderNode aStarNode)
|
||||
{
|
||||
return new Node
|
||||
{
|
||||
Position = new Point(aStarNode.X, aStarNode.Y),
|
||||
F = aStarNode.F,
|
||||
G = aStarNode.G
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Start position of the path.
|
||||
/// </summary>
|
||||
public Point Start { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// A collision bytemap.
|
||||
/// 0 = unwalkable node
|
||||
/// 1 = walkable node
|
||||
/// </summary>
|
||||
public byte[,] CollisionMap;
|
||||
|
||||
private Point goal;
|
||||
/// <summary>
|
||||
/// Sets a goal point and finds a path to it.
|
||||
/// After a path is created, call Next() go get the next node in the path.
|
||||
/// </summary>
|
||||
public Point Goal
|
||||
{
|
||||
get { return goal; }
|
||||
set
|
||||
{
|
||||
this.goal = value;
|
||||
this.FindPath(this.Parent.GetComponent<Transform>().Grid.Position, value, null);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Is a path in progress?
|
||||
/// </summary>
|
||||
public bool IsMoving
|
||||
{
|
||||
get
|
||||
{
|
||||
return path != null && path.Count() != 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int Length
|
||||
{
|
||||
get
|
||||
{
|
||||
return (path != null) ? path.Count : 0;
|
||||
}
|
||||
}
|
||||
|
||||
private AStar.PathFinderFast pathFinder;
|
||||
private List<AStar.PathFinderNode> path;
|
||||
|
||||
public PathFinder(Entity parent)
|
||||
: base(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
/*if (path != null && path.Count != 0)
|
||||
{
|
||||
var nextNode = path.Last();
|
||||
var nodePos = new Point(nextNode.X, nextNode.Y);
|
||||
Parent.Transform.Grid.Position = nodePos;
|
||||
if (Parent.Transform.World == (Vector2)Parent.Transform.Grid)
|
||||
path.Remove(nextNode);
|
||||
}*/
|
||||
|
||||
base.Update(gameTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the next node of the current path.
|
||||
/// </summary>
|
||||
/// <returns>The next node in the path.</returns>
|
||||
public Node Next()
|
||||
{
|
||||
if (path == null)
|
||||
return null;
|
||||
|
||||
if (path.Count == 0)
|
||||
return null;
|
||||
|
||||
var nextNode = path.Last();
|
||||
path.Remove(nextNode);
|
||||
return (Node)nextNode;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cancels the current path in memory.
|
||||
/// </summary>
|
||||
public void Stop()
|
||||
{
|
||||
path = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds a path between two points.
|
||||
/// </summary>
|
||||
/// <param name="start">The start point.</param>
|
||||
/// <param name="goal">The goal point.</param>
|
||||
/// <param name="appendCollisionMap">A list of unwalkable points that will be joined with the original collision map.</param>
|
||||
/// <returns></returns>
|
||||
private List<AStar.PathFinderNode> FindPath(Point start, Point goal, List<Point> appendCollisionMap)
|
||||
{
|
||||
byte[,] mapCollisionMap = Core.Map.GetCollisionMap();
|
||||
|
||||
// Add solid collision component entities
|
||||
foreach (var collision in EntityManager.GetComponents<Collision>())
|
||||
{
|
||||
if (collision.Solid && collision.Parent != this.Parent)
|
||||
{
|
||||
var pos = Grid.WorldToGrid(new Vector2(collision.Rectangle.X, collision.Rectangle.Y));
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
public class PathFinder : Component
|
||||
{
|
||||
public class Node
|
||||
{
|
||||
public Point Position;
|
||||
public int F;
|
||||
public int G;
|
||||
|
||||
public static explicit operator Node(AStar.PathFinderNode aStarNode)
|
||||
{
|
||||
return new Node
|
||||
for (int x = 0; x < Math.Ceiling(collision.Rectangle.Width / (double)Grid.TileSize); x++)
|
||||
for (int y = 0; y < Math.Ceiling(collision.Rectangle.Height / (double)Grid.TileSize); y++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Position = new Point(aStarNode.X, aStarNode.Y),
|
||||
F = aStarNode.F,
|
||||
G = aStarNode.G
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public Point Start { get; private set; }
|
||||
|
||||
public byte[,] CollisionMap;
|
||||
|
||||
private Point goal;
|
||||
public Point Goal
|
||||
{
|
||||
get { return goal; }
|
||||
set
|
||||
{
|
||||
this.goal = value;
|
||||
//this.Start = this.Parent.GetComponent<Transform>().Grid.Position;
|
||||
this.FindPath(this.Parent.GetComponent<Transform>().Grid.Position, value, null);
|
||||
}
|
||||
}
|
||||
|
||||
private AStar.PathFinderFast pathFinder;
|
||||
private List<AStar.PathFinderNode> path;
|
||||
|
||||
public PathFinder(Entity parent)
|
||||
: base(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
/*if (path != null && path.Count != 0)
|
||||
{
|
||||
var nextNode = path.Last();
|
||||
var nodePos = new Point(nextNode.X, nextNode.Y);
|
||||
Parent.Transform.Grid.Position = nodePos;
|
||||
if (Parent.Transform.World == (Vector2)Parent.Transform.Grid)
|
||||
path.Remove(nextNode);
|
||||
}*/
|
||||
|
||||
base.Update(gameTime);
|
||||
}
|
||||
|
||||
public Node Next()
|
||||
{
|
||||
if (path == null)
|
||||
return null;
|
||||
|
||||
if (path.Count == 0)
|
||||
return null;
|
||||
|
||||
var nextNode = path.Last();
|
||||
path.Remove(nextNode);
|
||||
return (Node)nextNode;
|
||||
}
|
||||
|
||||
private List<AStar.PathFinderNode> FindPath(Point start, Point goal, List<Point> appendCollisionMap)
|
||||
{
|
||||
byte[,] mapCollisionMap = Core.Map.GetCollisionMap();
|
||||
|
||||
if (appendCollisionMap != null)
|
||||
foreach (var point in appendCollisionMap)
|
||||
mapCollisionMap[point.X, point.Y] = 0;
|
||||
|
||||
pathFinder = new AStar.PathFinderFast(mapCollisionMap);
|
||||
pathFinder.Formula = AStar.HeuristicFormula.Manhattan;
|
||||
pathFinder.Diagonals = false;
|
||||
pathFinder.HeavyDiagonals = false;
|
||||
pathFinder.HeuristicEstimate = 2;
|
||||
pathFinder.PunishChangeDirection = false;
|
||||
pathFinder.TieBreaker = false;
|
||||
pathFinder.SearchLimit = 50000;
|
||||
pathFinder.DebugProgress = false;
|
||||
pathFinder.DebugFoundPath = false;
|
||||
|
||||
var _start = new System.Drawing.Point(start.X, start.Y);
|
||||
var _goal = new System.Drawing.Point(goal.X, goal.Y);
|
||||
//path = Core.PathFinder.FindPath(_start, _goal);
|
||||
path = pathFinder.FindPath(_start, _goal);
|
||||
if (path == null)
|
||||
Debug.WriteLine(this.Parent.ToString() + ": Path not found!");
|
||||
|
||||
this.CollisionMap = new byte[100, 100];
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
public void RecreatePath(List<Point> appendCollisionMap)
|
||||
{
|
||||
FindPath(this.Parent.GetComponent<Transform>().Grid.Position, this.Goal, appendCollisionMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
mapCollisionMap[pos.X + x, pos.Y + y] = 0;
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (appendCollisionMap != null)
|
||||
foreach (var point in appendCollisionMap)
|
||||
mapCollisionMap[point.X, point.Y] = 0;
|
||||
|
||||
pathFinder = new AStar.PathFinderFast(mapCollisionMap);
|
||||
pathFinder.Formula = AStar.HeuristicFormula.Manhattan;
|
||||
pathFinder.Diagonals = false;
|
||||
pathFinder.HeavyDiagonals = false;
|
||||
pathFinder.HeuristicEstimate = 2;
|
||||
pathFinder.PunishChangeDirection = false;
|
||||
pathFinder.TieBreaker = false;
|
||||
pathFinder.SearchLimit = 50000;
|
||||
pathFinder.DebugProgress = false;
|
||||
pathFinder.DebugFoundPath = false;
|
||||
|
||||
var _start = new System.Drawing.Point(start.X, start.Y);
|
||||
var _goal = new System.Drawing.Point(goal.X, goal.Y);
|
||||
//path = Core.PathFinder.FindPath(_start, _goal);
|
||||
path = pathFinder.FindPath(_start, _goal);
|
||||
if (path == null)
|
||||
Debug.WriteLine(this.Parent.ToString() + ": Path not found!");
|
||||
|
||||
//this.CollisionMap = new byte[100, 100];
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recreate the current path in memory with a list of unwalkable points that will be joined with the original collision map.
|
||||
/// </summary>
|
||||
/// <param name="appendCollisionMap">A list of unwalkable points that will be joined with the collision map.</param>
|
||||
public void RecreatePath(List<Point> appendCollisionMap)
|
||||
{
|
||||
FindPath(this.Parent.GetComponent<Transform>().Grid.Position, this.Goal, appendCollisionMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
[Obsolete("Deprecated in favour of Component.Transform")]
|
||||
public class PixelTransform : Component
|
||||
{
|
||||
public Vector2 Position;
|
||||
public float X
|
||||
{
|
||||
get
|
||||
{
|
||||
return Position.X;
|
||||
}
|
||||
set
|
||||
{
|
||||
Position.X = value;
|
||||
}
|
||||
}
|
||||
public float Y
|
||||
{
|
||||
get
|
||||
{
|
||||
return Position.Y;
|
||||
}
|
||||
set
|
||||
{
|
||||
Position.Y = value;
|
||||
}
|
||||
}
|
||||
public float Rotation;
|
||||
public Vector2 Origin;
|
||||
|
||||
public PixelTransform(Entity parent)
|
||||
: base(parent)
|
||||
{
|
||||
Position = Vector2.Zero;
|
||||
Rotation = 0.0f;
|
||||
Origin = Vector2.Zero;
|
||||
}
|
||||
|
||||
public Point ToGrid()
|
||||
{
|
||||
return Grid.WorldToGrid(Position);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,14 +7,32 @@ using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Sprite render component.
|
||||
/// Handles rendering of a 2D texture.
|
||||
/// </summary>
|
||||
public class SpriteRenderer : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The texture to be rendered.
|
||||
/// </summary>
|
||||
public Texture2D Texture;
|
||||
public Texture2D AlternativeTexture;
|
||||
/// <summary>
|
||||
/// Color modifier.
|
||||
/// </summary>
|
||||
public Color Color;
|
||||
/// <summary>
|
||||
/// Scale of the texture.
|
||||
/// </summary>
|
||||
public float Scale;
|
||||
|
||||
public Vector2 Offset;
|
||||
|
||||
public SpriteEffects SpriteEffects;
|
||||
|
||||
public SpriteRenderer(Entity parent) : base(parent)
|
||||
public SpriteRenderer(Entity parent)
|
||||
: base(parent)
|
||||
{
|
||||
this.Color = Color.White;
|
||||
this.Scale = 1;
|
||||
@@ -23,9 +41,8 @@ namespace DepthsBelow.Component
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
Transform transform = this.Parent.GetComponent<Transform>();
|
||||
//spriteBatch.Draw(Texture, tc.Position, this.Color);
|
||||
spriteBatch.Draw(Texture, transform.World.Position + transform.World.Origin, null, Color, transform.World.Rotation, transform.World.Origin, Scale, SpriteEffects, 0);
|
||||
var transform = this.Parent.GetComponent<Transform>();
|
||||
spriteBatch.Draw(Texture, transform.World.Position + transform.World.Origin + Offset, null, Color, transform.World.Rotation, transform.World.Origin, Scale, SpriteEffects, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
public class Stat : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The current health points of the unit
|
||||
/// </summary>
|
||||
public float HP = 0;
|
||||
public float _MaxHP = 100;
|
||||
/// <summary>
|
||||
/// Gets or sets the max HP.
|
||||
/// </summary>
|
||||
public float MaxHP
|
||||
{
|
||||
get { return _MaxHP; }
|
||||
set
|
||||
{
|
||||
_MaxHP = value;
|
||||
if (HP == 0)
|
||||
HP = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int MaxPanic = 100;
|
||||
|
||||
protected int hp = 0;
|
||||
protected int defence = 0;
|
||||
protected int stepsTaken = 0;
|
||||
protected int distanceToTarget = 0;
|
||||
protected int panic = 0;
|
||||
protected int soldierAim = 100;
|
||||
protected int weaponAccuracy = 0;
|
||||
protected int weaponStrength = 0;
|
||||
protected int ammo = 0;
|
||||
protected int enemyDodge = 0;
|
||||
|
||||
protected int penaltyRange = 5;
|
||||
|
||||
Vector2 rememberedPosition = Vector2.Zero;
|
||||
|
||||
public Vector2 Remember
|
||||
{
|
||||
get { return rememberedPosition; }
|
||||
set { rememberedPosition = value; }
|
||||
}
|
||||
|
||||
public int GetAim
|
||||
{
|
||||
get { return soldierAim + weaponAccuracy; }
|
||||
set { weaponAccuracy = value; }
|
||||
}
|
||||
|
||||
public int GetStep
|
||||
{
|
||||
get { return stepsTaken; }
|
||||
set { stepsTaken = value; }
|
||||
}
|
||||
|
||||
public int GetDodge
|
||||
{
|
||||
get { return enemyDodge; }
|
||||
set { enemyDodge = value; }
|
||||
}
|
||||
public int Life
|
||||
{
|
||||
get { return hp; }
|
||||
set
|
||||
{
|
||||
hp = value;
|
||||
if (hp <= 0) {
|
||||
//If you kill me, I will become stronger than you can ever imagine.
|
||||
Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
public int Defence
|
||||
{
|
||||
get { return defence; }
|
||||
set { defence = value; }
|
||||
}
|
||||
public int Strength
|
||||
{
|
||||
get { return weaponStrength; }
|
||||
set { weaponStrength = value; }
|
||||
}
|
||||
|
||||
public void Kill()
|
||||
{
|
||||
hp = 0;
|
||||
Parent.Remove();
|
||||
//Console.WriteLine("Blargh! I am dead!");
|
||||
}
|
||||
|
||||
public int Penalty(int distance)
|
||||
{
|
||||
return panic/* + GetPenalty(stepsTaken)*/ + (int)(GetPenalty(distance));
|
||||
}
|
||||
|
||||
public Stat(Entity parent)
|
||||
: base (parent)
|
||||
{
|
||||
rememberedPosition = Vector2.Zero;
|
||||
}
|
||||
|
||||
public bool targetInSight()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public int GetPenalty(int distance)
|
||||
{
|
||||
int penalty = 0;
|
||||
if (distance >= penaltyRange * 3)
|
||||
{
|
||||
distance -= penaltyRange * 3;
|
||||
penalty = penaltyRange + penaltyRange * 3 + penaltyRange * 5 + distance * 10;
|
||||
}
|
||||
else if (distance >= penaltyRange * 2)
|
||||
{
|
||||
distance -= penaltyRange * 2;
|
||||
penalty = penaltyRange + penaltyRange * 3 + distance * 5;
|
||||
}
|
||||
else if (distance >= penaltyRange)
|
||||
{
|
||||
distance -= penaltyRange;
|
||||
penalty = penaltyRange + distance * 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
penalty = distance;
|
||||
}
|
||||
return penalty;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,21 @@ using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow.Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Transform component.
|
||||
/// Handles both grid and world positions and rotations, while keeping them in sync.
|
||||
/// </summary>
|
||||
public class Transform : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a grid position.
|
||||
/// </summary>
|
||||
public class GridTransform
|
||||
{
|
||||
private Point position;
|
||||
/// <summary>
|
||||
/// Sets the grid position and updates the world position of WorldTransform.
|
||||
/// </summary>
|
||||
public Point Position
|
||||
{
|
||||
get { return position; }
|
||||
@@ -22,6 +32,9 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand for the grid x-position.
|
||||
/// </summary>
|
||||
public int X
|
||||
{
|
||||
get { return position.X; }
|
||||
@@ -31,6 +44,10 @@ namespace DepthsBelow.Component
|
||||
masterTransform.World.SetWithoutRelation((Vector2)this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand for the grid y-position.
|
||||
/// </summary>
|
||||
public int Y
|
||||
{
|
||||
get { return position.Y; }
|
||||
@@ -41,11 +58,17 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implicit conversion between GridTransform and a Point grid position.
|
||||
/// </summary>
|
||||
public static implicit operator Point(GridTransform gridTransform)
|
||||
{
|
||||
return gridTransform.position;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Explicit conversion between GridTransform and a Vector2 world position.
|
||||
/// </summary>
|
||||
public static explicit operator Vector2(GridTransform gridTransform)
|
||||
{
|
||||
var worldPosition = DepthsBelow.Grid.GridToWorld(gridTransform.Position);
|
||||
@@ -53,11 +76,19 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
|
||||
private readonly Transform masterTransform;
|
||||
/// <summary>
|
||||
/// Create a GridTransform within a master Transform component.
|
||||
/// </summary>
|
||||
/// <param name="masterTransform">The master Transform component.</param>
|
||||
public GridTransform(Transform masterTransform)
|
||||
{
|
||||
this.masterTransform = masterTransform;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the position data without updating the associated world position.
|
||||
/// </summary>
|
||||
/// <param name="position">The grid position.</param>
|
||||
public void SetWithoutRelation(Point position)
|
||||
{
|
||||
this.position = position;
|
||||
@@ -67,6 +98,9 @@ namespace DepthsBelow.Component
|
||||
public class WorldTransform
|
||||
{
|
||||
private Vector2 position;
|
||||
/// <summary>
|
||||
/// Sets the world position and updates the grid position of GridTransform.
|
||||
/// </summary>
|
||||
public Vector2 Position
|
||||
{
|
||||
get { return position; }
|
||||
@@ -77,6 +111,9 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand for the world x-position.
|
||||
/// </summary>
|
||||
public float X
|
||||
{
|
||||
get { return position.X; }
|
||||
@@ -86,6 +123,10 @@ namespace DepthsBelow.Component
|
||||
masterTransform.Grid.SetWithoutRelation((Point)this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand for the world y-position.
|
||||
/// </summary>
|
||||
public float Y
|
||||
{
|
||||
get { return position.Y; }
|
||||
@@ -96,20 +137,27 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rotation in radians.
|
||||
/// </summary>
|
||||
public float Rotation;
|
||||
|
||||
public void Rotate(int directionX, int directionY)
|
||||
{
|
||||
Rotation = (float)Math.Atan(directionY/directionX);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Origin to rotate around.
|
||||
/// </summary>
|
||||
public Vector2 Origin;
|
||||
|
||||
/// <summary>
|
||||
/// Implicit conversion between WorldTransform and a Vector2 world position.
|
||||
/// </summary>
|
||||
public static implicit operator Vector2(WorldTransform worldTransform)
|
||||
{
|
||||
return worldTransform.Position;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Explicit conversion between WorldTransform and a Point grid position.
|
||||
/// </summary>
|
||||
public static explicit operator Point(WorldTransform worldTransform)
|
||||
{
|
||||
var gridPosition = DepthsBelow.Grid.WorldToGrid(worldTransform.Position);
|
||||
@@ -117,18 +165,32 @@ namespace DepthsBelow.Component
|
||||
}
|
||||
|
||||
private readonly Transform masterTransform;
|
||||
/// <summary>
|
||||
/// Create a WorldTransform within a master Transform component.
|
||||
/// </summary>
|
||||
/// <param name="masterTransform">The master Transform component.</param>
|
||||
public WorldTransform(Transform masterTransform)
|
||||
{
|
||||
this.masterTransform = masterTransform;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the position data without updating the associated grid position.
|
||||
/// </summary>
|
||||
/// <param name="position">The world position.</param>
|
||||
public void SetWithoutRelation(Vector2 position)
|
||||
{
|
||||
this.position = position;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The grid position.
|
||||
/// </summary>
|
||||
public GridTransform Grid;
|
||||
/// <summary>
|
||||
/// The world position.
|
||||
/// </summary>
|
||||
public WorldTransform World;
|
||||
|
||||
public Transform(Entity parent)
|
||||
@@ -138,11 +200,17 @@ namespace DepthsBelow.Component
|
||||
World = new WorldTransform(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implicit conversion between Transform and a Point grid position.
|
||||
/// </summary>
|
||||
public static implicit operator Point(Transform transform)
|
||||
{
|
||||
return transform.Grid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implicit conversion between Transform and a Vector2 world position.
|
||||
/// </summary>
|
||||
public static implicit operator Vector2(Transform transform)
|
||||
{
|
||||
return transform.World;
|
||||
|
||||
@@ -1,140 +1,261 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Audio;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.GamerServices;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Media;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// This is the main type for your game
|
||||
/// </summary>
|
||||
public class Core : Microsoft.Xna.Framework.Game
|
||||
{
|
||||
GraphicsDeviceManager graphics;
|
||||
SpriteBatch spriteBatch;
|
||||
|
||||
public Camera Camera;
|
||||
|
||||
public static MouseInput MouseInput;
|
||||
public List<Soldier> Squad;
|
||||
public static Map Map;
|
||||
|
||||
public Core()
|
||||
{
|
||||
graphics = new GraphicsDeviceManager(this);
|
||||
Content.RootDirectory = "Content";
|
||||
|
||||
graphics.PreferredBackBufferWidth = 1280;
|
||||
graphics.PreferredBackBufferHeight = 720;
|
||||
graphics.IsFullScreen = false;
|
||||
|
||||
//graphics.SynchronizeWithVerticalRetrace = false;
|
||||
this.IsFixedTimeStep = false;
|
||||
graphics.ApplyChanges();
|
||||
|
||||
this.IsMouseVisible = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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
|
||||
/// related content. Calling base.Initialize will enumerate through any components
|
||||
/// and initialize them as well.
|
||||
/// </summary>
|
||||
protected override void Initialize()
|
||||
{
|
||||
// TODO: Add your initialization logic here
|
||||
Camera = new Camera(this);
|
||||
Squad = new List<Soldier>();
|
||||
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LoadContent will be called once per game and is the place to load
|
||||
/// all of your content.
|
||||
/// </summary>
|
||||
protected override void LoadContent()
|
||||
{
|
||||
// Create a new SpriteBatch, which can be used to draw textures.
|
||||
spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||
|
||||
Map = Content.Load<Map>("maps/Cave.Level1");
|
||||
// Load map objects
|
||||
Map.ParseObjects(this);
|
||||
|
||||
// TODO: use this.Content to load your game content here
|
||||
Soldier.LoadContent(this);
|
||||
|
||||
MouseInput = new MouseInput(this);
|
||||
MouseInput.LoadContent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UnloadContent will be called once per game and is the place to unload
|
||||
/// all content.
|
||||
/// </summary>
|
||||
protected override void UnloadContent()
|
||||
{
|
||||
// TODO: Unload any non ContentManager content here
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Allows the game to run logic such as updating the world,
|
||||
/// checking for collisions, gathering input, and playing audio.
|
||||
/// </summary>
|
||||
/// <param name="gameTime">Provides a snapshot of timing values.</param>
|
||||
protected override void Update(GameTime gameTime)
|
||||
{
|
||||
// Allows the game to exit
|
||||
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
|
||||
this.Exit();
|
||||
|
||||
Camera.Update(gameTime);
|
||||
MouseInput.Update(gameTime);
|
||||
|
||||
// Update soldiers in squad
|
||||
foreach (var soldier in Squad)
|
||||
soldier.Update(gameTime);
|
||||
|
||||
base.Update(gameTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is called when the game should draw itself.
|
||||
/// </summary>
|
||||
/// <param name="gameTime">Provides a snapshot of timing values.</param>
|
||||
protected override void Draw(GameTime gameTime)
|
||||
{
|
||||
GraphicsDevice.Clear(Color.Black);
|
||||
|
||||
// Start drawing using the Camera transform
|
||||
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null,
|
||||
Camera.Transform);
|
||||
|
||||
// Draw the level
|
||||
Map.Draw(spriteBatch);
|
||||
|
||||
// Draw units
|
||||
foreach (var soldier in Squad)
|
||||
{
|
||||
var sr = soldier.GetComponent<Component.SpriteRenderer>();
|
||||
if (sr != null)
|
||||
sr.Draw(spriteBatch);
|
||||
}
|
||||
|
||||
// Draw mouse input visuals
|
||||
MouseInput.Draw(spriteBatch);
|
||||
|
||||
spriteBatch.End();
|
||||
|
||||
base.Draw(gameTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using DepthsBelow.GUI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Audio;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.GamerServices;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Media;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// This is the main type for your game
|
||||
/// </summary>
|
||||
public class Core : Microsoft.Xna.Framework.Game
|
||||
{
|
||||
public static GraphicsDeviceManager GraphicsDeviceManager;
|
||||
private SpriteBatch spriteBatch;
|
||||
private Effect lightShader;
|
||||
private RenderTarget2D lightRenderTarget;
|
||||
private RenderTarget2D sceneRenderTarget;
|
||||
|
||||
public Lua Lua;
|
||||
|
||||
public TurnManager TurnManager;
|
||||
|
||||
public Camera Camera;
|
||||
public Interface Interface;
|
||||
|
||||
public/* static*/ MouseInput MouseInput;
|
||||
public static KeyboardInput KeyboardInput;
|
||||
public List<Soldier> Squad;
|
||||
public DynamicGroupManager GroupManager;
|
||||
public List<SmallEnemy> Swarm;
|
||||
public List<Shot> Volley;
|
||||
|
||||
public List<MonsterSpawn> Spawn;
|
||||
|
||||
public static Map Map;
|
||||
|
||||
public SmallEnemy TestMonster;
|
||||
|
||||
public int Brightness = 30;
|
||||
|
||||
public Core()
|
||||
{
|
||||
GraphicsDeviceManager = new GraphicsDeviceManager(this);
|
||||
GraphicsDeviceManager.PreferredBackBufferWidth = 1280;
|
||||
GraphicsDeviceManager.PreferredBackBufferHeight = 720;
|
||||
GraphicsDeviceManager.IsFullScreen = false;
|
||||
//graphics.SynchronizeWithVerticalRetrace = false;
|
||||
GraphicsDeviceManager.ApplyChanges();
|
||||
|
||||
this.IsFixedTimeStep = false;
|
||||
this.IsMouseVisible = true;
|
||||
|
||||
Content.RootDirectory = "Content";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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
|
||||
/// related content. Calling base.Initialize will enumerate through any components
|
||||
/// and initialize them as well.
|
||||
/// </summary>
|
||||
protected override void Initialize()
|
||||
{
|
||||
GameServices.AddService<GraphicsDevice>(GraphicsDevice);
|
||||
GameServices.AddService<ContentManager>(Content);
|
||||
|
||||
Lua = new Lua();
|
||||
|
||||
TurnManager = new TurnManager(new string[] { "Player", "Computer" });
|
||||
|
||||
Camera = new Camera(this);
|
||||
Interface = new Interface(this);
|
||||
|
||||
Squad = new List<Soldier>();
|
||||
Swarm = new List<SmallEnemy>();
|
||||
Volley = new List<Shot>();
|
||||
|
||||
Spawn = new List<MonsterSpawn>();
|
||||
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LoadContent will be called once per game and is the place to load
|
||||
/// all of your content.
|
||||
/// </summary>
|
||||
protected override void LoadContent()
|
||||
{
|
||||
// Create a new SpriteBatch, which can be used to draw textures.
|
||||
spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||
lightShader = Content.Load<Effect>("shaders/LightEffect");
|
||||
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);
|
||||
|
||||
Map = Content.Load<Map>("maps/prototyp2");
|
||||
//Map = Content.Load<Map>("maps/Aztek.Test");
|
||||
//Map = Content.Load<Map>("maps/Cave.Level1");
|
||||
|
||||
// Load map objects
|
||||
Map.ParseObjects(this);
|
||||
|
||||
Squad[0].Name = "Dean H. Jones";
|
||||
Squad[0].Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
Squad[1].Name = "Walter L. Verville";
|
||||
Squad[1].Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
Squad[2].Name = "Patrick Y. Southerland";
|
||||
Squad[2].Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
Squad[3].Name = "Andrew C. Friend";
|
||||
Squad[3].Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
Squad[4].Name = "Gary B. Whitley";
|
||||
Squad[4].Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
|
||||
// Center the camera on a unit
|
||||
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 * 3.5f);
|
||||
|
||||
Interface.CreateUnitFrames(Squad);
|
||||
|
||||
// TODO: use this.Content to load your game content here
|
||||
Soldier.LoadContent();
|
||||
//SmallEnemy.LoadContent();
|
||||
//Shot.LoadContent();
|
||||
|
||||
MouseInput = new MouseInput(this);
|
||||
MouseInput.LoadContent();
|
||||
KeyboardInput = new KeyboardInput(this);
|
||||
|
||||
TestMonster = new SmallEnemy(ref Swarm);
|
||||
TestMonster.X = 12;
|
||||
TestMonster.Y = 4;
|
||||
Swarm.Add(TestMonster);
|
||||
|
||||
// Load Lua scripts after everything is created
|
||||
Lua.LoadScripts();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UnloadContent will be called once per game and is the place to unload
|
||||
/// all content.
|
||||
/// </summary>
|
||||
protected override void UnloadContent()
|
||||
{
|
||||
// TODO: Unload any non ContentManager content here
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Allows the game to run logic such as updating the world,
|
||||
/// checking for collisions, gathering input, and playing audio.
|
||||
/// </summary>
|
||||
/// <param name="gameTime">Provides a snapshot of timing values.</param>
|
||||
protected override void Update(GameTime gameTime)
|
||||
{
|
||||
// Allows the game to exit
|
||||
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
|
||||
this.Exit();
|
||||
|
||||
Camera.Update(gameTime);
|
||||
MouseInput.Update(gameTime);
|
||||
KeyboardInput.Update(gameTime);
|
||||
|
||||
EntityManager.Update(gameTime);
|
||||
|
||||
Interface.Update(gameTime);
|
||||
GUIManager.Update(gameTime);
|
||||
|
||||
base.Update(gameTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is called when the game should draw itself.
|
||||
/// </summary>
|
||||
/// <param name="gameTime">Provides a snapshot of timing values.</param>
|
||||
protected override void Draw(GameTime gameTime)
|
||||
{
|
||||
MouseState ms = Mouse.GetState();
|
||||
|
||||
// Draw to the lighting render target
|
||||
GraphicsDevice.SetRenderTarget(lightRenderTarget);
|
||||
GraphicsDevice.Clear(new Color(Brightness, Brightness, Brightness));
|
||||
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Additive, SamplerState.PointClamp, null, null, null,
|
||||
Camera.Transform);
|
||||
|
||||
// Draw flashlights
|
||||
foreach (var light in EntityManager.GetComponents<Component.Flashlight>())
|
||||
light.Draw(spriteBatch);
|
||||
|
||||
spriteBatch.End();
|
||||
GraphicsDevice.SetRenderTarget(null);
|
||||
|
||||
// Draw the scene to a render target
|
||||
GraphicsDevice.SetRenderTarget(sceneRenderTarget);
|
||||
GraphicsDevice.Clear(Color.Black);
|
||||
// Start drawing using the Camera transform
|
||||
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null,
|
||||
Camera.Transform);
|
||||
|
||||
// Draw the level
|
||||
Map.Draw(spriteBatch);
|
||||
|
||||
// Draw entities
|
||||
foreach (var spriteRenderer in EntityManager.GetComponents<Component.SpriteRenderer>())
|
||||
{
|
||||
// Only render illuminated entities
|
||||
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);
|
||||
if (
|
||||
sourceRect.X >= 0
|
||||
&& sourceRect.Y >= 0
|
||||
&& sourceRect.X < lightRenderTarget.Width
|
||||
&& sourceRect.Y < lightRenderTarget.Height
|
||||
)
|
||||
{
|
||||
var lightData = new Color[1];
|
||||
lightRenderTarget.GetData<Color>(0, sourceRect, lightData, 0, 1);
|
||||
if (lightData[0] != new Color(Brightness, Brightness, Brightness))
|
||||
spriteRenderer.Draw(spriteBatch);
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
var debugTexture = new Texture2D(GraphicsDevice, 1, 1);
|
||||
debugTexture.SetData(new Color[] { Color.White });
|
||||
foreach (var collisionComponent in EntityManager.GetComponents<Component.Collision>())
|
||||
{
|
||||
spriteBatch.Draw(debugTexture, collisionComponent.Rectangle, Color.Red * 0.5f);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Draw mouse input visuals
|
||||
MouseInput.Draw(spriteBatch);
|
||||
|
||||
spriteBatch.End();
|
||||
GraphicsDevice.SetRenderTarget(null);
|
||||
|
||||
// Draw the scene from the render target with the light shader
|
||||
lightShader.Parameters["LightsTexture"].SetValue(lightRenderTarget);
|
||||
lightShader.CurrentTechnique.Passes[0].Apply();
|
||||
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque, SamplerState.PointClamp, null, null, lightShader,
|
||||
Matrix.Identity);
|
||||
spriteBatch.Draw(sceneRenderTarget, Vector2.Zero, Color.White);
|
||||
spriteBatch.End();
|
||||
|
||||
// Draw GUI components
|
||||
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.AnisotropicClamp, null, null, null, Matrix.Identity);
|
||||
GUIManager.Draw(spriteBatch);
|
||||
spriteBatch.End();
|
||||
|
||||
base.Draw(gameTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
static class CustomExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Load all content within a certain folder. The function
|
||||
/// returns a dictionary where the file name, without type
|
||||
/// extension, is the key and the texture object is the value.
|
||||
///
|
||||
/// The contentFolder parameter has to be relative to the
|
||||
/// game.Content.RootDirectory folder.
|
||||
///
|
||||
/// http://danielsaidi.wordpress.com/2010/01/26/xna-load-all-content-files-in-a-folder/
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The content type.</typeparam>
|
||||
/// <param name="contentManager">The content manager for which content is to be loaded.</param>
|
||||
/// <param name="contentFolder">The game project root folder relative folder path.</param>
|
||||
/// <returns>A list of loaded content objects.</returns>
|
||||
public static Dictionary<String, T> LoadContent<T>(this ContentManager contentManager, string contentFolder)
|
||||
{
|
||||
//Load directory info, abort if none
|
||||
DirectoryInfo dir = new DirectoryInfo(contentManager.RootDirectory + "\\" + contentFolder);
|
||||
if (!dir.Exists)
|
||||
throw new DirectoryNotFoundException();
|
||||
//Init the resulting list
|
||||
Dictionary<String, T> result = new Dictionary<String, T>();
|
||||
|
||||
//Load all files that matches the file filter
|
||||
FileInfo[] files = dir.GetFiles("*.*");
|
||||
foreach (FileInfo file in files)
|
||||
{
|
||||
string key = Path.GetFileNameWithoutExtension(file.Name);
|
||||
|
||||
result[key] = contentManager.Load<T>(contentFolder + "/" + key);
|
||||
}
|
||||
//Return the result
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,7 @@
|
||||
<UseVSHostingProcess>false</UseVSHostingProcess>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<XnaCompressContent>false</XnaCompressContent>
|
||||
<DocumentationFile>bin\x86\Debug\DepthsBelow.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -70,9 +71,13 @@
|
||||
<GenerateManifests>true</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>true</SignManifests>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="LuaInterface, Version=2.0.0.16708, Culture=neutral, processorArchitecture=x86">
|
||||
<HintPath>..\..\LuaInterface\LuaInterface.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
@@ -107,27 +112,37 @@
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Xml">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Core">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Net">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Camera.cs" />
|
||||
<Compile Include="Component\Flashlight.cs" />
|
||||
<Compile Include="Door.cs" />
|
||||
<Compile Include="DynamicGroupManager.cs" />
|
||||
<Compile Include="MonsterSpawn.cs" />
|
||||
<Compile Include="TurnManager.cs" />
|
||||
<Compile Include="CustomExtensions.cs" />
|
||||
<Compile Include="EntityManager.cs" />
|
||||
<Compile Include="GameServices.cs" />
|
||||
<Compile Include="Interface.cs" />
|
||||
<Compile Include="Lua.cs" />
|
||||
<Compile Include="Shot.cs" />
|
||||
<Compile Include="Component\Stat.cs" />
|
||||
<Compile Include="GUIManager.cs" />
|
||||
<Compile Include="GUI\Button.cs" />
|
||||
<Compile Include="GUI\Frame.cs" />
|
||||
<Compile Include="GUI\Text.cs" />
|
||||
<Compile Include="KeyboardInput.cs" />
|
||||
<Compile Include="Component\PathFinder.cs" />
|
||||
<Compile Include="Component\Transform.cs" />
|
||||
<Compile Include="Grid.cs" />
|
||||
<Compile Include="Component\Collision.cs" />
|
||||
<Compile Include="Component\Component.cs" />
|
||||
<Compile Include="Component\GridTransform.cs" />
|
||||
<Compile Include="Core.cs" />
|
||||
<Compile Include="Entity.cs" />
|
||||
<Compile Include="Map.cs" />
|
||||
@@ -135,8 +150,9 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Component\SpriteRenderer.cs" />
|
||||
<Compile Include="SmallEnemy.cs" />
|
||||
<Compile Include="Soldier.cs" />
|
||||
<Compile Include="Component\PixelTransform.cs" />
|
||||
<Compile Include="Utility.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Game.ico" />
|
||||
@@ -181,16 +197,17 @@
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="DepthsBelow_TemporaryKey.pfx" />
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.targets" />
|
||||
<!--
|
||||
To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
<!--
|
||||
To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DepthsBelow.Component;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class Door : Entity
|
||||
{
|
||||
public Texture2D Texture;
|
||||
|
||||
public static Texture2D TextureOpen;
|
||||
public static Texture2D TextureClosed;
|
||||
public static Texture2D TextureDestroyed;
|
||||
|
||||
public bool Alive = true;
|
||||
public bool IsOpen;
|
||||
|
||||
public Door(bool horizontal)
|
||||
: base()
|
||||
{
|
||||
LoadContent();
|
||||
|
||||
IsOpen = false;
|
||||
|
||||
if (horizontal)
|
||||
Transform.World.Rotation = -MathHelper.PiOver2;
|
||||
|
||||
var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White };
|
||||
if (horizontal)
|
||||
rc.Offset.Y += Texture.Width;
|
||||
AddComponent(rc);
|
||||
|
||||
Collision cc;
|
||||
if (horizontal)
|
||||
cc = new Collision(this, Texture.Height, Texture.Width);
|
||||
else
|
||||
cc = new Collision(this, Texture.Width, Texture.Height);
|
||||
cc.Solid = true;
|
||||
AddComponent(cc);
|
||||
}
|
||||
|
||||
public void LoadContent()
|
||||
{
|
||||
TextureOpen = GameServices.GetService<ContentManager>().Load<Texture2D>("images/door_open");
|
||||
TextureClosed = GameServices.GetService<ContentManager>().Load<Texture2D>("images/door_closed");
|
||||
TextureDestroyed = GameServices.GetService<ContentManager>().Load<Texture2D>("images/door_destroyed");
|
||||
|
||||
Texture = TextureClosed;
|
||||
}
|
||||
|
||||
public void Open()
|
||||
{
|
||||
if (Alive && !IsOpen)
|
||||
{
|
||||
IsOpen = true;
|
||||
this.GetComponent<SpriteRenderer>().Texture = TextureOpen;
|
||||
this.GetComponent<Collision>().Solid = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (Alive && IsOpen)
|
||||
{
|
||||
IsOpen = false;
|
||||
this.GetComponent<SpriteRenderer>().Texture = TextureClosed;
|
||||
this.GetComponent<Collision>().Solid = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Toggle()
|
||||
{
|
||||
if (IsOpen)
|
||||
Close();
|
||||
else
|
||||
Open();
|
||||
}
|
||||
|
||||
public void Kill()
|
||||
{
|
||||
Alive = false;
|
||||
this.GetComponent<SpriteRenderer>().Texture = TextureDestroyed;
|
||||
this.GetComponent<Collision>().Solid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class DynamicGroupManager
|
||||
{
|
||||
public class Group
|
||||
{
|
||||
public List<Entity> Entities;
|
||||
public float Panic;
|
||||
public float MaxPanic
|
||||
{
|
||||
get
|
||||
{
|
||||
float maxPanic = 0;
|
||||
foreach (var entity in Entities)
|
||||
{
|
||||
var stats = entity.GetComponent<Component.Stat>();
|
||||
if (stats != null && stats.Life > 0)
|
||||
maxPanic += stats.MaxPanic;
|
||||
}
|
||||
return maxPanic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<Entity> entities;
|
||||
|
||||
public float MaxRange;
|
||||
|
||||
public List<Group> Groups;
|
||||
|
||||
public DynamicGroupManager(List<Entity> entities, float maxRange)
|
||||
{
|
||||
this.entities = entities;
|
||||
this.MaxRange = maxRange;
|
||||
|
||||
UpdateGroups();
|
||||
}
|
||||
|
||||
public void UpdateGroups()
|
||||
{
|
||||
if (Groups == null)
|
||||
Groups = new List<Group>();
|
||||
|
||||
var newGroups = CreateGroups(MaxRange);
|
||||
|
||||
foreach (var newGroup in newGroups)
|
||||
{
|
||||
for (int index = 0; index < newGroup.Entities.Count; index++)
|
||||
{
|
||||
var entity = newGroup.Entities[index];
|
||||
|
||||
Group oldGroup = null;
|
||||
// Find the group the entity belonged to before
|
||||
foreach (var group in Groups)
|
||||
{
|
||||
if (@group.Entities.Contains(entity))
|
||||
{
|
||||
oldGroup = @group;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldGroup != null)
|
||||
{
|
||||
if (entity.GetComponent<Component.Stat>().Life > 0)
|
||||
{
|
||||
newGroup.Panic += (oldGroup.Panic/oldGroup.MaxPanic)*(float) entity.GetComponent<Component.Stat>().MaxPanic;
|
||||
//if (entity.GetComponent<Component.Stat>().Life > 0)
|
||||
oldGroup.Panic -= (oldGroup.Panic/oldGroup.MaxPanic)*(float) entity.GetComponent<Component.Stat>().MaxPanic;
|
||||
oldGroup.Entities.Remove(entity);
|
||||
}
|
||||
}
|
||||
else
|
||||
newGroup.Panic = 125;
|
||||
}
|
||||
}
|
||||
|
||||
Groups = newGroups;
|
||||
}
|
||||
|
||||
private List<Group> CreateGroups(float maxRange)
|
||||
{
|
||||
var alreadyGrouped = new List<Entity>();
|
||||
var groups = new List<Group>();
|
||||
|
||||
for (int index = 0; index < entities.Count; index++)
|
||||
{
|
||||
var soldier = entities[index];
|
||||
|
||||
if (!alreadyGrouped.Contains(soldier) && soldier.GetComponent<Component.Stat>().Life > 0)
|
||||
{
|
||||
var group = new List<Entity>();
|
||||
GetNearChain(ref group, soldier, maxRange);
|
||||
alreadyGrouped.AddRange(group);
|
||||
|
||||
if (group.Count > 0)
|
||||
groups.Add(new Group() { Entities = group });
|
||||
}
|
||||
}
|
||||
|
||||
return groups;
|
||||
}
|
||||
|
||||
// Get all entities who are close to each other in a chain
|
||||
private void GetNearChain(ref List<Entity> group, Entity entity, float maxRange)
|
||||
{
|
||||
for (int index = 0; index < entities.Count; index++)
|
||||
{
|
||||
var nearSoldier = entities[index];
|
||||
|
||||
if (!group.Contains(nearSoldier) && nearSoldier.GetComponent<Component.Stat>().Life > 0)
|
||||
{
|
||||
float distance = Vector2.Distance(nearSoldier.Transform.World + nearSoldier.Transform.World.Origin,
|
||||
entity.Transform.World + entity.Transform.World.Origin);
|
||||
if (distance <= maxRange)
|
||||
{
|
||||
group.Add(nearSoldier);
|
||||
GetNearChain(ref group, nearSoldier, maxRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,44 +6,94 @@ using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class Entity
|
||||
/// <summary>
|
||||
/// Game object.
|
||||
/// </summary>
|
||||
public class Entity : IDisposable
|
||||
{
|
||||
List<Component.Component> Components;
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand for transform component.
|
||||
/// </summary>
|
||||
public Component.Transform Transform;
|
||||
public Component.PixelTransform pixelTransform;
|
||||
public Component.GridTransform gridTransform;
|
||||
|
||||
/// <summary>
|
||||
/// Shorthand to the grid transform position.
|
||||
/// </summary>
|
||||
public Point Position
|
||||
{
|
||||
get { return this.Transform.Grid.Position; }
|
||||
set { this.Transform.Grid.Position = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Shorthand to the grid transform x-position.
|
||||
/// </summary>
|
||||
public int X
|
||||
{
|
||||
get { return this.Transform.Grid.X; }
|
||||
set
|
||||
{
|
||||
this.Transform.Grid.X = value;
|
||||
}
|
||||
set { this.Transform.Grid.X = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Shorthand to the grid transform y-position.
|
||||
/// </summary>
|
||||
public int Y
|
||||
{
|
||||
get { return this.Transform.Grid.Y; }
|
||||
set
|
||||
{
|
||||
this.Transform.Grid.Y = value;
|
||||
}
|
||||
set { this.Transform.Grid.Y = value; }
|
||||
}
|
||||
|
||||
protected Core core;
|
||||
|
||||
public Entity(Core core)
|
||||
/// <summary>
|
||||
/// Storage for property data
|
||||
/// </summary>
|
||||
public Dictionary<string, object> Properties = new Dictionary<string, object>();
|
||||
/// <summary>
|
||||
/// Shorthand for frame properties.
|
||||
/// </summary>
|
||||
public object this[string key]
|
||||
{
|
||||
this.core = core;
|
||||
get { return Properties[key]; }
|
||||
set { Properties[key] = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a game object and adds it to the referenced entity manager.
|
||||
/// </summary>
|
||||
///
|
||||
public Entity()
|
||||
{
|
||||
EntityManager.Add(this);
|
||||
|
||||
Components = new List<Component.Component>();
|
||||
|
||||
Transform = new Component.Transform(this);
|
||||
AddComponent(Transform);
|
||||
pixelTransform = new Component.PixelTransform(this);
|
||||
AddComponent(pixelTransform);
|
||||
gridTransform = new Component.GridTransform(this);
|
||||
AddComponent(gridTransform);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of IDisposable.
|
||||
/// Dispose of any unmanaged resources.
|
||||
/// </summary>
|
||||
public virtual void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the entity from the game world and disposes
|
||||
/// potential unmanaged resources.
|
||||
/// </summary>
|
||||
public virtual void Remove()
|
||||
{
|
||||
EntityManager.Remove(this);
|
||||
Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the reference to a component contained in the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The component type.</typeparam>
|
||||
/// <returns>Returns the component of requested type.</returns>
|
||||
public T GetComponent<T>() where T : Component.Component
|
||||
{
|
||||
foreach (Component.Component c in Components)
|
||||
@@ -55,11 +105,19 @@ namespace DepthsBelow
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a component to the entity.
|
||||
/// </summary>
|
||||
/// <param name="c">the component to add</param>
|
||||
public void AddComponent(Component.Component c)
|
||||
{
|
||||
Components.Add(c);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the entity and all child components.
|
||||
/// </summary>
|
||||
/// <param name="gameTime"></param>
|
||||
public virtual void Update(GameTime gameTime)
|
||||
{
|
||||
// Update components
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages a group of entities.
|
||||
/// </summary>
|
||||
public static class EntityManager
|
||||
{
|
||||
public static List<Entity> Entities = new List<Entity>();
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of IDisposable.
|
||||
/// Dispose of the entity manager, and all entities it contains.
|
||||
/// </summary>
|
||||
public static void Dispose()
|
||||
{
|
||||
foreach (var entity in Entities)
|
||||
entity.Dispose();
|
||||
|
||||
Entities = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add an entity to the entity manager.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity to add.</param>
|
||||
public static void Add(Entity entity)
|
||||
{
|
||||
Entities.Add(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove an entity from the entity manager.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity to remove.</param>
|
||||
public static void Remove(Entity entity)
|
||||
{
|
||||
Entities.Remove(entity);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset the entity manager, disposing any entities it contains.
|
||||
/// </summary>
|
||||
public static void Reset()
|
||||
{
|
||||
foreach (var entity in Entities)
|
||||
entity.Dispose();
|
||||
|
||||
Entities.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the reference to a component contained in the entity.
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The component type.</typeparam>
|
||||
/// <returns>Returns the component of requested type.</returns>
|
||||
public static List<T> GetComponents<T>() where T : Component.Component
|
||||
{
|
||||
List<T> components = new List<T>();
|
||||
|
||||
foreach (var entity in Entities)
|
||||
{
|
||||
var component = entity.GetComponent<T>();
|
||||
if (component != null)
|
||||
components.Add(component);
|
||||
}
|
||||
|
||||
return components;
|
||||
}
|
||||
|
||||
public static List<T> GetEntities<T>() where T : Entity
|
||||
{
|
||||
return Entities.OfType<T>().ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update all entities handled by the entity manager.
|
||||
/// </summary>
|
||||
/// <param name="gameTime"></param>
|
||||
public static void Update(GameTime gameTime)
|
||||
{
|
||||
foreach (var entity in Entities.ToList())
|
||||
entity.Update(gameTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draw all entities handled by the entity manager.
|
||||
/// </summary>
|
||||
/// <param name="spriteBatch"></param>
|
||||
public static void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
foreach (var entity in Entities)
|
||||
{
|
||||
entity.GetComponent<Component.SpriteRenderer>().Draw(spriteBatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow.GUI
|
||||
{
|
||||
/// <summary>
|
||||
/// A button frame which can handle clicks.
|
||||
/// </summary>
|
||||
public class Button : Frame
|
||||
{
|
||||
//public delegate void OnClickHandler(Point pos);
|
||||
|
||||
/// <summary>
|
||||
/// Handler of OnClick events.
|
||||
/// </summary>
|
||||
//public OnClickHandler OnClick;
|
||||
|
||||
private MouseState lastMouseState;
|
||||
|
||||
public Button()
|
||||
: base()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Button(Frame parent)
|
||||
: base(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
base.Update(gameTime);
|
||||
|
||||
/*MouseState ms = Mouse.GetState();
|
||||
|
||||
if (ms.LeftButton == ButtonState.Released && lastMouseState.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
// HACK: This should be handled globally somewhere else to prevent event bubbling
|
||||
if (
|
||||
ms.X >= AbsoluteRectangle.Left
|
||||
&& ms.X < AbsoluteRectangle.Right
|
||||
&& ms.Y >= AbsoluteRectangle.Top
|
||||
&& ms.Y < AbsoluteRectangle.Bottom)
|
||||
{
|
||||
if (OnClick != null)
|
||||
{
|
||||
var clickPos = new Point(ms.X - AbsoluteRectangle.X, ms.Y - AbsoluteRectangle.Y);
|
||||
OnClick(clickPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lastMouseState = ms;*/
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow.GUI
|
||||
{
|
||||
/// <summary>
|
||||
/// A generic GUI frame.
|
||||
/// </summary>
|
||||
public class Frame
|
||||
{
|
||||
public string Name;
|
||||
/// <summary>
|
||||
/// Width of the frame.
|
||||
/// </summary>
|
||||
public int Width
|
||||
{
|
||||
get { return this.Rectangle.Width; }
|
||||
set { this.Rectangle.Width = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Height of the frame.
|
||||
/// </summary>
|
||||
public int Height
|
||||
{
|
||||
get { return this.Rectangle.Height; }
|
||||
set { this.Rectangle.Height = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// X-position of the frame.
|
||||
/// </summary>
|
||||
public int X
|
||||
{
|
||||
get { return this.Rectangle.X; }
|
||||
set { this.Rectangle.X = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Y-position of the frame.
|
||||
/// </summary>
|
||||
public int Y
|
||||
{
|
||||
get { return this.Rectangle.Y; }
|
||||
set { this.Rectangle.Y = value; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The x-coordinate of the left side of the frame.
|
||||
/// </summary>
|
||||
public int Left
|
||||
{
|
||||
get { return this.Rectangle.Left; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The y-coordinate of the top side of the frame.
|
||||
/// </summary>
|
||||
public int Top
|
||||
{
|
||||
get { return this.Rectangle.Top; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The x-coordinate of the right side of the frame.
|
||||
/// </summary>
|
||||
public int Right
|
||||
{
|
||||
get { return this.Rectangle.Right; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The y-coordinate of the bottom side of the frame.
|
||||
/// </summary>
|
||||
public int Bottom
|
||||
{
|
||||
get { return this.Rectangle.Bottom; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Rectangle of the frame.
|
||||
/// </summary>
|
||||
public Rectangle Rectangle;
|
||||
/// <summary>
|
||||
/// Absolute rectangle of the frame.
|
||||
/// Takes parent frame positions in consideration and converts negative widths and heights.
|
||||
/// </summary>
|
||||
public Rectangle AbsoluteRectangle
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Parent != null)
|
||||
return Utility.MakeRectanglePositive(new Rectangle(Parent.AbsoluteRectangle.X + Rectangle.X, Parent.AbsoluteRectangle.Y + Rectangle.Y, Rectangle.Width, Rectangle.Height));
|
||||
else
|
||||
return Utility.MakeRectanglePositive(Rectangle);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Optional background texture of the frame.
|
||||
/// </summary>
|
||||
public Texture2D Texture;
|
||||
/// <summary>
|
||||
/// Texture color tint.
|
||||
/// </summary>
|
||||
public Color Color;
|
||||
|
||||
public bool _Visible = true;
|
||||
/// <summary>
|
||||
/// If the frame is visible or not.
|
||||
/// </summary>
|
||||
public bool Visible
|
||||
{
|
||||
get { return (Parent != null) ? _Visible && Parent.Visible : _Visible; }
|
||||
set { _Visible = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The layer of the frame.
|
||||
/// Bigger number means closer to the screen.
|
||||
/// </summary>
|
||||
public int Layer = 0;
|
||||
/// <summary>
|
||||
/// Gets the sum of this frame and all parent layers.
|
||||
/// </summary>
|
||||
public int LayerSum
|
||||
{
|
||||
get { return (Parent != null) ? this.Layer + Parent.LayerSum : this.Layer; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The unique identifier of the frame.
|
||||
/// </summary>
|
||||
public int UID { get; private set; }
|
||||
/// <summary>
|
||||
/// Potential parent frame.
|
||||
/// </summary>
|
||||
public Frame Parent;
|
||||
/// <summary>
|
||||
/// Potential children frames.
|
||||
/// </summary>
|
||||
public List<Frame> Children;
|
||||
|
||||
/// <summary>
|
||||
/// Storage for property data
|
||||
/// </summary>
|
||||
public Dictionary<string, object> Properties = new Dictionary<string, object>();
|
||||
/// <summary>
|
||||
/// Shorthand for frame properties.
|
||||
/// </summary>
|
||||
public object this[string key]
|
||||
{
|
||||
get { return Properties[key]; }
|
||||
set { Properties[key] = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls whether mouse events can be handled by the frame.
|
||||
/// </summary>
|
||||
public bool MouseEnabled = false;
|
||||
|
||||
#region Events
|
||||
|
||||
/// <summary>
|
||||
/// Handler for click events.
|
||||
/// </summary>
|
||||
/// <param name="frame">The frame.</param>
|
||||
/// <param name="args">The <see cref="GUIManager.MouseEventArgs" /> instance containing the event data.</param>
|
||||
public delegate void OnClickHandler(Frame frame, GUIManager.MouseEventArgs args);
|
||||
/// <summary>
|
||||
/// Occurs when the frame is clicked inside it's bounding rectangle.
|
||||
/// </summary>
|
||||
public event OnClickHandler OnClick;
|
||||
|
||||
/// <summary>
|
||||
/// Handler for press events.
|
||||
/// </summary>
|
||||
/// <param name="frame">The frame.</param>
|
||||
/// <param name="args">The <see cref="GUIManager.MouseEventArgs" /> instance containing the event data.</param>
|
||||
public delegate void OnPressHandler(Frame frame, GUIManager.MouseEventArgs args);
|
||||
/// <summary>
|
||||
/// Occurs when the frame is clicked inside it's bounding rectangle.
|
||||
/// </summary>
|
||||
public event OnPressHandler OnPress;
|
||||
|
||||
/// <summary>
|
||||
/// Handler for release events.
|
||||
/// </summary>
|
||||
/// <param name="frame">The frame.</param>
|
||||
/// <param name="args">The <see cref="GUIManager.MouseEventArgs" /> instance containing the event data.</param>
|
||||
public delegate void OnReleaseHandler(Frame frame, GUIManager.MouseEventArgs args);
|
||||
/// <summary>
|
||||
/// Occurs when the frame is clicked inside it's bounding rectangle.
|
||||
/// </summary>
|
||||
public event OnReleaseHandler OnRelease;
|
||||
|
||||
/// <summary>
|
||||
/// Handler for mouse over events.
|
||||
/// </summary>
|
||||
/// <param name="frame">The frame.</param>
|
||||
/// <param name="args">The <see cref="GUIManager.MouseEventArgs" /> instance containing the event data.</param>
|
||||
public delegate void OnMouseOverHandler(Frame frame, GUIManager.MouseEventArgs args);
|
||||
/// <summary>
|
||||
/// Occurs when the frame is clicked inside it's bounding rectangle.
|
||||
/// </summary>
|
||||
public event OnMouseOverHandler OnMouseOver;
|
||||
|
||||
/// <summary>
|
||||
/// Handler for mouse out events.
|
||||
/// </summary>
|
||||
/// <param name="frame">The frame.</param>
|
||||
/// <param name="args">The <see cref="GUIManager.MouseEventArgs" /> instance containing the event data.</param>
|
||||
public delegate void OnMouseOutHandler(Frame frame, GUIManager.MouseEventArgs args);
|
||||
/// <summary>
|
||||
/// Occurs when the frame is clicked inside it's bounding rectangle.
|
||||
/// </summary>
|
||||
public event OnMouseOutHandler OnMouseOut;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Raises the specified event by name.
|
||||
/// </summary>
|
||||
/// <param name="eventName">Name of the event.</param>
|
||||
/// <param name="eventArgs">The <see cref="EventArgs" /> instance containing the event data.</param>
|
||||
/// <returns>Returns true if any event was raised.</returns>
|
||||
public bool Raise(string eventName, EventArgs eventArgs)
|
||||
{
|
||||
// Get the event field info
|
||||
var fieldInfo = this.GetType().GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
// If the event exists
|
||||
if (fieldInfo != null)
|
||||
{
|
||||
var eventDelegate = (MulticastDelegate)fieldInfo.GetValue(this);
|
||||
// If there's any subscribed events...
|
||||
if (eventDelegate != null)
|
||||
{
|
||||
// Invoke their raise methods
|
||||
foreach (var handler in eventDelegate.GetInvocationList())
|
||||
{
|
||||
try
|
||||
{
|
||||
handler.Method.Invoke(handler.Target, new object[] { this, eventArgs });
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the subscriber count for a specific event.
|
||||
/// </summary>
|
||||
/// <param name="eventName">Name of the event.</param>
|
||||
/// <returns>Returns the number of subscribers of the event.</returns>
|
||||
public int GetSubscriberCount(string eventName)
|
||||
{
|
||||
// Get the event field info
|
||||
var fieldInfo = this.GetType().GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
// If the event exists
|
||||
if (fieldInfo != null)
|
||||
{
|
||||
var eventDelegate = (MulticastDelegate)fieldInfo.GetValue(this);
|
||||
// If there's any subscribed events...
|
||||
if (eventDelegate != null)
|
||||
return eventDelegate.GetInvocationList().Length;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private MouseState lastMouseState;
|
||||
|
||||
/// <summary>
|
||||
/// Create a blank frame.
|
||||
/// </summary>
|
||||
public Frame()
|
||||
{
|
||||
this.Rectangle = Rectangle.Empty;
|
||||
this.Texture = null;
|
||||
this.Color = Color.White;
|
||||
|
||||
this.Children = new List<Frame>();
|
||||
|
||||
this.UID = GUIManager.Add(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a blank frame as the child of a frame.
|
||||
/// </summary>
|
||||
/// <param name="parentFrame">The parent frame.</param>
|
||||
public Frame(Frame parentFrame)
|
||||
: this()
|
||||
{
|
||||
this.Parent = parentFrame;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a child frame to the frame.
|
||||
/// </summary>
|
||||
/// <param name="childFrame">The child frame to add.</param>
|
||||
public void AddChild(Frame childFrame)
|
||||
{
|
||||
childFrame.Parent = this;
|
||||
if (!Children.Contains(childFrame))
|
||||
Children.Add(childFrame);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove a child frame from the frame.
|
||||
/// </summary>
|
||||
/// <param name="childFrame">The child frame to remove.</param>
|
||||
public void RemoveChild(Frame childFrame)
|
||||
{
|
||||
if (Children.Contains(childFrame))
|
||||
Children.Remove(childFrame);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Destroys the frame and all its children.
|
||||
/// </summary>
|
||||
public void Destroy()
|
||||
{
|
||||
if (Parent != null)
|
||||
Parent.RemoveChild(this);
|
||||
|
||||
GUIManager.Remove(this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the background texture of the frame.
|
||||
/// </summary>
|
||||
/// <param name="fileName">Filename of the texture.</param>
|
||||
public void SetTexture(string fileName)
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>(fileName);
|
||||
}
|
||||
|
||||
public virtual void Update(GameTime gameTime)
|
||||
{
|
||||
/*MouseState ms = Mouse.GetState();
|
||||
|
||||
if (ms.LeftButton == ButtonState.Released && lastMouseState.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
// HACK: This should be handled globally somewhere else to prevent event bubbling
|
||||
if (
|
||||
ms.X >= AbsoluteRectangle.Left
|
||||
&& ms.X < AbsoluteRectangle.Right
|
||||
&& ms.Y >= AbsoluteRectangle.Top
|
||||
&& ms.Y < AbsoluteRectangle.Bottom)
|
||||
{
|
||||
if (OnClick != null)
|
||||
{
|
||||
var args = new MouseEventArgs()
|
||||
{
|
||||
Position = new Point(ms.X - AbsoluteRectangle.X, ms.Y - AbsoluteRectangle.Y),
|
||||
Time = gameTime.TotalGameTime
|
||||
};
|
||||
OnClick(this, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lastMouseState = ms;*/
|
||||
|
||||
/*foreach (var child in Children)
|
||||
child.Update(gameTime);*/
|
||||
}
|
||||
|
||||
public virtual void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
if (Visible)
|
||||
{
|
||||
if (Texture != null)
|
||||
spriteBatch.Draw(Texture,
|
||||
AbsoluteRectangle,
|
||||
null,
|
||||
Color,
|
||||
0,
|
||||
Vector2.Zero,
|
||||
((Width < 0) ? SpriteEffects.FlipHorizontally : 0)
|
||||
| ((Height < 0) ? SpriteEffects.FlipVertically : 0),
|
||||
0);
|
||||
|
||||
/*foreach (var child in Children)
|
||||
child.Draw(spriteBatch);*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow.GUI
|
||||
{
|
||||
/// <summary>
|
||||
/// A basic text control.
|
||||
/// </summary>
|
||||
class Text : Frame
|
||||
{
|
||||
/// <summary>
|
||||
/// Text to display.
|
||||
/// </summary>
|
||||
public String Value;
|
||||
/// <summary>
|
||||
/// Font to use while rendering.
|
||||
/// </summary>
|
||||
public SpriteFont Font;
|
||||
|
||||
public Text()
|
||||
: base()
|
||||
{
|
||||
this.Color = Color.White;
|
||||
}
|
||||
|
||||
public Text(Frame parent)
|
||||
: base(parent)
|
||||
{
|
||||
this.Color = Color.White;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the font to use while rendering.
|
||||
/// </summary>
|
||||
/// <param name="spriteFontName">Filename of the font.</param>
|
||||
public void SetFont(string spriteFontName)
|
||||
{
|
||||
Font = GameServices.GetService<ContentManager>().Load<SpriteFont>(spriteFontName);
|
||||
}
|
||||
|
||||
public override void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
base.Draw(spriteBatch);
|
||||
|
||||
if (Visible && Font != null)
|
||||
spriteBatch.DrawString(Font, Value, new Vector2(Rectangle.X + Parent.AbsoluteRectangle.X, Rectangle.Y + Parent.AbsoluteRectangle.Y), Color);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DepthsBelow.GUI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public static class GUIManager
|
||||
{
|
||||
/// <summary>
|
||||
/// GUI mouse event arguments.
|
||||
/// </summary>
|
||||
public class MouseEventArgs : EventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The XNA mouse state.
|
||||
/// </summary>
|
||||
public MouseState MouseState;
|
||||
|
||||
public ButtonState LeftButton;
|
||||
public ButtonState MiddleButton;
|
||||
public ButtonState RightButton;
|
||||
public int ScrollWheelValue;
|
||||
|
||||
/// <summary>
|
||||
/// The time of the click, since the start of the program.
|
||||
/// </summary>
|
||||
public TimeSpan Time;
|
||||
}
|
||||
|
||||
public static List<Frame> Frames = new List<Frame>();
|
||||
private static int uidIndex = 0;
|
||||
|
||||
public static int Add(Frame frame)
|
||||
{
|
||||
Frames.Add(frame);
|
||||
return CreateUID();
|
||||
}
|
||||
|
||||
public static void Remove(Frame frame)
|
||||
{
|
||||
Frames.Remove(frame);
|
||||
}
|
||||
|
||||
public static int CreateUID()
|
||||
{
|
||||
return uidIndex++;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculates which frames are intersecting a point.
|
||||
/// </summary>
|
||||
/// <param name="point">A point on the screen.</param>
|
||||
/// <returns>Returns a list of frames intersecting the point.</returns>
|
||||
public static List<Frame> FramesIntersectingPoint(Point point)
|
||||
{
|
||||
var rect = new Rectangle(point.X, point.Y, 1, 1);
|
||||
return Frames.Where(frame => rect.Intersects(frame.AbsoluteRectangle)).ToList();
|
||||
}
|
||||
|
||||
public static bool RaiseAt(string eventName, EventArgs eventArgs, Point position)
|
||||
{
|
||||
// Create a list of all frames which intersects with the click position
|
||||
var intersections = FramesIntersectingPoint(position);
|
||||
// Filter it by event
|
||||
intersections = intersections.Where(frame => frame.GetSubscriberCount(eventName) > 0).ToList();
|
||||
// Get the topmost frame of that list
|
||||
var topFrame = GetTopFrame(intersections);
|
||||
|
||||
if (topFrame != null)
|
||||
return topFrame.Raise(eventName, eventArgs);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the top frame in the frame stack.
|
||||
/// </summary>
|
||||
/// <param name="frames">A list of frames to check.</param>
|
||||
/// <returns>Returns the topmost frame.</returns>
|
||||
private static Frame GetTopFrame(List<Frame> frames)
|
||||
{
|
||||
if (frames.Count == 0)
|
||||
return null;
|
||||
|
||||
if (frames.Count == 1)
|
||||
return frames.First();
|
||||
|
||||
return frames.OrderByDescending(f => f, new FrameSort()).First();
|
||||
}
|
||||
|
||||
public static void Update(GameTime gameTime)
|
||||
{
|
||||
foreach (var frame in Frames)
|
||||
frame.Update(gameTime);
|
||||
}
|
||||
|
||||
public static void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
foreach (var frame in Frames.OrderBy(f => f, new FrameSort()))
|
||||
{
|
||||
frame.Draw(spriteBatch);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sort frames based on layer, using UID as tie breaker.
|
||||
/// </summary>
|
||||
private class FrameSort : IComparer<Frame>
|
||||
{
|
||||
public int Compare(Frame a, Frame b)
|
||||
{
|
||||
var aLayerSum = a.LayerSum;
|
||||
var bLayerSum = b.LayerSum;
|
||||
|
||||
// Compare the layer sum
|
||||
if (aLayerSum > bLayerSum)
|
||||
return 1;
|
||||
if (aLayerSum < bLayerSum)
|
||||
return -1;
|
||||
|
||||
// If the result is indecisive, pick the frame with the biggest UID
|
||||
if (aLayerSum == bLayerSum)
|
||||
{
|
||||
if (a.UID > b.UID)
|
||||
return 1;
|
||||
|
||||
if (a.UID < b.UID)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/*
|
||||
* http://roy-t.nl/index.php/2010/08/25/xna-accessing-contentmanager-and-graphicsdevice-anywhere-anytime-the-gameservicecontainer/
|
||||
*/
|
||||
public static class GameServices
|
||||
{
|
||||
private static GameServiceContainer container;
|
||||
public static GameServiceContainer Instance
|
||||
{
|
||||
get { return container ?? (container = new GameServiceContainer()); }
|
||||
}
|
||||
|
||||
public static T GetService<T>()
|
||||
{
|
||||
return (T)Instance.GetService(typeof(T));
|
||||
}
|
||||
|
||||
public static void AddService<T>(T service)
|
||||
{
|
||||
Instance.AddService(typeof(T), service);
|
||||
}
|
||||
|
||||
public static void RemoveService<T>()
|
||||
{
|
||||
Instance.RemoveService(typeof(T));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
@@ -3,15 +3,31 @@ using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// Global grid utility functions.
|
||||
/// </summary>
|
||||
public static class Grid
|
||||
{
|
||||
/// <summary>
|
||||
/// The size of a tile in pixels.
|
||||
/// </summary>
|
||||
public const int TileSize = 32;
|
||||
|
||||
/// <summary>
|
||||
/// Converts a grid position into a world position.
|
||||
/// </summary>
|
||||
/// <param name="gridPos">The grid position to convert.</param>
|
||||
/// <returns>Returns a Vector2 world position.</returns>
|
||||
public static Vector2 GridToWorld(Point gridPos)
|
||||
{
|
||||
return new Vector2(gridPos.X * TileSize, gridPos.Y * TileSize);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts a world position into a grid position.
|
||||
/// </summary>
|
||||
/// <param name="screenPos">The world position to convert.</param>
|
||||
/// <returns>Returns a Point grid position.</returns>
|
||||
public static Point WorldToGrid(Vector2 screenPos)
|
||||
{
|
||||
return new Point(
|
||||
|
||||
@@ -0,0 +1,664 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DepthsBelow.GUI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class Interface
|
||||
{
|
||||
Core core;
|
||||
|
||||
/// <summary>
|
||||
/// The master frame covering the whole game screen. Parent of all frames.
|
||||
/// This frame handles all mouse interaction with the game world
|
||||
/// </summary>
|
||||
public Frame UIParent;
|
||||
|
||||
public List<Frame> PanicFrames = new List<Frame>();
|
||||
public List<Frame> UnitFrames = new List<Frame>();
|
||||
public Dictionary<Soldier, Frame> SoldierToFrame = new Dictionary<Soldier, Frame>();
|
||||
|
||||
Random random = new Random();
|
||||
|
||||
private bool checkingDirection;
|
||||
private Vector2 directionStart;
|
||||
|
||||
GUI.Text hitChance;
|
||||
|
||||
public Interface(Core core)
|
||||
{
|
||||
this.core = core;
|
||||
|
||||
UIParent = new Frame();
|
||||
UIParent.Width = GameServices.GetService<GraphicsDevice>().Viewport.Width;
|
||||
UIParent.Height = GameServices.GetService<GraphicsDevice>().Viewport.Height;
|
||||
|
||||
// Selection rectangle
|
||||
var selectionFrame = new Frame(UIParent);
|
||||
selectionFrame.Texture = Utility.GetSolidTexture();
|
||||
selectionFrame.Color = Color.Red * 0.5f;
|
||||
selectionFrame.Visible = false;
|
||||
UIParent["selectionFrame"] = selectionFrame;
|
||||
|
||||
// OnPress
|
||||
UIParent.OnPress += delegate(Frame frame, GUIManager.MouseEventArgs args)
|
||||
{
|
||||
//KeyboardState ks = Keyboard.GetState();
|
||||
MouseState ms = args.MouseState;
|
||||
var mousePos = new Point(ms.X, ms.Y);
|
||||
var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1);
|
||||
var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y));
|
||||
var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
|
||||
|
||||
// Show the selection frame
|
||||
if (args.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
var selectFrame = (GUI.Frame)frame["selectionFrame"];
|
||||
if (!selectFrame.Visible)
|
||||
{
|
||||
selectFrame.X = mousePos.X;
|
||||
selectFrame.Y = mousePos.Y;
|
||||
selectFrame.Visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
// Unit rotation
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected && mouseWorldRectangle.Intersects(unit.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
checkingDirection = true;
|
||||
directionStart = unit.Transform.World + unit.Transform.World.Origin;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// OnRelease
|
||||
UIParent.OnRelease += delegate(Frame frame, GUIManager.MouseEventArgs args)
|
||||
{
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
MouseState ms = args.MouseState;
|
||||
var mousePos = new Point(ms.X, ms.Y);
|
||||
|
||||
var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1);
|
||||
var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y));
|
||||
var mouseGridPos= Grid.WorldToGrid(mouseWorldPos);
|
||||
var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
|
||||
|
||||
if (args.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
// Deselect all units
|
||||
if (!ks.IsKeyDown(Keys.LeftControl))
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
unit.Selected = false;
|
||||
|
||||
foreach (var unitFrame in UnitFrames)
|
||||
unitFrame.Color = Color.Black;
|
||||
}
|
||||
|
||||
// Select all soldier units inside the selection rectangle
|
||||
var selectFrame = (GUI.Frame)frame["selectionFrame"];
|
||||
if (selectFrame.Visible)
|
||||
{
|
||||
Console.WriteLine("Before: " + selectFrame.AbsoluteRectangle.X + ", " + selectFrame.AbsoluteRectangle.Y + ", " + selectFrame.AbsoluteRectangle.Width + ", " + selectFrame.AbsoluteRectangle.Height);
|
||||
|
||||
var intersectionRectangle = core.Camera.ScreenToWorld(selectFrame.AbsoluteRectangle);
|
||||
|
||||
Console.WriteLine("After: " + intersectionRectangle.X + ", " + intersectionRectangle.Y + ", " + intersectionRectangle.Width + ", " + intersectionRectangle.Height);
|
||||
|
||||
|
||||
// Select all units in the rectangle
|
||||
foreach (var soldier in core.Squad)
|
||||
{
|
||||
if (intersectionRectangle.Intersects(soldier.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
soldier.Selected = true;
|
||||
foreach (var unitFrame in UnitFrames)
|
||||
{
|
||||
if (unitFrame["soldier"] == soldier)
|
||||
unitFrame.Color = Color.Blue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
selectFrame.Visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Send orders with right click
|
||||
if (args.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
if (checkingDirection)
|
||||
{
|
||||
checkingDirection = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("Right button pressed on UIParent");
|
||||
Point mainpath = Point.Zero;
|
||||
Stack<Soldier> soldierStack = new Stack<Soldier>();
|
||||
//core.Squad.Where(a=>a.Selected).ToList().ForEach(a => soldierStack.Push(a));
|
||||
/*foreach (var soldier in core.Squad)
|
||||
{
|
||||
if (soldier.Selected)
|
||||
{
|
||||
soldierStack.Push(soldier);
|
||||
}
|
||||
}*/
|
||||
|
||||
// Don't move into other soldiers
|
||||
bool blocked = false;
|
||||
foreach (var soldier in core.Squad)
|
||||
if (soldier.Position == mouseGridPos)
|
||||
blocked = true;
|
||||
|
||||
if (!blocked)
|
||||
{
|
||||
byte[,] collisionMap = Core.Map.GetCollisionMap();
|
||||
|
||||
// Try pathfinding
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected)
|
||||
{
|
||||
if (mainpath == Point.Zero)
|
||||
{
|
||||
mainpath = unit.Position;
|
||||
}
|
||||
Vector2 fromMain = new Vector2((mainpath.X - unit.Position.X)*Grid.TileSize,
|
||||
(mainpath.Y - unit.Position.Y)*Grid.TileSize);
|
||||
var goal = Grid.WorldToGrid(mouseWorldPos - fromMain);
|
||||
Console.WriteLine("First " + unit.AP);
|
||||
unit.GetComponent<Component.PathFinder>().Goal = goal;
|
||||
var length = unit.GetComponent<Component.PathFinder>().Length - 1;
|
||||
if (unit.AP >= length)
|
||||
{
|
||||
|
||||
if (unit.GetComponent<Component.PathFinder>().IsMoving == false)
|
||||
{
|
||||
// If a path was not found, add the unit to the stack
|
||||
soldierStack.Push(unit);
|
||||
}
|
||||
else
|
||||
{
|
||||
unit.AP -= length;
|
||||
Console.WriteLine("then " + unit.AP);
|
||||
collisionMap[goal.X, goal.Y] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unit.GetComponent<Component.PathFinder>().Stop();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Loop in a spiral and assign the soldiers in the stack their own unblocked positions
|
||||
int X = 10;
|
||||
int Y = 10;
|
||||
int x, y, dx, dy;
|
||||
x = y = dx = 0;
|
||||
dy = -1;
|
||||
int t = (int) MathHelper.Max(X, Y);
|
||||
int maxI = t*t;
|
||||
for (int i = 0; i < maxI; i++)
|
||||
{
|
||||
if ((-X/2 < x && x <= X/2) && (-Y/2 < y && y <= Y/2))
|
||||
{
|
||||
Point point = new Point(x + mouseGridPos.X, y + mouseGridPos.Y);
|
||||
if (collisionMap[point.X, point.Y] == 1)
|
||||
{
|
||||
if (soldierStack.Count == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
var soldier = soldierStack.Pop();
|
||||
|
||||
if (soldier == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("before " + soldier.AP);
|
||||
|
||||
soldier.GetComponent<Component.PathFinder>().Goal = point;
|
||||
var length = soldier.GetComponent<Component.PathFinder>().Length - 1;
|
||||
|
||||
if (soldier.GetComponent<Component.PathFinder>().IsMoving == true)
|
||||
{
|
||||
if (soldier.AP >= length)
|
||||
{
|
||||
|
||||
soldier.AP -= length;
|
||||
|
||||
Console.WriteLine("then " + soldier.AP);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
soldier.GetComponent<Component.PathFinder>().Stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if ((x == y) || ((x < 0) && (x == -y)) || ((x > 0) && (x == 1 - y)))
|
||||
{
|
||||
t = dx;
|
||||
dx = -dy;
|
||||
dy = t;
|
||||
}
|
||||
x += dx;
|
||||
y += dy;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
hitChance = new Text(UIParent);
|
||||
hitChance.SetFont("Arial");
|
||||
hitChance.Value = "";
|
||||
|
||||
var button = new GUI.Button(UIParent);
|
||||
button.SetTexture("images/Enter");
|
||||
button.X = 200;
|
||||
button.Y = 100;
|
||||
button.Width = 55;
|
||||
button.Height = 40;
|
||||
|
||||
// Test GUI frames
|
||||
/*var frame = new GUI.Frame()
|
||||
{
|
||||
Y = 100
|
||||
};
|
||||
|
||||
var button = new GUI.Button(frame)
|
||||
{
|
||||
Width = 48,
|
||||
Height = 23,
|
||||
Texture = core.Content.Load<Texture2D>("images/Enter"),
|
||||
OnClick = delegate(Point clickPos)
|
||||
{
|
||||
Debug.WriteLine("That ugly button was clicked at (" + clickPos.X + "," + clickPos.Y + ")");
|
||||
}
|
||||
};
|
||||
|
||||
var text = new GUI.Text(frame);
|
||||
text.SetFont("Arial");
|
||||
text.Value = "Hello world!";*/
|
||||
|
||||
// Create some unit frames
|
||||
/*var panicFrame = CreatePanicFrame();
|
||||
var unit1 = CreateUnitFrame("Flight captain Rainbow");
|
||||
unit1.X = panicFrame.X;
|
||||
unit1.Y = panicFrame.Y + panicFrame.Height;
|
||||
unit1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args)
|
||||
{
|
||||
frame.Color = Color.Red;
|
||||
};
|
||||
var unit2 = CreateUnitFrame("Mr. Sparkle");
|
||||
unit2.X = unit1.X;
|
||||
unit2.Y = unit1.Y + unit1.Height;
|
||||
unit2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args)
|
||||
{
|
||||
frame.Color = Color.Red;
|
||||
};*/
|
||||
|
||||
/*var frame1 = new GUI.Frame();
|
||||
frame1.Layer = 0;
|
||||
frame1.SetTexture("images/Enter");
|
||||
frame1.Color = Color.Red;
|
||||
frame1.Width = 100;
|
||||
frame1.Height = 100;
|
||||
frame1.OnClick += delegate(Frame frame, Frame.MouseEventArgs args)
|
||||
{
|
||||
if (frame.Color == Color.Red)
|
||||
frame.Color = Color.Green;
|
||||
else
|
||||
frame.Color = Color.Red;
|
||||
};
|
||||
var frame1_child = new GUI.Frame(frame1);
|
||||
frame1_child.SetTexture("images/Enter");
|
||||
frame1_child.Color = Color.Purple;
|
||||
frame1_child.Width = 60;
|
||||
frame1_child.Height = 60;
|
||||
frame1_child.X = 20;
|
||||
frame1_child.Y = 20;
|
||||
|
||||
var frame2 = new GUI.Frame();
|
||||
frame2.Layer = 0;
|
||||
frame2.SetTexture("images/Enter");
|
||||
frame2.Color = Color.Blue;
|
||||
frame2.Width = 100;
|
||||
frame2.Height = 100;
|
||||
frame2.X = 50;
|
||||
frame2.Y = 50;
|
||||
frame2.OnClick += delegate(Frame frame, Frame.MouseEventArgs args)
|
||||
{
|
||||
if (frame.Color == Color.Blue)
|
||||
frame.Color = Color.Yellow;
|
||||
else
|
||||
frame.Color = Color.Blue;
|
||||
};*/
|
||||
}
|
||||
|
||||
private GUI.Frame CreatePanicFrame()
|
||||
{
|
||||
var frame = new GUI.Frame(UIParent);
|
||||
frame.SetTexture("images/GUI/unit_background");
|
||||
frame.Color = Color.Black;
|
||||
frame.Width = 164;
|
||||
frame.Height = 19;
|
||||
|
||||
frame.OnClick += delegate(Frame frame1, GUIManager.MouseEventArgs args)
|
||||
{
|
||||
DynamicGroupManager.Group group = (DynamicGroupManager.Group)frame1["group"];
|
||||
if (group != null)
|
||||
group.Panic += 5;
|
||||
};
|
||||
|
||||
var panicBarBg = new GUI.Frame(frame);
|
||||
panicBarBg.SetTexture("images/GUI/health_background");
|
||||
panicBarBg.Width = 136;
|
||||
panicBarBg.Height = 13;
|
||||
panicBarBg.X = 3;
|
||||
panicBarBg.Y = 3;
|
||||
frame["panicBarBg"] = panicBarBg;
|
||||
|
||||
var panicBar = new GUI.Frame(panicBarBg);
|
||||
panicBar.SetTexture("images/GUI/bar_solid");
|
||||
panicBar.Color = new Color(87, 55, 253);
|
||||
panicBar.Width = (int)(panicBarBg.Width * 0.5);
|
||||
panicBar.Height = 11;
|
||||
panicBar.X = 1;
|
||||
panicBar.Y = 1;
|
||||
frame["panicBar"] = panicBar;
|
||||
|
||||
var text = new GUI.Text(frame);
|
||||
text.SetFont("fonts/UnitName");
|
||||
text.Value = "0%";
|
||||
text.X = 4;
|
||||
text.Y = 1;
|
||||
frame["text"] = text;
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
private GUI.Frame CreateUnitFrame(Soldier soldier)
|
||||
{
|
||||
var frame = new GUI.Frame(UIParent);
|
||||
frame.SetTexture("images/GUI/unit_background");
|
||||
frame.Color = Color.Black;
|
||||
frame.Width = 164;
|
||||
frame.Height = 42;
|
||||
|
||||
var nameText = new GUI.Text(frame);
|
||||
nameText.SetFont("fonts/UnitName");
|
||||
nameText.Value = soldier.Name + " "/* + soldier.GetHashCode()*/;
|
||||
nameText.X = 4;
|
||||
nameText.Y = 1;
|
||||
frame["nameText"] = nameText;
|
||||
|
||||
var healthBarBg = new GUI.Frame(frame);
|
||||
healthBarBg.SetTexture("images/GUI/health_background");
|
||||
healthBarBg.Width = 136;
|
||||
healthBarBg.Height = 13;
|
||||
healthBarBg.X = 3;
|
||||
healthBarBg.Y = 19;
|
||||
frame["healthBarBg"] = healthBarBg;
|
||||
|
||||
var healthBar = new GUI.Frame(healthBarBg);
|
||||
healthBar.SetTexture("images/GUI/bar_solid");
|
||||
healthBar.Color = Color.Red;
|
||||
healthBar.Width = (int)((healthBarBg.Width - 2) * (soldier.GetComponent<Component.Stat>().HP / soldier.GetComponent<Component.Stat>().MaxHP));
|
||||
healthBar.Height = 11;
|
||||
healthBar.X = 1;
|
||||
healthBar.Y = 1;
|
||||
frame["healthBar"] = healthBar;
|
||||
|
||||
var actionBarBg = new GUI.Frame(frame);
|
||||
actionBarBg.SetTexture("images/GUI/health_background");
|
||||
actionBarBg.Width = 136;
|
||||
actionBarBg.Height = 8;
|
||||
actionBarBg.X = 3;
|
||||
actionBarBg.Y = 31;
|
||||
frame["actionBarBg"] = actionBarBg;
|
||||
|
||||
var actionBar = new GUI.Frame(actionBarBg);
|
||||
actionBar.SetTexture("images/GUI/bar_solid");
|
||||
actionBar.Color = Color.Orange;
|
||||
actionBar.Width = (int)((healthBarBg.Width - 2) * (soldier.GetComponent<Component.Stat>().HP / soldier.GetComponent<Component.Stat>().MaxHP));
|
||||
actionBar.Height = 6;
|
||||
actionBar.X = 1;
|
||||
actionBar.Y = 1;
|
||||
frame["actionBar"] = actionBar;
|
||||
|
||||
for (int i = 1; i < 10; i++)
|
||||
{
|
||||
var line = new GUI.Frame(actionBar);
|
||||
line.Texture = Utility.GetSolidTexture();
|
||||
line.Color = Color.Black;
|
||||
line.Height = 6;
|
||||
line.Width = 1;
|
||||
line.X = (int)(i * ((float)actionBarBg.Width/10f)) - 1;
|
||||
}
|
||||
|
||||
return frame;
|
||||
}
|
||||
|
||||
public void CreateUnitFrames(List<Soldier> squad)
|
||||
{
|
||||
// TODO: ForEach squad in Squads...
|
||||
/*GUI.Frame lastFrame = null;
|
||||
foreach (Soldier soldier in squad)
|
||||
{
|
||||
// TODO: Remove this test ;)
|
||||
soldier.GetComponent<Component.Stat>().HP = random.Next(0, (int) soldier.GetComponent<Component.Stat>().MaxHP - 1);
|
||||
|
||||
var uFrame = CreateUnitFrame(soldier);
|
||||
uFrame["soldier"] = soldier;
|
||||
soldier["unitFrame"] = uFrame;
|
||||
if (lastFrame != null)
|
||||
{
|
||||
uFrame.X = lastFrame.X;
|
||||
uFrame.Y = lastFrame.Y + lastFrame.Height;
|
||||
}
|
||||
uFrame.OnClick += delegate(Frame f, GUIManager.MouseEventArgs e)
|
||||
{
|
||||
var s = (Soldier) f["soldier"];
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
|
||||
if (!ks.IsKeyDown(Keys.LeftControl))
|
||||
{
|
||||
// Deselect all units
|
||||
foreach (var unitFrame in UnitFrames)
|
||||
{
|
||||
((Soldier) unitFrame["soldier"]).Selected = false;
|
||||
unitFrame.Color = Color.Black;
|
||||
}
|
||||
}
|
||||
|
||||
if (!s.Selected)
|
||||
{
|
||||
s.Selected = true;
|
||||
uFrame.Color = Color.Blue;
|
||||
}
|
||||
};
|
||||
UnitFrames.Add(uFrame);
|
||||
lastFrame = uFrame;
|
||||
}*/
|
||||
|
||||
foreach (var soldier in squad)
|
||||
{
|
||||
PanicFrames.Add(CreatePanicFrame());
|
||||
|
||||
// TODO: Remove this test ;)
|
||||
//soldier.GetComponent<Component.Stat>().HP = random.Next(0, (int)soldier.GetComponent<Component.Stat>().MaxHP - 1);
|
||||
|
||||
var uFrame = CreateUnitFrame(soldier);
|
||||
uFrame["soldier"] = soldier;
|
||||
soldier["unitFrame"] = uFrame;
|
||||
uFrame.OnPress += delegate(Frame frame, GUIManager.MouseEventArgs args) { };
|
||||
uFrame.OnRelease += delegate(Frame f, GUIManager.MouseEventArgs e)
|
||||
{
|
||||
var s = (Soldier)f["soldier"];
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
|
||||
if (!ks.IsKeyDown(Keys.LeftControl))
|
||||
{
|
||||
// Deselect all units
|
||||
foreach (var unitFrame in UnitFrames)
|
||||
{
|
||||
((Soldier)unitFrame["soldier"]).Selected = false;
|
||||
unitFrame.Color = Color.Black;
|
||||
}
|
||||
}
|
||||
|
||||
if (!s.Selected)
|
||||
{
|
||||
s.Selected = true;
|
||||
uFrame.Color = Color.Blue;
|
||||
}
|
||||
};
|
||||
UnitFrames.Add(uFrame);
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateUnitFrames()
|
||||
{
|
||||
core.GroupManager.UpdateGroups();
|
||||
var groups = core.GroupManager.Groups;
|
||||
|
||||
foreach (var panicFrame in PanicFrames)
|
||||
panicFrame.Visible = false;
|
||||
|
||||
foreach (var unitFrame in UnitFrames)
|
||||
{
|
||||
unitFrame.Visible = false;
|
||||
}
|
||||
|
||||
GUI.Frame lastFrame = null;
|
||||
for (int index = 0; index < groups.Count; index++)
|
||||
{
|
||||
var group = groups[index];
|
||||
|
||||
var pFrame = PanicFrames[index];
|
||||
pFrame["group"] = group;
|
||||
var pFrameBarBg = (GUI.Frame)pFrame["panicBarBg"];
|
||||
var pFrameBar = (GUI.Frame)pFrame["panicBar"];
|
||||
var pFrameText = (GUI.Text)pFrame["text"];
|
||||
pFrameBar.Width = (int)(pFrameBarBg.Width * (group.Panic / group.MaxPanic));
|
||||
pFrameText.Value = Math.Round(group.Panic).ToString() + "/" + group.MaxPanic.ToString() + " (" + Math.Round(group.Panic / group.MaxPanic * 100f).ToString() + "%)";
|
||||
|
||||
pFrame.Visible = true;
|
||||
if (lastFrame != null)
|
||||
{
|
||||
pFrame.X = lastFrame.X;
|
||||
pFrame.Y = lastFrame.Y + lastFrame.Height + 15;
|
||||
}
|
||||
lastFrame = pFrame;
|
||||
|
||||
foreach (Soldier soldier in @group.Entities)
|
||||
{
|
||||
var frame = (GUI.Frame) soldier["unitFrame"];
|
||||
frame.X = lastFrame.X;
|
||||
frame.Y = lastFrame.Y + lastFrame.Height;
|
||||
frame.Visible = true;
|
||||
|
||||
// Update HP
|
||||
var healthBarBg = (GUI.Frame)frame["healthBarBg"];
|
||||
var healthBar = (GUI.Frame)frame["healthBar"];
|
||||
healthBar.Width = (int)((healthBarBg.Width - 2) * (soldier.GetComponent<Component.Stat>().Life / soldier.GetComponent<Component.Stat>().MaxHP));
|
||||
|
||||
// Update Action Points
|
||||
var actionBarBg = (GUI.Frame)frame["actionBarBg"];
|
||||
var actionBar = (GUI.Frame)frame["actionBar"];
|
||||
actionBar.Width = (int)(((float)actionBarBg.Width - 2f) * ((float)soldier.AP / (float)soldier.MaxActionPoints));
|
||||
lastFrame = frame;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Update(GameTime gameTime)
|
||||
{
|
||||
MouseState ms = Mouse.GetState();
|
||||
var mousePos = new Point(ms.X, ms.Y);
|
||||
var mouseRectangle = new Rectangle(mousePos.X, mousePos.Y, 1, 1);
|
||||
var mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(mousePos.X, mousePos.Y));
|
||||
var mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
|
||||
|
||||
// Update the selection rectangle
|
||||
var selectionFrame = (GUI.Frame)UIParent["selectionFrame"];
|
||||
if (selectionFrame.Visible)
|
||||
{
|
||||
selectionFrame.Width = (int)mousePos.X - selectionFrame.X;
|
||||
selectionFrame.Height = (int)mousePos.Y - selectionFrame.Y;
|
||||
}
|
||||
|
||||
// Update rotations
|
||||
if (checkingDirection)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
if (unit.Selected)
|
||||
{
|
||||
float directionX = mouseWorldPos.X - unit.Transform.World.X;
|
||||
float directionY = mouseWorldPos.Y - unit.Transform.World.Y;
|
||||
//var mouseDirection = mouseWorldPos;
|
||||
//mouseDirection.Normalize();
|
||||
unit.GetComponent<Component.Transform>().World.Rotation =
|
||||
(float)
|
||||
Math.Atan2(mouseWorldPos.Y - unit.Transform.World.Y - unit.Transform.World.Origin.Y,
|
||||
mouseWorldPos.X - unit.Transform.World.X - unit.Transform.World.Origin.X);
|
||||
}
|
||||
}
|
||||
|
||||
bool onSomething = false;
|
||||
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected == true && unit.Fired == false)
|
||||
{
|
||||
foreach (var enemy in core.Swarm)
|
||||
{
|
||||
if (core.MouseInput.gridRectangle.Intersects(enemy.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
onSomething = true;
|
||||
hitChance.Visible = true;
|
||||
int chanceToHit = Utility.CalculateHitChance(unit.GetComponent<Component.Stat>(), unit.GetComponent<Component.Transform>().World.Position, enemy);
|
||||
hitChance.Value = chanceToHit.ToString() + "%";
|
||||
hitChance.X = ms.X - 15;
|
||||
hitChance.Y = ms.Y - 15;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (onSomething == true)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (onSomething == false)
|
||||
{
|
||||
hitChance.Visible = false;
|
||||
}
|
||||
|
||||
UpdateUnitFrames();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,350 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Media;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class KeyboardInput
|
||||
{
|
||||
Core core;
|
||||
private KeyboardState lastKeyboardState;
|
||||
|
||||
int checkerSpeed = 2;
|
||||
|
||||
int bulletCost = 5;
|
||||
int rocketCost = 10;
|
||||
|
||||
public KeyboardInput(Core core)
|
||||
{
|
||||
this.core = core;
|
||||
}
|
||||
|
||||
/*public List<List<Soldier>> GetGroups(List<Soldier> soldiers)
|
||||
{
|
||||
var ungrouped = soldiers.ToList();
|
||||
var groups = new List<List<Soldier>>();
|
||||
|
||||
for (int index = 0; index < soldiers.Count; index++)
|
||||
{
|
||||
var checkingSoldier = soldiers[index];
|
||||
var group = new List<Soldier>();
|
||||
|
||||
for (int i = 0; i < soldiers.Count; i++)
|
||||
{
|
||||
var soldier = soldiers[i];
|
||||
if (ungrouped.Contains(soldier))
|
||||
{
|
||||
float distance = Vector2.Distance(checkingSoldier.Transform.World + checkingSoldier.Transform.World.Origin,
|
||||
soldier.Transform.World + soldier.Transform.World.Origin);
|
||||
if (distance <= ((float) Grid.TileSize * 1f))
|
||||
{
|
||||
ungrouped.Remove(soldier);
|
||||
group.Add(soldier);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (group.Count > 0)
|
||||
groups.Add(group);
|
||||
}
|
||||
|
||||
return groups;
|
||||
}*/
|
||||
|
||||
// Get a list of dynamic soldier groups
|
||||
public List<List<Soldier>> GetGroups(List<Soldier> soldiers, float maxRange)
|
||||
{
|
||||
var alreadyGrouped = new List<Soldier>();
|
||||
var groups = new List<List<Soldier>>();
|
||||
|
||||
for (int index = 0; index < soldiers.Count; index++)
|
||||
{
|
||||
var soldier = soldiers[index];
|
||||
|
||||
if (!alreadyGrouped.Contains(soldier))
|
||||
{
|
||||
var group = new List<Soldier>();
|
||||
GetNearChain(ref group, soldiers, soldier, maxRange);
|
||||
alreadyGrouped.AddRange(group);
|
||||
|
||||
if (group.Count > 0)
|
||||
groups.Add(group);
|
||||
}
|
||||
}
|
||||
|
||||
return groups;
|
||||
}
|
||||
|
||||
// Get all soldiers who are close to each other in a chain
|
||||
public void GetNearChain(ref List<Soldier> group, List<Soldier> soldiers, Soldier soldier, float maxRange)
|
||||
{
|
||||
for (int index = 0; index < soldiers.Count; index++)
|
||||
{
|
||||
var nearSoldier = soldiers[index];
|
||||
|
||||
if (!group.Contains(nearSoldier))
|
||||
{
|
||||
float distance = Vector2.Distance(nearSoldier.Transform.World + nearSoldier.Transform.World.Origin,
|
||||
soldier.Transform.World + soldier.Transform.World.Origin);
|
||||
if (distance <= maxRange)
|
||||
{
|
||||
group.Add(nearSoldier);
|
||||
GetNearChain(ref group, soldiers, nearSoldier, maxRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private DynamicGroupManager groupManager;
|
||||
|
||||
public void Update(GameTime gameTime)
|
||||
{
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
|
||||
// Brightness
|
||||
if (ks.IsKeyUp(Keys.Up) && lastKeyboardState.IsKeyDown(Keys.Up))
|
||||
core.Brightness = (int)MathHelper.Clamp(core.Brightness + 5, 0, 254);
|
||||
if (ks.IsKeyUp(Keys.Down) && lastKeyboardState.IsKeyDown(Keys.Down))
|
||||
core.Brightness = (int)MathHelper.Clamp(core.Brightness - 5, 0, 254);
|
||||
|
||||
// Debug test: grouping
|
||||
if (ks.IsKeyUp(Keys.K) && lastKeyboardState.IsKeyDown(Keys.K))
|
||||
{
|
||||
if (groupManager == null)
|
||||
groupManager = new DynamicGroupManager(core.Squad.Cast<Entity>().ToList(), Grid.TileSize * 1.5f);
|
||||
groupManager.UpdateGroups();
|
||||
//var groups = GetGroups(core.Squad, (float)Grid.TileSize * 1.5f);
|
||||
var groups = groupManager.Groups;
|
||||
foreach (var group in groups)
|
||||
{
|
||||
Debug.WriteLine("Group #" + groups.IndexOf(group) + " Panic: " + group.Panic);
|
||||
foreach (var entity in group.Entities)
|
||||
{
|
||||
var soldier = (Soldier)entity;
|
||||
Debug.WriteLine(soldier.Name + " " + soldier.GetHashCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Next turn
|
||||
if (ks.IsKeyDown(Keys.Enter) && lastKeyboardState.IsKeyUp(Keys.Enter))
|
||||
{
|
||||
if (core.TurnManager.CurrentTurn == core.TurnManager["Player"])
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
unit.AP = unit.MaxActionPoints;
|
||||
unit.Fired = false;
|
||||
}
|
||||
|
||||
core.TurnManager.EndTurn();
|
||||
}
|
||||
|
||||
if (core.TurnManager.CurrentTurn == core.TurnManager["Computer"])
|
||||
{
|
||||
foreach (var enemy in core.Swarm)
|
||||
{
|
||||
enemy.step = 0;
|
||||
enemy.AttackedThisTurn = false;
|
||||
Point target = Point.Zero;
|
||||
float distance = 7000;
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
Vector2 soldier = new Vector2(unit.Transform.Grid.X, unit.Transform.Grid.Y);
|
||||
Vector2 monster = new Vector2(enemy.Transform.Grid.X, enemy.Transform.Grid.Y);
|
||||
|
||||
float newDistance = Vector2.Distance(soldier, monster);
|
||||
|
||||
if (newDistance < distance)
|
||||
{
|
||||
target = unit.Transform.Grid;
|
||||
distance = newDistance;
|
||||
}
|
||||
}
|
||||
enemy.GetComponent<Component.PathFinder>().Goal = target;
|
||||
distance = 7000;
|
||||
|
||||
}
|
||||
|
||||
core.TestMonster.step = 0;
|
||||
Point testTarget = Point.Zero;
|
||||
float testDistance = 7000;
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
Vector2 soldier = new Vector2(unit.Transform.Grid.X, unit.Transform.Grid.Y);
|
||||
Vector2 monster = new Vector2(core.TestMonster.Transform.Grid.X, core.TestMonster.Transform.Grid.Y);
|
||||
|
||||
float newDistance = Vector2.Distance(soldier, monster);
|
||||
|
||||
if (newDistance < testDistance)
|
||||
{
|
||||
testTarget = unit.Transform.Grid;
|
||||
testDistance = newDistance;
|
||||
}
|
||||
}
|
||||
core.TestMonster.GetComponent<Component.PathFinder>().Goal = testTarget;
|
||||
testDistance = 7000;
|
||||
|
||||
core.TurnManager.EndTurn();
|
||||
}
|
||||
}
|
||||
if (ks.IsKeyDown(Keys.A))
|
||||
{
|
||||
/*foreach (var unit in core.Swarm)
|
||||
{
|
||||
unit.X = 200;
|
||||
unit.Y = 200;
|
||||
}*/
|
||||
core.TestMonster.X = 12;
|
||||
core.TestMonster.Y = 4;
|
||||
}
|
||||
if (ks.IsKeyUp(Keys.O) && lastKeyboardState.IsKeyDown(Keys.O))
|
||||
{
|
||||
try
|
||||
{
|
||||
EntityManager.GetEntities<Door>()[0].Toggle();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
if (ks.IsKeyUp(Keys.P) && lastKeyboardState.IsKeyDown(Keys.P))
|
||||
{
|
||||
try
|
||||
{
|
||||
var pos = core.GroupManager.Groups[1].Entities[0].Transform.World.Position;
|
||||
var enemy = new SmallEnemy(ref core.Swarm);
|
||||
enemy.Transform.World.Position = pos + new Vector2(0, Grid.TileSize*3);
|
||||
core.Swarm.Add(enemy);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
if (ks.IsKeyDown(Keys.S) || ks.IsKeyDown(Keys.R))
|
||||
{
|
||||
foreach (var soldier in core.Squad)
|
||||
{
|
||||
if (soldier.Selected == true && soldier.Fired == false)
|
||||
{
|
||||
bool enoughActionPoints = true;
|
||||
int cost = 0;
|
||||
string type = "";
|
||||
if (ks.IsKeyDown(Keys.S))
|
||||
{
|
||||
cost = bulletCost;
|
||||
type = "bullet";
|
||||
}
|
||||
else if (ks.IsKeyDown(Keys.R))
|
||||
{
|
||||
cost = rocketCost;
|
||||
type = "Rocket";
|
||||
}
|
||||
if (soldier.AP >= cost)
|
||||
{
|
||||
core.Volley.Add(new Shot(soldier.GetComponent<Component.Stat>(), type));
|
||||
soldier.AP -= cost;
|
||||
soldier.Fired = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
enoughActionPoints = false;
|
||||
}
|
||||
if (enoughActionPoints == true)
|
||||
{
|
||||
foreach (var shot in core.Volley)
|
||||
{
|
||||
if (shot.select == false)
|
||||
{
|
||||
shot.select = true;
|
||||
shot.X = soldier.X;
|
||||
shot.Y = soldier.Y;
|
||||
//shot.Transform.World.Position += soldier.Transform.World.Origin;
|
||||
//shot.Transform.World.X += Grid.TileSize / 2;
|
||||
//shot.Transform.World.Y += Grid.TileSize / 2;
|
||||
}
|
||||
if (shot.direction == Vector2.Zero)
|
||||
{
|
||||
double directionX = Math.Cos(soldier.Transform.World.Rotation);
|
||||
double directionY = Math.Sin(soldier.Transform.World.Rotation);
|
||||
shot.direction = new Vector2((float)directionX, (float)directionY);
|
||||
shot.Transform.World.Rotation = soldier.Transform.World.Rotation;
|
||||
Vector2 yo = soldier.Transform.World.Position;
|
||||
shot.Stat.Remember = yo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ks.IsKeyDown(Keys.C))
|
||||
{
|
||||
foreach (var soldier in core.Squad)
|
||||
{
|
||||
if (soldier.Selected == true && soldier.Fired == false)
|
||||
{
|
||||
Point checker = Point.Zero;
|
||||
double directionX = Math.Cos(soldier.GetComponent<Component.Transform>().World.Rotation);
|
||||
double directionY = Math.Sin(soldier.GetComponent<Component.Transform>().World.Rotation);
|
||||
Vector2 direction = new Vector2((int)directionX, (int)directionY);
|
||||
int range = 120;
|
||||
int current = 0;
|
||||
bool hit = false;
|
||||
checker = new Point((int)soldier.Transform.World.Origin.X, (int)soldier.Transform.World.Origin.Y);
|
||||
do
|
||||
{
|
||||
checker.X += (int)direction.X * checkerSpeed;
|
||||
checker.Y += (int)direction.Y * checkerSpeed;
|
||||
foreach (var creature in core.Swarm)
|
||||
{
|
||||
if (creature.GetComponent<Component.Collision>().Rectangle.Contains(checker))
|
||||
{
|
||||
hit = true;
|
||||
}
|
||||
}
|
||||
if (core.TestMonster.GetComponent<Component.Collision>().Rectangle.Contains(checker))
|
||||
{
|
||||
|
||||
}
|
||||
current++;
|
||||
} while (hit == false && current < range);
|
||||
current = 0;
|
||||
if (soldier.Selected == true && soldier.Fired == false && hit == true)
|
||||
{
|
||||
core.Volley.Add(new Shot(soldier.GetComponent<Component.Stat>(), "Bullet"));
|
||||
soldier.Fired = true;
|
||||
foreach (var shot in core.Volley)
|
||||
{
|
||||
if (shot.select == false)
|
||||
{
|
||||
shot.select = true;
|
||||
shot.X = soldier.X;
|
||||
shot.Y = soldier.Y;
|
||||
//shot.Transform.World.X += Grid.TileSize / 2;
|
||||
//shot.Transform.World.Y += Grid.TileSize / 2;
|
||||
}
|
||||
if (shot.direction == Vector2.Zero)
|
||||
{
|
||||
shot.direction = new Vector2((float)directionX, (float)directionY);
|
||||
shot.Transform.World.Rotation = soldier.Transform.World.Rotation;
|
||||
}
|
||||
}
|
||||
}
|
||||
hit = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lastKeyboardState = ks;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DepthsBelow.GUI;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
// TODO: The frames created here must be disposed correctly when the Lua context is disposed
|
||||
static class LuaGUI
|
||||
{
|
||||
public static GUI.Frame CreateFrame()
|
||||
{
|
||||
return new Frame();
|
||||
}
|
||||
public static GUI.Frame CreateFrame(GUI.Frame parent)
|
||||
{
|
||||
return new GUI.Frame(parent);
|
||||
}
|
||||
|
||||
public static GUI.Button CreateButton()
|
||||
{
|
||||
return new Button();
|
||||
}
|
||||
public static GUI.Button CreateButton(GUI.Frame parent)
|
||||
{
|
||||
return new GUI.Button(parent);
|
||||
}
|
||||
|
||||
public static GUI.Text CreateText()
|
||||
{
|
||||
return new Text();
|
||||
}
|
||||
public static GUI.Text CreateText(GUI.Frame parent)
|
||||
{
|
||||
return new GUI.Text(parent);
|
||||
}
|
||||
}
|
||||
|
||||
static class LuaMouse
|
||||
{
|
||||
public static Point GetPos()
|
||||
{
|
||||
var ms = Mouse.GetState();
|
||||
return new Point(ms.X, ms.Y);
|
||||
}
|
||||
}
|
||||
|
||||
public class Lua
|
||||
{
|
||||
private LuaInterface.Lua lua;
|
||||
|
||||
private List<string> filesToRun;
|
||||
|
||||
public Lua()
|
||||
{
|
||||
filesToRun = new List<string>();
|
||||
Initialize();
|
||||
|
||||
/*lua.DoString(@"
|
||||
local frame = CreateFrame('Frame');
|
||||
frame.X = 100;
|
||||
local button = CreateFrame('Button', frame);
|
||||
button:SetTexture('images/Enter');
|
||||
button.Width = 100;
|
||||
button.Height = 50;
|
||||
button.OnClick = function(clickPos)
|
||||
Console.WriteLine(clickPos.X .. ' ' .. clickPos.Y);
|
||||
end
|
||||
");*/
|
||||
}
|
||||
|
||||
private void Initialize()
|
||||
{
|
||||
if (lua == null)
|
||||
{
|
||||
lua = new LuaInterface.Lua();
|
||||
ExposeLibraries();
|
||||
}
|
||||
}
|
||||
|
||||
public void ExposeLibraries()
|
||||
{
|
||||
lua.NewTable("Console");
|
||||
lua.RegisterFunction("Console.Write", null, typeof(System.Console).GetMethod("Write", new Type[] { typeof(string) }));
|
||||
lua.RegisterFunction("Console.WriteLine", null, typeof(System.Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
|
||||
|
||||
lua.NewTable("Mouse");
|
||||
lua.RegisterFunction("Mouse.GetPos", null, typeof(LuaMouse).GetMethod("GetPos"));
|
||||
|
||||
// Register GUI creation functions
|
||||
lua.RegisterFunction("_CreateFrame", null, typeof(LuaGUI).GetMethod("CreateFrame", new Type[] { }));
|
||||
lua.RegisterFunction("_CreateFrameAsChild", null, typeof(LuaGUI).GetMethod("CreateFrame", new Type[] { typeof(GUI.Frame) }));
|
||||
lua.RegisterFunction("_CreateButton", null, typeof(LuaGUI).GetMethod("CreateButton", new Type[] { }));
|
||||
lua.RegisterFunction("_CreateButtonAsChild", null, typeof(LuaGUI).GetMethod("CreateButton", new Type[] { typeof(GUI.Frame) }));
|
||||
lua.RegisterFunction("_CreateText", null, typeof(LuaGUI).GetMethod("CreateText", new Type[] { }));
|
||||
lua.RegisterFunction("_CreateTextAsChild", null, typeof(LuaGUI).GetMethod("CreateText", new Type[] { typeof(GUI.Frame) }));
|
||||
|
||||
lua.NewTable("GUI");
|
||||
/*
|
||||
* Because Lua can't dynamically call overloads of registered functions, a generic Lua function needs to do the decision making.
|
||||
* This way we can also dynamically create different frame classes with the same function.
|
||||
*/
|
||||
lua.DoString(@"
|
||||
CreateFrame = function(frameType, parent)
|
||||
frameType = string.lower(frameType):gsub('^%l', string.upper)
|
||||
if (parent == nil) then
|
||||
return _G['_Create' .. frameType]()
|
||||
else
|
||||
return _G['_Create' .. frameType .. 'AsChild'](parent)
|
||||
end
|
||||
end
|
||||
");
|
||||
}
|
||||
|
||||
public LuaInterface.LuaFunction Expose(string path, object target, System.Reflection.MethodBase function)
|
||||
{
|
||||
return lua.RegisterFunction(path, target, function);
|
||||
}
|
||||
|
||||
public void Expose(string path, object obj)
|
||||
{
|
||||
lua[path] = obj;
|
||||
}
|
||||
|
||||
public void ResetContext()
|
||||
{
|
||||
if (lua != null)
|
||||
lua.Dispose();
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
public void Reload()
|
||||
{
|
||||
ResetContext();
|
||||
LoadScripts();
|
||||
}
|
||||
|
||||
public void LoadScripts()
|
||||
{
|
||||
// Load scripts from script folder
|
||||
// HACK: This needs to load files on the fly instead of loading precompiled files by the content manager.
|
||||
// http://xbox.create.msdn.com/en-US/education/catalog/sample/winforms_series_2 maybe?
|
||||
/*var scripts = GameServices.GetService<ContentManager>().LoadContent<string>("scripts");
|
||||
foreach (var script in scripts)
|
||||
{
|
||||
try
|
||||
{
|
||||
lua.DoString(script.Value);
|
||||
}
|
||||
catch (LuaInterface.LuaException e)
|
||||
{
|
||||
Console.WriteLine("Lua error: " + e.Message);
|
||||
}
|
||||
|
||||
}*/
|
||||
|
||||
foreach (var fileName in filesToRun)
|
||||
{
|
||||
lua.DoFile(GameServices.GetService<ContentManager>().RootDirectory + "/" + fileName);
|
||||
}
|
||||
}
|
||||
|
||||
public void AddFile(string fileName)
|
||||
{
|
||||
filesToRun.Add(fileName);
|
||||
}
|
||||
|
||||
public T GetObject<T>(string obj)
|
||||
{
|
||||
return (T)lua[obj];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,156 +1,197 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class MapTile
|
||||
{
|
||||
public int LocalId;
|
||||
public Texture2D Texture;
|
||||
public Rectangle SourceRectangle;
|
||||
public SpriteEffects SpriteEffects;
|
||||
}
|
||||
|
||||
public enum MapObjectType : byte
|
||||
{
|
||||
Plain,
|
||||
Tile,
|
||||
Polygon,
|
||||
Polyline
|
||||
}
|
||||
|
||||
public class MapObject
|
||||
{
|
||||
//public MapObjectType ObjectType;
|
||||
public string Name;
|
||||
public string Type;
|
||||
public Rectangle Bounds;
|
||||
public List<Vector2> Points;
|
||||
}
|
||||
|
||||
public class MapLayer
|
||||
{
|
||||
public int Width;
|
||||
public int Height;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
public class MapTileLayer : MapLayer
|
||||
{
|
||||
public MapTile[] Tiles;
|
||||
}
|
||||
|
||||
public class MapObjectLayer : MapLayer
|
||||
{
|
||||
public MapObject[] Objects;
|
||||
}
|
||||
|
||||
public class Map
|
||||
{
|
||||
public int TileWidth;
|
||||
public int TileHeight;
|
||||
public List<MapLayer> Layers = new List<MapLayer>();
|
||||
|
||||
public Map()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void ParseObjects(Core core)
|
||||
{
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var objectLayer = layer as MapObjectLayer;
|
||||
|
||||
if (objectLayer == null)
|
||||
continue;
|
||||
|
||||
foreach (var mapObject in objectLayer.Objects)
|
||||
{
|
||||
if (mapObject.Type == "SquadStart")
|
||||
{
|
||||
var soldier = new Soldier(core, ref core.Squad);
|
||||
// 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 mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
soldier.X = mapObjectGridPos.X;
|
||||
soldier.Y = mapObjectGridPos.Y;
|
||||
|
||||
core.Squad.Add(soldier);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var tileLayer = layer as MapTileLayer;
|
||||
|
||||
if (tileLayer == null)
|
||||
continue;
|
||||
|
||||
// Don't draw the collision layer
|
||||
if (tileLayer.Name == "Collision")
|
||||
continue;
|
||||
|
||||
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)
|
||||
{
|
||||
spriteBatch.Draw(
|
||||
mapTile.Texture,
|
||||
new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight),
|
||||
mapTile.SourceRectangle,
|
||||
Color.White,
|
||||
0,
|
||||
Vector2.Zero,
|
||||
mapTile.SpriteEffects,
|
||||
0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[,] GetCollisionMap()
|
||||
{
|
||||
byte[,] collisionMap = null;
|
||||
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var tileLayer = layer as MapTileLayer;
|
||||
|
||||
if (tileLayer != null && tileLayer.Name == "Collision")
|
||||
{
|
||||
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)
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class MapTile
|
||||
{
|
||||
public int LocalId;
|
||||
public Texture2D Texture;
|
||||
public Rectangle SourceRectangle;
|
||||
public SpriteEffects SpriteEffects;
|
||||
}
|
||||
|
||||
public enum MapObjectType : byte
|
||||
{
|
||||
Plain,
|
||||
Tile,
|
||||
Polygon,
|
||||
Polyline
|
||||
}
|
||||
|
||||
public class MapObject
|
||||
{
|
||||
//public MapObjectType ObjectType;
|
||||
public string Name;
|
||||
public string Type;
|
||||
public Rectangle Bounds;
|
||||
public List<Vector2> Points;
|
||||
}
|
||||
|
||||
public class MapLayer
|
||||
{
|
||||
public int Width;
|
||||
public int Height;
|
||||
public string Name;
|
||||
}
|
||||
|
||||
public class MapTileLayer : MapLayer
|
||||
{
|
||||
public MapTile[] Tiles;
|
||||
}
|
||||
|
||||
public class MapObjectLayer : MapLayer
|
||||
{
|
||||
public MapObject[] Objects;
|
||||
}
|
||||
|
||||
public class Map
|
||||
{
|
||||
public int TileWidth;
|
||||
public int TileHeight;
|
||||
public List<MapLayer> Layers = new List<MapLayer>();
|
||||
|
||||
public Map()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void ParseObjects(Core core)
|
||||
{
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var objectLayer = layer as MapObjectLayer;
|
||||
|
||||
if (objectLayer == null)
|
||||
continue;
|
||||
|
||||
foreach (var mapObject in objectLayer.Objects)
|
||||
{
|
||||
if (mapObject.Type == "SquadStart")
|
||||
{
|
||||
var soldier = new Soldier(ref core.Squad);
|
||||
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)
|
||||
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
soldier.X = mapObjectGridPos.X;
|
||||
soldier.Y = mapObjectGridPos.Y;
|
||||
|
||||
core.Squad.Add(soldier);
|
||||
}
|
||||
if (mapObject.Type == "MonsterSpawn" || mapObject.Type == "EnemySpawn")
|
||||
{
|
||||
var enemy = new MonsterSpawn("Monster", 14, 0, ref core.Swarm);
|
||||
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
enemy.X = mapObjectGridPos.X;
|
||||
enemy.Y = mapObjectGridPos.Y;
|
||||
}
|
||||
if (mapObject.Type == "AmbushMonsterSpawn" || mapObject.Type == "AmbushEnemySpawn")
|
||||
{
|
||||
var enemy = new MonsterSpawn("Monster", 2, 0, ref core.Swarm);
|
||||
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
enemy.X = mapObjectGridPos.X;
|
||||
enemy.Y = mapObjectGridPos.Y;
|
||||
}
|
||||
if (mapObject.Type == "DelayedMonsterSpawn" || mapObject.Type == "DelayedEnemySpawn")
|
||||
{
|
||||
var enemy = new MonsterSpawn("Monster", 200, 4, ref core.Swarm);
|
||||
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y - Grid.TileSize);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
enemy.X = mapObjectGridPos.X;
|
||||
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);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
enemy.X = mapObjectGridPos.X;
|
||||
enemy.Y = mapObjectGridPos.Y;
|
||||
}
|
||||
if (mapObject.Type == "Door")
|
||||
{
|
||||
var door = new Door(true);
|
||||
var mapObjectPos = new Vector2(mapObject.Bounds.X, mapObject.Bounds.Y);
|
||||
var mapObjectGridPos = Grid.WorldToGrid(mapObjectPos);
|
||||
door.X = mapObjectGridPos.X;
|
||||
door.Y = mapObjectGridPos.Y;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var tileLayer = layer as MapTileLayer;
|
||||
|
||||
if (tileLayer == null)
|
||||
continue;
|
||||
|
||||
// Don't draw the collision layer
|
||||
if (tileLayer.Name == "Collision")
|
||||
continue;
|
||||
|
||||
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)
|
||||
{
|
||||
spriteBatch.Draw(
|
||||
mapTile.Texture,
|
||||
new Rectangle(x * TileWidth, y * TileHeight, TileWidth, TileHeight),
|
||||
mapTile.SourceRectangle,
|
||||
Color.White,
|
||||
0,
|
||||
Vector2.Zero,
|
||||
mapTile.SpriteEffects,
|
||||
0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public byte[,] GetCollisionMap()
|
||||
{
|
||||
byte[,] collisionMap = null;
|
||||
|
||||
foreach (var layer in Layers)
|
||||
{
|
||||
var tileLayer = layer as MapTileLayer;
|
||||
|
||||
if (tileLayer != null && tileLayer.Name == "Collision")
|
||||
{
|
||||
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)
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class MonsterSpawn : Entity
|
||||
{
|
||||
//EntityManager entityManager;
|
||||
|
||||
int wakingDistance = 12;
|
||||
int sleepingDistance = 6;
|
||||
int wakingTurn = 0;
|
||||
|
||||
string type;
|
||||
|
||||
List<SmallEnemy> swarm;
|
||||
|
||||
public MonsterSpawn(string _type, int _wakingDistance, int _wakingTurn, ref List<SmallEnemy> Swarm)
|
||||
: base()
|
||||
{
|
||||
//this.entityManager = entityManager;
|
||||
type = _type;
|
||||
swarm = Swarm;
|
||||
wakingDistance = _wakingDistance;
|
||||
wakingTurn = _wakingTurn;
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
for (int index = 0; index < EntityManager.Entities.Count; index++)
|
||||
{
|
||||
var entity = EntityManager.Entities[index];
|
||||
if (entity is Soldier)
|
||||
{
|
||||
Vector2 distance1 = new Vector2(this.GetComponent<Component.Transform>().Grid.Position.X,
|
||||
this.GetComponent<Component.Transform>().Grid.Position.Y);
|
||||
Vector2 distance2 = new Vector2(entity.GetComponent<Component.Transform>().Grid.Position.X,
|
||||
entity.GetComponent<Component.Transform>().Grid.Position.Y);
|
||||
if (Vector2.Distance(distance1, distance2) < wakingDistance && TurnManager.currentTurn >= wakingTurn/* && Vector2.Distance(distance1, distance2) > sleepingDistance*/)
|
||||
{
|
||||
var enemy = new SmallEnemy(ref swarm);
|
||||
if (type == "BUB")
|
||||
{
|
||||
enemy.LoadBoss();
|
||||
}
|
||||
enemy.X = this.X;
|
||||
enemy.Y = this.Y;
|
||||
swarm.Add(enemy);
|
||||
this.Remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,169 +1,333 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Media;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using Microsoft.Xna.Framework.Media;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class MouseInput
|
||||
{
|
||||
Core core;
|
||||
MouseState lastMouseState;
|
||||
Rectangle selectionRectangle;
|
||||
Texture2D selectionTexture;
|
||||
public Rectangle gridRectangle;
|
||||
Texture2D gridTexture;
|
||||
|
||||
Vector2 directionStart;
|
||||
Vector2 directionNow;
|
||||
|
||||
bool checkingDirection = false;
|
||||
bool readjust = false;
|
||||
|
||||
private Point pressLocation;
|
||||
|
||||
public MouseInput(Core core)
|
||||
{
|
||||
this.core = core;
|
||||
|
||||
selectionRectangle = Rectangle.Empty;
|
||||
gridRectangle = Rectangle.Empty;
|
||||
}
|
||||
|
||||
public void LoadContent()
|
||||
{
|
||||
selectionTexture = new Texture2D(core.GraphicsDevice, 1, 1);
|
||||
selectionTexture.SetData(new Color[] { Color.White });
|
||||
|
||||
//gridTexture = new Texture2D(core.GraphicsDevice, 1, 1);
|
||||
//gridTexture.SetData(new Color[] { Color.White });
|
||||
gridTexture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/selection");
|
||||
}
|
||||
|
||||
public void OnPress(MouseState ms, GameTime gameTime)
|
||||
{
|
||||
pressLocation = new Point(ms.X, ms.Y);
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime
|
||||
};
|
||||
bool handledByUI = GUIManager.RaiseAt("OnPress", mouseEvent, pressLocation);
|
||||
|
||||
if (handledByUI)
|
||||
return;
|
||||
|
||||
// If the mouse event is above a GUI frame that handles mouse events, do nothing
|
||||
//if (GUIManager.FramesIntersectingPoint(mousePos).Any(frame => frame.MouseEnabled))
|
||||
// return;
|
||||
}
|
||||
|
||||
public void OnRelease(MouseState ms, GameTime gameTime)
|
||||
{
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime
|
||||
};
|
||||
|
||||
bool handledByUI = GUIManager.RaiseAt("OnRelease", mouseEvent, pressLocation);
|
||||
|
||||
if (handledByUI)
|
||||
return;
|
||||
}
|
||||
|
||||
public void OnClick(MouseState ms, GameTime gameTime)
|
||||
{
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime
|
||||
};
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class MouseInput
|
||||
{
|
||||
Core core;
|
||||
MouseState lastMouseState;
|
||||
Rectangle selectionRectangle;
|
||||
Texture2D selectionTexture;
|
||||
Rectangle gridRectangle;
|
||||
Texture2D gridTexture;
|
||||
|
||||
Vector2 directionStart;
|
||||
Vector2 directionNow;
|
||||
|
||||
bool checkingDirection = false;
|
||||
|
||||
|
||||
public MouseInput(Core core)
|
||||
{
|
||||
this.core = core;
|
||||
|
||||
selectionRectangle = Rectangle.Empty;
|
||||
gridRectangle = Rectangle.Empty;
|
||||
}
|
||||
|
||||
|
||||
public void LoadContent()
|
||||
{
|
||||
selectionTexture = new Texture2D(core.GraphicsDevice, 1, 1);
|
||||
selectionTexture.SetData(new Color[] { Color.White });
|
||||
|
||||
gridTexture = new Texture2D(core.GraphicsDevice, 1, 1);
|
||||
gridTexture.SetData(new Color[] { Color.White });
|
||||
}
|
||||
|
||||
public void Update(GameTime gameTime)
|
||||
{
|
||||
MouseState ms = Mouse.GetState();
|
||||
Vector2 mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(ms.X, ms.Y));
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
|
||||
// Selection rectangle
|
||||
if (ms.LeftButton == ButtonState.Pressed)
|
||||
//Console.WriteLine(Grid.GridToWorld(new Point()));
|
||||
|
||||
bool handledByUI = GUIManager.RaiseAt("OnClick", mouseEvent, new Point(ms.X, ms.Y));
|
||||
|
||||
if (handledByUI)
|
||||
return;
|
||||
}
|
||||
|
||||
public void Update(GameTime gameTime)
|
||||
{
|
||||
MouseState ms = Mouse.GetState();
|
||||
Vector2 mouseWorldPos = core.Camera.ScreenToWorld(new Vector2(ms.X, ms.Y));
|
||||
Rectangle mouseWorldRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
|
||||
KeyboardState ks = Keyboard.GetState();
|
||||
|
||||
// OnPress events
|
||||
if (ms.LeftButton == ButtonState.Pressed && lastMouseState.LeftButton == ButtonState.Released)
|
||||
{
|
||||
if (selectionRectangle == Rectangle.Empty)
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
selectionRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
selectionRectangle.Width = (int)mouseWorldPos.X - selectionRectangle.X;
|
||||
selectionRectangle.Height = (int)mouseWorldPos.Y - selectionRectangle.Y;
|
||||
}
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
LeftButton = ButtonState.Pressed
|
||||
};
|
||||
GUIManager.RaiseAt("OnPress", mouseEvent, new Point(ms.X, ms.Y));
|
||||
|
||||
}
|
||||
// When the mouse is released
|
||||
if (ms.LeftButton == ButtonState.Released && selectionRectangle != Rectangle.Empty)
|
||||
if (ms.MiddleButton == ButtonState.Pressed && lastMouseState.MiddleButton == ButtonState.Released)
|
||||
{
|
||||
// Deselect all units
|
||||
if (!ks.IsKeyDown(Keys.LeftControl))
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
unit.Selected = false;
|
||||
}
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
MiddleButton = ButtonState.Pressed
|
||||
};
|
||||
GUIManager.RaiseAt("OnPress", mouseEvent, new Point(ms.X, ms.Y));
|
||||
|
||||
// Select all units in the rectangle
|
||||
foreach (var unit in core.Squad)
|
||||
}
|
||||
if (ms.RightButton == ButtonState.Pressed && lastMouseState.RightButton == ButtonState.Released)
|
||||
{
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
if (selectionRectangle.Intersects(unit.GetComponent<Component.Collision>().Rectangle))
|
||||
unit.Selected = true;
|
||||
}
|
||||
|
||||
// Hide the selection rectangle
|
||||
selectionRectangle = Rectangle.Empty;
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
RightButton = ButtonState.Pressed
|
||||
};
|
||||
GUIManager.RaiseAt("OnPress", mouseEvent, new Point(ms.X, ms.Y));
|
||||
}
|
||||
|
||||
// OnRelease events
|
||||
if (ms.LeftButton == ButtonState.Released && lastMouseState.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
LeftButton = ButtonState.Pressed
|
||||
};
|
||||
//GUIManager.RaiseAt("OnClick", mouseEvent, new Point(ms.X, ms.Y));
|
||||
GUIManager.RaiseAt("OnRelease", mouseEvent, new Point(ms.X, ms.Y));
|
||||
}
|
||||
if (ms.MiddleButton == ButtonState.Released && lastMouseState.MiddleButton == ButtonState.Pressed)
|
||||
{
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
MiddleButton = ButtonState.Pressed
|
||||
};
|
||||
//GUIManager.RaiseAt("OnClick", mouseEvent, new Point(ms.X, ms.Y));
|
||||
GUIManager.RaiseAt("OnRelease", mouseEvent, new Point(ms.X, ms.Y));
|
||||
}
|
||||
|
||||
// Send orders with right click
|
||||
if (ms.RightButton == ButtonState.Released && lastMouseState.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
if (unit.Selected)
|
||||
{
|
||||
unit.GetComponent<Component.PathFinder>().Goal = Grid.WorldToGrid(mouseWorldPos);
|
||||
}
|
||||
|
||||
}
|
||||
if (ms.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected && gridRectangle.Intersects(unit.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
checkingDirection = true;
|
||||
directionStart = unit.Transform.World + unit.Transform.World.Origin;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (checkingDirection == true && ms.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
if (unit.Selected)
|
||||
{
|
||||
directionNow.X = mouseWorldPos.X;
|
||||
directionNow.Y = mouseWorldPos.Y;
|
||||
float directionX = mouseWorldPos.X - unit.Transform.World.X;
|
||||
float directionY = mouseWorldPos.Y - unit.Transform.World.Y;
|
||||
var mouseDirection = mouseWorldPos;
|
||||
mouseDirection.Normalize();
|
||||
//float angle = (float)Math.Acos(Vector2.Dot(new Vector2(0, 1), mouseDirection)) * MathHelper.TwoPi;
|
||||
/*if (directionX < 0)
|
||||
{
|
||||
directionX *= -1;
|
||||
unit.GetComponent<Component.Transform>().World.Rotation = (float)Math.Atan(directionY / directionX);
|
||||
}
|
||||
else
|
||||
{
|
||||
*/unit.GetComponent<Component.Transform>().World.Rotation = (float)Math.Atan2(mouseWorldPos.Y - unit.Transform.World.Y, mouseWorldPos.X - unit.Transform.World.X);/*
|
||||
}*/
|
||||
//Console.WriteLine(angle);
|
||||
//unit.GetComponent<Component.Transform>().World.Rotation = angle;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
checkingDirection = false;
|
||||
}
|
||||
|
||||
// Grid highlighting
|
||||
Point mouseGridPos = Grid.WorldToGrid(mouseWorldPos);
|
||||
Vector2 rectWorldPos = Grid.GridToWorld(mouseGridPos);
|
||||
gridRectangle = new Rectangle((int)rectWorldPos.X, (int)rectWorldPos.Y, Grid.TileSize, Grid.TileSize);
|
||||
|
||||
lastMouseState = ms;
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
spriteBatch.Draw(selectionTexture, selectionRectangle, Color.Red * 0.5f);
|
||||
spriteBatch.Draw(gridTexture, gridRectangle, Color.Yellow * 0.3f);
|
||||
|
||||
if (checkingDirection == true)
|
||||
{
|
||||
Texture2D blank = new Texture2D(core.GraphicsDevice, 1, 1, false, SurfaceFormat.Color);
|
||||
blank.SetData(new[] { Color.White });
|
||||
DrawLine(spriteBatch, blank, 2, Color.White, directionStart, directionNow);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DrawLine(SpriteBatch batch, Texture2D blank, float width, Color color, Vector2 point1, Vector2 point2)
|
||||
{
|
||||
float angle = (float)Math.Atan2(point2.Y - point1.Y, point2.X - point1.X);
|
||||
float length = Vector2.Distance(point1, point2);
|
||||
|
||||
batch.Draw(blank, point1, null, color,
|
||||
angle, Vector2.Zero, new Vector2(length, width),
|
||||
SpriteEffects.None, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
var mouseEvent = new GUIManager.MouseEventArgs()
|
||||
{
|
||||
MouseState = ms,
|
||||
Time = gameTime.TotalGameTime,
|
||||
RightButton = ButtonState.Pressed
|
||||
};
|
||||
//GUIManager.RaiseAt("OnClick", mouseEvent, new Point(ms.X, ms.Y));
|
||||
GUIManager.RaiseAt("OnRelease", mouseEvent, new Point(ms.X, ms.Y));
|
||||
}
|
||||
|
||||
// TODO: OnClick events
|
||||
|
||||
// Tooltip stuff
|
||||
/*var tooltip = core.Lua.GetObject<GUI.Frame>("ToolTip");
|
||||
if (tooltip != null)
|
||||
{
|
||||
tooltip.Visible = false;
|
||||
foreach(var entity in core.Squad)
|
||||
{
|
||||
if (mouseWorldRectangle.Intersects(entity.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
tooltip.Visible = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tooltip.Visible)
|
||||
{
|
||||
tooltip.X = ms.X + 10;
|
||||
tooltip.Y = ms.Y + 15;
|
||||
}
|
||||
}*/
|
||||
|
||||
if (core.TurnManager.CurrentTurn == core.TurnManager["Player"])
|
||||
{
|
||||
// Selection rectangle
|
||||
/*if (ms.LeftButton == ButtonState.Pressed)
|
||||
{
|
||||
|
||||
if (selectionRectangle == Rectangle.Empty)
|
||||
{
|
||||
directionStart = mouseWorldPos;
|
||||
selectionRectangle = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 0, 0);
|
||||
readjust = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mouseWorldPos.X > directionStart.X && mouseWorldPos.Y < directionStart.Y || mouseWorldPos.X < directionStart.X && mouseWorldPos.Y > directionStart.Y)
|
||||
{
|
||||
int rectangleX = (int)mouseWorldPos.X - ((int)mouseWorldPos.X - (int)directionStart.X);
|
||||
int rectangleY = (int)mouseWorldPos.Y;
|
||||
int rectangleWidth = (int)mouseWorldPos.X - (int)directionStart.X;
|
||||
int rectangleHeight = (int)directionStart.Y - (int)mouseWorldPos.Y;
|
||||
selectionRectangle = new Rectangle(rectangleX, rectangleY, rectangleWidth, rectangleHeight);
|
||||
readjust = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (readjust == true)
|
||||
{
|
||||
selectionRectangle = new Rectangle((int)directionStart.X, (int)directionStart.Y, 0, 0);
|
||||
}
|
||||
selectionRectangle.Width = (int)mouseWorldPos.X - selectionRectangle.X;
|
||||
selectionRectangle.Height = (int)mouseWorldPos.Y - selectionRectangle.Y;
|
||||
readjust = false;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
//Calculating chance to hit if holding cursor over enemy
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected == true && unit.Fired == false)
|
||||
{
|
||||
foreach (var enemy in core.Swarm)
|
||||
{
|
||||
if (gridRectangle.Intersects(enemy.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
Console.WriteLine(Utility.CalculateHitChance(unit.GetComponent<Component.Stat>(), unit.GetComponent<Component.Transform>().World.Position, enemy));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// When the mouse is released
|
||||
/*if (ms.LeftButton == ButtonState.Released && selectionRectangle != Rectangle.Empty)
|
||||
{
|
||||
// Deselect all units
|
||||
if (!ks.IsKeyDown(Keys.LeftControl))
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
unit.Selected = false;
|
||||
}
|
||||
|
||||
// Select all units in the rectangle
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (selectionRectangle.Intersects(unit.GetComponent<Component.Collision>().Rectangle))
|
||||
unit.Selected = true;
|
||||
}
|
||||
|
||||
// Hide the selection rectangle
|
||||
selectionRectangle = Rectangle.Empty;
|
||||
}*/
|
||||
|
||||
// Send orders with right click
|
||||
/*if (ms.RightButton == ButtonState.Released && lastMouseState.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
if (checkingDirection == false)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
if (unit.Selected)
|
||||
{
|
||||
unit.GetComponent<Component.PathFinder>().Goal = Grid.WorldToGrid(mouseWorldPos);
|
||||
}
|
||||
}
|
||||
|
||||
}*/
|
||||
|
||||
/*if (ms.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
{
|
||||
if (unit.Selected && gridRectangle.Intersects(unit.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
checkingDirection = true;
|
||||
directionStart = unit.Transform.World + unit.Transform.World.Origin;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (checkingDirection == true && ms.RightButton == ButtonState.Pressed)
|
||||
{
|
||||
foreach (var unit in core.Squad)
|
||||
if (unit.Selected)
|
||||
{
|
||||
directionNow.X = mouseWorldPos.X;
|
||||
directionNow.Y = mouseWorldPos.Y;
|
||||
float directionX = mouseWorldPos.X - unit.Transform.World.X;
|
||||
float directionY = mouseWorldPos.Y - unit.Transform.World.Y;
|
||||
var mouseDirection = mouseWorldPos;
|
||||
mouseDirection.Normalize();
|
||||
unit.GetComponent<Component.Transform>().World.Rotation = (float)Math.Atan2(mouseWorldPos.Y - unit.Transform.World.Y - unit.Transform.World.Origin.Y, mouseWorldPos.X - unit.Transform.World.X - unit.Transform.World.Origin.X);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
checkingDirection = false;
|
||||
}*/
|
||||
}
|
||||
// Grid highlighting
|
||||
Point mouseGridPos = Grid.WorldToGrid(mouseWorldPos);
|
||||
Vector2 rectWorldPos = Grid.GridToWorld(mouseGridPos);
|
||||
gridRectangle = new Rectangle((int)rectWorldPos.X, (int)rectWorldPos.Y, Grid.TileSize, Grid.TileSize);
|
||||
|
||||
lastMouseState = ms;
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch spriteBatch)
|
||||
{
|
||||
spriteBatch.Draw(selectionTexture, selectionRectangle, Color.Red * 0.5f);
|
||||
spriteBatch.Draw(gridTexture, gridRectangle, Color.White * 0.7f);
|
||||
|
||||
if (checkingDirection == true)
|
||||
{
|
||||
Utility.DrawLine(spriteBatch, Color.White, 2, directionStart, directionNow);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using DepthsBelow.Component;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class Shot : Entity
|
||||
{
|
||||
public Texture2D Texture;
|
||||
public Color Color;
|
||||
public static Point Origin;
|
||||
string type = "";
|
||||
|
||||
Stat soldierStat;
|
||||
|
||||
public Stat Stat
|
||||
{
|
||||
get { return soldierStat; }
|
||||
set { soldierStat = value; }
|
||||
}
|
||||
|
||||
public string Type
|
||||
{
|
||||
get { return type; }
|
||||
set { type = value; }
|
||||
}
|
||||
|
||||
private bool _selected = false; //I guess as in "currently doing something"
|
||||
|
||||
public bool select
|
||||
{
|
||||
get { return _selected; }
|
||||
set
|
||||
{
|
||||
_selected = value;
|
||||
}
|
||||
}
|
||||
|
||||
public List<Shot> Volley;
|
||||
|
||||
public Vector2 direction = Vector2.Zero;
|
||||
|
||||
public Shot(Stat _soldierStat, string _type)
|
||||
: base()
|
||||
{
|
||||
type = _type;
|
||||
|
||||
if (Texture == null)
|
||||
LoadContent();
|
||||
|
||||
//Transform.World.Origin = new Vector2(16, 16);
|
||||
|
||||
Stat = _soldierStat;
|
||||
|
||||
if (type == "Rocket")
|
||||
{
|
||||
Stat.Strength = 50000;
|
||||
}
|
||||
|
||||
this.Color = Color.White;
|
||||
var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White };
|
||||
rc.Offset = new Vector2(16, 16);
|
||||
AddComponent(rc);
|
||||
|
||||
var cc = new Collision(this, 32, 32);
|
||||
AddComponent(cc);
|
||||
|
||||
}
|
||||
public void LoadContent()
|
||||
{
|
||||
if (type == "Rocket")
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/RocketProjectile");
|
||||
}
|
||||
else
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Shot3");
|
||||
}
|
||||
}
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
base.Update(gameTime);
|
||||
|
||||
float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
|
||||
List<Point> soldierCollisions = new List<Point>();
|
||||
|
||||
// HACK: Make this work properly with other speeds...
|
||||
float speed = 4f;
|
||||
Transform.World.Position += speed * direction;
|
||||
|
||||
foreach (var entity in EntityManager.Entities)
|
||||
{
|
||||
var collision = entity.GetComponent<Component.Collision>();
|
||||
if (collision == null)
|
||||
continue;
|
||||
|
||||
if (this.GetComponent<Component.Collision>().Rectangle.Intersects(collision.Rectangle))
|
||||
{
|
||||
if (entity is SmallEnemy)
|
||||
{
|
||||
if (Utility.AttackTest(Stat, entity, Utility.CalculateHitChance(Stat, this.Stat.Remember, entity)))
|
||||
{
|
||||
this.Remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (entity is Door && type == "Rocket")
|
||||
{
|
||||
((Door)entity).Kill();
|
||||
this.Remove();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using DepthsBelow.Component;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
public class SmallEnemy : Entity
|
||||
{
|
||||
public Texture2D Texture;
|
||||
public Color Color;
|
||||
public static Point Origin;
|
||||
private bool _selected; //I guess as in "currently doing something"
|
||||
|
||||
public List<SmallEnemy> Swarm;
|
||||
|
||||
private PathFinder.Node nextNode;
|
||||
|
||||
public int numberOfSteps = 8;
|
||||
public int currentStep = 0;
|
||||
|
||||
public bool AttackedThisTurn = false;
|
||||
|
||||
public int step
|
||||
{
|
||||
get { return currentStep; }
|
||||
set
|
||||
{
|
||||
currentStep = value;
|
||||
}
|
||||
}
|
||||
|
||||
public SmallEnemy(ref List<SmallEnemy> swarm)
|
||||
: base()
|
||||
{
|
||||
if (Texture == null)
|
||||
LoadContent();
|
||||
|
||||
this.Swarm = swarm;
|
||||
|
||||
Transform.World.Origin = new Vector2(20, 16);
|
||||
|
||||
this.Color = Color.White;
|
||||
var rc = new SpriteRenderer(this) { Texture = Texture, Color = Color.White };
|
||||
AddComponent(rc);
|
||||
|
||||
var cc = new Collision(this, 32, 32);
|
||||
cc.Solid = true;
|
||||
AddComponent(cc);
|
||||
|
||||
var pfc = new PathFinder(this);
|
||||
AddComponent(pfc);
|
||||
|
||||
var stat = new Component.Stat(this)
|
||||
{
|
||||
Life = 50,
|
||||
Defence = 25,
|
||||
Strength = 70,
|
||||
GetAim = 100,
|
||||
GetDodge = 50
|
||||
};
|
||||
AddComponent(stat);
|
||||
}
|
||||
public override void Remove()
|
||||
{
|
||||
Swarm.Remove(this);
|
||||
|
||||
base.Remove();
|
||||
}
|
||||
|
||||
public bool Selected
|
||||
{
|
||||
get { return _selected; }
|
||||
set
|
||||
{
|
||||
_selected = value;
|
||||
GetComponent<SpriteRenderer>().Color = (value) ? Color.Blue : this.Color;
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadContent()
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Monster");
|
||||
}
|
||||
|
||||
public void LoadBoss()
|
||||
{
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/Pineapple");
|
||||
GetComponent<SpriteRenderer>().Texture = Texture;
|
||||
Transform.World.Origin = new Vector2(((float)Texture.Width) / 2f, ((float)Texture.Height) / 2f);
|
||||
GetComponent<SpriteRenderer>().Offset = (new Vector2(Texture.Width / 2f, Texture.Height / 2f) - new Vector2(Grid.TileSize / 2, Grid.TileSize / 2)) * -1;
|
||||
GetComponent<Stat>()._MaxHP = 500;
|
||||
GetComponent<Stat>().MaxHP = 500;
|
||||
GetComponent<Stat>().Life = 500;
|
||||
GetComponent<Stat>().Defence = 15;
|
||||
GetComponent<Stat>().Strength = 70;
|
||||
GetComponent<Stat>().GetAim = 80;
|
||||
GetComponent<Stat>().GetDodge = 5;
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
{
|
||||
base.Update(gameTime);
|
||||
|
||||
float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
|
||||
|
||||
if (nextNode == null)
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
|
||||
if (nextNode != null)
|
||||
{
|
||||
List<Point> soldierCollisions = new List<Point>();
|
||||
|
||||
// Collision with moving units
|
||||
foreach (var body in Swarm)
|
||||
{
|
||||
if (body != this)
|
||||
{
|
||||
if (body.Transform.Grid == nextNode.Position)
|
||||
{
|
||||
soldierCollisions.Add(body.Transform.Grid);
|
||||
GetComponent<PathFinder>().RecreatePath(soldierCollisions);
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (nextNode != null)
|
||||
{
|
||||
var nodeWorldPos = Grid.GridToWorld(nextNode.Position);
|
||||
// HACK: Make this work properly with other speeds...
|
||||
float speed = 4f;
|
||||
if (Transform.World.X < nodeWorldPos.X)
|
||||
{
|
||||
Transform.World.X += speed;
|
||||
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(0);
|
||||
}
|
||||
if (Transform.World.X > nodeWorldPos.X)
|
||||
{
|
||||
Transform.World.X -= speed;
|
||||
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(180);
|
||||
}
|
||||
if (Transform.World.Y < nodeWorldPos.Y)
|
||||
{
|
||||
Transform.World.Y += speed;
|
||||
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(90);
|
||||
}
|
||||
if (Transform.World.Y > nodeWorldPos.Y)
|
||||
{
|
||||
Transform.World.Y -= speed;
|
||||
GetComponent<Component.Transform>().World.Rotation = MathHelper.ToRadians(270);
|
||||
}
|
||||
if (Transform.World == nodeWorldPos)
|
||||
{
|
||||
if (currentStep < numberOfSteps)
|
||||
{
|
||||
currentStep++;
|
||||
//lastLastNode = lastNode;
|
||||
//lastNode = nextNode;
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
GetComponent<PathFinder>().Stop();
|
||||
}
|
||||
foreach (var entity in EntityManager.Entities)
|
||||
{
|
||||
if (entity is Soldier)
|
||||
{
|
||||
if (entity.GetComponent<Component.Collision>().Rectangle.Intersects(this.GetComponent<Component.Collision>().Rectangle))
|
||||
{
|
||||
if (AttackedThisTurn == false)
|
||||
{
|
||||
if (Utility.AttackTest(this.GetComponent<Component.Stat>(), entity, Utility.CalculateHitChance(this.GetComponent<Component.Stat>(), this.Transform.World.Position, entity)))
|
||||
{
|
||||
AttackedThisTurn = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using DepthsBelow.Component;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
|
||||
@@ -11,17 +12,47 @@ namespace DepthsBelow
|
||||
{
|
||||
public static Texture2D Texture;
|
||||
public Color Color;
|
||||
public static Point Origin;
|
||||
public string Name;
|
||||
private bool _selected;
|
||||
|
||||
public List<Soldier> Squad;
|
||||
|
||||
private PathFinder.Node nextNode;
|
||||
private PathFinder.Node lastNode;
|
||||
private PathFinder.Node lastLastNode;
|
||||
|
||||
public Soldier(Core core, ref List<Soldier> squad) : base(core)
|
||||
private bool hasFiredAlready = false;
|
||||
|
||||
int fireTimer = 0;
|
||||
int timeSpentFired = 1000;
|
||||
|
||||
public bool Fired
|
||||
{
|
||||
get { return hasFiredAlready; }
|
||||
set
|
||||
{
|
||||
hasFiredAlready = value;
|
||||
}
|
||||
}
|
||||
|
||||
public int MaxActionPoints = 10;
|
||||
int actionPointsLeft = 10;
|
||||
|
||||
public int AP
|
||||
{
|
||||
get { return actionPointsLeft; }
|
||||
set
|
||||
{
|
||||
actionPointsLeft = value;
|
||||
GetComponent<Component.Stat>().GetStep = actionPointsLeft;
|
||||
}
|
||||
}
|
||||
|
||||
public Soldier(ref List<Soldier> squad)
|
||||
: base()
|
||||
{
|
||||
if (Texture == null)
|
||||
LoadContent(core);
|
||||
LoadContent();
|
||||
|
||||
this.Squad = squad;
|
||||
|
||||
@@ -36,6 +67,31 @@ namespace DepthsBelow
|
||||
|
||||
var pfc = new PathFinder(this);
|
||||
AddComponent(pfc);
|
||||
|
||||
var flashlight = new Flashlight(this)
|
||||
{
|
||||
Intensity = 0.8f
|
||||
};
|
||||
AddComponent(flashlight);
|
||||
|
||||
var stat = new Component.Stat(this)
|
||||
{
|
||||
MaxHP = 100,
|
||||
MaxPanic = 100,
|
||||
Life = 100,
|
||||
Defence = 25,
|
||||
Strength = 50,
|
||||
GetAim = 40,
|
||||
GetDodge = 20
|
||||
};
|
||||
AddComponent(stat);
|
||||
}
|
||||
|
||||
public override void Remove()
|
||||
{
|
||||
Squad.Remove(this);
|
||||
|
||||
base.Remove();
|
||||
}
|
||||
|
||||
public bool Selected
|
||||
@@ -48,9 +104,9 @@ namespace DepthsBelow
|
||||
}
|
||||
}
|
||||
|
||||
public static void LoadContent(Core core)
|
||||
public static void LoadContent()
|
||||
{
|
||||
Texture = core.Content.Load<Texture2D>("images/soldier2");
|
||||
Texture = GameServices.GetService<ContentManager>().Load<Texture2D>("images/soldier5");
|
||||
}
|
||||
|
||||
public override void Update(GameTime gameTime)
|
||||
@@ -58,7 +114,7 @@ namespace DepthsBelow
|
||||
base.Update(gameTime);
|
||||
|
||||
float elapsed = gameTime.ElapsedGameTime.Milliseconds / 1000.0f;
|
||||
|
||||
|
||||
if (nextNode == null)
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
|
||||
@@ -66,21 +122,41 @@ namespace DepthsBelow
|
||||
{
|
||||
List<Point> soldierCollisions = new List<Point>();
|
||||
|
||||
foreach (var soldier in Squad)
|
||||
{
|
||||
if (soldier != this)
|
||||
{
|
||||
if (soldier.Transform.Grid == nextNode.Position)
|
||||
{
|
||||
soldierCollisions.Add(soldier.Transform.Grid);
|
||||
GetComponent<PathFinder>().RecreatePath(soldierCollisions);
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Collision with units at a standstill
|
||||
//foreach (var soldier in Squad)
|
||||
//{
|
||||
// if (soldier != this)
|
||||
// {
|
||||
// if (!soldier.GetComponent<PathFinder>().IsMoving)
|
||||
// {
|
||||
// soldierCollisions.Add(soldier.Transform.Grid);
|
||||
// }
|
||||
// if (soldier.Transform.Grid == nextNode.Position)
|
||||
// {
|
||||
// GetComponent<PathFinder>().RecreatePath(soldierCollisions);
|
||||
// nextNode = GetComponent<PathFinder>().Next();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
//}
|
||||
|
||||
// Collision with moving units
|
||||
//foreach (var soldier in Squad)
|
||||
//{
|
||||
// if (soldier != this)
|
||||
// {
|
||||
// var pathFinder = soldier.GetComponent<PathFinder>();
|
||||
// var position = nextNode.Position;
|
||||
// if (soldier.Transform.Grid == position)
|
||||
// {
|
||||
// soldierCollisions.Add(soldier.Transform.Grid);
|
||||
// GetComponent<PathFinder>().RecreatePath(soldierCollisions);
|
||||
// nextNode = GetComponent<PathFinder>().Next();
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
if (nextNode != null)
|
||||
{
|
||||
@@ -97,12 +173,30 @@ namespace DepthsBelow
|
||||
Transform.World.Y -= speed;
|
||||
|
||||
if (Transform.World == nodeWorldPos)
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
{
|
||||
//if (AP < NumberOfActionPoints)
|
||||
//{
|
||||
//AP++;
|
||||
lastLastNode = lastNode;
|
||||
lastNode = nextNode;
|
||||
nextNode = GetComponent<PathFinder>().Next();
|
||||
//}
|
||||
/*else
|
||||
{
|
||||
GetComponent<PathFinder>().Stop();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**/
|
||||
if (Fired == true)
|
||||
{
|
||||
fireTimer += gameTime.ElapsedGameTime.Milliseconds;
|
||||
if (fireTimer > timeSpentFired)
|
||||
{
|
||||
fireTimer = 0;
|
||||
Fired = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// Keeps track of whose turn it is.
|
||||
/// </summary>
|
||||
public class TurnManager
|
||||
{
|
||||
public static int currentTurn = 0;
|
||||
|
||||
/// <summary>
|
||||
/// A player turn token.
|
||||
/// </summary>
|
||||
public class Token
|
||||
{
|
||||
/// <summary>
|
||||
/// Unique identifying name of the token.
|
||||
/// </summary>
|
||||
public string Name { get; private set; }
|
||||
private TurnManager turnManager;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Token" /> class.
|
||||
/// Preferably use <see cref="TurnManager.CreateToken" /> instead.
|
||||
/// </summary>
|
||||
/// <param name="turnManager">The turn manager the token belongs to.</param>
|
||||
/// <param name="name">Unique identifying name of the token.</param>
|
||||
public Token(TurnManager turnManager, string name)
|
||||
{
|
||||
this.turnManager = turnManager;
|
||||
this.Name = name;
|
||||
turnManager.AddToken(this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dictionary of turn tokens.
|
||||
/// </summary>
|
||||
public Dictionary<string, Token> Tokens;
|
||||
private int currentTokenIndex;
|
||||
|
||||
/// <summary>
|
||||
/// The turn token belonging to a player.
|
||||
/// </summary>
|
||||
public Token CurrentTurn
|
||||
{
|
||||
get { return Tokens.ElementAt(currentTokenIndex).Value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the turn token by the specified name.
|
||||
/// </summary>
|
||||
/// <param name="name">The identifying name of the player.</param>
|
||||
/// <returns>Returns a player turn token.</returns>
|
||||
public Token this[string name]
|
||||
{
|
||||
get { return this.Tokens[name]; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a turn manager.
|
||||
/// </summary>
|
||||
public TurnManager()
|
||||
{
|
||||
Tokens = new Dictionary<string, Token>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a turn manager.
|
||||
/// </summary>
|
||||
/// <param name="tokenNames">Tokens of players.</param>
|
||||
public TurnManager(string[] tokenNames)
|
||||
: this()
|
||||
{
|
||||
foreach (var tokenName in tokenNames)
|
||||
CreateToken(tokenName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a turn token.
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the token.</param>
|
||||
/// <returns>Returns a player turn token.</returns>
|
||||
public Token CreateToken(string name)
|
||||
{
|
||||
return Tokens.ContainsKey(name) ? Tokens[name] : new Token(this, name);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a turn token to
|
||||
/// </summary>
|
||||
/// <param name="token"></param>
|
||||
public void AddToken(Token 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>
|
||||
public void EndTurn()
|
||||
{
|
||||
var prevTurn = CurrentTurn;
|
||||
|
||||
if (++currentTokenIndex > Tokens.Count - 1)
|
||||
currentTokenIndex = 0;
|
||||
|
||||
Debug.WriteLine(prevTurn.Name + " turn ended. Current turn: " + CurrentTurn.Name);
|
||||
if (CurrentTurn.Name == "Player")
|
||||
{
|
||||
currentTurn++;
|
||||
Console.WriteLine("Turn: " + currentTurn);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DepthsBelow.Component;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace DepthsBelow
|
||||
{
|
||||
/// <summary>
|
||||
/// Various global utility functions.
|
||||
/// </summary>
|
||||
static class Utility
|
||||
{
|
||||
/// <summary>
|
||||
/// Calculate the chance of an entity with a Stat component to hit another unit.
|
||||
/// </summary>
|
||||
/// <param name="attacker">The attacking unit.</param>
|
||||
/// <param name="defender">The recieving unit.</param>
|
||||
/// <returns>Returns a hit chance percentage.</returns>
|
||||
public static int CalculateHitChance(Stat attacker, Vector2 attackerPosition, Entity defender)
|
||||
{
|
||||
Stat shooting = attacker;
|
||||
Stat dodging = defender.GetComponent<Stat>();
|
||||
if (shooting == null || dodging == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int baseHitChance = shooting.GetAim;
|
||||
int baseDodgeChance = dodging.GetDodge;
|
||||
int distance = (int)Vector2.Distance(attackerPosition, defender.Transform.World.Position);
|
||||
int basePenalty = shooting.Penalty(distance / (Grid.TileSize));
|
||||
Console.WriteLine("Penalty = " + basePenalty);
|
||||
int chanceToHit = baseHitChance - baseDodgeChance - basePenalty;
|
||||
//Console.WriteLine(chanceToHit);
|
||||
return chanceToHit;
|
||||
}
|
||||
public static bool AttackTest(Stat attacker, Entity defender, int chanceToHit)
|
||||
{
|
||||
Component.Stat shooting = attacker;
|
||||
Component.Stat dodging = defender.GetComponent<Component.Stat>();
|
||||
Random rand = new Random();
|
||||
if (rand.Next(0, 100) < chanceToHit)
|
||||
{
|
||||
dodging.Life -= shooting.Strength - dodging.Defence / 2;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private static Texture2D blank;
|
||||
|
||||
public static void DrawLine(SpriteBatch batch, Color color, float width, Vector2 start, Vector2 end)
|
||||
{
|
||||
if (blank == null)
|
||||
{
|
||||
blank = new Texture2D(Core.GraphicsDeviceManager.GraphicsDevice, 1, 1, false, SurfaceFormat.Color);
|
||||
blank.SetData(new[] { color });
|
||||
}
|
||||
|
||||
float angle = (float)Math.Atan2(end.Y - start.Y, end.X - start.X);
|
||||
float length = Vector2.Distance(start, end);
|
||||
|
||||
batch.Draw(blank, start, null, color,
|
||||
angle, Vector2.Zero, new Vector2(length, width),
|
||||
SpriteEffects.None, 0);
|
||||
}
|
||||
|
||||
private static Texture2D solidTexture = null;
|
||||
/// <summary>
|
||||
/// Creates a 1x1 solid white XNA texture.
|
||||
/// </summary>
|
||||
/// <returns>Returns a 1x1 solid white Texture2D object.</returns>
|
||||
public static Texture2D GetSolidTexture()
|
||||
{
|
||||
if (solidTexture == null)
|
||||
{
|
||||
solidTexture = new Texture2D(GameServices.GetService<GraphicsDevice>(), 1, 1);
|
||||
solidTexture.SetData(new Color[] { Color.White });
|
||||
}
|
||||
|
||||
return solidTexture;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts rectangles with negative sizes to positive sizes with its position offset.
|
||||
/// </summary>
|
||||
/// <param name="rect">The rectangle with potentially negative sizes.</param>
|
||||
/// <returns>Returns a rectangle with positive sizes.</returns>
|
||||
public static Rectangle MakeRectanglePositive(Rectangle rect)
|
||||
{
|
||||
if (rect.Width < 0)
|
||||
{
|
||||
rect.X += rect.Width;
|
||||
rect.Width = -rect.Width;
|
||||
}
|
||||
|
||||
if (rect.Height < 0)
|
||||
{
|
||||
rect.Y += rect.Height;
|
||||
rect.Height = -rect.Height;
|
||||
}
|
||||
|
||||
return rect;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
This file contains an xml description of a font, and will be read by the XNA
|
||||
Framework Content Pipeline. Follow the comments to customize the appearance
|
||||
of the font in your game, and to change the characters which are available to draw
|
||||
with.
|
||||
-->
|
||||
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
|
||||
<Asset Type="Graphics:FontDescription">
|
||||
|
||||
<!--
|
||||
Modify this string to change the font that will be imported.
|
||||
-->
|
||||
<FontName>Arial</FontName>
|
||||
|
||||
<!--
|
||||
Size is a float value, measured in points. Modify this value to change
|
||||
the size of the font.
|
||||
-->
|
||||
<Size>11</Size>
|
||||
|
||||
<!--
|
||||
Spacing is a float value, measured in pixels. Modify this value to change
|
||||
the amount of spacing in between characters.
|
||||
-->
|
||||
<Spacing>0</Spacing>
|
||||
|
||||
<!--
|
||||
UseKerning controls the layout of the font. If this value is true, kerning information
|
||||
will be used when placing characters.
|
||||
-->
|
||||
<UseKerning>true</UseKerning>
|
||||
|
||||
<!--
|
||||
Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
|
||||
and "Bold, Italic", and are case sensitive.
|
||||
-->
|
||||
<Style>Regular</Style>
|
||||
|
||||
<!--
|
||||
If you uncomment this line, the default character will be substituted if you draw
|
||||
or measure text that contains characters which were not included in the font.
|
||||
-->
|
||||
<!-- <DefaultCharacter>*</DefaultCharacter> -->
|
||||
|
||||
<!--
|
||||
CharacterRegions control what letters are available in the font. Every
|
||||
character from Start to End will be built and made available for drawing. The
|
||||
default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
|
||||
character set. The characters are ordered according to the Unicode standard.
|
||||
See the documentation for more information.
|
||||
-->
|
||||
<CharacterRegions>
|
||||
<CharacterRegion>
|
||||
<Start> </Start>
|
||||
<End>~</End>
|
||||
</CharacterRegion>
|
||||
</CharacterRegions>
|
||||
</Asset>
|
||||
</XnaContent>
|
||||
@@ -1,110 +1,273 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{433A77A2-DE52-4875-A4EF-232CF59C2DD3}</ProjectGuid>
|
||||
<ProjectTypeGuids>{96E2B04D-8817-42c6-938A-82C39BA4D311};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
|
||||
<OutputPath>bin\$(Platform)\$(Configuration)</OutputPath>
|
||||
<ContentRootDirectory>Content</ContentRootDirectory>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<RootNamespace>DepthsBelowContent</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.EffectImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.FBXImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.TextureImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.XImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.AudioImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.VideoImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier.png">
|
||||
<Name>soldier</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="maps\test.tmx">
|
||||
<Name>test</Name>
|
||||
<Importer>TmxImporter</Importer>
|
||||
<Processor>MapProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\TiledLib\TiledLib\TiledLib.csproj">
|
||||
<Project>{EC3F6988-459C-4783-89E9-F34C0CC731C7}</Project>
|
||||
<Name>TiledLib</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DepthsBelowContentPipeline\DepthsBelowContentPipeline.csproj">
|
||||
<Project>{D054E3A6-7E05-4255-984F-69FE40D9137F}</Project>
|
||||
<Name>DepthsBelowContentPipeline</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\tilesets\aztek.jpg">
|
||||
<Name>aztek</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier2.png">
|
||||
<Name>soldier2</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\tilesets\collision.png">
|
||||
<Name>collision</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\Cave.Level1.tmx">
|
||||
<Name>Cave.Level1</Name>
|
||||
<Processor>MapProcessor</Processor>
|
||||
<Importer>TmxImporter</Importer>
|
||||
<SubType>Designer</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\tilesets\cave.png">
|
||||
<Name>cave</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{433A77A2-DE52-4875-A4EF-232CF59C2DD3}</ProjectGuid>
|
||||
<ProjectTypeGuids>{96E2B04D-8817-42c6-938A-82C39BA4D311};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
|
||||
<OutputPath>bin\$(Platform)\$(Configuration)</OutputPath>
|
||||
<ContentRootDirectory>Content</ContentRootDirectory>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<RootNamespace>DepthsBelowContent</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.EffectImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.FBXImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.TextureImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.XImporter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.AudioImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Content.Pipeline.VideoImporters, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier.png">
|
||||
<Name>soldier</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\TiledLib\TiledLib\TiledLib.csproj">
|
||||
<Project>{EC3F6988-459C-4783-89E9-F34C0CC731C7}</Project>
|
||||
<Name>TiledLib</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DepthsBelowContentPipeline\DepthsBelowContentPipeline.csproj">
|
||||
<Project>{D054E3A6-7E05-4255-984F-69FE40D9137F}</Project>
|
||||
<Name>DepthsBelowContentPipeline</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier2.png">
|
||||
<Name>soldier2</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Monster.png">
|
||||
<Name>Monster</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Enter.bmp">
|
||||
<Name>Enter</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Arial.spritefont">
|
||||
<Name>Arial</Name>
|
||||
<Importer>FontDescriptionImporter</Importer>
|
||||
<Processor>FontDescriptionProcessor</Processor>
|
||||
<SubType>Designer</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Shot2.bmp">
|
||||
<Name>Shot2</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\FireBall.PNG">
|
||||
<Name>Shot</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="scripts\gui.lua">
|
||||
<Name>gui</Name>
|
||||
<Importer>LuaImporter</Importer>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Compile>
|
||||
<Compile Include="scripts\test.lua">
|
||||
<Name>test</Name>
|
||||
<Importer>LuaImporter</Importer>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="scripts\tooltip.lua">
|
||||
<Name>tooltip</Name>
|
||||
<Importer>LuaImporter</Importer>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\GUI\bar_solid.png">
|
||||
<Name>bar_solid</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\GUI\bar_transparent.png">
|
||||
<Name>bar_transparent</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\GUI\health_background.png">
|
||||
<Name>health_background</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\GUI\unit_background.png">
|
||||
<Name>unit_background</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="fonts\UnitName.spritefont">
|
||||
<Name>UnitName</Name>
|
||||
<Importer>FontDescriptionImporter</Importer>
|
||||
<Processor>FontDescriptionProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="shaders\LightEffect.fx">
|
||||
<Name>LightEffect</Name>
|
||||
<Importer>EffectImporter</Importer>
|
||||
<Processor>EffectProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\lights\point.png">
|
||||
<Name>point</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\lights\spot.png">
|
||||
<Name>spot</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\Aztek.Test.tmx">
|
||||
<Name>Aztek.Test</Name>
|
||||
<Importer>TmxImporter</Importer>
|
||||
<Processor>MapProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier3.png">
|
||||
<Name>soldier3</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\soldier5.png">
|
||||
<Name>soldier5</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\lights\spot_wide.png">
|
||||
<Name>spot_wide</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\selection.png">
|
||||
<Name>selection</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Shot3.bmp">
|
||||
<Name>Shot3</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\prototyp.tmx">
|
||||
<Name>prototyp</Name>
|
||||
<Importer>TmxImporter</Importer>
|
||||
<Processor>MapProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\door_closed.png">
|
||||
<Name>door_closed</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\door_destroyed.png">
|
||||
<Name>door_destroyed</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
<Compile Include="images\door_open.png">
|
||||
<Name>door_open</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Pineapple.png">
|
||||
<Name>Pineapple</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\Pineapple%282%29.png">
|
||||
<Name>Pineapple%282%29</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="maps\prototyp2.tmx">
|
||||
<Name>prototyp2</Name>
|
||||
<Importer>TmxImporter</Importer>
|
||||
<Processor>MapProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="images\RocketProjectile.png">
|
||||
<Name>RocketProjectile</Name>
|
||||
<Importer>TextureImporter</Importer>
|
||||
<Processor>TextureProcessor</Processor>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
This file contains an xml description of a font, and will be read by the XNA
|
||||
Framework Content Pipeline. Follow the comments to customize the appearance
|
||||
of the font in your game, and to change the characters which are available to draw
|
||||
with.
|
||||
-->
|
||||
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
|
||||
<Asset Type="Graphics:FontDescription">
|
||||
|
||||
<!--
|
||||
Modify this string to change the font that will be imported.
|
||||
-->
|
||||
<FontName>Arial</FontName>
|
||||
|
||||
<!--
|
||||
Size is a float value, measured in points. Modify this value to change
|
||||
the size of the font.
|
||||
-->
|
||||
<Size>10</Size>
|
||||
|
||||
<!--
|
||||
Spacing is a float value, measured in pixels. Modify this value to change
|
||||
the amount of spacing in between characters.
|
||||
-->
|
||||
<Spacing>0</Spacing>
|
||||
|
||||
<!--
|
||||
UseKerning controls the layout of the font. If this value is true, kerning information
|
||||
will be used when placing characters.
|
||||
-->
|
||||
<UseKerning>true</UseKerning>
|
||||
|
||||
<!--
|
||||
Style controls the style of the font. Valid entries are "Regular", "Bold", "Italic",
|
||||
and "Bold, Italic", and are case sensitive.
|
||||
-->
|
||||
<Style>Regular</Style>
|
||||
|
||||
<!--
|
||||
If you uncomment this line, the default character will be substituted if you draw
|
||||
or measure text that contains characters which were not included in the font.
|
||||
-->
|
||||
<!-- <DefaultCharacter>*</DefaultCharacter> -->
|
||||
|
||||
<!--
|
||||
CharacterRegions control what letters are available in the font. Every
|
||||
character from Start to End will be built and made available for drawing. The
|
||||
default range is from 32, (ASCII space), to 126, ('~'), covering the basic Latin
|
||||
character set. The characters are ordered according to the Unicode standard.
|
||||
See the documentation for more information.
|
||||
-->
|
||||
<CharacterRegions>
|
||||
<CharacterRegion>
|
||||
<Start> </Start>
|
||||
<End>~</End>
|
||||
</CharacterRegion>
|
||||
</CharacterRegions>
|
||||
</Asset>
|
||||
</XnaContent>
|
||||
|
After Width: | Height: | Size: 670 B |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 977 B |
|
After Width: | Height: | Size: 983 B |
|
After Width: | Height: | Size: 1008 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 222 B |
|
After Width: | Height: | Size: 142 B |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 405 B After Width: | Height: | Size: 405 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.0" orientation="orthogonal" width="100" height="100" tilewidth="32" tileheight="32">
|
||||
<tileset firstgid="1" name="Aztek" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek.png" width="480" height="693"/>
|
||||
</tileset>
|
||||
<tileset firstgid="316" name="Collision" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/collision.png" width="32" height="32"/>
|
||||
</tileset>
|
||||
<layer name="Floor" width="100" height="100">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt1sEJgEAMAMED++/ZCsTzYVxhBtJA9pGsBQAA0HVsDHP0aNjpoMccPZr0aNGjS4MWPVr0aHjya2n1Pj2a7nauxyw9WvRouerhjnxDjxY9WvRocc9b9GjRo0WPFj1a9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4M9ODsMCBQ==
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Tile Layer 1" width="100" height="100">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt2MlOwzAQBmA/Ajvc2OEGYr0BLcuN7f2fhqlUS1GqNCfHQfk+6ZeqxAdLk2TGTQkAAMg2IpuRrTXZjuzU2uDEHEaOIsdrchI5rbS/KVk8+w+Rx551N5Hb8tuZvMWz/x756FmnHsN4iexHDnrWqccwviMXkcuedeoxnKfIc1p9V3Yje8vrs8i8xuYm6DPylVbflbPI+fL6Ir9VdjdtV5Hr5W/fqHrymbA5+95F7pPzYQ35TNicfV8jb8n5sIbc07v6eU6+71tWVu7p6/p5s9+rxzD6+nm+rx7D6KpHu9/nXq+vl9VVj3a/z71eXy+rqx7N602+W2Wpx7h01aM9D+dZeJb8r1VSVz3a83CehX+S/7VKMu+Oi3qMi3qMi3qMi3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDf/QHD8yhT
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Tile Layer 2" width="100" height="100">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt0bEJgEAQRNHrx6tAq/BswP6rcCODC0Qw2BXeg58PTGsAAADwbERH9ghu/qjFH7X4AwAAgLfWaMseAQB8skQ9ewQAv7JPkeucAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAai5YqQYl
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup name="Object Layer 1" width="100" height="100" visible="0">
|
||||
<object type="SquadStart" gid="4" x="352" y="352"/>
|
||||
<object type="SquadStart" gid="4" x="416" y="352"/>
|
||||
<object type="SquadStart" gid="4" x="352" y="384"/>
|
||||
<object type="SquadStart" gid="4" x="384" y="384"/>
|
||||
<object type="SquadStart" gid="4" x="384" y="352"/>
|
||||
<object type="MonsterSpawn" gid="5" x="544" y="480"/>
|
||||
<object type="MonsterSpawn" gid="5" x="768" y="608"/>
|
||||
<object type="MonsterSpawn" gid="5" x="768" y="576"/>
|
||||
<object type="MonsterSpawn" gid="5" x="672" y="288"/>
|
||||
<object type="MonsterSpawn" gid="5" x="704" y="832"/>
|
||||
<object type="MonsterSpawn" gid="5" x="864" y="832"/>
|
||||
<object type="MonsterSpawn" gid="5" x="576" y="896"/>
|
||||
<object type="MonsterSpawn" gid="5" x="448" y="576"/>
|
||||
<object type="MonsterSpawn" gid="5" x="560" y="670"/>
|
||||
</objectgroup>
|
||||
<layer name="Collision" width="100" height="100">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt1rENAyEQAMF3X+6/LpdgeA5pgxnpUoJbCXgeAJj1/dwd9ujRokeLHi0ne9Rknh4tJ7vTY54eLe6rFj1advfpz3vX7R7s0aNlcpd6nLvdQ5M9E/fVv7NYp0eLHi0nPVbPZJ0eLXq06NFy+z1njx49erTo0aJHix49K+/6m+EdPVr06LFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoO4HZimKNQ==
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
@@ -1,224 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.0" orientation="orthogonal" width="100" height="100" tilewidth="32" tileheight="32">
|
||||
<tileset firstgid="1" name="tilese Depths Below" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/cave.png" trans="ff00ff" width="512" height="288"/>
|
||||
</tileset>
|
||||
<tileset firstgid="145" name="Collision" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/collision.png" width="32" height="32"/>
|
||||
</tileset>
|
||||
<layer name="Tile Layer 1" width="100" height="100">
|
||||
<data encoding="csv">
|
||||
81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,
|
||||
81,52,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,54,54,54,54,54,54,54,54,54,53,53,53,55,81,
|
||||
81,68,69,69,69,69,101,102,103,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,70,69,69,69,71,81,
|
||||
81,84,85,85,85,129,117,118,119,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,85,86,85,85,85,87,81,
|
||||
81,37,7,8,21,21,133,134,135,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,7,8,7,7,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,7,8,21,21,21,21,21,21,7,8,8,7,8,21,21,21,21,21,21,21,133,134,135,87,81,
|
||||
81,37,7,8,21,21,21,21,21,21,21,21,21,18,18,18,18,18,18,18,18,2,2,2,18,5,8,8,89,7,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,2,2,2,2,18,18,19,20,4,4,4,4,4,4,2,7,8,8,8,8,8,8,8,8,8,7,7,8,8,24,7,8,3,4,4,20,4,18,18,133,134,135,87,81,
|
||||
81,37,7,8,19,20,20,1,1,1,1,1,21,21,1,18,19,20,20,20,20,18,18,18,5,5,7,8,89,89,5,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,18,18,18,18,18,19,20,20,20,20,20,20,3,4,7,8,24,24,24,24,24,24,24,24,8,8,8,24,19,7,7,8,4,20,3,2,2,18,133,134,135,49,81,
|
||||
81,37,7,8,7,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,7,8,8,89,89,5,4,20,4,17,17,17,17,17,17,17,1,1,1,1,1,17,17,17,1,2,3,5,5,5,5,5,6,2,3,4,7,8,8,2,3,2,18,2,2,2,23,24,2,2,2,3,18,19,23,24,24,24,24,20,18,23,7,8,4,4,4,2,18,19,2,3,2,39,81,
|
||||
81,37,7,8,23,24,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,17,5,7,8,24,89,89,21,3,4,20,4,4,4,4,5,6,22,17,17,17,17,17,17,18,1,2,3,4,5,5,5,21,5,5,2,7,7,8,8,24,2,2,18,19,18,18,18,18,18,2,2,2,2,2,18,19,20,3,4,20,20,20,19,7,8,4,2,2,2,18,19,2,2,18,39,81,
|
||||
81,37,7,8,24,24,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,7,8,8,89,89,89,7,7,7,7,7,7,7,7,7,6,6,6,1,2,3,4,5,6,5,7,7,7,21,21,5,7,7,7,7,7,8,7,7,7,7,8,5,20,2,3,4,2,2,18,18,18,18,2,18,19,20,3,4,20,20,18,19,7,7,8,18,18,18,18,19,2,18,19,39,81,
|
||||
81,37,23,24,23,24,1,1,1,7,7,7,7,7,7,8,7,7,7,8,1,1,1,5,7,8,24,89,89,89,23,7,23,23,23,23,23,23,7,4,22,22,4,5,6,6,6,6,6,23,23,23,24,8,21,23,23,23,7,7,7,23,23,23,23,7,7,8,4,2,2,2,18,19,20,20,20,18,19,20,3,4,20,20,4,2,19,23,7,8,2,3,4,4,2,2,18,19,39,81,
|
||||
81,37,7,7,7,7,7,7,7,23,23,7,7,7,7,7,23,23,7,8,1,1,1,21,7,8,8,89,89,89,89,7,7,7,7,7,7,7,7,20,4,22,6,6,6,22,22,22,22,23,23,23,7,24,24,24,24,24,23,23,23,23,23,23,24,23,7,7,8,4,18,18,19,20,4,20,3,2,3,4,4,20,4,20,2,2,3,19,7,8,2,3,4,4,2,18,19,2,39,81,
|
||||
81,37,23,23,23,23,23,23,23,23,24,23,23,23,23,23,23,7,7,8,1,1,1,21,7,7,8,8,89,89,89,23,7,23,23,23,23,23,23,4,20,4,22,22,22,18,19,20,21,23,7,7,23,23,7,7,8,8,8,8,8,8,8,8,8,8,23,23,7,8,20,20,3,4,20,2,2,18,19,20,20,19,20,4,2,18,19,19,7,7,8,4,20,20,2,3,3,4,39,81,
|
||||
81,37,8,8,3,1,1,1,1,1,1,1,1,1,1,1,1,23,23,24,1,1,1,19,7,8,8,24,89,89,89,23,23,23,23,23,23,23,23,20,4,20,4,6,18,19,5,5,5,23,23,7,6,22,23,23,24,24,8,24,24,24,24,24,24,8,8,8,23,24,8,8,8,9,2,18,18,19,20,4,19,20,4,4,2,3,4,19,23,7,7,8,20,2,3,3,3,4,39,81,
|
||||
81,37,24,8,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,19,7,8,8,24,89,7,89,89,89,19,3,3,3,23,7,7,20,4,20,4,4,6,5,5,5,7,7,23,22,2,3,17,18,19,8,8,22,6,22,2,2,24,24,24,24,24,24,24,24,7,8,19,18,19,20,20,19,20,4,2,2,3,4,19,20,23,7,8,20,3,3,4,4,20,39,81,
|
||||
81,37,8,8,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,7,7,8,89,89,89,7,19,19,19,19,19,19,19,7,7,7,7,7,7,20,4,4,5,22,23,23,23,2,1,1,17,18,19,8,8,22,22,2,3,2,2,18,18,19,20,19,20,20,7,8,8,8,2,3,18,19,20,4,2,3,4,20,19,20,3,7,8,3,19,3,4,20,20,39,81,
|
||||
81,37,8,8,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,7,8,8,89,7,23,3,3,19,20,20,19,19,23,23,23,23,23,7,19,20,20,5,6,7,89,89,133,134,135,18,19,20,8,24,22,22,2,2,18,18,19,20,18,19,20,20,2,23,24,24,24,8,8,3,4,20,2,18,19,20,3,19,20,19,7,7,8,3,4,20,18,19,39,81,
|
||||
81,37,8,8,3,1,1,1,7,8,8,8,8,8,1,1,1,1,1,1,1,1,1,4,23,7,7,8,89,23,23,19,19,19,19,20,20,2,3,4,5,6,7,7,19,5,5,5,5,23,89,89,133,134,135,19,20,21,8,24,6,20,2,2,2,18,19,20,19,20,20,2,18,2,3,23,24,24,24,3,4,2,18,19,20,3,4,19,20,4,23,7,8,4,20,3,4,2,39,81,
|
||||
81,37,8,8,3,1,1,1,7,8,24,24,24,24,8,1,1,1,1,1,1,1,1,4,20,23,7,8,89,23,18,19,20,20,2,2,2,3,4,3,4,4,7,7,17,5,5,5,21,89,89,89,133,134,135,2,3,4,8,24,2,3,4,18,18,19,20,3,4,20,2,2,2,3,4,20,2,3,2,3,4,2,3,4,2,3,3,19,20,4,20,23,24,20,2,3,4,2,39,81,
|
||||
81,37,24,8,3,1,4,4,5,7,7,8,8,24,24,8,20,20,19,20,4,3,19,20,2,23,7,7,8,23,18,18,19,20,4,18,18,19,20,19,20,20,7,7,4,4,5,5,2,89,89,89,6,6,5,2,3,4,24,24,2,3,2,18,8,8,8,3,4,18,2,3,18,19,20,20,3,2,3,4,2,3,4,3,3,19,19,19,20,4,20,3,4,2,3,4,20,2,39,81,
|
||||
81,37,21,22,3,19,20,4,4,5,7,8,24,8,24,24,8,20,19,3,4,4,19,20,4,19,23,7,8,23,20,18,19,20,20,4,2,2,2,2,2,2,7,7,4,20,5,5,18,89,89,89,22,6,2,3,4,20,6,2,2,2,18,19,24,24,8,19,20,3,18,19,18,19,20,18,19,2,3,4,2,3,3,19,19,20,4,3,4,20,20,4,20,2,3,4,2,2,39,81,
|
||||
81,37,21,22,19,4,4,5,4,4,5,8,24,24,8,24,24,8,20,19,20,20,4,19,20,7,8,8,8,23,20,4,18,19,20,7,7,18,18,18,2,3,7,23,20,18,19,20,17,89,89,89,7,5,2,3,4,20,6,2,18,18,19,8,8,8,24,20,4,2,3,2,2,3,4,18,2,3,4,2,3,3,19,19,20,4,20,19,20,20,4,20,19,2,3,22,2,2,39,81,
|
||||
81,37,2,3,2,20,20,21,20,4,4,4,5,24,24,8,8,24,8,19,19,3,4,19,20,7,8,24,24,23,4,20,4,18,18,23,7,18,18,18,2,3,7,23,5,6,18,19,17,89,89,7,7,7,7,7,20,20,2,18,18,19,8,24,24,24,24,7,7,7,19,2,3,4,20,2,3,4,20,3,19,19,20,3,4,4,3,19,20,20,4,20,3,2,3,7,7,7,39,81,
|
||||
81,37,2,3,18,20,21,21,5,5,5,5,5,7,8,24,24,8,24,8,8,19,20,4,7,8,8,89,89,23,20,4,20,4,18,7,7,7,20,2,3,4,23,23,21,22,6,18,19,89,89,23,23,23,23,7,7,7,7,7,7,7,24,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,53,54,53,53,54,54,54,54,7,7,7,7,23,7,7,39,81,
|
||||
81,37,2,3,18,19,20,21,21,21,21,21,21,23,24,23,24,24,8,24,24,8,8,8,8,8,24,89,89,23,20,20,4,4,20,23,7,7,7,4,4,20,4,5,6,4,1,1,1,89,89,1,17,2,3,23,23,7,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,53,53,53,53,53,53,53,54,23,7,7,7,7,7,7,39,81,
|
||||
81,37,2,2,3,20,89,7,7,7,7,89,89,89,89,89,23,24,24,23,24,24,24,24,24,24,89,89,89,23,18,19,20,20,4,19,23,7,7,20,4,4,1,1,1,1,17,17,17,89,89,17,2,3,4,20,20,23,23,23,23,20,6,2,3,2,18,19,20,2,18,19,20,18,2,3,2,2,3,4,7,7,20,20,4,20,19,20,20,3,4,7,8,23,23,23,23,23,39,81,
|
||||
81,37,2,3,3,2,89,7,23,23,7,7,7,7,7,7,89,7,89,89,89,89,89,89,89,89,89,89,7,23,4,4,4,4,20,4,4,7,23,20,20,20,4,4,17,17,18,2,3,89,89,2,3,4,4,19,20,2,18,19,20,21,2,3,4,18,19,20,6,18,19,20,20,2,3,4,2,18,19,20,7,8,3,4,4,4,19,20,3,4,20,7,8,4,3,2,2,3,39,81,
|
||||
81,37,2,3,3,3,89,7,21,21,5,5,5,5,2,2,2,5,4,3,4,4,89,89,89,7,7,7,7,23,20,20,20,20,4,20,4,23,23,18,19,20,20,20,4,2,3,4,4,89,89,2,3,4,20,5,6,2,18,19,20,6,2,3,2,3,4,20,2,18,19,20,2,3,4,2,18,19,20,20,7,7,8,20,4,4,19,20,3,4,3,23,24,4,4,2,2,3,39,81,
|
||||
81,37,2,3,3,4,89,7,2,21,21,21,21,21,18,18,18,5,3,3,3,3,4,7,7,23,23,7,7,23,4,19,19,20,20,20,20,20,23,7,7,18,19,20,20,4,4,20,2,89,89,2,3,4,4,5,2,2,3,4,20,2,3,2,18,19,20,6,18,19,20,2,2,3,2,2,3,4,20,4,23,7,7,8,2,3,4,18,19,20,3,2,3,4,4,2,3,4,39,81,
|
||||
81,37,2,3,19,4,89,7,2,3,4,5,6,6,17,3,3,5,3,19,19,3,3,7,7,7,7,7,7,23,20,4,20,4,4,18,19,20,2,23,7,7,7,19,20,4,2,3,2,89,89,4,4,20,5,6,2,2,3,4,21,2,7,8,8,20,5,2,2,3,4,2,3,2,2,3,4,20,3,4,7,23,7,8,3,4,20,2,3,4,2,3,4,20,4,2,3,4,39,81,
|
||||
81,37,2,3,3,4,7,7,2,3,4,7,7,7,2,19,19,5,19,19,19,19,19,23,23,23,23,23,7,23,20,20,4,20,20,4,19,20,2,2,7,7,23,19,20,3,4,3,2,89,89,20,4,6,21,2,18,18,7,8,8,8,8,8,24,8,8,2,3,4,20,2,3,2,18,19,20,20,4,20,7,7,7,8,3,4,20,3,4,20,2,3,4,19,2,2,3,4,39,81,
|
||||
81,37,2,2,3,4,7,7,3,4,5,23,23,7,2,2,3,21,3,4,3,3,3,3,4,3,19,19,7,23,19,20,20,19,20,20,3,3,4,18,21,7,7,19,20,4,4,2,3,89,89,20,4,22,2,2,7,8,8,8,7,8,8,8,24,24,24,8,3,4,2,3,2,18,19,20,4,19,20,20,23,7,7,7,8,4,2,3,4,3,2,3,4,4,2,2,3,4,39,81,
|
||||
81,37,18,2,3,5,21,2,3,4,5,23,23,23,2,2,3,7,7,20,19,19,19,19,3,3,3,3,23,23,19,19,20,19,19,7,7,19,3,4,4,7,7,4,4,4,3,4,4,89,89,4,4,4,4,2,7,8,24,7,8,8,24,24,2,23,24,24,8,3,4,19,2,3,4,20,20,20,20,4,20,23,23,7,8,4,2,3,4,3,2,3,4,4,18,2,3,4,39,81,
|
||||
81,37,2,2,3,5,1,2,3,2,2,2,18,18,2,18,19,7,7,18,19,20,19,20,19,19,19,19,19,19,3,19,20,19,19,23,7,4,4,20,20,7,7,7,20,20,19,20,20,7,89,20,20,20,20,18,23,24,7,8,8,24,2,18,18,2,23,24,24,8,8,8,2,3,4,20,20,20,19,20,4,2,2,7,7,8,2,3,4,3,2,3,4,20,18,2,3,4,39,81,
|
||||
81,37,2,2,3,5,1,2,2,18,18,18,19,2,3,4,20,7,7,19,20,18,2,3,2,19,20,20,19,20,19,19,19,19,19,23,7,20,20,4,4,23,23,7,7,20,20,20,20,89,89,4,1,2,2,2,2,2,7,8,24,18,18,19,20,18,2,23,24,24,24,24,8,19,20,20,20,19,20,19,20,2,2,23,7,7,8,3,4,3,2,3,4,4,18,2,3,4,39,81,
|
||||
81,37,1,2,3,4,2,2,18,19,20,2,3,4,19,20,19,7,7,2,3,4,18,2,3,19,3,3,3,19,20,20,20,20,20,7,7,19,20,20,4,7,7,7,7,7,4,20,20,89,89,4,17,2,3,2,2,18,7,8,20,3,4,22,1,2,3,4,20,2,23,24,24,20,18,19,20,20,18,19,20,2,2,3,23,7,7,7,8,2,3,4,20,20,2,3,4,4,39,81,
|
||||
81,37,7,7,7,89,89,7,7,7,7,7,7,7,7,7,7,7,7,2,3,2,2,3,19,20,19,19,19,19,3,3,3,3,3,23,23,20,20,20,20,23,23,23,23,7,7,7,7,89,89,2,2,2,2,18,18,19,7,8,3,4,20,22,2,3,4,4,2,18,18,23,24,8,19,20,20,2,3,4,20,2,3,4,20,23,23,7,7,8,3,4,4,2,2,3,4,20,39,81,
|
||||
81,37,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,89,89,89,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,23,23,23,23,89,89,5,5,5,5,5,20,22,7,8,3,4,22,22,2,3,4,20,18,18,19,23,24,24,8,20,20,2,3,4,4,4,2,3,4,2,3,23,7,7,8,4,20,2,2,3,4,4,39,81,
|
||||
81,37,23,23,23,23,23,104,105,106,23,23,23,23,23,23,23,23,23,23,7,7,7,7,89,89,89,89,89,89,89,89,89,89,89,89,89,89,7,8,89,89,89,89,89,89,89,89,7,8,89,21,21,21,21,21,21,22,23,24,19,20,2,2,2,3,4,2,18,19,20,18,23,24,24,8,2,3,4,20,20,20,18,19,20,4,3,4,23,7,7,7,8,2,4,5,4,20,39,81,
|
||||
81,37,7,8,3,3,4,120,121,122,2,2,2,2,2,2,18,3,4,4,4,20,19,20,18,18,19,3,19,19,19,20,19,7,7,7,7,7,7,7,7,8,7,8,7,7,8,7,7,7,8,17,18,19,20,20,21,22,2,3,2,3,4,2,2,3,4,2,3,4,20,19,20,23,24,24,8,8,20,2,2,3,4,18,2,3,4,20,2,23,23,7,7,8,4,5,4,20,39,81,
|
||||
81,37,7,8,5,6,6,6,6,18,18,18,18,18,18,18,19,3,3,4,20,4,19,20,2,18,18,19,19,20,4,2,3,23,107,107,108,7,23,23,7,8,8,7,8,23,24,8,23,23,24,18,19,20,21,22,20,21,18,2,18,19,2,18,2,2,2,18,19,20,19,20,2,3,23,24,24,24,8,3,2,3,4,3,18,19,20,4,4,2,3,23,7,7,20,21,4,20,39,81,
|
||||
81,37,8,8,23,24,7,22,2,2,2,3,4,17,17,2,2,19,3,3,4,20,19,20,4,4,19,20,18,2,3,2,3,4,123,107,108,23,23,23,23,24,24,8,7,8,24,24,8,7,8,22,17,18,19,20,21,22,2,18,19,2,3,4,23,7,7,7,22,22,20,2,3,4,2,18,23,24,24,8,2,3,4,3,4,18,19,20,2,3,4,20,23,7,20,21,4,20,39,81,
|
||||
81,37,8,8,6,22,7,3,4,18,18,2,2,2,2,18,18,19,19,3,4,3,19,20,4,3,4,18,19,18,2,3,4,2,3,107,108,3,4,2,3,23,24,24,8,7,8,24,24,8,7,8,19,20,21,22,22,2,3,4,20,2,3,4,23,23,23,23,22,22,20,2,3,4,2,3,4,23,24,24,8,8,4,19,20,18,19,20,2,3,4,4,20,23,20,21,4,20,39,81,
|
||||
81,38,8,8,22,17,7,2,2,2,2,18,18,18,18,19,20,4,2,19,3,3,4,19,20,19,20,4,4,20,2,2,3,4,19,107,108,2,2,18,19,20,23,24,24,8,7,8,24,24,7,8,19,20,21,22,2,18,19,20,18,2,3,4,23,23,24,23,22,22,20,2,3,2,3,4,20,3,23,24,24,24,8,8,20,18,19,20,3,4,20,4,2,3,20,21,3,4,39,81,
|
||||
81,38,8,8,23,24,7,18,7,8,8,8,19,20,17,7,8,8,3,8,8,8,3,19,20,21,19,20,20,4,4,3,4,20,20,107,108,2,18,19,20,2,3,23,24,24,8,7,8,24,8,7,8,21,2,2,18,19,20,4,2,3,4,2,23,23,23,23,22,22,2,3,4,2,3,4,2,2,2,2,23,24,24,24,8,18,19,20,3,4,4,20,3,4,20,21,3,4,39,81,
|
||||
81,38,8,8,4,1,7,17,23,2,2,23,4,6,2,23,1,2,3,23,5,5,3,19,20,5,1,1,19,20,20,4,4,19,20,107,108,18,19,20,20,2,3,4,7,8,24,8,7,8,24,8,8,8,3,4,19,20,3,4,2,3,4,18,23,23,23,23,22,22,2,3,2,3,4,20,18,7,8,8,8,20,23,24,24,8,8,8,8,8,20,2,3,4,20,21,4,4,39,81,
|
||||
81,38,8,8,4,1,7,1,7,1,2,7,4,4,5,8,8,7,3,8,8,7,19,19,20,1,17,17,18,2,19,20,20,19,20,107,108,19,20,4,2,3,4,20,7,7,8,24,8,8,24,24,24,8,8,7,8,3,4,2,3,4,20,23,23,23,23,24,6,22,2,2,18,19,20,7,8,8,8,24,24,2,3,23,24,24,24,24,24,24,8,2,3,4,2,2,3,4,39,81,
|
||||
81,38,8,7,89,89,23,1,23,8,8,8,20,1,2,3,4,23,3,4,2,23,4,20,17,17,18,19,2,3,4,19,20,4,2,107,108,20,4,20,2,3,4,3,8,7,8,23,24,24,8,24,8,24,7,7,8,8,4,2,3,4,23,23,23,23,23,24,22,2,3,18,19,20,7,8,8,24,24,4,4,3,4,2,3,4,2,3,23,24,24,8,4,20,2,2,3,4,39,81,
|
||||
81,38,8,7,89,89,17,1,2,2,3,4,20,17,1,8,8,8,3,8,8,8,4,20,2,3,4,21,2,3,4,2,19,20,4,107,108,3,4,2,3,4,20,19,20,7,8,4,23,24,24,24,8,24,8,7,8,7,8,2,3,4,23,23,23,23,23,24,4,4,4,3,4,20,7,8,24,4,4,20,4,3,2,3,4,20,2,3,4,23,24,24,8,3,18,18,19,20,39,81,
|
||||
81,38,8,7,89,89,2,3,4,2,3,4,4,1,17,17,17,2,3,4,2,3,4,20,2,3,4,2,3,4,20,2,3,19,20,107,108,2,2,18,19,20,2,2,18,19,20,20,4,2,3,23,24,8,24,7,7,8,7,8,3,23,23,23,23,23,23,24,20,20,20,4,4,7,8,8,4,4,20,20,4,2,18,19,20,2,2,3,4,20,23,24,24,8,8,8,20,4,39,81,
|
||||
81,38,8,7,89,89,2,3,4,2,3,4,20,17,18,19,2,3,4,2,3,4,20,2,2,3,2,3,4,20,4,3,19,19,20,107,108,4,18,19,19,20,2,2,18,19,20,20,4,2,3,23,24,8,24,23,7,7,7,8,23,23,23,23,23,23,23,24,2,19,20,20,20,7,8,24,4,20,19,20,20,18,19,20,4,2,2,3,4,20,2,23,24,24,24,24,8,8,39,81,
|
||||
81,38,8,7,89,89,2,3,4,2,3,4,3,4,1,17,2,3,4,2,3,4,20,2,3,2,2,3,4,2,3,19,19,20,107,108,108,4,20,3,19,19,20,2,2,18,19,20,2,3,4,23,24,24,8,8,23,23,7,7,8,7,7,7,7,23,24,18,2,3,4,20,19,7,7,8,4,2,2,3,4,19,20,4,20,2,3,4,20,2,3,4,20,3,23,24,24,24,39,81,
|
||||
81,38,8,7,89,89,2,3,4,2,3,4,3,4,17,2,3,4,20,2,3,4,2,2,3,2,3,4,20,3,19,19,20,2,107,108,124,20,3,4,3,19,20,2,2,18,19,20,18,19,20,19,23,24,24,24,8,8,8,7,7,8,23,23,23,23,24,2,3,3,3,4,20,23,7,8,4,2,18,19,20,4,3,4,4,2,3,4,20,2,3,4,2,3,4,18,19,20,39,81,
|
||||
81,38,8,7,89,89,3,4,20,2,3,4,4,20,20,2,3,4,20,2,3,4,2,2,3,2,3,3,3,19,20,19,2,3,107,108,20,2,3,4,3,19,20,2,2,18,19,20,19,20,1,2,1,23,24,24,24,24,24,8,8,7,8,7,8,4,18,2,3,19,3,4,20,3,7,7,8,4,19,20,19,20,3,2,2,3,4,4,4,2,3,4,2,3,4,18,19,20,39,81,
|
||||
81,38,8,7,89,89,3,4,3,3,4,20,4,20,6,2,3,4,2,2,3,2,3,2,3,3,19,19,19,20,3,2,3,4,107,108,4,3,4,2,19,19,20,2,2,18,19,20,20,1,1,1,17,2,3,23,24,23,24,24,24,8,8,8,24,4,2,3,4,20,19,3,4,3,23,7,8,20,4,3,3,4,3,2,3,4,20,4,4,2,3,4,2,3,4,2,2,3,39,81,
|
||||
81,38,8,7,89,4,3,2,19,19,3,3,3,3,3,3,3,3,3,3,3,3,3,3,19,19,20,4,2,3,4,4,19,107,108,108,20,19,20,18,19,19,20,2,2,18,19,20,4,4,4,4,18,2,3,4,23,24,24,23,24,24,24,24,24,3,4,4,20,2,3,19,3,3,4,7,7,8,20,4,19,20,4,2,3,4,4,20,2,3,4,20,2,3,4,3,2,3,39,81,
|
||||
81,38,8,7,89,3,4,2,19,20,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,3,2,3,4,4,20,20,107,108,124,3,4,20,2,2,19,20,2,2,18,19,20,4,4,4,20,17,18,19,20,18,19,23,24,24,24,24,23,24,8,3,4,2,2,3,4,19,3,4,23,7,7,8,4,4,19,20,3,4,20,4,7,8,3,4,4,2,3,4,3,18,2,39,81,
|
||||
81,38,8,7,89,19,3,3,4,19,20,4,3,4,2,3,4,2,2,3,4,2,2,3,4,2,2,3,4,20,20,20,107,108,108,2,3,4,2,3,4,19,20,2,2,18,19,20,20,20,3,4,6,2,3,4,6,5,6,2,2,3,7,23,24,24,8,4,18,18,3,4,19,3,4,19,23,7,7,8,4,19,20,3,4,4,4,7,8,8,4,4,2,3,4,3,2,2,39,81,
|
||||
81,38,8,7,89,2,19,3,3,19,20,20,19,20,2,3,4,2,2,3,2,2,3,4,20,2,3,4,4,3,4,20,107,108,124,3,4,2,2,3,4,19,20,2,2,18,19,20,4,18,19,20,4,4,4,20,22,2,3,4,2,2,23,7,23,24,24,3,4,4,3,4,19,3,3,3,4,23,23,24,4,19,20,3,4,4,20,23,24,24,20,4,2,3,4,3,2,2,39,81,
|
||||
81,38,8,7,89,3,19,19,19,3,19,20,4,2,3,4,20,18,2,3,2,2,3,4,2,2,3,4,20,4,20,4,107,108,2,3,4,18,2,3,4,19,20,2,8,8,19,20,4,18,18,19,20,20,4,2,2,3,4,20,18,18,19,23,7,23,24,8,3,4,3,4,3,19,3,3,4,20,20,19,20,19,3,4,4,20,4,7,23,24,4,20,2,3,4,2,3,4,39,81,
|
||||
81,38,8,7,89,3,3,4,19,3,3,19,20,4,3,4,4,18,2,2,3,4,2,2,2,3,4,4,4,20,2,107,108,108,3,2,3,4,2,3,4,3,19,20,8,8,18,19,20,3,4,3,18,19,20,4,18,19,20,2,18,19,20,2,23,23,24,24,8,3,4,4,19,20,3,4,20,3,3,19,20,20,19,20,4,20,4,7,23,24,4,4,2,3,4,2,3,4,39,81,
|
||||
81,38,8,7,89,3,19,3,4,19,3,19,20,20,3,4,20,2,2,2,3,4,2,18,2,2,2,3,4,20,2,107,108,124,4,4,4,4,2,3,4,3,19,8,23,8,8,8,20,19,20,19,20,18,19,20,4,2,2,18,19,20,2,2,18,23,23,24,24,8,3,4,5,5,3,4,19,19,3,3,19,20,3,4,4,20,2,7,23,24,4,4,2,3,4,2,3,4,39,81,
|
||||
81,38,8,7,89,3,2,3,3,4,19,3,19,20,4,4,2,3,2,2,3,4,18,18,18,18,2,3,4,4,18,107,108,2,2,2,2,3,4,4,4,19,19,23,23,7,8,8,8,8,8,2,3,18,19,20,20,18,18,19,20,2,18,18,19,20,23,23,24,24,8,3,21,5,4,20,4,20,19,19,19,20,19,20,20,3,2,23,23,24,4,4,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,4,2,19,3,4,3,19,19,20,20,4,2,3,2,3,4,2,18,19,20,20,18,19,20,20,107,108,108,18,18,18,18,2,2,2,3,4,19,23,7,7,7,7,8,8,8,8,2,18,8,8,20,19,20,2,18,18,19,20,2,2,18,23,23,24,24,8,8,21,4,4,20,4,18,19,20,20,19,20,20,3,3,23,24,7,20,20,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,2,3,4,19,3,3,4,19,20,4,4,4,4,2,3,2,18,2,18,18,2,2,18,19,107,108,108,124,3,4,20,4,18,18,18,2,19,20,23,7,18,7,7,7,8,8,8,8,18,8,8,8,8,8,18,19,20,2,18,18,18,19,20,23,23,24,24,24,24,8,3,3,3,4,3,3,3,3,3,3,3,7,23,24,7,20,4,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,2,3,4,3,19,3,4,20,19,20,20,4,20,4,2,18,19,2,3,2,18,18,18,107,108,108,124,18,19,20,3,4,4,3,4,19,20,2,23,7,19,20,7,7,7,7,8,8,8,7,7,7,7,7,8,8,18,18,19,20,3,4,4,20,2,23,7,23,24,24,8,8,3,3,19,19,19,19,3,4,7,23,23,24,4,3,4,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,2,3,3,4,20,19,3,4,19,20,19,20,4,20,4,19,2,3,4,2,3,4,107,108,108,124,3,4,3,3,3,4,20,19,19,20,2,2,23,7,20,20,3,8,7,7,7,7,7,8,8,8,7,7,7,7,3,3,3,3,3,3,3,3,3,3,23,7,8,7,7,7,7,8,4,3,4,4,19,7,23,23,24,19,20,3,4,2,3,2,3,4,4,39,81,
|
||||
81,38,8,8,89,8,3,3,4,19,3,19,3,4,19,20,19,20,4,20,4,3,3,3,3,107,108,108,108,124,2,3,3,3,4,4,3,4,19,20,2,2,18,23,7,20,3,19,7,8,7,7,7,7,7,7,8,8,8,7,7,19,19,3,3,3,3,3,3,3,19,19,7,8,23,23,23,7,7,7,7,7,7,7,23,23,24,20,3,4,3,4,2,3,2,2,3,4,39,81,
|
||||
81,38,8,8,89,8,19,3,3,4,19,3,3,3,4,19,20,19,20,4,20,4,107,108,108,108,108,124,124,20,4,4,5,5,5,5,5,5,19,20,2,2,8,23,7,3,19,3,7,7,8,7,7,7,8,8,7,8,8,7,7,8,5,3,4,3,4,19,19,19,20,4,8,8,8,20,20,23,23,23,23,23,23,23,23,24,4,18,19,20,19,20,2,3,2,2,3,4,39,81,
|
||||
81,38,8,8,89,89,19,19,19,3,3,19,19,19,3,4,20,5,5,5,5,5,107,108,124,124,124,5,5,5,5,5,5,5,5,5,5,5,3,3,3,8,23,23,7,19,3,5,7,7,7,7,7,7,8,7,8,8,8,7,7,7,19,19,20,19,3,3,4,3,4,4,7,7,8,20,3,4,4,2,18,19,20,4,2,3,4,3,4,20,2,3,2,3,18,2,3,4,39,81,
|
||||
81,38,8,8,89,89,3,4,19,19,19,19,19,3,19,3,3,3,19,20,20,19,123,124,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,8,8,23,23,7,19,3,5,5,7,7,7,7,7,7,7,7,8,7,8,8,7,7,8,3,19,19,19,19,20,19,20,20,23,7,8,4,4,4,2,2,18,19,20,20,3,4,20,3,4,2,18,19,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,89,3,4,19,3,3,3,19,19,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,19,23,23,23,7,4,3,19,20,19,20,20,7,8,8,7,7,7,7,8,8,8,7,7,7,19,20,20,19,19,19,19,19,19,23,7,8,20,20,20,2,3,18,19,20,4,3,4,3,4,20,2,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,89,89,3,4,3,19,19,19,19,19,19,19,19,20,19,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7,8,8,8,4,4,4,4,4,3,4,2,2,7,8,7,7,8,7,8,7,8,8,7,7,20,20,4,20,20,3,4,20,2,23,7,8,3,4,2,2,3,2,3,4,20,4,20,3,4,4,2,2,3,2,3,4,2,7,8,39,81,
|
||||
81,38,8,8,89,89,3,4,3,4,5,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,20,5,5,5,7,8,8,8,20,20,20,20,20,20,4,4,4,18,19,7,7,7,7,8,7,8,8,7,7,7,19,20,20,2,2,3,4,18,18,23,7,8,3,4,2,3,4,18,19,20,3,4,18,19,20,4,2,18,19,2,3,4,7,7,8,39,81,
|
||||
81,38,8,8,7,89,3,4,3,4,5,2,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7,8,8,8,8,20,20,3,4,18,19,20,20,20,20,4,18,18,18,7,7,7,7,7,7,7,7,19,20,19,20,4,3,4,20,19,20,4,7,7,8,4,2,3,2,3,4,20,3,4,2,3,4,4,2,2,3,7,8,8,23,23,24,39,81,
|
||||
81,38,8,8,7,89,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,23,23,23,7,8,8,8,8,5,5,18,19,20,20,20,18,20,19,20,20,19,20,20,20,7,7,2,18,18,18,19,20,2,18,19,20,4,20,4,4,2,2,23,7,8,4,4,3,18,19,20,7,7,8,8,8,8,8,8,8,8,8,24,24,24,24,4,39,81,
|
||||
81,38,8,8,8,89,5,5,5,5,5,5,5,5,5,5,2,2,2,2,3,2,5,5,5,5,5,23,23,23,23,8,8,8,23,8,8,19,20,20,20,20,20,20,19,20,20,19,20,20,3,4,4,2,2,18,18,18,19,20,18,18,18,18,19,19,20,20,4,20,20,3,4,23,7,8,20,20,4,3,4,4,23,23,24,24,24,24,24,24,24,24,24,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,5,5,5,5,2,2,5,5,19,20,2,18,18,2,3,2,3,4,2,23,7,8,8,8,8,8,23,7,8,8,19,20,20,20,20,20,20,20,20,20,19,20,20,3,2,2,2,18,18,19,20,18,18,19,20,3,4,20,19,20,19,20,20,19,20,19,20,23,7,7,8,19,20,19,20,20,20,4,2,3,4,20,4,18,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,5,5,3,4,2,3,4,2,3,4,2,18,19,2,3,2,3,4,23,23,7,8,23,19,19,20,2,18,18,19,20,2,20,20,20,19,20,20,20,19,20,20,3,19,18,18,18,19,20,19,20,2,2,2,3,4,4,20,20,20,20,4,3,2,3,4,19,23,23,7,8,2,18,18,19,20,20,4,2,3,4,3,4,3,18,19,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,3,4,19,20,2,3,2,3,4,20,2,2,3,2,3,2,3,23,8,8,23,18,18,18,18,18,18,19,20,2,20,20,19,20,20,20,20,19,20,19,20,8,8,8,8,20,18,19,20,18,18,18,2,3,4,20,20,2,2,2,2,2,2,2,2,2,2,18,23,7,7,8,19,20,4,4,3,4,18,19,20,3,4,3,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,89,4,19,20,2,3,2,3,4,18,2,18,2,3,4,8,7,89,8,23,2,3,2,19,19,20,20,19,20,20,19,20,20,20,20,20,19,20,20,19,8,8,8,8,8,8,8,8,8,8,8,8,8,4,20,18,2,2,2,2,2,2,18,18,18,18,8,8,23,23,7,8,2,2,2,2,3,4,2,3,4,3,4,3,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,89,4,19,20,2,3,2,3,4,2,2,18,2,3,8,7,89,89,23,4,2,2,18,4,4,20,20,20,19,20,20,20,20,20,20,19,20,20,20,2,8,8,8,8,8,7,7,7,7,7,7,7,7,8,8,8,8,18,18,18,18,18,19,8,8,8,8,7,23,24,7,7,8,18,2,3,4,4,2,3,4,2,3,4,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,89,89,3,4,20,2,3,18,19,20,2,18,18,8,7,89,89,89,89,23,20,2,18,19,20,20,20,19,20,20,20,20,20,20,18,20,20,20,8,8,8,8,8,7,7,7,3,4,18,19,20,20,23,7,7,7,7,7,8,8,8,8,8,8,8,7,7,7,2,3,23,23,7,8,4,4,4,4,20,2,3,4,2,3,4,2,3,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,8,89,89,4,2,2,2,3,4,20,2,3,8,7,89,89,89,89,89,23,2,18,19,20,20,20,19,20,20,3,20,20,18,18,20,8,8,8,7,8,7,7,7,3,4,3,4,20,20,18,18,18,19,20,3,4,23,7,7,7,7,7,7,7,7,4,4,4,4,19,23,24,7,7,8,20,20,20,4,2,3,4,2,3,4,18,19,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,8,89,89,4,2,2,2,3,4,8,7,89,89,89,89,89,89,89,23,4,2,2,3,2,20,19,20,20,20,20,20,18,18,8,8,7,7,7,7,7,7,7,20,19,20,19,20,19,20,20,18,19,20,18,19,20,20,18,19,20,2,3,4,4,19,20,20,20,20,2,2,23,23,7,8,20,4,4,4,2,3,4,2,3,4,18,19,2,3,4,2,3,4,39,81,
|
||||
81,38,8,8,8,8,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,2,3,4,20,2,3,4,4,20,2,20,20,20,8,8,8,7,7,7,7,7,8,8,20,20,18,18,19,20,20,19,20,18,18,18,18,18,18,18,18,18,18,18,18,2,3,4,4,18,18,18,19,20,18,2,3,4,7,7,7,7,8,7,7,7,7,7,7,7,7,7,8,3,2,2,3,4,39,81,
|
||||
81,38,8,8,89,8,8,89,89,89,89,89,89,89,89,89,89,89,89,89,2,2,3,4,20,2,3,4,4,20,2,8,8,8,8,8,7,7,7,7,8,8,7,7,18,18,19,20,2,18,18,18,18,19,20,20,19,20,19,20,18,19,20,20,18,2,3,4,19,20,3,4,2,2,18,18,19,20,23,23,23,7,8,23,23,7,23,23,23,23,23,7,8,3,18,2,3,4,39,81,
|
||||
81,38,8,8,89,8,8,89,89,89,89,89,89,89,89,89,89,2,3,2,3,2,3,4,4,2,3,4,4,20,2,7,7,7,8,8,7,8,7,7,7,7,7,2,2,2,2,2,2,18,18,18,2,3,4,20,18,19,20,19,20,2,2,2,2,2,3,4,18,2,3,4,2,3,18,18,19,20,3,4,7,8,8,23,24,23,23,24,7,7,8,23,24,3,2,2,3,4,39,81,
|
||||
81,38,8,8,8,89,8,2,2,2,2,18,19,20,2,18,19,2,3,2,3,2,3,4,20,2,3,4,4,20,2,7,7,7,8,8,7,7,4,4,20,2,2,2,2,2,18,18,18,2,3,4,4,19,20,2,2,2,2,2,2,2,2,2,2,3,4,4,2,2,3,4,18,19,2,18,19,20,19,7,8,8,24,2,3,4,19,2,8,8,8,20,2,3,2,2,3,4,39,81,
|
||||
81,38,8,8,8,89,8,2,2,2,2,3,4,20,18,19,20,2,3,18,19,2,3,4,4,18,19,4,4,20,2,2,2,2,7,7,7,4,4,4,4,18,2,2,18,18,19,2,2,18,19,20,20,20,4,2,2,2,8,8,2,2,2,2,2,2,3,4,3,2,3,4,18,2,3,4,20,2,3,7,8,24,3,2,3,4,3,18,18,18,19,20,2,2,18,2,3,4,39,81,
|
||||
81,38,8,8,8,89,8,2,2,2,18,19,20,20,18,19,20,2,2,18,19,2,3,4,2,2,3,18,4,4,18,18,18,18,2,2,2,2,4,4,18,18,18,18,19,2,2,18,18,19,20,2,3,4,20,18,18,18,8,8,8,18,18,18,2,3,4,4,2,3,4,20,19,2,3,4,18,2,7,8,24,2,2,18,19,20,3,4,4,3,2,3,2,18,19,2,3,4,39,81,
|
||||
81,38,8,8,89,7,8,18,2,18,18,19,20,19,19,19,19,19,19,19,19,19,3,4,2,2,2,3,2,2,4,4,4,18,18,18,18,18,4,18,2,2,3,4,3,4,18,19,20,18,2,3,4,20,2,2,2,2,7,7,7,2,2,2,3,4,4,4,2,3,4,18,19,2,3,4,18,7,23,24,4,2,18,19,20,2,3,4,20,19,18,19,18,18,19,2,3,4,39,81,
|
||||
81,38,8,8,89,7,89,19,18,19,20,20,20,20,20,19,20,20,20,20,20,20,2,3,4,2,18,19,18,18,18,19,20,19,20,20,2,2,3,4,18,18,19,20,19,20,20,18,18,2,3,4,20,2,2,2,2,8,7,7,7,2,2,3,4,4,4,4,2,3,4,18,19,2,3,4,2,7,8,20,4,4,5,5,5,18,19,20,20,2,3,4,20,19,20,2,3,4,39,81,
|
||||
81,38,8,8,89,89,89,2,2,3,4,20,20,19,19,20,20,20,19,19,18,19,2,2,2,18,18,19,20,20,20,18,18,2,2,3,4,18,19,20,19,20,18,19,20,18,18,2,2,3,7,8,8,8,8,3,4,7,7,7,2,3,4,4,4,4,19,20,2,3,4,2,2,4,5,4,18,19,2,4,5,5,5,21,21,18,19,20,5,18,19,20,18,20,18,2,3,4,39,81,
|
||||
81,38,8,8,89,89,89,2,89,89,4,20,20,20,20,19,19,19,19,20,18,18,18,7,8,8,8,8,8,8,8,2,2,18,18,19,20,20,2,2,2,2,3,4,7,8,8,8,8,8,8,8,8,8,8,8,8,7,7,3,4,4,4,4,4,19,20,2,2,3,4,2,2,20,21,4,18,19,2,5,5,21,21,20,3,2,3,4,21,18,19,7,7,7,7,7,8,4,39,81,
|
||||
81,38,8,8,89,89,8,8,8,8,8,7,7,7,7,20,20,20,20,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,20,2,2,3,7,8,8,8,8,8,8,8,8,8,8,8,8,8,3,8,8,8,8,8,8,8,8,8,8,7,8,8,2,18,2,3,4,2,2,4,5,4,2,2,4,5,5,5,19,20,2,18,19,20,7,8,7,23,23,23,23,7,7,8,39,81,
|
||||
81,38,8,8,8,8,7,7,7,7,7,7,8,8,8,8,7,8,8,8,8,8,8,8,8,4,4,4,4,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,4,4,20,20,20,18,19,20,20,19,8,8,8,8,8,8,8,8,8,8,2,2,2,3,2,2,3,4,4,4,5,5,5,5,21,21,4,4,4,4,20,3,8,8,7,7,8,8,8,8,8,8,39,81,
|
||||
81,84,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,20,20,20,20,20,20,20,20,20,20,20,8,8,8,8,8,8,8,8,20,20,20,20,20,20,20,20,18,18,18,19,20,18,18,18,18,2,3,4,2,8,8,8,8,18,18,18,2,3,18,18,19,20,20,20,21,21,21,21,20,20,20,20,20,20,4,3,8,8,23,23,24,24,24,24,24,24,39,81,
|
||||
81,66,34,34,35,35,34,34,34,34,34,34,34,8,8,8,8,8,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,34,34,35,34,34,34,34,34,34,34,34,34,35,34,34,34,34,34,34,35,34,34,34,34,34,34,34,35,34,34,35,67,81,
|
||||
81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Collision" width="100" height="100" visible="0">
|
||||
<data encoding="csv">
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,145,145,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,145,145,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,0,0,0,145,145,0,145,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,145,145,145,145,0,0,145,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,145,145,145,145,145,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,145,145,145,0,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,145,0,0,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,145,145,0,0,0,0,0,145,145,0,0,0,0,0,145,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,145,145,0,0,0,0,0,145,145,0,0,0,0,0,145,0,0,145,145,145,145,0,0,0,0,0,0,145,145,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,145,145,145,145,145,145,0,0,0,0,0,145,145,145,0,0,0,0,145,145,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,145,145,145,145,145,0,145,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,0,
|
||||
0,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,
|
||||
0,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,145,145,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,145,145,145,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,145,145,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,145,0,0,0,0,0,145,145,145,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,145,145,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,145,0,0,0,0,145,145,0,0,0,0,0,0,145,145,0,0,0,0,0,145,0,0,0,0,145,145,145,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,0,0,0,0,0,145,145,0,0,0,0,0,145,145,145,0,145,145,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,145,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,145,145,0,0,0,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,145,145,145,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,145,145,145,145,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,145,145,145,145,0,0,0,145,145,145,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,145,145,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,145,0,145,0,0,145,0,0,0,145,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,0,0,145,0,145,0,0,145,0,0,0,145,145,145,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,145,145,0,0,145,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,145,145,145,145,0,0,0,0,0,145,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,145,145,0,0,0,0,145,145,0,0,0,145,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,145,145,0,145,145,145,145,0,0,0,0,0,145,145,0,0,0,145,0,0,0,0,145,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,145,145,0,145,145,0,0,0,0,145,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,145,145,145,0,0,0,0,145,145,0,0,0,0,0,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,0,145,145,145,145,145,145,145,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,145,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,145,145,145,145,145,145,0,145,145,145,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,0,0,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,0,0,0,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,145,145,145,145,145,0,0,0,0,0,0,145,145,145,145,0,0,0,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,0,0,0,0,145,145,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,0,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,145,0,0,0,0,0,0,0,0,0,145,0,
|
||||
0,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup name="Object Layer 1" width="100" height="100">
|
||||
<object name="Spawn1" type="SquadStart" gid="143" x="320" y="256"/>
|
||||
<object name="Spawn2" type="SquadStart" gid="143" x="288" y="192"/>
|
||||
<object name="Spawn4" type="SquadStart" gid="143" x="224" y="160"/>
|
||||
<object name="Spawn3" type="SquadStart" gid="143" x="256" y="288"/>
|
||||
<object name="Spawn5" type="SquadStart" gid="143" x="224" y="224"/>
|
||||
</objectgroup>
|
||||
</map>
|
||||
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.0" orientation="orthogonal" width="256" height="256" tilewidth="32" tileheight="32">
|
||||
<tileset firstgid="1" name="Aztek Temple" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek.png" width="480" height="693"/>
|
||||
</tileset>
|
||||
<tileset firstgid="316" name="collision" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/collision.png" width="32" height="32"/>
|
||||
</tileset>
|
||||
<layer name="Floor" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt2jFqA0EQRUGB7n9n40CgzEh4ebv7q6DDCV8HzTweAAAAAAAAAAAAAAAAAAAbnm8DnMvzJgN8ru5W/9Cpu9U/dOpu9Q+dulv9Q6fuVv/QqbvVP3TqbvUPnbpb/UOn7lb/0Km71T906m71D526W/1Dp+5W/9Cpu9U/dOpu9Q+dulv9Q6fuVv/QqbvVP3TqbvUPnbpb/UOn7lb/0Km71T906m71D526W/1Dp+5W/9Cpu9U/dOpu9Q+dulv9Q6fuVv/QqbvVP9yTPmGX/mGX/mGX/uF4Z7236R+Op3/YpX/YdYX+v3kP/E3/sEv/sOsK/QPH0D/s0j/cR9Gz/uEc6rarfQH0reofOp+2o2e4D/3DLv3DLv3DLv3DLv3DLv3DLv3DDu3BLv3DLv0DL3qHXfqHXfqHXfqHXfqH6/PXBnbpH3bpH3bpH3bpH7b8V/P6h+vRP/BL/7BL/7BL/7BL/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUfgD7Ih3C
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Interior" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
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
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Interior 2" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt08ENADAIAzFmhP13KVOAKmwp/3wuAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJ9lr7ZPACv0D3fpH+7SPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTHpGaApU=
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup name="Object Layer 1" width="256" height="256">
|
||||
<object type="SquadStart" x="704" y="2624" width="32" height="32"/>
|
||||
<object type="SquadStart" x="736" y="2656" width="32" height="32"/>
|
||||
<object type="SquadStart" x="704" y="2720" width="32" height="32"/>
|
||||
<object type="SquadStart" x="800" y="2656" 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="Door" x="640" y="2656" width="32" height="64"/>
|
||||
<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="992" y="2688" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1088" y="2560" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1120" y="1888" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1632" y="1664" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1600" y="2112" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1760" y="1824" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1824" y="1920" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1984" y="1696" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1984" y="2048" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="1824" y="2208" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2080" y="1792" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2272" y="1664" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2336" y="1728" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2272" y="2112" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2304" y="2016" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2720" y="1888" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2720" y="1824" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2752" y="1856" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2112" y="800" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2112" y="960" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2112" y="1120" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2112" y="1280" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="3424" y="1280" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="3424" y="1120" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="3424" y="960" 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="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>
|
||||
<layer name="Collision" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt20FuwjAURVG6r+5/XRWjDkqRE75j5/1zpEwYID+JKyUIHg8AAAAAAAAAAAAAgH18f/W6gF+re9Q/rLO6R/3DOqsb1D+sk9xI8jaokNxI8jaokNxI8jaokNxI8jaokNxI8jaoMNrIrv2MnFn/8Jr+oa/kRpK3QYXkRpK3QYXkRpK3QYWK5//ZbX16Lv3Da/qHvpIbSd4GFZIbSd4GFZIbSd4GFWY+/x9t7sz7eP6H8/QPfSU3krwNKiQ3krwNKiQ3krwNKnj+h770D30lN5K8DSokN5K8DSokN5K8DSp4/oe+9A99JTeSvA0qJDeSvA0qJDeSvA0qJDeSvA2eXn3Gd75Wnx2SrO5Z/7DO6p71D+us7ln/sM5On/MZ/QP/26kb/cO1dupG/3CtI53NfO3dWUZ71j8co3/IMtLRjvfN+ofPdel/1x2wkv71T1/61z993bUD/cPnunTQZScc0aWLLjvhiJEudrxvvuv3FrAT/UNf1f1f8drImfQPf53pQv+QYXb/V9nlHHAn+oe+9A996R/6quim4ru3GRfwnv6hL/1DX2c6Wt21/mFcdUeru9Y/jLuif2BP+oe+9A99VTeqf7gP/UNf+odeZjaqf9ib/qGvmV3qH/amf+jL/T/0pX/gSf/Ql/6hr09//3/mPwLAHvQPfekf+tI/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAu/sBxwzVAA==
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.0" orientation="orthogonal" width="256" height="256" tilewidth="32" tileheight="32">
|
||||
<tileset firstgid="1" name="Aztek Temple" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek.png" width="480" height="693"/>
|
||||
</tileset>
|
||||
<tileset firstgid="316" name="collision" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/collision.png" width="32" height="32"/>
|
||||
</tileset>
|
||||
<layer name="Floor" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
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
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Interior" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt3UmTHEcVB/Bq47vBYjsZW2wn2xLbDRDbje27AF/AcPCCiQCCsGyJ9WBs6WywTYSvJgB/GCy4U+nph97kZNbSMxppun+/iBczqumexeF/VtarrKphAAAAAAAAAAAAAAA4PP/e1vtj3RnrP2P9977+RnC43l9YZ5bVzd0xoC5jApyvzWa6elldUnWey8dHNsMHY0CrTjsuGFdgnQ9vTlbOTi+rc9XL4WObozGgVaceFxrvq18j/9BXZ76X1blq5bjMJx7aHI0Brdp1XIiM1+9r5f/hzfn9t4QLp8pQL6tz1cpxmVt8ZKxHx7o01m+Gowq7jgsxDuT39LJ/Sf6hq878kztWK8efGuvxsZ4Y63Ij/z1z40Ke68fPaeX/0vbnAm115p8a6+mxrox1dbv/vJT24TnP+fPWmFB/r7P4XWMcyPnvHffLPkzrZfVyynb+PL8mf351JuNL9vtL5bz3su+4H+a1sh91pfpYqj5f+NCCnD011tNjXR3rC2fwO8/l33E/LPPa0B4Dcq5Kpj44Vzh+fHSH+vJYXxmO8v+lHb/HpbE+uv2d83kAx/2wu6X5f2Y42o8/PtYTK+vbY31nrG+O9a0d3l/q8lifHuvl8ktv+msCHPfDcmvzX+bxV4ajHK6pcvz/ylg3tnWlqlp+b/l6HDuUf/fO9cfcX/5hman8R8YiXzn/Hxvr42N9YqxPbr/PXC0dK+rvXc7vRf5fG/r7/jjul39Yppf/fI69lf/PjPXZsT431udX/KwlVX/vOv/1+sIPbY5nX/5hmV7+H5nJ/xeHo15e9PbOUv29c/6L3vrCfJ4SmNfL/2Mz+Y9eXvT2zlL9vev899YXPi7/sEov/0/O5P881fmvj/1bYwEwr5f/6LMt7f+F3vaW+rV3OtvlH+6NXfPf6/+t6QvWr73T2S7/cG/smv9e/29NX7B+7Z3OdvmHe2PX/Pf6f2v6gvVr73S2yz/cG7vm/zzV+a/v9SX/sJuz6v/11u5N2bX/V6//lX/YzVn1/yL/59H/q+/5If+wm7Pq/0X+9f/g4lh6/V9ZXz/V/4v86//BxVGytCT/lzbT/b/I/67iZ7Xskn/3/YcFNsvyf3nzYPT//jYsy7/7/8G8Rxbm/+pmt/7fOxPV6v+1tuf8l68vyb/7/8G8uP/39eEov+UePVe38+d8b436/j9L+3915t9L1er/tbbn/Jevt+79oQcA6+TM57q6nT/ne2rV+a97dHHvjnr7e1WV+fs/ttXq/73X2D63/+/lXw+AQ/b8WC+M9fNtZdeH4/l/PVXMnx/e3L2vTp3/yHNk+Z9j/Ws4nvV3Gr/T1OunKvLfezaoHgDcVWf/RvX1P2+r7LNL5uv7/8cYEPfVqfPf0sr1Wfl//3/TLj0AOJKzH/fbvdV5be/8f4wBl7efl/x/dayvjfX1lRV9/Ojrr31/qWtjfWPoPxu0lX89AA5Nnf1bqVpK/ku2p54DFK/57ljf29b3V1T08aOvv+a9UT8Y64fD/HOI9QA5VK3sx/z++RUV3+M0z+3MzwpqPf8nP8+n9qNUPx7rJ53XneUzBeGiah3rx/4+8r/mWR1LxoYXx/pF9XvkfmJ+VlB+/s8Tw/Hn+cR74n3FM6l+OtbPOn+3/LMP4rk4N8f67cr3Lt2nL733/txzOnrjQZH7iblXGJXHqOjnxXvifcUvU/1qrF93/nb5Zx+U/+93HQPm9te9saD8zFvpY/586dhQ5z+byn/5OyP/rTX/f0j1x7H+1Pnb5Z998Oaw+xiw9Lla9f6697q8L67HhXpsmMp/PlfQ6v9fG476+UueH94j/+yDd4ejMSCvwVszDiyd06+dJ0wd/w+Nf2dxriD3/8s+P/r/0c/vrU9aQv7ZF2UMyGvwYhx4dqznhpO9txeH4+NF7I/rfXze3styr1rz/JzVqfzneX0cC8ScP+YT0fOLNQpwyN5MNZX7m9vK48Wt4WSuI/tzfbx6rVBUa0zIWc3vzef76mqd/2vV1DnBPB/63Vi/H476A7Av3t3W1H6/ZOD2tsq/Y7x4a+gf48/18WIffKuqejzIrxmqn5XP98U5v/x5ff6vVXFOMMs/W/7Zd3P7/ZL7t7dV/h1jxt+Hk3P1nPfc23+987VhONn7qyur8/904++5srCKY/f4TuSfQzC1z8/Zf2v78fbEe+rzfFnefprj7jze1Pmvry/MWa+vOw7yzyHrZTnm+yXzfx3uzvffbrw2Km/P+Y9+QG9sWCOfA6zzX9b1XB+OjwMvDyfHhSX5h0PQy3/M9/P6upLb6AHUfcGbw/GeXvQIzzL7oc5/7hXGNcY58/V1x6+n7yX/HKo6+72xoN7/58zfTpV7em8O9y77df5zvy6+nseAXvYL+edQ1Xl/qbEtxoCc/5z5t1PljOfsn1X+43vW+c+9wnyOYWq/H+SfQ1Vn/dXGtt4cIKq1nqe134+vvdD5OPe1em1Rzn8eY+rzjVPZL+SfQ/TscDLrbzS2Rf7rHsAw9Nf41dnP3yuOEeqPrW35a621Qb3zf+G1Yfo+JIX8c2gi42vyX+//i9b6vtacv7Uvj2pd89O6TrC1Nmjq3mBL7/91bTi6JggORWS8Pt5fm//W+r46+7HfrvflUb1rAVtrherK1/v07v+Vr/+ZuscXHIqY+9fH+2uO/4f0mjiv3svrjca2qF7We9unrv/J6ut/es/5g0MT+/16f//GMH0OII79c/7rNX83Gtum8jx1/U9rHlFfD9gj/9CW9/N1/qfmAHnfX+Rj/leGs7nWv67eWCH/sJu836/zP9UDiPXwcb1snIuLjK653+fS6h3/19cQ1NcC967/jet9e+OBcYJDEPP8Ov9/Gebn//l62Xwt75J7Au1arXMCWeta4Nb1v3G971T+jQHsu5jnr8l/zP/z+fJWNu/HfXXm1gKE3vHAnUbBvop5fj4OiPxP9QBL/vP58rpnf1br/Nc6bf7LPUGj5J991st2qZL/qR5gfb48Zz4fC5y3Xv7r637n+oH1OAD7oLXet3V/v5LnqR7glAdx/782/yHGALiIcn6X5D6u54t1PvuS//r6vzXnA+Wfi2pqfx/n8XLu43q+yMou+T+t+Hm7OO3xP+yDZ4fp7JfMx3m8nPvo7Z9m/39a19PPfG5YNx7U1wL1rv+5Nhz1L+WffbPkGL9kPl/DX6/rj8/vR/6H4WT+l44B9bVAvet/Sv9Sf5+LrHdsP7XPr+/jXfr8dfbzv88y/2tynF+79H2t+/7W63+j/xfZd2zPRVWft5/Lf57rl21xnv+88h/z+qVZXjsHaN3nq1fR1+/dDwgedHntbl6rM7VmJ9+rq5f/uCZ41/N/U2IfvSTPux4DwCEoGX1pW71r+XJm87a8zq/O/0vD/Brg06rHgVa+T9MHhH0X1+nGvjrmAOVjPg6O83w5xznjdf5fHe59/sP1qurxwBwA+uJa3bxet3xsPa8j9wdyxuv85zXA593/b40H8g/zYg7Qy3VkZ+o18VyPyPn9Ov8XdjkPAIcqegJ1buv7+03lv8wV4pih9Uy/88y/OQAs17t3V+v63t6an/J5HDPEmoEXh/uT/2GQf1iqd++utfmvn/GV5wLyDw+ufE+P+jqA3rmBOv+tY4IYA26e35/ygbnzhMBd0QfMFfnvnRuo5wKt+UGMAbcH4EH2alUxB1gy95/rDeZ7fwMPnjeqyusEW/v/+p7+U2MA8GCr85vXCbZyDeyvvE5Q9uHwyD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXxf8A7Hca2w==
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Interior 2" width="256" height="256">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt1LENg0AMQNHrYBcoWIUNMgELHZCMGhdUJxGlOEGie0/6lSXLlVMCAAAAAAAAAAAAAAAAAAAAAAAAAPgvSxHQliEa7z4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALtRX2JGjNdqiPXpGrwp7gd/QfZjl5AcAAAAAAAAAAAAAAAAAAAAAAAAAAMCZ6Qhoy1wEtONRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMB33mp4DUA=
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup name="Object Layer 1" width="256" height="256">
|
||||
<object type="SquadStart" x="2688" y="2336" width="32" height="32"/>
|
||||
<object type="SquadStart" x="2720" y="2368" width="32" height="32"/>
|
||||
<object type="SquadStart" x="2688" y="2432" width="32" height="32"/>
|
||||
<object type="SquadStart" x="2752" y="2432" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2560" y="1856" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2816" y="1568" width="32" height="32"/>
|
||||
<object type="EnemySpawn" x="2944" y="2016" width="32" height="32"/>
|
||||
<object type="DelayedEnemySpawn" x="2816" y="2304" width="32" height="32"/>
|
||||
<object type="BossSpawn" x="2752" y="800" width="32" height="32"/>
|
||||
<object type="Door" x="2720" y="1728" width="64" height="32"/>
|
||||
<object type="Door" x="2720" y="1504" width="64" height="32"/>
|
||||
<object type="EnemySpawn" x="2656" y="1600" width="32" height="32"/>
|
||||
<object type="SquadStart" x="2784" y="2368" width="32" height="32"/>
|
||||
</objectgroup>
|
||||
<layer name="Collision" width="256" height="256" visible="0">
|
||||
<data encoding="base64" compression="zlib">
|
||||
eJzt3T13HEkVBuDRgnM+nBvY3MDG/FTnCzhfwPkCmy/gfAHnCzhm+mju0dV1VXWPNJqe1jzPOfcgjbUeyei9XV1d1b3bAQAAAAAA8NS+HNRv9/W7ff1+X2/X+gbhmRhlba36qlN6ATzcMVlbs77uVK8f6APQN8p6L2tr1redavUD+YexUdZ7WVuzvutUqx/oAdA3ZWOU9V7W1qrvO9XrB1/vnAdAz3R8HGW9l7e16uamXb2e8O3OGAB6puPjKOu9vK1VS6755Z7w3e5uDCD/cN90fBxl/UdPVL85cdV+ULMu//Cp6fg4yvqrQ506r6eu1hqAmnf5h/um437Neq61c7206jW/Vv6NAeC+m5T1141aO9dLK1/zk39Y5kcl77/c16/29et9fXEBuV5a+Zqf/MO8KQ9x3K+5/7D/sxcXkOtjKub781yAHgCfihz0jvsf93/28gIyfUzFNb+YC5B/aMv5r9l/v7s99n9+AZl+SA+YzgGmcY38Q9so/9PY/+XN/Pn/Gqbvd3RdYprPmM4Bpq/pnQPIP9dulP9p7P92Nz//v4a5/L86nANM/9s7B5B/rt0o/9PY/93h6y4p/3E8H+X/9c3dNc24FiD/cN8o/9PY/5vD1y3N/1P2hPi7Y33P3LqkWMsU1wJaPUD+uWaj/E/zfu8PX3dJ+Y/1PXP5j/VMcS3AGADuy5nozQFOLmn8H+t7RvmPn2v6mrl5f/nnWs3l/+Ph6y4p/7vd/Pyf/MO8nIcpKz/b18/39YvD+P/FId9r5D+fs7deH+U/f83cmF/+uVZzx/+XR+a/1xOO6RV1nu/Lzuuj/Mf5fiv/rTGA/HON5vL/+Yr5z/fubL0+yn9c85N/6KtZaPWAyRrj/3zvztbro/zHNb9j1v/KP9fmkvM/Z5T/uOZ3zPpfYwCuzSXn/zHzf7H/Z+7+/8YAXLOaidY1gCkTW5v/i/0/+RxiyRpA+eeaLDn+T3sAtjb/F+v+8v3/e2sA5Z9rtST/0x6Arc3/xf6ffP//0TNArAHgGtU89O4DsrX5v9c3d/czrs8A6fUA+efa1DFxbw/A1ub/4hzgVekBdS7AdUCuWd0bP2Xlx/v6yb5+enO7/m/aA7C1+b8YA8Q+gegBdT7QMwG5ZlMe4vc/jqmtPQBbm//L75V7QJ0P9GxwrtmUh/jdn3LQ2wOwtfm/mv/oAXU+cO7aIDxn+Vm6Uw56ewC2Nv+Xz+PjZ4o5wdwDlqwPgK0YPfey9dqUhzgPnnLQyv/c/X9H7/eUeRrlf1qz8C59bfxcdT6wng/oAWzBKOeR5z/s64/7+tPuNgut1+L+uFPF/bKPff7X6P1ar/f05t97P+co/9+kvyvuYRxjgNwD6vmAHsClmct6zVfk+c/7+su+/rq7zUPrtdc3d+fB3+/a2Z/+u1H+H1rhKf7u97u77L8rP1fuAfV8QA9gDUv2pvSyXjMdef7bvv6+r3/sbvPQey3Og286x/7pa7aW/w+7u3OAGAu0ekA9H9ADOJfeMT2yvTTrNdOR53/u61/7+vfuNg+91+I8OJ4BXPM/fc2pM99zqvf5ePj3+ebwbxK9oPaAej6gB3BKS/ab1JxHtpdmvWY68vyfff13X//b3eah91qcB/fO/eO/21L+pzUL7w//Rh9293tB/Rn1AB6rt470bfl8ynfO+lQ155HtpVmvmY48f7avH+zrh4c89F6L8+BW9vPftaX8T2sWPhz+jT7u7veCqfQATqGX+3epctanfOesT1VzHtlemvWa6chzXcfbey3Og1v5z3/XVvIfaxY+Hv6NXpReEKUHsNSXG6r6+xnreFtreyP3UTX/c2vsTtELTv33xpqFF4eKPQzRC6JaP68eQMtXK9TonKK1b3VuniF/nn/fe9mPP99a/vO65Zc3d3sYXqTXXs78zHoA2ddnrN5xPJ9T5DmE3vWC/HGrh7xd+P1sNf+fH6r2gly9+x3qAWTfnrHy8b/XC/IcQu96Qf64zjlGxXu+GXw/p8j4Yxz7nvV4nvP+RaN69ADCd2esvC+11QvmzvdjHjHPKdY5x6h4zzeD72dr+W9lfC7rPUt6wNL1zWzX92esvC+11Qtq1d+/uF6Qrx3kXpAr3vPN4PvZWv7jWJ/P9R9jrgfUcRfPT1wHP0flfamtXlCr/v7FtcF8nTD3glwxZngz+Bm3lv/WuP+xRj2gXr/l+Ynr4OeovC+11Qtq1d+/WAeQ1wTkXpArxgxvBj/j1vJfz/8fMu5v6fWAuk6D5yfWyJyj8r7UVi+oVX//Ym1PXueTe0GuGDO8HfyMW8p/zf6ptXpAXZPF85Ovkz915X2prV5Qq/7+xdqevM4n94JceU6g9/1sKf9Plfus9oC6/pLnp14jztmKXPXW3bf23IyO5XlfaqsX1KrvF99j7/vNlecEeraU/1O955zcA+qaap6fvE629oLIVW/dfWvPzehYnveltnpBrfp+0WtG6/qi8pxAlq8vyn9b/H9U11Tz/OR7R/buk/Gq8/vQ2nOz5Fiex+Cj+YL6fnN7/vLHeU4gZz5fX9xS/s+tt36Q52c0Jh+to2/tuVl6LI/PR/MF9f3m9vzlj/OcQM78Vtf/wlNZMiZv9YTeHrMlx/JW7+h97dLX8sd5TiBn/lTrf+Wf52RuTL70Gv/SY3mrd4z6ypLX8sd5TiBn/lTrf+Wf56qV32Ou8x+zJqj138/1jtGawV7Wo061/lf+ea5aa/GOuc5/TK9YMlY4Zo9hL+tRp1r/K/88V4/d53dMr2jdk/cx1ct61KnW/z4km7LPFpxzT+Cpq5f11vnGpecf1nDOPYGnrmPmFuQfPnXOPYGnrmPmFuQfPnXOPYGnrtHcQpTxP/Sdc0/gmiX/8KnesTPff6qu443PY939aB9vfU5fa69/vu9H615A9d5g9fN6D/HW/SvlH9pG4+e8vrauwa17hlv7dOqe4bke0boXUO0H9fPoA73nDEzkH+a1ekFvHW/dM9zap1P38c31iNb4oPaD+nlvnBA1OVX+n6rgUvT20E5j81Z/GO3nqfv45npEa3xQ+0H9vDdOiJqsnW/555K07rnfy3xdb5/X382t8Wvt+xv1iCX3Hqqf98YJUZO18y3/XJKc/5r7uT02df1dvZf/aG/fXI9ojQ9qP6if98YJ+Z5ga+db/rkU9dk7Nfdze2zq+ru5vXmjPUatc4m5ew/1rkPUcUG+J9ja+ZZ/LkU9XvfG9709NnX93dzevGP3Ec3de6h3HaKOC6Ima+db/rkUvWP13L66mvvI69zevIdWrx/0rkPUcUF+btba+ZZ9LkXvWD23r67mPnI4tzfvKWrJOCE/N2vtjMs/l6J3rJ7bV9c7Hs/tzXvq/T9zewCqtfMu+6ypd6ye21dX8xXX4uf25p1j/0/r+zvWkmzKP1vXO1YvyXzrWvzSe32duk59z3rZ5BocO44ePYfjs4XZ7P1vjCNyxfX73vO+PZ8WHq53rK6Zrc/ZaK3NGT2XY7TON39cn+cdY4ve8749nxYe7pg1u3PP4Rg9l2O0zjd/XJ/n3eoRtYCHaWV+ycdLrsWP/qzXJ+rzvFs9ohZwOnVMcOo5+lGfqM/zbvWIWsDTOffcfa5Wj6gFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMf6PzdxK1A=
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
@@ -1,223 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.0" orientation="orthogonal" width="100" height="100" tilewidth="32" tileheight="32">
|
||||
<tileset firstgid="1" name="Aztek" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek.jpg" width="160" height="160"/>
|
||||
</tileset>
|
||||
<tileset firstgid="26" name="Collision" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/collision.png" width="32" height="32"/>
|
||||
</tileset>
|
||||
<tileset firstgid="27" name="Aztek Transparent" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek_transparent.png" width="160" height="160"/>
|
||||
</tileset>
|
||||
<tileset firstgid="52" name="Aztek 2" tilewidth="32" tileheight="32">
|
||||
<image source="tilesets/aztek2.png" width="320" height="320"/>
|
||||
</tileset>
|
||||
<layer name="Tile Layer 1" width="100" height="100">
|
||||
<data encoding="csv">
|
||||
52,53,54,54,54,54,54,54,56,0,0,52,54,54,54,54,54,54,55,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
62,63,64,64,64,64,64,65,76,0,0,72,63,64,64,64,64,64,65,66,52,53,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,55,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,75,76,0,0,72,73,74,74,74,74,74,75,76,62,63,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,65,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,75,76,0,0,72,73,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,75,76,0,0,72,73,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,75,124,54,54,125,73,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,133,64,64,64,64,136,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
82,83,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,85,86,82,83,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,85,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
92,93,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,95,96,92,93,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,95,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
52,53,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,55,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
62,63,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,65,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
72,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
82,83,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,84,85,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
92,93,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,95,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
<layer name="Collision" width="100" height="100">
|
||||
<data encoding="csv">
|
||||
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
</map>
|
||||
|
Before Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,81 @@
|
||||
luanet.load_assembly("Microsoft.Xna.Framework")
|
||||
Color = luanet.import_type("Microsoft.Xna.Framework.Color")
|
||||
|
||||
local frame = CreateFrame('Frame');
|
||||
frame.X = 100;
|
||||
|
||||
local button = CreateFrame('Button', frame);
|
||||
button:SetTexture('images/Enter');
|
||||
button.Width = 100;
|
||||
button.Height = 50;
|
||||
button.OnClick = function(clickPos)
|
||||
Console.WriteLine(clickPos.X .. ' ' .. clickPos.Y)
|
||||
end
|
||||
|
||||
|
||||
function CreatePanicFrame(x, y)
|
||||
local frame = CreateFrame("Frame")
|
||||
frame:SetTexture("images/GUI/unit_background")
|
||||
frame.Width = 154
|
||||
frame.Height = 19
|
||||
frame.X = x
|
||||
frame.Y = y
|
||||
|
||||
local healthBg = CreateFrame("Frame", frame)
|
||||
healthBg:SetTexture("images/GUI/health_background")
|
||||
healthBg.Width = 136
|
||||
healthBg.Height = 13
|
||||
healthBg.X = 3
|
||||
healthBg.Y = 3
|
||||
|
||||
local healthBar = CreateFrame("Frame", healthBg)
|
||||
healthBar:SetTexture("images/GUI/bar_solid")
|
||||
healthBar.Color = Color(87, 55, 253)
|
||||
healthBar.Width = healthBg.Width * 0.5
|
||||
healthBar.Height = 11
|
||||
healthBar.X = 1
|
||||
healthBar.Y = 1
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function CreateUnitFrame(name, x, y)
|
||||
-- Frames for one unit
|
||||
local frame = CreateFrame("Frame")
|
||||
frame:SetTexture("images/GUI/unit_background")
|
||||
frame.Width = 164;
|
||||
frame.Height = 35;
|
||||
frame.X = x
|
||||
frame.Y = y
|
||||
|
||||
local nameText = CreateFrame("Text", frame)
|
||||
nameText:SetFont("fonts/UnitName")
|
||||
nameText.Value = name
|
||||
nameText.X = 4
|
||||
nameText.Y = 1
|
||||
|
||||
local healthBg = CreateFrame("Frame", frame)
|
||||
healthBg:SetTexture("images/GUI/health_background")
|
||||
healthBg.Width = 136
|
||||
healthBg.Height = 13
|
||||
healthBg.X = 3
|
||||
healthBg.Y = 19
|
||||
|
||||
local healthBar = CreateFrame("Frame", healthBg)
|
||||
healthBar:SetTexture("images/GUI/bar_solid")
|
||||
healthBar.Color = Color.Red
|
||||
healthBar.Width = healthBg.Width * 0.5
|
||||
healthBar.Height = 11
|
||||
healthBar.X = 1
|
||||
healthBar.Y = 1
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
--[[local frame;
|
||||
frame = CreatePanicFrame(0, 0)
|
||||
frame = CreateUnitFrame("Flight captain Rainbow Dash", frame.X, frame.Y + frame.Height)
|
||||
CreateUnitFrame("Mr. Sparkle", frame.X, frame.Y + frame.Height)]]--
|
||||
|
||||
local testFrame = CreateTestFrame()
|
||||
testFrame:SetWidth(1337)
|
||||
@@ -0,0 +1 @@
|
||||
Console.WriteLine("Test.lua loaded");
|
||||
@@ -0,0 +1,5 @@
|
||||
ToolTip = CreateFrame("Frame")
|
||||
|
||||
local text = CreateFrame("Text", ToolTip)
|
||||
text:SetFont("Arial")
|
||||
text.Value = "99%"
|
||||
@@ -0,0 +1,31 @@
|
||||
texture LightsTexture;
|
||||
|
||||
sampler ColorSampler : register(s0);
|
||||
|
||||
sampler LightsSampler = sampler_state{
|
||||
Texture = <LightsTexture>;
|
||||
};
|
||||
|
||||
struct VertexShaderOutput
|
||||
{
|
||||
float4 Position : POSITION0;
|
||||
float2 TexCoord : TEXCOORD0;
|
||||
};
|
||||
|
||||
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
|
||||
{
|
||||
float2 tex = input.TexCoord;
|
||||
|
||||
float4 color = tex2D(ColorSampler, tex);
|
||||
float4 alpha = tex2D(LightsSampler, tex);
|
||||
|
||||
return color * alpha;
|
||||
}
|
||||
|
||||
technique Technique1
|
||||
{
|
||||
pass Pass1
|
||||
{
|
||||
PixelShader = compile ps_2_0 PixelShaderFunction();
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@
|
||||
<Private>False</Private>
|
||||
<SpecificVersion>True</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=MSIL" />
|
||||
<Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
|
||||
<Private>False</Private>
|
||||
<SpecificVersion>True</SpecificVersion>
|
||||
@@ -49,6 +50,7 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="LuaImporter.cs" />
|
||||
<Compile Include="MapProcessor.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Microsoft.Xna.Framework.Content.Pipeline;
|
||||
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
|
||||
|
||||
// TODO: replace this with the type you want to import.
|
||||
using TImport = System.String;
|
||||
|
||||
namespace DepthsBelowContentPipeline
|
||||
{
|
||||
/// <summary>
|
||||
/// This class will be instantiated by the XNA Framework Content Pipeline
|
||||
/// to import a file from disk into the specified type, TImport.
|
||||
///
|
||||
/// This should be part of a Content Pipeline Extension Library project.
|
||||
///
|
||||
/// TODO: change the ContentImporter attribute to specify the correct file
|
||||
/// extension, display name, and default processor for this importer.
|
||||
/// </summary>
|
||||
[ContentImporter(".lua", DisplayName = "LUA Importer", DefaultProcessor = "LuaProcessor")]
|
||||
public class LuaImporter : ContentImporter<TImport>
|
||||
{
|
||||
public override TImport Import(string filename, ContentImporterContext context)
|
||||
{
|
||||
return System.IO.File.ReadAllText(filename);
|
||||
}
|
||||
}
|
||||
}
|
||||