aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Mundus/Data/Crafting/CraftingTableContext.cs4
-rw-r--r--Mundus/Data/GameEventLogs/GameEventLogContext.cs4
-rw-r--r--Mundus/Data/SuperLayers/ISuperLayerContext.cs8
-rw-r--r--Mundus/Data/SuperLayers/LandContext.cs18
-rw-r--r--Mundus/Data/SuperLayers/SkyContext.cs10
-rw-r--r--Mundus/Data/SuperLayers/UndergroundContext.cs9
-rw-r--r--Mundus/Data/Values.cs10
-rw-r--r--Mundus/Program.cs2
-rw-r--r--Mundus/Service/GameEventLogController.cs19
-rw-r--r--Mundus/Service/GameGenerator.cs41
-rw-r--r--Mundus/Service/SuperLayers/HeightController.cs5
-rw-r--r--Mundus/Service/SuperLayers/ImageController.cs59
-rw-r--r--Mundus/Service/Tiles/Crafting/CraftingRecipe.cs28
-rw-r--r--Mundus/Service/Tiles/ITile.cs9
-rw-r--r--Mundus/Service/Tiles/Items/ItemController.cs107
-rw-r--r--Mundus/Service/Tiles/Items/ItemTile.cs19
-rw-r--r--Mundus/Service/Tiles/Items/Presets/GroundPresets.cs21
-rw-r--r--Mundus/Service/Tiles/Items/Presets/MaterialPresets.cs22
-rw-r--r--Mundus/Service/Tiles/Items/Presets/StructurePresets.cs28
-rw-r--r--Mundus/Service/Tiles/Items/Presets/ToolPresets.cs42
-rw-r--r--Mundus/Service/Tiles/Items/Types/Gear.cs15
-rw-r--r--Mundus/Service/Tiles/Items/Types/GroundTile.cs35
-rw-r--r--Mundus/Service/Tiles/Items/Types/Material.cs28
-rw-r--r--Mundus/Service/Tiles/Items/Types/Structure.cs68
-rw-r--r--Mundus/Service/Tiles/Items/Types/Tool.cs26
-rw-r--r--Mundus/Service/Tiles/Mobs/Controllers/MobFighting.cs149
-rw-r--r--Mundus/Service/Tiles/Mobs/Controllers/MobMovement.cs204
-rw-r--r--Mundus/Service/Tiles/Mobs/Controllers/MobStatsController.cs95
-rw-r--r--Mundus/Service/Tiles/Mobs/Controllers/MobTerraforming.cs248
-rw-r--r--Mundus/Service/Tiles/Mobs/Inventory.cs110
-rw-r--r--Mundus/Service/Tiles/Mobs/LandMobs/LandMobsPresets.cs36
-rw-r--r--Mundus/Service/Tiles/Mobs/LandMobs/Player.cs43
-rw-r--r--Mundus/Service/Tiles/Mobs/MobTile.cs92
-rw-r--r--Mundus/Service/Windows/Calculate.cs147
-rw-r--r--Mundus/Service/Windows/WindowController.cs113
-rw-r--r--Mundus/Views/Dialogs/ExitDialog.cs1
-rw-r--r--Mundus/Views/Windows/CraftingWindow.cs3
-rw-r--r--Mundus/Views/Windows/GameWindows/Small/SmallPrinting.cs4
38 files changed, 1153 insertions, 729 deletions
diff --git a/Mundus/Data/Crafting/CraftingTableContext.cs b/Mundus/Data/Crafting/CraftingTableContext.cs
index 284573f..d7ea2d6 100644
--- a/Mundus/Data/Crafting/CraftingTableContext.cs
+++ b/Mundus/Data/Crafting/CraftingTableContext.cs
@@ -34,7 +34,9 @@
return recipes.Where(cr => cr.HasEnoughItems(MI.Player.Inventory.Items)).ToArray();
}
- // Used to set the connection string
+ /// <summary>
+ /// Used to set the connection string
+ /// </summary>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(DataBaseContexts.ConnectionStringMySQL);
diff --git a/Mundus/Data/GameEventLogs/GameEventLogContext.cs b/Mundus/Data/GameEventLogs/GameEventLogContext.cs
index 5440bd8..7a5dc57 100644
--- a/Mundus/Data/GameEventLogs/GameEventLogContext.cs
+++ b/Mundus/Data/GameEventLogs/GameEventLogContext.cs
@@ -46,7 +46,9 @@
return this.GameEventLogs.Count();
}
- // Used to set the connection string
+ /// <summary>
+ /// Used to set the connection string
+ /// </summary>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(DataBaseContexts.ConnectionStringMySQL);
diff --git a/Mundus/Data/SuperLayers/ISuperLayerContext.cs b/Mundus/Data/SuperLayers/ISuperLayerContext.cs
index e6884ad..78a2d83 100644
--- a/Mundus/Data/SuperLayers/ISuperLayerContext.cs
+++ b/Mundus/Data/SuperLayers/ISuperLayerContext.cs
@@ -1,9 +1,11 @@
-namespace Mundus.Data.SuperLayers
+using System;
+
+namespace Mundus.Data.SuperLayers
{
/// <summary>
/// Add, remove and change values in the different superlayers (database tables)
/// </summary>
- public interface ISuperLayerContext
+ public interface ISuperLayerContext
{
/// <summary>
/// Returns the stock_id of the mob at the specified positoin
@@ -37,8 +39,8 @@
/// <summary>
/// Removes health from the mob on the specified position in the mob layer table
+ /// Returns true if the mob can still be damaged (is still alive)
/// </summary>
- /// <returns><c>true</c>If the mob can still be damaged (alive)<c>false</c> otherwise.</returns>
bool TakeDamageMobAtPosition(int yPos, int xPos, int damage);
/// <summary>
diff --git a/Mundus/Data/SuperLayers/LandContext.cs b/Mundus/Data/SuperLayers/LandContext.cs
index 7e23498..0607e23 100644
--- a/Mundus/Data/SuperLayers/LandContext.cs
+++ b/Mundus/Data/SuperLayers/LandContext.cs
@@ -75,6 +75,7 @@
{
this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = stock_id;
this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health = health;
+ this.SaveChanges();
}
/// <summary>
@@ -82,8 +83,7 @@
/// </summary>
public void RemoveMobFromPosition(int yPos, int xPos)
{
- this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = null;
- this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health = -1;
+ this.SetMobAtPosition(null, -1, yPos, xPos);
}
/// <summary>
@@ -92,9 +92,9 @@
/// <returns><c>true</c>If the mob can still be damaged (alive)<c>false</c> otherwise.</returns>
public bool TakeDamageMobAtPosition(int yPos, int xPos, int damage)
{
- var mob = this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos);
- mob.Health -= damage;
- return mob.Health > 0;
+ this.LMobLayer.FirstOrDefault(x => x.YPos == yPos && x.XPos == xPos).Health -= damage;
+ this.SaveChanges();
+ return this.LMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health > 0;
}
/// <summary>
@@ -119,8 +119,8 @@
/// </summary>
public void RemoveStructureFromPosition(int yPos, int xPos)
{
- this.LStructureLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = null;
- this.LStructureLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health = -1;
+ this.SetStructureAtPosition(null, -1, yPos, xPos);
+ this.SaveChanges();
}
/// <summary>
@@ -158,7 +158,9 @@
this.LGroundLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = null;
}
- // Used to set the connection string
+ /// <summary>
+ /// Used to set the connection string
+ /// </summary>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(DataBaseContexts.ConnectionStringMySQL);
diff --git a/Mundus/Data/SuperLayers/SkyContext.cs b/Mundus/Data/SuperLayers/SkyContext.cs
index 72bef8d..45d58a2 100644
--- a/Mundus/Data/SuperLayers/SkyContext.cs
+++ b/Mundus/Data/SuperLayers/SkyContext.cs
@@ -92,9 +92,9 @@
/// <returns><c>true</c>If the mob can still be damaged (alive)<c>false</c> otherwise.</returns>
public bool TakeDamageMobAtPosition(int yPos, int xPos, int damage)
{
- var mob = this.SMobLayer.First(x => x.YPos == yPos && x.XPos == xPos);
- mob.Health -= damage;
- return mob.Health > 0;
+ this.SMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health -= damage;
+ this.SaveChanges();
+ return this.SMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health > 0;
}
/// <summary>
@@ -158,7 +158,9 @@
this.SGroundLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = null;
}
- // Used to set the connection string
+ /// <summary>
+ /// Used to set the connection string
+ /// </summary>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(DataBaseContexts.ConnectionStringMySQL);
diff --git a/Mundus/Data/SuperLayers/UndergroundContext.cs b/Mundus/Data/SuperLayers/UndergroundContext.cs
index 8e06ae4..4874360 100644
--- a/Mundus/Data/SuperLayers/UndergroundContext.cs
+++ b/Mundus/Data/SuperLayers/UndergroundContext.cs
@@ -92,9 +92,8 @@
/// <returns><c>true</c>If the mob can still be damaged (alive)<c>false</c> otherwise.</returns>
public bool TakeDamageMobAtPosition(int yPos, int xPos, int damage)
{
- var mob = this.UMobLayer.First(x => x.YPos == yPos && x.XPos == xPos);
- mob.Health -= damage;
- return mob.Health > 0;
+ this.UMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health -= damage;
+ return this.UMobLayer.First(x => x.YPos == yPos && x.XPos == xPos).Health > 0;
}
/// <summary>
@@ -158,7 +157,9 @@
this.UGroundLayer.First(x => x.YPos == yPos && x.XPos == xPos).stock_id = null;
}
- // Used to set the connection string
+ /// <summary>
+ /// Used to set the connection string
+ /// </summary>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(DataBaseContexts.ConnectionStringMySQL);
diff --git a/Mundus/Data/Values.cs b/Mundus/Data/Values.cs
index eb9812b..970f189 100644
--- a/Mundus/Data/Values.cs
+++ b/Mundus/Data/Values.cs
@@ -5,6 +5,16 @@
/// </summary>
public static class Values
{
+ public const double TAKEN_ENERGY_FROM_FIGHTING = 0.5;
+
+ public const double TAKEN_ENERGY_FROM_MOVEMENT = 0.1;
+
+ public const double ENERGY_TAKEN_FROM_PLACING_GROUND = 0.4;
+
+ public const double ENERGY_TAKEN_FROM_BUILDING_STRUCTURE = 0.5;
+
+ public const double ENERGY_TAKEN_FROM_DESTROYING = 0.6;
+
public enum MapSize
{
SMALL = 14,
diff --git a/Mundus/Program.cs b/Mundus/Program.cs
index 3d4530c..a4cc679 100644
--- a/Mundus/Program.cs
+++ b/Mundus/Program.cs
@@ -7,8 +7,6 @@
public static class MainClass
{
- private static bool runGame = true;
-
public static void Main(string[] args)
{
DataBaseContexts.CreateInstances();
diff --git a/Mundus/Service/GameEventLogController.cs b/Mundus/Service/GameEventLogController.cs
index 65eb9c6..4d11146 100644
--- a/Mundus/Service/GameEventLogController.cs
+++ b/Mundus/Service/GameEventLogController.cs
@@ -1,18 +1,21 @@
-using System;
-using System.Collections.Generic;
-using Mundus.Data;
+namespace Mundus.Service
+{
+ using Mundus.Data;
-namespace Mundus.Service {
- public static class GameEventLogController {
- public static void AddMessage(string logMessage) {
+ public static class GameEventLogController
+ {
+ public static void AddMessage(string logMessage)
+ {
DataBaseContexts.GELContext.AddMessage(logMessage);
}
- public static string GetMessagage(int index) {
+ public static string GetMessagage(int index)
+ {
return (0 <= index && index < GetCount()) ? DataBaseContexts.GELContext.GetMessage(index + 1) : null;
}
- public static int GetCount() {
+ public static int GetCount()
+ {
return DataBaseContexts.GELContext.GetCount();
}
}
diff --git a/Mundus/Service/GameGenerator.cs b/Mundus/Service/GameGenerator.cs
index 17dba54..13d43ca 100644
--- a/Mundus/Service/GameGenerator.cs
+++ b/Mundus/Service/GameGenerator.cs
@@ -1,21 +1,25 @@
-using System;
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Data.Windows;
-using Mundus.Service.SuperLayers.Generators;
+namespace Mundus.Service
+{
+ using System;
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Data.Windows;
+ using Mundus.Service.SuperLayers.Generators;
-namespace Mundus.Service {
- public static class GameGenerator {
+ public static class GameGenerator
+ {
/// <summary>
/// Sets the map size and starts generation of all superlayers
/// </summary>
/// <param name="size">Size of the map ("small", "medium" or "large")</param>
- public static void GenerateMap(string size) {
- switch (size.ToLower()) {
- case "small": Values.CurrMapSize =Values.MapSize.SMALL; break;
+ public static void GenerateMap(string size)
+ {
+ switch (size.ToLower())
+ {
+ case "small": Values.CurrMapSize = Values.MapSize.SMALL; break;
case "medium": Values.CurrMapSize = Values.MapSize.MEDIUM; break;
case "large": Values.CurrMapSize = Values.MapSize.LARGE; break;
- default: throw new ArgumentException( "Map size must be \"small\", \"medium\" or \"large\"" );
+ default: throw new ArgumentException("Map size must be \"small\", \"medium\" or \"large\"");
}
SkySuperLayerGenerator.GenerateAllLayers(Values.CurrMapSize);
@@ -28,8 +32,10 @@ namespace Mundus.Service {
/// Note: certain mobs base their inventory size from the game window size
/// </summary>
/// <param name="size">Size of the game window ("small", "medium" or "large")</param>
- public static void GameWindowSizeSetup(string size) {
- switch (size.ToLower()) {
+ public static void GameWindowSizeSetup(string size)
+ {
+ switch (size.ToLower())
+ {
case "small": WI.SelWin = WI.WSGame; break;
case "medium": WI.SelWin = WI.WMGame; break;
case "large": WI.SelWin = WI.WLGame; break;
@@ -40,7 +46,8 @@ namespace Mundus.Service {
MI.CreateInstances();
}
- public static void GameWindowInitialize() {
+ public static void GameWindowInitialize()
+ {
WI.WPause.GameWindow = WI.SelWin;
WI.SelWin.PrintWorldScreen();
WI.SelWin.PrintMainMenu();
@@ -51,8 +58,10 @@ namespace Mundus.Service {
/// Sets the game difficulty (that affects map generation).
/// </summary>
/// <param name="value">Must be "peaceful", "easy", "normal", "hard" or "insane"</param>
- public static void SetDifficulty(string value) {
- switch(value.ToLower()) {
+ public static void SetDifficulty(string value)
+ {
+ switch (value.ToLower())
+ {
case "peaceful": Values.CurrDifficulty = Values.Difficulty.Peaceful; break;
case "easy": Values.CurrDifficulty = Values.Difficulty.Easy; break;
case "normal": Values.CurrDifficulty = Values.Difficulty.Normal; break;
diff --git a/Mundus/Service/SuperLayers/HeightController.cs b/Mundus/Service/SuperLayers/HeightController.cs
index 0a3afb9..6fa854d 100644
--- a/Mundus/Service/SuperLayers/HeightController.cs
+++ b/Mundus/Service/SuperLayers/HeightController.cs
@@ -15,11 +15,12 @@
/// Contains the order of superlayers, from the one that is the highest (above all others)
/// to the one that is the lowest (underneath all other)
/// </summary>
- private static ISuperLayerContext[] superLayers = {
+ private static ISuperLayerContext[] superLayers =
+ {
DataBaseContexts.SContext,
DataBaseContexts.LContext,
DataBaseContexts.UContext
- };
+ };
/// <summary>
/// Returns the superlayer that is underneath the given one
diff --git a/Mundus/Service/SuperLayers/ImageController.cs b/Mundus/Service/SuperLayers/ImageController.cs
index 5ac1d42..b501091 100644
--- a/Mundus/Service/SuperLayers/ImageController.cs
+++ b/Mundus/Service/SuperLayers/ImageController.cs
@@ -32,16 +32,42 @@
}
else if (layer == Layer.Structure && superLayer.GetStructureLayerStock(y, x) != null)
{
- img = new Image(GetPlayerStructureStockID(y, x), IconSize.Dnd );
+ img = new Image(GetPlayerStructureStockID(y, x), IconSize.Dnd);
}
else if (layer == Layer.Mob && superLayer.GetMobLayerStock(y, x) != null)
{
img = new Image(superLayer.GetMobLayerStock(y, x), IconSize.Dnd);
}
+
return img;
}
/// <summary>
+ /// Returns the Image on the given inventory place of the player at the given index
+ /// If there isn't one, returns a "blank" image
+ /// </summary>
+ public static Image GetPlayerInventoryImage(InventoryPlace place, int index) {
+ string stock_id = "blank";
+
+ if (MI.Player.Inventory.GetItemTile(place, index) != null) {
+ // Structures have two icons, one when they are placed and one when they are in the inventory
+ // All other item types have only one icon.
+ if (MI.Player.Inventory.GetItemTile(place, index).GetType() == typeof(Structure)) {
+ stock_id = ((Structure)MI.Player.Inventory.GetItemTile(place, index)).inventory_stock_id;
+ }
+ else {
+ stock_id = MI.Player.Inventory.GetItemTile(place, index).stock_id;
+ }
+ }
+ // Accessories and gear menus have a different blank icon
+ else if (place == InventoryPlace.Accessories || place == InventoryPlace.Gear) {
+ stock_id = "blank_gear";
+ }
+
+ return new Image(stock_id, IconSize.Dnd);
+ }
+
+ /// <summary>
/// Returns the stock_id at the given position in player's superlayer
/// If there is no stock_id, returns "L_hole"
/// </summary>
@@ -65,6 +91,7 @@
{
return superLayer.GetStructureLayerStock(y, x);
}
+
return "blank";
}
@@ -75,35 +102,5 @@
{
return y >= 0 && x >= 0 && x < (int)Values.CurrMapSize && y < (int)Values.CurrMapSize;
}
-
- /// <summary>
- /// Returns the Image on the given inventory place of the player at the given index
- /// If there isn't one, returns a "blank" image
- /// </summary>
- public static Image GetPlayerInventoryImage(InventoryPlace place, int index)
- {
- string stock_id = "blank";
-
- if (MI.Player.Inventory.GetItemTile(place, index) != null)
- {
- // Structures have two icons, one when they are placed and one when they are in the inventory
- // All other item types have only one icon.
- if (MI.Player.Inventory.GetItemTile(place, index).GetType() == typeof(Structure))
- {
- stock_id = ((Structure)MI.Player.Inventory.GetItemTile(place, index)).inventory_stock_id;
- }
- else
- {
- stock_id = MI.Player.Inventory.GetItemTile(place, index).stock_id;
- }
- }
- // Accessories and gear menus have a different blank icon
- else if (place == InventoryPlace.Accessories || place == InventoryPlace.Gear)
- {
- stock_id = "blank_gear";
- }
-
- return new Image(stock_id, IconSize.Dnd);
- }
}
}
diff --git a/Mundus/Service/Tiles/Crafting/CraftingRecipe.cs b/Mundus/Service/Tiles/Crafting/CraftingRecipe.cs
index 3d495a3..1bdb625 100644
--- a/Mundus/Service/Tiles/Crafting/CraftingRecipe.cs
+++ b/Mundus/Service/Tiles/Crafting/CraftingRecipe.cs
@@ -8,11 +8,6 @@
[Table("CraftingRecipes", Schema = "Mundus")]
public class CraftingRecipe
{
- /// <summary>
- /// Required fifth item
- /// </summary>
- public string ReqItem5 { get; private set; }
-
public CraftingRecipe(string resultItem, int count1, string reqItem1) : this(resultItem, count1, reqItem1, 0, null, 0, null, 0, null, 0, null)
{
}
@@ -59,49 +54,54 @@
public string ResultItem { get; private set; }
/// <summary>
- /// Required amount of the first item
+ /// Gets the required amount of the first item
/// </summary>
public int Count1 { get; private set; }
/// <summary>
- /// Required first item
+ /// Gets the required first item
/// </summary>
public string ReqItem1 { get; private set; }
/// <summary>
- /// Required amount of the second item
+ /// Gets the required amount of the second item
/// </summary>
public int Count2 { get; private set; }
/// <summary>
- /// Required second item
+ /// Gets the required second item
/// </summary>
public string ReqItem2 { get; private set; }
/// <summary>
- /// Required amount of the third item
+ /// Gets the required amount of the third item
/// </summary>
public int Count3 { get; private set; }
/// <summary>
- /// Required third item
+ /// Gets the required third item
/// </summary>
public string ReqItem3 { get; private set; }
/// <summary>
- /// Required amount of the fourth item
+ /// Gets the required amount of the fourth item
/// </summary>
public int Count4 { get; private set; }
/// <summary>
- /// Required fourth item
+ /// Gets the required fourth item
/// </summary>
public string ReqItem4 { get; private set; }
/// <summary>
- /// Required amount of the fifth item
+ /// Gets the required amount of the fifth item
/// </summary>
public int Count5 { get; private set; }
+
+ /// <summary>
+ /// Gets the required fifth item
+ /// </summary>
+ public string ReqItem5 { get; private set; }
/// <summary>
/// Checks if the given array of items has enough of every requried item
diff --git a/Mundus/Service/Tiles/ITile.cs b/Mundus/Service/Tiles/ITile.cs
index c6c4d17..564edbe 100644
--- a/Mundus/Service/Tiles/ITile.cs
+++ b/Mundus/Service/Tiles/ITile.cs
@@ -1,8 +1,7 @@
-using Gtk;
-
-namespace Mundus.Service.Tiles {
- public interface ITile {
+namespace Mundus.Service.Tiles
+{
+ public interface ITile
+ {
string stock_id { get; }
- Image Texture { get; }
}
}
diff --git a/Mundus/Service/Tiles/Items/ItemController.cs b/Mundus/Service/Tiles/Items/ItemController.cs
index 13e03cd..172b622 100644
--- a/Mundus/Service/Tiles/Items/ItemController.cs
+++ b/Mundus/Service/Tiles/Items/ItemController.cs
@@ -1,45 +1,62 @@
-using System;
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Data.Windows;
-using Mundus.Service.Tiles.Items.Types;
-using static Mundus.Data.Values;
-using static Mundus.Service.Tiles.Mobs.Inventory;
-
-namespace Mundus.Service.Tiles.Items {
- public static class ItemController {
+namespace Mundus.Service.Tiles.Items
+{
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Data.Windows;
+ using Mundus.Service.Tiles.Items.Types;
+ using static Mundus.Service.Tiles.Mobs.Inventory;
+
+ /// <summary>
+ /// Contains the item that the player has selected and switches it's location
+ /// </summary>
+ public static class ItemController
+ {
private static ItemTile[] selItemLocation;
+
+ /// <summary>
+ /// Gets the index of the selected item in the selected item location
+ /// </summary>
public static int SelItemIndex { get; private set; }
+ /// <summary>
+ /// Gets the inventory place in which the selected item is stored
+ /// </summary>
public static InventoryPlace SelItemPlace { get; private set; }
/// <summary>
/// Sets the item that will be moved (switched)
/// </summary>
- public static void SelectItem(InventoryPlace place, int index) {
+ public static void SelectItem(InventoryPlace place, int index)
+ {
+ selItemLocation = GetPlayerInventoryArray(place);
+
SelItemPlace = place;
- selItemLocation = GetInventoryArray(place);
SelItemIndex = index;
WI.SelWin.PrintSelectedItemInfo(selItemLocation[SelItemIndex]);
}
/// <summary>
- /// Tries to switch the location of the originally selected item (origin) with the currently selected item
+ /// Tries to switch the location of the selected item with the given one
+ /// If a material is moved to it's current location (double clicked), and
+ /// it can restore energy, it restores the player's energy
/// </summary>
- public static void SwitchItems(InventoryPlace destination, int index) {
- ItemTile[] destinationLocation = GetInventoryArray(destination);
+ public static void SwitchItems(InventoryPlace destination, int index)
+ {
+ ItemTile[] destinationLocation = GetPlayerInventoryArray(destination);
ItemTile toTransfer = selItemLocation[SelItemIndex];
- if (toTransfer != null) {
+ if (toTransfer != null)
+ {
// Consumable materials can be consumed by double clicking on them (transfering them to their current location)
- if (toTransfer == destinationLocation[index]) {
- if (toTransfer.GetType() == typeof(Material) &&
- PlayerTryEat((Material)toTransfer)) {
+ if (toTransfer == destinationLocation[index])
+ {
+ if (toTransfer.GetType() == typeof(Material) && PlayerDidEat((Material)toTransfer))
+ {
selItemLocation[SelItemIndex] = null;
}
}
- else if (ItemCanGoThere(toTransfer, destination)) {
+ else if (ItemCanGoThere(toTransfer, destination))
+ {
selItemLocation[SelItemIndex] = destinationLocation[index];
destinationLocation[index] = toTransfer;
}
@@ -48,16 +65,32 @@ namespace Mundus.Service.Tiles.Items {
ResetSelection();
}
- public static void ResetSelection() {
+ /// <summary>
+ /// Sets the selected item place and index to invalid values
+ /// </summary>
+ public static void ResetSelection()
+ {
selItemLocation = null;
- SelItemIndex = -1;
+ SelItemIndex = -1;
SelItemPlace = 0;
}
- // Certain item types can only be placed inside certain inventory places.
- private static ItemTile[] GetInventoryArray(InventoryPlace place) {
- switch (place) {
+ /// <summary>
+ /// Returns whether an item has been selected
+ /// </summary>
+ public static bool HasSelectedItem()
+ {
+ return selItemLocation != null && SelItemIndex > -1;
+ }
+
+ /// <summary>
+ /// Returns an ItemTile array, corresponding to a given place inside the player's inventory
+ /// </summary>
+ private static ItemTile[] GetPlayerInventoryArray(InventoryPlace place)
+ {
+ switch (place)
+ {
case InventoryPlace.Hotbar: return MI.Player.Inventory.Hotbar;
case InventoryPlace.Items: return MI.Player.Inventory.Items;
case InventoryPlace.Accessories: return MI.Player.Inventory.Accessories;
@@ -66,8 +99,13 @@ namespace Mundus.Service.Tiles.Items {
}
}
- private static bool ItemCanGoThere(ItemTile toTransfer, InventoryPlace place) {
- switch (place) {
+ /// <summary>
+ /// Checks if the given ItemTile can be inside the given destination
+ /// </summary>
+ private static bool ItemCanGoThere(ItemTile toTransfer, InventoryPlace place)
+ {
+ switch (place)
+ {
case InventoryPlace.Hotbar: return toTransfer.GetType() != typeof(GroundTile);
case InventoryPlace.Items: return true;
case InventoryPlace.Accessories: return toTransfer.GetType() == typeof(Gear);
@@ -76,15 +114,18 @@ namespace Mundus.Service.Tiles.Items {
}
}
- public static bool HasSelectedItem() {
- return selItemLocation != null && SelItemIndex != -1;
- }
-
- private static bool PlayerTryEat(Material material) {
- if (material.EnergyRestorePoints > 0) {
+ /// <summary>
+ /// If the given material can restore energy, it restores that player's energy and returns true
+ /// </summary>
+ private static bool PlayerDidEat(Material material)
+ {
+ if (material.EnergyRestorePoints > 0)
+ {
MI.Player.RestoreEnergy(material.EnergyRestorePoints);
+
return true;
}
+
return false;
}
}
diff --git a/Mundus/Service/Tiles/Items/ItemTile.cs b/Mundus/Service/Tiles/Items/ItemTile.cs
index 4b6b6d7..83c5590 100644
--- a/Mundus/Service/Tiles/Items/ItemTile.cs
+++ b/Mundus/Service/Tiles/Items/ItemTile.cs
@@ -1,17 +1,16 @@
-using Gtk;
-using Mundus.Service.Tiles;
-
-namespace Mundus.Service.Tiles.Items {
- public abstract class ItemTile : ITile {
+namespace Mundus.Service.Tiles.Items
+{
+ public abstract class ItemTile : ITile
+ {
public string stock_id { get; private set; }
- public Image Texture { get; private set; }
- public ItemTile(ItemTile item) :this(item.stock_id)
- { }
+ public ItemTile(ItemTile item) : this(item.stock_id)
+ {
+ }
- public ItemTile(string stock_id) {
+ public ItemTile(string stock_id)
+ {
this.stock_id = stock_id;
- this.Texture = new Image( stock_id, IconSize.Dnd );
}
}
}
diff --git a/Mundus/Service/Tiles/Items/Presets/GroundPresets.cs b/Mundus/Service/Tiles/Items/Presets/GroundPresets.cs
index 9ec33eb..f763309 100644
--- a/Mundus/Service/Tiles/Items/Presets/GroundPresets.cs
+++ b/Mundus/Service/Tiles/Items/Presets/GroundPresets.cs
@@ -1,16 +1,21 @@
-using Mundus.Service.Tiles.Items.Types;
+
+namespace Mundus.Service.Tiles.Items.Presets
+{
+ using Mundus.Service.Tiles.Items.Types;
-namespace Mundus.Service.Tiles.Items.Presets {
- public static class GroundPresets {
+ public static class GroundPresets
+ {
private static GroundTile sSky = new GroundTile("S_sky", -1, false);
private static GroundTile lGrass = new GroundTile("L_grass", 1);
private static GroundTile uRoche = new GroundTile("U_roche", 10);
- public static GroundTile GetSSky() {
+ public static GroundTile GetSSky()
+ {
return sSky;
}
- public static GroundTile GetLGrass() {
+ public static GroundTile GetLGrass()
+ {
return lGrass;
}
@@ -18,8 +23,10 @@ namespace Mundus.Service.Tiles.Items.Presets {
return uRoche;
}
- public static GroundTile GetFromStock(string stock_id) {
- switch(stock_id) {
+ public static GroundTile GetFromStock(string stock_id)
+ {
+ switch (stock_id)
+ {
case "S_sky": return GetSSky();
case "L_grass": return GetLGrass();
case "U_roche": return GetURoche();
diff --git a/Mundus/Service/Tiles/Items/Presets/MaterialPresets.cs b/Mundus/Service/Tiles/Items/Presets/MaterialPresets.cs
index 0f2d44b..9b5ac1e 100644
--- a/Mundus/Service/Tiles/Items/Presets/MaterialPresets.cs
+++ b/Mundus/Service/Tiles/Items/Presets/MaterialPresets.cs
@@ -1,29 +1,35 @@
-using Mundus.Service.Tiles.Items.Types;
+namespace Mundus.Service.Tiles.Items.Presets
+{
+ using Mundus.Service.Tiles.Items.Types;
-namespace Mundus.Service.Tiles.Items.Presets {
- public static class MaterialPresets {
+ public static class MaterialPresets
+ {
/// <returns>New instance</returns>
- public static Material GetALandRock() {
+ public static Material GetALandRock()
+ {
return new Material("L_rock");
}
/// <returns>New instance</returns>
- public static Material GetALandStick() {
+ public static Material GetALandStick()
+ {
return new Material("L_stick");
}
/// <returns>New instance</returns>
- public static Material GetALandBeefSteak() {
+ public static Material GetALandBeefSteak()
+ {
return new Material("L_beef_steak", 5);
}
// <returns>New instance</returns>
- public static Material GetALandMuttonSteak() {
+ public static Material GetALandMuttonSteak()
+ {
return new Material("L_mutton_steak", 4);
}
/// <summary>
- /// (TEMPORARY)
+ /// TEMPORARY
/// </summary>
public static Material GetAStone() {
return new Material("U_stone");
diff --git a/Mundus/Service/Tiles/Items/Presets/StructurePresets.cs b/Mundus/Service/Tiles/Items/Presets/StructurePresets.cs
index f2ca7ea..b16a952 100644
--- a/Mundus/Service/Tiles/Items/Presets/StructurePresets.cs
+++ b/Mundus/Service/Tiles/Items/Presets/StructurePresets.cs
@@ -1,30 +1,38 @@
-using Mundus.Service.Tiles.Items.Types;
-using static Mundus.Data.Values;
+namespace Mundus.Service.Tiles.Items.Presets
+{
+ using Mundus.Service.Tiles.Items.Types;
+ using static Mundus.Data.Values;
-namespace Mundus.Service.Tiles.Items.Presets {
- public static class StructurePresets {
+ public static class StructurePresets
+ {
private static Structure lBoulder = new Structure("L_boulder", "L_boulder_inventory", 7, ToolType.Pickaxe, 1, false, false, MaterialPresets.GetALandRock());
private static Structure lTree = new Structure("L_tree", "L_tree_inventory", 5, ToolType.Axe, 1, false, false, MaterialPresets.GetALandStick());
private static Structure uRock = new Structure("U_rock", "U_rock", 10, ToolType.Pickaxe, 2, false, false, MaterialPresets.GetAStone());
- public static Structure GetLBoulder() {
+ public static Structure GetLBoulder()
+ {
return lBoulder;
}
- public static Structure GetLTree() {
+ public static Structure GetLTree()
+ {
return lTree;
}
- public static Structure GetURock() {
+ public static Structure GetURock()
+ {
return uRock;
}
- public static Structure GetAWoodenLadder() {
+ public static Structure GetAWoodenLadder()
+ {
return new Structure("L_wooden_ladder", "L_wooden_ladder_inventory", 1, ToolType.Axe, 1, true, true);
}
- public static Structure GetFromStock(string stock_id) {
- switch(stock_id) {
+ public static Structure GetFromStock(string stock_id)
+ {
+ switch (stock_id)
+ {
case "L_boulder": return GetLBoulder();
case "L_tree": return GetLTree();
case "U_rock": return GetURock();
diff --git a/Mundus/Service/Tiles/Items/Presets/ToolPresets.cs b/Mundus/Service/Tiles/Items/Presets/ToolPresets.cs
index 791e77c..04d6798 100644
--- a/Mundus/Service/Tiles/Items/Presets/ToolPresets.cs
+++ b/Mundus/Service/Tiles/Items/Presets/ToolPresets.cs
@@ -1,42 +1,54 @@
-using Mundus.Service.Tiles.Items.Types;
-using static Mundus.Data.Values;
-
-namespace Mundus.Service.Tiles.Items.Presets {
- public static class ToolPresets {
- public static Tool GetAWoodenPickaxe() {
+namespace Mundus.Service.Tiles.Items.Presets
+{
+ using Mundus.Service.Tiles.Items.Types;
+ using static Mundus.Data.Values;
+
+ public static class ToolPresets
+ {
+ public static Tool GetAWoodenPickaxe()
+ {
return new Tool("wooden_pickaxe", ToolType.Pickaxe, 1);
}
- public static Tool GetAWoodenAxe() {
+ public static Tool GetAWoodenAxe()
+ {
return new Tool("wooden_axe", ToolType.Axe, 1);
}
- public static Tool GetAWoodenShovel() {
+ public static Tool GetAWoodenShovel()
+ {
return new Tool("wooden_shovel", ToolType.Shovel, 1);
}
- public static Tool GetAWoodenLongsword() {
+ public static Tool GetAWoodenLongsword()
+ {
return new Tool("wooden_longsword", ToolType.Sword, 2);
}
- public static Tool GetARockPickaxe() {
+ public static Tool GetARockPickaxe()
+ {
return new Tool("rock_pickaxe", ToolType.Pickaxe, 2);
}
- public static Tool GetARockAxe() {
+ public static Tool GetARockAxe()
+ {
return new Tool("rock_axe", ToolType.Axe, 2);
}
- public static Tool GetARockShovel() {
+ public static Tool GetARockShovel()
+ {
return new Tool("rock_shovel", ToolType.Shovel, 2);
}
- public static Tool GetARockLongsword() {
+ public static Tool GetARockLongsword()
+ {
return new Tool("rock_longsword", ToolType.Sword, 4);
}
- public static Tool GetFromStock(string stock_id) {
- switch(stock_id) {
+ public static Tool GetFromStock(string stock_id)
+ {
+ switch (stock_id)
+ {
case "wooden_pickaxe": return GetAWoodenPickaxe();
case "wooden_axe": return GetAWoodenAxe();
case "wooden_shovel": return GetAWoodenShovel();
diff --git a/Mundus/Service/Tiles/Items/Types/Gear.cs b/Mundus/Service/Tiles/Items/Types/Gear.cs
index 52f8d9d..4dbfbc9 100644
--- a/Mundus/Service/Tiles/Items/Types/Gear.cs
+++ b/Mundus/Service/Tiles/Items/Types/Gear.cs
@@ -1,12 +1,17 @@
-namespace Mundus.Service.Tiles.Items.Types {
- public class Gear : ItemTile {
+namespace Mundus.Service.Tiles.Items.Types
+{
+ public class Gear : ItemTile
+ {
public Gear(Gear gear) : base(gear.stock_id)
- { }
+ {
+ }
public Gear(string stock_id) : base(stock_id)
- { }
+ {
+ }
- public override string ToString() {
+ public override string ToString()
+ {
return $"Gear | ID: {stock_id}";
}
}
diff --git a/Mundus/Service/Tiles/Items/Types/GroundTile.cs b/Mundus/Service/Tiles/Items/Types/GroundTile.cs
index 215ff96..8e2280d 100644
--- a/Mundus/Service/Tiles/Items/Types/GroundTile.cs
+++ b/Mundus/Service/Tiles/Items/Types/GroundTile.cs
@@ -1,26 +1,31 @@
-using Gtk;
-using static Mundus.Data.Values;
+namespace Mundus.Service.Tiles.Items.Types
+{
+ using static Mundus.Data.Values;
+
+ public class GroundTile : ItemTile
+ {
+ public GroundTile(GroundTile groundTile) :this(groundTile.stock_id, groundTile.ReqShovelClass, groundTile.Solid)
+ {
+ }
+
+ public GroundTile(string stock_id, int reqShovelClass, bool solid = true) : base(stock_id)
+ {
+ this.ReqShovelClass = reqShovelClass;
+ this.Solid = solid;
+ }
-namespace Mundus.Service.Tiles.Items.Types {
- public class GroundTile : ItemTile {
/// <summary>
- /// Required minimal shovel class for destroying the ground tile
+ /// Gets the required minimal shovel class for destroying the ground tile
/// </summary>
public int ReqShovelClass { get; private set; }
+
/// <summary>
- /// Determines whether mobs can go through and structures can be placed (if not solid)
+ /// Gets whether mobs can go through and structures can be placed (if not solid)
/// </summary>
public bool Solid { get; private set; }
- public GroundTile(GroundTile groundTile) :this(groundTile.stock_id, groundTile.ReqShovelClass, groundTile.Solid)
- { }
-
- public GroundTile(string stock_id, int reqShovelClass, bool solid = true) :base(stock_id) {
- this.ReqShovelClass = reqShovelClass;
- this.Solid = solid;
- }
-
- public override string ToString() {
+ public override string ToString()
+ {
return $"GroundTile | ID: {this.stock_id} TT: {ToolType.Shovel} TC: {this.ReqShovelClass}";
}
}
diff --git a/Mundus/Service/Tiles/Items/Types/Material.cs b/Mundus/Service/Tiles/Items/Types/Material.cs
index 565713e..acee078 100644
--- a/Mundus/Service/Tiles/Items/Types/Material.cs
+++ b/Mundus/Service/Tiles/Items/Types/Material.cs
@@ -1,23 +1,29 @@
-namespace Mundus.Service.Tiles.Items.Types {
- public class Material : ItemTile {
- /// <summary>
- /// Certain materials can be eaten to replenish energy points. This stores by how much to restore energy points.
- /// Note: If a material mustn't be consumed, his energy points should be less or equal to 0
- /// </summary>
- public double EnergyRestorePoints { get; private set; }
-
+namespace Mundus.Service.Tiles.Items.Types
+{
+ public class Material : ItemTile
+ {
public Material(Material material) : this(material.stock_id, material.EnergyRestorePoints)
- { }
+ {
+ }
public Material(string stock_id, double energyRestorePoints = -1) : base(stock_id)
{
this.EnergyRestorePoints = energyRestorePoints;
}
- public override string ToString() {
- if (EnergyRestorePoints > 0) {
+ /// <summary>
+ /// Certain materials can be eaten to replenish energy points. This stores by how much to restore energy points.
+ /// Note: If a material mustn't be consumed, his energy points should be less or equal to 0
+ /// </summary>
+ public double EnergyRestorePoints { get; private set; }
+
+ public override string ToString()
+ {
+ if (this.EnergyRestorePoints > 0)
+ {
return $"Material | ID: {this.stock_id} EnergyRP: {this.EnergyRestorePoints}";
}
+
return $"Material | ID: {this.stock_id}";
}
}
diff --git a/Mundus/Service/Tiles/Items/Types/Structure.cs b/Mundus/Service/Tiles/Items/Types/Structure.cs
index 8b84978..a9dfaf7 100644
--- a/Mundus/Service/Tiles/Items/Types/Structure.cs
+++ b/Mundus/Service/Tiles/Items/Types/Structure.cs
@@ -1,54 +1,64 @@
-using static Mundus.Data.Values;
+namespace Mundus.Service.Tiles.Items.Types
+{
+ using static Mundus.Data.Values;
-namespace Mundus.Service.Tiles.Items.Types {
- public class Structure : ItemTile {
+ public class Structure : ItemTile
+ {
private Material droppedMaterial;
+ public Structure(Structure structure) :this(structure.stock_id, structure.inventory_stock_id, structure.Health, structure.ReqToolType, structure.ReqToolClass, structure.IsWalkable,
+ structure.IsWalkable, (structure.droppedMaterial != null)?new Material(structure.droppedMaterial.stock_id):null)
+ {
+ }
+
+ public Structure(string stock_id, string inventory_stock_id, int health, ToolType reqToolType, int reqToolClass, bool isWalkable = false, bool isClimable = false, Material droppedMaterial = null) : base(stock_id)
+ {
+ this.inventory_stock_id = inventory_stock_id;
+ this.Health = health;
+ this.ReqToolType = reqToolType;
+ this.ReqToolClass = reqToolClass;
+ this.IsWalkable = isWalkable;
+ this.IsClimable = isClimable;
+ this.droppedMaterial = droppedMaterial;
+ }
+
/// <summary>
- /// stock_id for when the structure is in an inventory
+ /// Gets the stock_id for when the structure is in an inventory
/// </summary>
public string inventory_stock_id { get; private set; }
+
/// <summary>
- /// Required type of tool to break the structure
+ /// Gets the required type of tool to break the structure
/// </summary>
public ToolType ReqToolType { get; private set; }
+
/// <summary>
- /// Required minimal tool class to break the structure
+ /// Gets the required minimal tool class to break the structure
/// </summary>
public int ReqToolClass { get; private set; }
+
public int Health { get; private set; }
/// <summary>
- /// Determines whether mobs can change superlayers (climb up or down a superlayer ; true) or not (false)
+ /// Gets whether mobs can change superlayers (climb up or down a superlayer ; true) or not (false)
/// </summary>
public bool IsClimable { get; private set; }
+
/// <summary>
- /// Determines whether mob can walk on top of the structure (true) or not (false)
+ /// Gets whether mob can walk on top of the structure (true) or not (false)
/// </summary>
public bool IsWalkable { get; private set; }
-
- public Structure(Structure structure) :this(structure.stock_id, structure.inventory_stock_id, structure.Health, structure.ReqToolType, structure.ReqToolClass, structure.IsWalkable,
- structure.IsWalkable, (structure.droppedMaterial != null)?new Material(structure.droppedMaterial.stock_id):null) {
- }
-
- public Structure(string stock_id, string inventory_stock_id, int health, ToolType reqToolType, int reqToolClass, bool isWalkable = false, bool isClimable = false, Material droppedMaterial = null) : base(stock_id) {
- this.inventory_stock_id = inventory_stock_id;
- this.Health = health;
- this.ReqToolType = reqToolType;
- this.ReqToolClass = reqToolClass;
- this.IsWalkable = isWalkable;
- this.IsClimable = isClimable;
- this.droppedMaterial = droppedMaterial;
- }
-
/// <summary>
/// Returns what the structure drops after being broken
/// </summary>
- public ItemTile GetDrop() {
- if (droppedMaterial == null) {
+ public ItemTile GetDrop()
+ {
+ if (this.droppedMaterial == null)
+ {
return this;
}
+
return droppedMaterial;
}
@@ -56,14 +66,16 @@ namespace Mundus.Service.Tiles.Items.Types {
/// Removes health from structure
/// </summary>
/// <returns>Whether the structure can still be damaged</returns>
- public bool TakeDamage(int damagePoints) {
+ public bool TakeDamage(int damagePoints)
+ {
this.Health -= damagePoints;
return this.Health > 0;
}
- public override string ToString() {
+ public override string ToString()
+ {
return $"Structure | ID: {this.stock_id} H: {this.Health} TT: {this.ReqToolType} TC: {this.ReqToolClass} " +
- $"W: {this.IsWalkable} DM ID: {((droppedMaterial != null)?this.droppedMaterial.stock_id:null)}";
+ $"W: {this.IsWalkable} DM ID: {((this.droppedMaterial != null) ? this.droppedMaterial.stock_id : null)}";
}
}
}
diff --git a/Mundus/Service/Tiles/Items/Types/Tool.cs b/Mundus/Service/Tiles/Items/Types/Tool.cs
index 424a15a..901b503 100644
--- a/Mundus/Service/Tiles/Items/Types/Tool.cs
+++ b/Mundus/Service/Tiles/Items/Types/Tool.cs
@@ -1,19 +1,25 @@
-using static Mundus.Data.Values;
+namespace Mundus.Service.Tiles.Items.Types
+{
+ using static Mundus.Data.Values;
-namespace Mundus.Service.Tiles.Items.Types {
- public class Tool : ItemTile {
- public ToolType Type { get; private set; }
- public int Class { get; private set; }
-
- public Tool(Tool tool) : this(tool.stock_id, tool.Type, tool.Class)
- { }
+ public class Tool : ItemTile
+ {
+ public Tool(Tool tool) : this(tool.stock_id, tool.Type, tool.Class)
+ {
+ }
- public Tool(string stock_id, ToolType toolType, int toolClass) : base(stock_id) {
+ public Tool(string stock_id, ToolType toolType, int toolClass) : base(stock_id)
+ {
this.Type = toolType;
this.Class = toolClass;
}
- public override string ToString() {
+ public ToolType Type { get; private set; }
+
+ public int Class { get; private set; }
+
+ public override string ToString()
+ {
return $"Tool | ID: {this.stock_id} Type: {this.Type} Class: {this.Class}";
}
}
diff --git a/Mundus/Service/Tiles/Mobs/Controllers/MobFighting.cs b/Mundus/Service/Tiles/Mobs/Controllers/MobFighting.cs
index 3b813d3..d1e8744 100644
--- a/Mundus/Service/Tiles/Mobs/Controllers/MobFighting.cs
+++ b/Mundus/Service/Tiles/Mobs/Controllers/MobFighting.cs
@@ -1,97 +1,116 @@
-using System.Linq;
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Items.Types;
-using Mundus.Service.Tiles.Mobs.LandMobs;
+namespace Mundus.Service.Tiles.Mobs.Controllers
+{
+ using System;
+ using System.Linq;
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Service.Tiles.Items.Types;
+ using Mundus.Service.Tiles.Mobs.LandMobs;
+ using static Mundus.Data.Values;
-namespace Mundus.Service.Tiles.Mobs.Controllers {
- public static class MobFighting {
+ public static class MobFighting
+ {
/// <summary>
/// Returns if for the specified position in the superlayer the payer is in, there exists a mob
+ /// Returns false also if the specified positoin is the player's current position
/// </summary>
- /// <param name="mapYPos">YPos of target mob</param>
- /// <param name="mapXPos">XPos of target mob</param>
- public static bool ExistsFightTargetForPlayer(int mapYPos, int mapXPos) {
+ public static bool ExistsFightTargetForPlayer(int mapYPos, int mapXPos)
+ {
return ExistsFightTargetForMob(MI.Player, mapYPos, mapXPos);
}
/// <summary>
+ /// The player tries to damage mob on the specified map position
+ /// Note: will fail of the player uses an invalid tool to fight with
+ /// </summary>
+ public static void PlayerTryFight(int mapYPos, int mapXPos)
+ {
+ if (PlayerTryFightWithMobAtPosition(mapYPos, mapXPos))
+ {
+ MI.Player.DrainEnergy(TAKEN_ENERGY_FROM_FIGHTING + DifficultyValueModifier());
+ }
+ }
+
+ /// <summary>
/// Returns if for the specified position in the superlayer the given mob is in, there exists a mob
+ /// Returns false also if the specified positoin is the mob's current position
/// </summary>
- /// <param name="mapYPos">YPos of target mob</param>
- /// <param name="mapXPos">XPos of target mob</param>
- public static bool ExistsFightTargetForMob(MobTile mob, int mapYPos, int mapXPos) {
+ private static bool ExistsFightTargetForMob(MobTile mob, int mapYPos, int mapXPos)
+ {
return mob.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos) != null &&
- (mob.YPos != mapYPos && mob.XPos != mapXPos);
+ !(mob.YPos == mapYPos && mob.XPos == mapXPos);
}
- private const double TAKEN_ENERGY_FROM_FIGHTING = 0.5;
/// <summary>
- /// The player tries to damage (or kill) mob on the specified map position
- /// Note: will fail of the player uses an invalid item
+ /// The given mob tries to damage the mob on the specified map position
+ /// Note: will fail of the given mob uses an invalid item
/// </summary>
- /// <param name="selPlace">Inventory place of the selected item (item will be checked if its a valid tool)</param>
- /// <param name="selIndex">Inventory index of the selected item place (item will be checked if its a valid tool)</param>
- /// <param name="mapYPos">YPos of target mob</param>
- /// <param name="mapXPos">XPos of target mob</param>
- public static void PlayerTryFight(int mapYPos, int mapXPos) {
- if (MobTryFight(MI.Player, mapYPos, mapXPos)) {
- MI.Player.DrainEnergy(TAKEN_ENERGY_FROM_FIGHTING + Values.DifficultyValueModifier());
+ private static bool PlayerTryFightWithMobAtPosition(int mapYPos, int mapXPos)
+ {
+ if (PlayerCanFightWithMob(mapYPos, mapXPos))
+ {
+ Tool selTool = (Tool)Inventory.GetPlayerItemFromItemSelection();
+ MobTile targetMob = LandMobsPresets.GetFromStock(MI.Player.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos));
+
+ if (selTool.Class >= targetMob.Defense)
+ {
+ targetMob.XPos = mapXPos;
+ targetMob.YPos = mapYPos;
+
+ PlayerFightWithMob(targetMob, selTool);
+ return true;
+ }
+
+ GameEventLogController.AddMessage($"You need a tool class of atleast {targetMob.Defense} to fight this mob");
+ }
+ else if (MI.Player.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos) == null)
+ {
+ GameEventLogController.AddMessage($"There is no mob to fight on \"{MI.Player.CurrSuperLayer}\" at Y:{mapYPos}, X:{mapXPos}");
+ }
+ else
+ {
+ GameEventLogController.AddMessage($"You need a Tool of type {Values.ToolType.Sword} to fight with other mobs");
}
+
+ return false;
}
- // Checks if the mob has a proper fighting item selected
- private static bool MobCanFight(MobTile mob, int mapYPos, int mapXPos) {
+ /// <summary>
+ /// Checks if there exists a mob at the given location in the player's superlayer
+ /// and if the player has selected a proper fighting tool
+ /// </summary>
+ private static bool PlayerCanFightWithMob(int mapYPos, int mapXPos)
+ {
return Inventory.GetPlayerItemFromItemSelection().GetType() == typeof(Tool) &&
- ((Tool)Inventory.GetPlayerItemFromItemSelection()).Type == Values.ToolType.Sword &&
- mob.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos) != null;
+ ((Tool)Inventory.GetPlayerItemFromItemSelection()).Type == ToolType.Sword &&
+ MI.Player.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos) != null;
}
/// <summary>
- /// The given mob tries to damage (or kill) mob on the specified map position
- /// Note: will fail of the given mob uses an invalid item
+ /// Reduces health of target mob
/// </summary>
- /// <returns><c>true</c> If mob was able to fight <c>false</c> otherwise.</returns>
- /// <param name="mob">Mob that will fight</param>
- /// <param name="selPlace">Inventory place of the selected item (item will be checked if its a valid tool)</param>
- /// <param name="selIndex">Inventory index of the selected item place (item will be checked if its a valid tool)</param>
- /// <param name="mapYPos">YPos of target mob</param>
- /// <param name="mapXPos">XPos of target mob</param>
- public static bool MobTryFight(MobTile mob, int mapYPos, int mapXPos) {
- if (MobCanFight(mob, mapYPos, mapXPos)) {
- Tool selTool = (Tool)Inventory.GetPlayerItemFromItemSelection();
- MobTile targetMob = LandMobsPresets.GetFromStock(mob.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos));
+ private static void PlayerFightWithMob(MobTile targetMob, Tool selTool)
+ {
+ int damagePoints = 1 + (selTool.Class - targetMob.Defense);
- if (selTool.Class >= targetMob.Defense) {
- int damagePoints = 1 + (selTool.Class - targetMob.Defense);
+ if (!MI.Player.CurrSuperLayer.TakeDamageMobAtPosition(targetMob.YPos, targetMob.XPos, damagePoints))
+ {
+ MI.Player.CurrSuperLayer.RemoveMobFromPosition(targetMob.YPos, targetMob.XPos);
- if (!mob.CurrSuperLayer.TakeDamageMobAtPosition(mapYPos, mapXPos, damagePoints)) {
- mob.CurrSuperLayer.RemoveMobFromPosition(mapYPos, mapXPos);
+ targetMob.XPos = -1;
+ targetMob.YPos = -1;
- if (mob.Inventory.Items.Contains(null)) {
- mob.Inventory.AppendToItems(targetMob.DroppedUponDeath);
- }
-
- if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Player killed \"{targetMob.stock_id}\"");
- }
- } else if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Player did {damagePoints} damage to \"{targetMob.stock_id}\"");
- }
- return true;
+ if (MI.Player.Inventory.Items.Contains(null))
+ {
+ MI.Player.Inventory.AppendToItems(targetMob.DroppedUponDeath);
}
- else if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"You need a tool class of atleast {targetMob.Defense} to fight this mob");
- }
- }
- else if (mob.CurrSuperLayer.GetMobLayerStock(mapYPos, mapXPos) == null && mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"There is no mob to fight on \"{mob.CurrSuperLayer}\" at Y:{mapYPos}, X:{mapXPos}");
+
+ GameEventLogController.AddMessage($"Player killed \"{targetMob.stock_id}\"");
}
- else if (mob.GetType() == typeof(Player)) { // Inventory.GetPlayerItem(selPlace, selIndex).GetType() != typeof(Tool) || ((Tool)Inventory.GetPlayerItem(selPlace, selIndex)).Type != ToolTypes.Sword
- GameEventLogController.AddMessage($"You need a Tool of type {Values.ToolType.Sword} to fight with other mobs");
+ else
+ {
+ GameEventLogController.AddMessage($"Player did {damagePoints} damage to \"{targetMob.stock_id}\"");
}
- return false;
}
}
}
diff --git a/Mundus/Service/Tiles/Mobs/Controllers/MobMovement.cs b/Mundus/Service/Tiles/Mobs/Controllers/MobMovement.cs
index 153bb72..0e63928 100644
--- a/Mundus/Service/Tiles/Mobs/Controllers/MobMovement.cs
+++ b/Mundus/Service/Tiles/Mobs/Controllers/MobMovement.cs
@@ -1,22 +1,24 @@
-using System;
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Data.SuperLayers;
-using Mundus.Service.SuperLayers;
-using Mundus.Service.Tiles.Items.Presets;
-using Mundus.Service.Tiles.Mobs;
-using Mundus.Service.Tiles.Mobs.LandMobs;
+namespace Mundus.Service.Tiles.Mobs.Controllers
+{
+ using System;
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Service.SuperLayers;
+ using Mundus.Service.Tiles.Items.Presets;
+ using Mundus.Service.Tiles.Mobs.LandMobs;
+ using static Mundus.Data.Values;
+
+ public static class MobMovement
+ {
+ private static Random rnd = new Random();
-namespace Mundus.Service.Tiles.Mobs.Controllers {
- public static class MobMovement {
- private static Random rnd = new Random();
-
/// <summary>
/// Moves all mobs that have a RndMovementRate of more than one on a random tile
/// in a 3x3 radius (including the tile they are currently on)
/// </summary>
- public static void MoveRandomlyAllMobs() {
- foreach(var superLayer in DataBaseContexts.SuperLayerContexts)
+ public static void MoveRandomlyAllMobs()
+ {
+ foreach (var superLayer in DataBaseContexts.SuperLayerContexts)
{
for (int y = 0; y < (int)Values.CurrMapSize; y++)
{
@@ -24,17 +26,18 @@ namespace Mundus.Service.Tiles.Mobs.Controllers {
{
MobTile mob = LandMobsPresets.GetFromStock(superLayer.GetMobLayerStock(y, x));
- if (mob != null) {
- mob.YPos = y;
- mob.XPos = x;
-
+ if (mob != null)
+ {
// Checks validity of RndMovementRate and descides if a mob will move to another tile
if (mob.RndMovementRate > 0 && rnd.Next(0, mob.RndMovementRate) == 1)
{
int newYPos = rnd.Next(y - 1, y + 2);
int newXPos = rnd.Next(x - 1, x + 2);
- mob.CurrSuperLayer = superLayer;
+ mob.XPos = x;
+ mob.YPos = y;
+ mob.CurrSuperLayer = superLayer;
+
ChangeMobPosition(mob, newYPos, newXPos, (int)Values.CurrMapSize);
}
}
@@ -43,27 +46,33 @@ namespace Mundus.Service.Tiles.Mobs.Controllers {
}
}
- public static void ChangeMobPosition(MobTile mob, int yPos, int xPos, int mapSize) {
- if (InBoundaries(yPos, xPos)) {
- if (CanWalkTo(mob, yPos, xPos)) {
- ChangeMobPosition(mob, yPos, xPos);
+ public static void ChangeMobPosition(MobTile mob, int destinationYPos, int destinationXPos, int mapSize)
+ {
+ if (InBoundaries(destinationYPos, destinationXPos))
+ {
+ if (CanWalkTo(mob, destinationYPos, destinationXPos))
+ {
+ ChangeMobPosition(mob, destinationYPos, destinationXPos);
}
- else if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Cannot walk to Y:{yPos}, X:{xPos}");
+ else if (mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Cannot walk to Y:{destinationYPos}, X:{destinationXPos}");
}
}
}
- private const double TAKEN_ENERGY_FROM_MOVEMENT = 0.1;
- public static void MovePlayer(int yPos, int xPos, int mapSize) {
+ public static void MovePlayer(int yPos, int xPos, int mapSize)
+ {
ChangeMobPosition(MI.Player, yPos, xPos, mapSize);
- if (MI.Player.YPos == yPos && MI.Player.XPos == xPos) {
+ if (MI.Player.YPos == yPos && MI.Player.XPos == xPos)
+ {
MI.Player.DrainEnergy(TAKEN_ENERGY_FROM_MOVEMENT + Values.DifficultyValueModifier());
}
}
- private static void ChangeMobPosition(MobTile mob, int yPos, int xPos) {
+ private static void ChangeMobPosition(MobTile mob, int yPos, int xPos)
+ {
// Mob is removed from his current superlayer and in the end is added to the new one
// Note: mob could not move, but will still be removed and readded to the superlayer
mob.CurrSuperLayer.RemoveMobFromPosition(mob.YPos, mob.XPos);
@@ -71,90 +80,103 @@ namespace Mundus.Service.Tiles.Mobs.Controllers {
// If mob can go down a layer from a hole
if (mob.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) == null &&
HeightController.GetSuperLayerUnderneathMob(mob) != null)
- {
- if (HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos) == null)
- {
- mob.CurrSuperLayer = HeightController.GetSuperLayerUnderneathMob(mob);
-
- if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Player fell down a superlayer, to {mob.CurrSuperLayer}");
- }
- }
- else if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Cannot fall down a superlayer, blocked by {HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos)}");
- }
+ {
+ MobDescendASuperLayer(mob, yPos, xPos);
}
+
// If mob can go down a layer from non-solid ground
else if (!GroundPresets.GetFromStock(mob.CurrSuperLayer.GetGroundLayerStock(yPos, xPos)).Solid &&
HeightController.GetSuperLayerUnderneathMob(mob) != null)
- {
-
- if (HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos) == null)
- {
- mob.CurrSuperLayer = HeightController.GetSuperLayerUnderneathMob(mob);
-
- if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Player descended a superlayer, to {mob.CurrSuperLayer}");
- }
- }
- else if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Cannot descend a superlayer, blocked by {HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos)}");
- }
+ {
+ MobDescendASuperLayer(mob, yPos, xPos);
}
+
// If mob can climb up
else if (mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos) != null &&
HeightController.GetSuperLayerAboveMob(mob).GetMobLayerStock(yPos, xPos) == null)
- {
- // Mobs can only climb to the superlayer on top of them, if
- // there is a climable structure and there is a "hole" on top of the climable structure
- if (StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsClimable &&
- HeightController.GetSuperLayerAboveMob(mob) != null)
- {
- // The ground above isn't solid or doesnt exist and there are no mobs on top
- if (HeightController.GetSuperLayerAboveMob(mob).GetGroundLayerStock(yPos, xPos) == null ||
- !GroundPresets.GetFromStock(HeightController.GetSuperLayerAboveMob(mob).GetGroundLayerStock(yPos, xPos)).Solid)
- {
- mob.CurrSuperLayer = HeightController.GetSuperLayerAboveMob(mob);
-
- if (mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Player climbed up a superlayer");
- }
- }
- else if (HeightController.GetSuperLayerAboveMob(mob).GetGroundLayerStock(yPos, xPos) != null && mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Cannot climb up a superlayer, there is solid ground above");
- }
- }
- else if (!StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsClimable && mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"Cannot climb up a superlayer using a \"{mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)}\"");
- }
- else if (HeightController.GetSuperLayerAboveMob(mob) == null && mob.GetType() == typeof(Player)) {
- GameEventLogController.AddMessage($"There is no superlayer to climb up to");
- }
+ {
+ MobAscendASuperLayer(mob, yPos, xPos);
}
- else if (HeightController.GetSuperLayerAboveMob(mob).GetMobLayerStock(yPos, xPos) != null && mob.GetType() == typeof(Player)) {
+ else if (HeightController.GetSuperLayerAboveMob(mob).GetMobLayerStock(yPos, xPos) != null && mob.GetType() == typeof(Player))
+ {
GameEventLogController.AddMessage($"Cannot climb up a superlayer, {HeightController.GetSuperLayerAboveMob(mob).GetMobLayerStock(yPos, xPos)} is blocking the way");
}
mob.YPos = yPos;
- mob.XPos = xPos;
+ mob.XPos = xPos;
+
mob.CurrSuperLayer.SetMobAtPosition(mob.stock_id, mob.Health, yPos, xPos);
}
+
+ private static void MobDescendASuperLayer(MobTile mob, int yPos, int xPos)
+ {
+ if (HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos) == null)
+ {
+ mob.CurrSuperLayer = HeightController.GetSuperLayerUnderneathMob(mob);
- private static bool CanWalkTo(MobTile mob, int yPos, int xPos) {
- //Mobs can only walk on free ground (no structure or mob ; you can walk on the same place you are) or walkable structures
- if (StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)) == null) {
- return mob.CurrSuperLayer.GetMobLayerStock(yPos, xPos) == null ||
- (mob.YPos == yPos && mob.XPos == xPos);
+ if (mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Player descend a superlayer, to {mob.CurrSuperLayer}");
+ }
}
- else if (StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsWalkable) {
- return mob.CurrSuperLayer.GetMobLayerStock(yPos, xPos) == null ||
+ else if (mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Cannot descend a superlayer, blocked by {HeightController.GetSuperLayerUnderneathMob(mob).GetMobLayerStock(yPos, xPos)}");
+ }
+ }
+
+ private static void MobAscendASuperLayer(MobTile mob, int yPos, int xPos)
+ {
+ if (StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsClimable &&
+ HeightController.GetSuperLayerAboveMob(mob) != null)
+ {
+ var superLayerAbove = HeightController.GetSuperLayerAboveMob(mob);
+
+ // To ascend, the ground above mustn't be solid or exist and there are no mobs on top
+ if (superLayerAbove.GetGroundLayerStock(yPos, xPos) == null ||
+ !GroundPresets.GetFromStock(superLayerAbove.GetGroundLayerStock(yPos, xPos)).Solid)
+ {
+ mob.CurrSuperLayer = superLayerAbove;
+
+ if (mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Player ascended a superlayer");
+ }
+ }
+ else if (HeightController.GetSuperLayerAboveMob(mob).GetGroundLayerStock(yPos, xPos) != null && mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Cannot ascend a superlayer, there is solid ground above");
+ }
+ }
+ else if (!StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsClimable && mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"Cannot ascend a superlayer using a \"{mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)}\"");
+ }
+ else if (HeightController.GetSuperLayerAboveMob(mob) == null && mob.GetType() == typeof(Player))
+ {
+ GameEventLogController.AddMessage($"There is no superlayer to climb up to");
+ }
+ }
+
+ private static bool CanWalkTo(MobTile mob, int yPos, int xPos)
+ {
+ // Mobs can only walk on if there is no structure or the structure is walkable
+ // Mobs can move to the same location they're in
+ if (mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos) == null ||
+ StructurePresets.GetFromStock(mob.CurrSuperLayer.GetStructureLayerStock(yPos, xPos)).IsWalkable)
+ {
+ return mob.CurrSuperLayer.GetMobLayerStock(yPos, xPos) == null ||
(mob.YPos == yPos && mob.XPos == xPos);
}
+
return false;
}
- // Returns if the chosen new location is inside the map
- private static bool InBoundaries(int yPos, int xPos) {
+ /// <summary>
+ /// Returns if the chosen new location is inside the boundaries of the map
+ /// </summary>
+ private static bool InBoundaries(int yPos, int xPos)
+ {
return yPos >= 0 && xPos >= 0 && yPos < (int)Values.CurrMapSize && xPos < (int)Values.CurrMapSize;
}
}
diff --git a/Mundus/Service/Tiles/Mobs/Controllers/MobStatsController.cs b/Mundus/Service/Tiles/Mobs/Controllers/MobStatsController.cs
index 4b89b54..13140b2 100644
--- a/Mundus/Service/Tiles/Mobs/Controllers/MobStatsController.cs
+++ b/Mundus/Service/Tiles/Mobs/Controllers/MobStatsController.cs
@@ -1,26 +1,37 @@
-using Gtk;
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Service.SuperLayers;
-using Mundus.Service.Tiles.Items.Presets;
+namespace Mundus.Service.Tiles.Mobs.Controllers
+{
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Service.SuperLayers;
+ using Mundus.Service.Tiles.Items.Presets;
-namespace Mundus.Service.Tiles.Mobs.Controllers {
- public static class MobStatsController {
+ public static class MobStatsController
+ {
public static object GroundPresetsHeightController { get; private set; }
/// <summary>
/// Returns the stock_id of the hearth icon that must be used on the given position of the health bar
/// </summary>
- /// <returns>stock_id of hearth icon</returns>
- /// <param name="index">Health bar index</param>
public static string GetPlayerHearthStock(int index) {
string stock_id = "hearth_0";
- int diff = MI.Player.Health - index * 4;
- if (diff >= 4) stock_id = "hearth_4";
- else if (diff == 1) stock_id = "hearth_1";
- else if (diff == 2) stock_id = "hearth_2";
- else if (diff == 3) stock_id = "hearth_3";
+ int diff = MI.Player.Health - (index * 4);
+
+ if (diff >= 4)
+ {
+ stock_id = "hearth_4";
+ }
+ else if (diff == 1)
+ {
+ stock_id = "hearth_1";
+ }
+ else if (diff == 2)
+ {
+ stock_id = "hearth_2";
+ }
+ else if (diff == 3)
+ {
+ stock_id = "hearth_3";
+ }
return stock_id;
}
@@ -30,16 +41,36 @@ namespace Mundus.Service.Tiles.Mobs.Controllers {
/// </summary>
/// <returns>stock_id of energy icon</returns>
/// <param name="index">Energy bar index</param>
- public static string GetPlayerEnergyStock(int index) {
+ public static string GetPlayerEnergyStock(int index)
+ {
string stock_id = "energy_0";
int diff = (int)MI.Player.Energy - index * 6;
- if (diff >= 6) stock_id = "energy_6";
- else if (diff == 1) stock_id = "energy_1";
- else if (diff == 2) stock_id = "energy_2";
- else if (diff == 3) stock_id = "energy_3";
- else if (diff == 4) stock_id = "energy_4";
- else if (diff == 5) stock_id = "energy_5";
+
+ if (diff >= 6)
+ {
+ stock_id = "energy_6";
+ }
+ else if (diff == 1)
+ {
+ stock_id = "energy_1";
+ }
+ else if (diff == 2)
+ {
+ stock_id = "energy_2";
+ }
+ else if (diff == 3)
+ {
+ stock_id = "energy_3";
+ }
+ else if (diff == 4)
+ {
+ stock_id = "energy_4";
+ }
+ else if (diff == 5)
+ {
+ stock_id = "energy_5";
+ }
return stock_id;
}
@@ -47,34 +78,42 @@ namespace Mundus.Service.Tiles.Mobs.Controllers {
/// <summary>
/// Returns the name of the superlayer the player is curently on
/// </summary>
- public static string GetPlayerSuperLayerName() {
+ public static string GetPlayerSuperLayerName()
+ {
return MI.Player.CurrSuperLayer.ToString();
}
/// <summary>
- /// Returns the player's horizontal (X) coordinates
+ /// Returns the player's horizontal (x) coordinates
/// </summary>
/// <returns>Player.XPos</returns>
- public static int GetPlayerXCoord() {
+ public static int GetPlayerXCoord()
+ {
return MI.Player.XPos;
}
/// <summary>
- /// Returns the player's vertical (Y) coordinates
+ /// Returns the player's vertical (y) coordinates
/// </summary>
/// <returns>Player.YPos</returns>
- public static int GetPlayerYCoord() {
+ public static int GetPlayerYCoord()
+ {
return MI.Player.YPos;
}
/// <summary>
/// Checks if the player has an an empty/non-solid tile directly on the superlayer above him
/// </summary>
- public static bool ExistsHoleOnTopOfPlayer() {
+ public static bool ExistsHoleOnTopOfPlayer()
+ {
+
//There can't be a hole if there isn't a layer above the player
- if (HeightController.GetSuperLayerAboveMob(MI.Player) == null) {
+ if (HeightController.GetSuperLayerAboveMob(MI.Player) == null)
+ {
return false;
}
+
+ // Returns true if the ground stock above the player is null or isnt Solid
return HeightController.GetSuperLayerAboveMob(MI.Player).GetGroundLayerStock(MI.Player.YPos, MI.Player.XPos) == null ||
!GroundPresets.GetFromStock(HeightController.GetSuperLayerAboveMob(MI.Player).GetGroundLayerStock(MI.Player.YPos, MI.Player.XPos)).Solid;
}
diff --git a/Mundus/Service/Tiles/Mobs/Controllers/MobTerraforming.cs b/Mundus/Service/Tiles/Mobs/Controllers/MobTerraforming.cs
index 687e5aa..f85a142 100644
--- a/Mundus/Service/Tiles/Mobs/Controllers/MobTerraforming.cs
+++ b/Mundus/Service/Tiles/Mobs/Controllers/MobTerraforming.cs
@@ -1,188 +1,230 @@
-using System.Linq;
-using static Mundus.Data.Values;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Data.SuperLayers;
-using Mundus.Service.SuperLayers;
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Items.Presets;
-using Mundus.Data;
-using Mundus.Service.Tiles.Items.Types;
-
-namespace Mundus.Service.Tiles.Mobs.Controllers {
- public static class MobTerraforming {
+namespace Mundus.Service.Tiles.Mobs.Controllers
+{
+ using System.Linq;
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Data.SuperLayers;
+ using Mundus.Service.SuperLayers;
+ using Mundus.Service.Tiles.Items.Presets;
+ using Mundus.Service.Tiles.Items.Types;
+ using static Mundus.Data.Values;
+
+ public static class MobTerraforming
+ {
/// <summary>
/// Tries to place a selected structure/ground tile or to mine/dig (destroy) at the selected location
/// </summary>
- public static void PlayerTerraformAt(int mapYPos, int mapXPos) {
+ public static void PlayerTerraformAt(int mapYPos, int mapXPos)
+ {
var selectedItemType = Inventory.GetPlayerItemFromItemSelection().GetType();
// If player can place strucure
- if (selectedItemType == typeof(Structure)) {
- if (PlayerCanBuildStructureAt(mapYPos, mapXPos)) {
- PlayerBuildStructureAt(mapYPos, mapXPos);
- Inventory.DeletePlayerItemTileFromItemSelection();
- }
- else {
- GameEventLogController.AddMessage($"Cannot build structure at Y:{mapYPos}, X:{mapXPos}");
- }
-
- }
+ if (selectedItemType == typeof(Structure))
+ {
+ PlayerTryBuildStructureAt(mapYPos, mapXPos);
+ }
+
// If Player can place ground
- else if (selectedItemType == typeof(GroundTile)) {
- if (PlayerCanPlaceGroundAt(mapYPos, mapXPos)) {
- PlayerPlaceGroundAt(mapYPos, mapXPos);
- Inventory.DeletePlayerItemTileFromItemSelection();
- }
- else {
- GameEventLogController.AddMessage($"Cannot place ground at Y:{mapYPos}, X:{mapXPos}");
- }
- }
+ else if (selectedItemType == typeof(GroundTile))
+ {
+ PlayerTryPlaceGroundAt(mapYPos, mapXPos);
+ }
+
// If player can mine/dig
- else if (selectedItemType == typeof(Tool)) {
- if (PlayerCanDestroyAt(mapYPos, mapXPos)) {
- PlayerDestroyAt(mapYPos, mapXPos);
- }
- else {
- GameEventLogController.AddMessage($"Cannot destroy at Y:{mapYPos}, X:{mapXPos}");
- }
+ else if (selectedItemType == typeof(Tool))
+ {
+ PlayerTryDestroyAt(mapYPos, mapXPos);
}
}
// Player can't destory structures/ground tiles if there are none
- private static bool PlayerCanDestroyAt(int yPos, int xPos) {
+ private static bool PlayerCanDestroyAt(int yPos, int xPos)
+ {
return MI.Player.CurrSuperLayer.GetStructureLayerStock(yPos, xPos) != null ||
MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) != null;
}
- private const double ENERGY_TAKEN_FROM_DESTROYING = 0.6;
- private static void PlayerDestroyAt(int mapYPos, int mapXPos) {
- var selectedTool = (Tool)Inventory.GetPlayerItemFromItemSelection();
+ private static void PlayerTryDestroyAt(int mapYPos, int mapXPos) {
+ if (PlayerCanDestroyAt(mapYPos, mapXPos))
+ {
+ var selectedTool = (Tool)Inventory.GetPlayerItemFromItemSelection();
- // Only shovels can destroy ground layer tiles, but not when there is something over the ground tile
- if (selectedTool.Type == ToolType.Shovel && MI.Player.CurrSuperLayer.GetStructureLayerStock(mapYPos, mapXPos) == null) {
- if (PlayerTryDestroyGroundAt(mapYPos, mapXPos, selectedTool)) {
- MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_DESTROYING + Values.DifficultyValueModifier());
+ // Only shovels can destroy ground layer tiles, but not when there is something over the ground tile
+ if (selectedTool.Type == ToolType.Shovel && MI.Player.CurrSuperLayer.GetStructureLayerStock(mapYPos, mapXPos) == null)
+ {
+ if (PlayerTryDestroyGroundAt(mapYPos, mapXPos, selectedTool))
+ {
+ MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_DESTROYING + DifficultyValueModifier());
+ }
}
- }
- // Don't try to destroy structure if there is no structure
- else if (MI.Player.CurrSuperLayer.GetStructureLayerStock(mapYPos, mapXPos) != null) {
- if (PlayerTryDestroyStructureAt(mapYPos, mapXPos, selectedTool)) {
- MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_DESTROYING + Values.DifficultyValueModifier());
+
+ // Don't try to destroy structure if there is no structure
+ else if (MI.Player.CurrSuperLayer.GetStructureLayerStock(mapYPos, mapXPos) != null)
+ {
+ if (PlayerTryDestroyStructureAt(mapYPos, mapXPos, selectedTool))
+ {
+ MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_DESTROYING + DifficultyValueModifier());
+ }
}
}
+ else
+ {
+ GameEventLogController.AddMessage($"Cannot destroy at Y:{mapYPos}, X:{mapXPos}");
+ }
}
- private static bool PlayerTryDestroyGroundAt(int mapYPos, int mapXPos, Tool shovel) {
+ private static bool PlayerTryDestroyGroundAt(int mapYPos, int mapXPos, Tool shovel)
+ {
var selectedGround = GroundPresets.GetFromStock(MI.Player.CurrSuperLayer.GetGroundLayerStock(mapYPos, mapXPos));
// Ground tiles that should be unbreakable have a negative required shovel class
- if (selectedGround.ReqShovelClass <= shovel.Class && selectedGround.ReqShovelClass >= 0) {
- MI.Player.CurrSuperLayer.SetGroundAtPosition(null, mapYPos, mapXPos);
+ if (selectedGround.ReqShovelClass <= shovel.Class && selectedGround.ReqShovelClass >= 0)
+ {
+ MI.Player.CurrSuperLayer.RemoveGroundFromPosition(mapYPos, mapXPos);
ISuperLayerContext under = HeightController.GetSuperLayerUnderneathMob(MI.Player);
+
// When a shovel destroys ground tile, it destroys the structure below it (but only if it is not walkable)
- if (under != null && under.GetStructureLayerStock(mapYPos, mapXPos) != null) {
- if (!StructurePresets.GetFromStock(under.GetStructureLayerStock(mapYPos, mapXPos)).IsWalkable) {
+ if (under != null && under.GetStructureLayerStock(mapYPos, mapXPos) != null)
+ {
+ if (!StructurePresets.GetFromStock(under.GetStructureLayerStock(mapYPos, mapXPos)).IsWalkable)
+ {
under.RemoveStructureFromPosition(mapYPos, mapXPos);
}
}
- if (MI.Player.Inventory.Items.Contains(null)) {
+ if (MI.Player.Inventory.Items.Contains(null))
+ {
MI.Player.Inventory.AppendToItems(new GroundTile(selectedGround));
}
GameEventLogController.AddMessage($"Player destroyed \"{selectedGround.stock_id}\" from layer \"{MI.Player.CurrSuperLayer}\" at Y:{mapYPos}, X:{mapXPos}");
return true;
}
- else if (selectedGround.ReqShovelClass > shovel.Class) {
+ else if (selectedGround.ReqShovelClass > shovel.Class)
+ {
GameEventLogController.AddMessage($"Ground \"{selectedGround.stock_id}\" requires minimum shovel class of: {selectedGround.ReqShovelClass}");
}
- else { // selectedGround.ReqSHovelClass < 0
+ else
+ {
GameEventLogController.AddMessage($"This ground cannot be destroyed.");
- }
+ }
+
return false;
}
- private static bool PlayerTryDestroyStructureAt(int mapYPos, int mapXPos, Tool tool) {
+ private static bool PlayerTryDestroyStructureAt(int mapYPos, int mapXPos, Tool tool)
+ {
var selStructure = StructurePresets.GetFromStock(MI.Player.CurrSuperLayer.GetStructureLayerStock(mapYPos, mapXPos));
- if (selStructure.ReqToolType == tool.Type && selStructure.ReqToolClass <= tool.Class) {
+ if (selStructure.ReqToolType == tool.Type && selStructure.ReqToolClass <= tool.Class)
+ {
int damagePoints = 1 + (tool.Class - selStructure.ReqToolClass);
// Some structures have a "drop", a specific item that they give upon being damaged.
// Other structures drop themselves (you "pick up" the structure after breaking it).
- if (selStructure.GetDrop() != selStructure) {
+ if (selStructure.GetDrop() != selStructure)
+ {
// The amount of dropped items it adds to inventory is that of the damage points.
// If the structure will "die" (health <= 0) before giving all items, it stops giving items.
- for (int i = 0; i < damagePoints && i < selStructure.Health && MI.Player.Inventory.Items.Contains(null); i++) {
+ for (int i = 0; i < damagePoints && i < selStructure.Health && MI.Player.Inventory.Items.Contains(null); i++)
+ {
MI.Player.Inventory.AppendToItems(new Material((Material)selStructure.GetDrop()));
}
}
- else if (MI.Player.Inventory.Items.Contains(null)) {
+ else if (MI.Player.Inventory.Items.Contains(null))
+ {
MI.Player.Inventory.AppendToItems((Structure)selStructure.GetDrop());
}
// Damage to the structure is done after adding the dropped item/items.
- if (!MI.Player.CurrSuperLayer.TakeDamageStructureAtPosition(mapYPos, mapXPos, damagePoints)) {
- MI.Player.CurrSuperLayer.SetStructureAtPosition(null, -1, mapYPos, mapXPos);
+ if (!MI.Player.CurrSuperLayer.TakeDamageStructureAtPosition(mapYPos, mapXPos, damagePoints))
+ {
+ MI.Player.CurrSuperLayer.RemoveStructureFromPosition(mapYPos, mapXPos);
GameEventLogController.AddMessage($"Player destroyed \"{selStructure.stock_id}\" from layer \"{MI.Player.CurrSuperLayer}\" at Y:{mapYPos}, X:{mapXPos}");
}
- else {
+ else
+ {
GameEventLogController.AddMessage($"Player did {damagePoints} damage to \"{selStructure.stock_id}\"");
- }
+ }
+
return true;
}
- else if (selStructure.ReqToolType != tool.Type) {
+ else if (selStructure.ReqToolType != tool.Type)
+ {
GameEventLogController.AddMessage($"Structure \"{selStructure.stock_id}\" requires tool type: {selStructure.ReqToolType}");
}
- else { // selStructure.ReqToolClass > tool.Class
+ else
+ {
GameEventLogController.AddMessage($"Structure \"{selStructure.stock_id}\" requires minimum tool class of: {selStructure.ReqToolClass}");
- }
+ }
+
return false;
}
// Ground can be placed if there isnt a structure on an empty ground layer spot
- private static bool PlayerCanPlaceGroundAt(int yPos, int xPos) {
+ private static bool PlayerCanPlaceGroundAt(int yPos, int xPos)
+ {
return MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) == null &&
MI.Player.CurrSuperLayer.GetStructureLayerStock(yPos, xPos) == null;
}
- private const double ENERGY_TAKEN_FROM_PLACING_GROUND = 0.4;
- private static void PlayerPlaceGroundAt(int yPos, int xPos) {
- GroundTile toPlace = (GroundTile)Inventory.GetPlayerItemFromItemSelection();
- MI.Player.CurrSuperLayer.SetGroundAtPosition(toPlace.stock_id, yPos, xPos);
- MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_PLACING_GROUND + Values.DifficultyValueModifier());
-
- GameEventLogController.AddMessage($"Set ground \"{toPlace.stock_id}\" on layer \"{MI.Player.CurrSuperLayer}\" at Y:{yPos}, X:{xPos}");
+ private static void PlayerTryPlaceGroundAt(int yPos, int xPos)
+ {
+ if (PlayerCanPlaceGroundAt(yPos, xPos))
+ {
+ GroundTile toPlace = (GroundTile)Inventory.GetPlayerItemFromItemSelection();
+
+ MI.Player.CurrSuperLayer.SetGroundAtPosition(toPlace.stock_id, yPos, xPos);
+ MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_PLACING_GROUND + DifficultyValueModifier());
+
+ GameEventLogController.AddMessage($"Set ground \"{toPlace.stock_id}\" on layer \"{MI.Player.CurrSuperLayer}\" at Y:{yPos}, X:{xPos}");
+
+ Inventory.DeletePlayerItemTileFromItemSelection();
+ }
+ else
+ {
+ GameEventLogController.AddMessage($"Cannot place ground at Y:{yPos}, X:{xPos}");
+ }
}
-
- private static bool PlayerCanBuildStructureAt(int yPos, int xPos) {
+ private static bool PlayerCanBuildStructureAt(int yPos, int xPos)
+ {
return MI.Player.CurrSuperLayer.GetStructureLayerStock(yPos, xPos) == null;
}
-
- private const double ENERGY_TAKEN_FROM_BUILDING_STRUCTURE = 0.5;
- private static void PlayerBuildStructureAt(int yPos, int xPos) {
- Structure toBuild = (Structure)Inventory.GetPlayerItemFromItemSelection();
-
- // Climable structures will be placed under a hole (if they can be).
- // Non climable structures won't be placed anywhere if there is a hole.
- if (toBuild.IsClimable && MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) == null &&
- HeightController.GetSuperLayerUnderneathMob(MI.Player).GetStructureLayerStock(yPos, xPos) == null)
- {
- HeightController.GetSuperLayerUnderneathMob(MI.Player).SetStructureAtPosition(toBuild.stock_id, toBuild.Health, yPos, xPos);
-
- GameEventLogController.AddMessage($"Set structure \"{toBuild.stock_id}\" on layer \"{HeightController.GetSuperLayerUnderneathMob(MI.Player)}\" at Y:{yPos}, X:{xPos}");
- }
- else if (MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) != null) {
- MI.Player.CurrSuperLayer.SetStructureAtPosition(toBuild.stock_id, toBuild.Health, yPos, xPos);
-
- GameEventLogController.AddMessage($"Set structure \"{toBuild.stock_id}\" on layer \"{MI.Player.CurrSuperLayer}\" at Y:{yPos}, X:{xPos}");
+
+ private static void PlayerTryBuildStructureAt(int yPos, int xPos)
+ {
+ if (PlayerCanBuildStructureAt(yPos, xPos))
+ {
+ Structure toBuild = (Structure)Inventory.GetPlayerItemFromItemSelection();
+
+ // Climable structures will be placed under a hole (if they can be).
+ // Non climable structures won't be placed anywhere if there is a hole.
+ if (toBuild.IsClimable && MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) == null &&
+ HeightController.GetSuperLayerUnderneathMob(MI.Player).GetStructureLayerStock(yPos, xPos) == null)
+ {
+ HeightController.GetSuperLayerUnderneathMob(MI.Player).SetStructureAtPosition(toBuild.stock_id, toBuild.Health, yPos, xPos);
+
+ GameEventLogController.AddMessage($"Set structure \"{toBuild.stock_id}\" on layer \"{HeightController.GetSuperLayerUnderneathMob(MI.Player)}\" at Y:{yPos}, X:{xPos}");
+ }
+ else if (MI.Player.CurrSuperLayer.GetGroundLayerStock(yPos, xPos) != null)
+ {
+ MI.Player.CurrSuperLayer.SetStructureAtPosition(toBuild.stock_id, toBuild.Health, yPos, xPos);
+
+ GameEventLogController.AddMessage($"Set structure \"{toBuild.stock_id}\" on layer \"{MI.Player.CurrSuperLayer}\" at Y:{yPos}, X:{xPos}");
+ }
+
+ MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_BUILDING_STRUCTURE + Values.DifficultyValueModifier());
+
+ Inventory.DeletePlayerItemTileFromItemSelection();
+ }
+ else
+ {
+ GameEventLogController.AddMessage($"Cannot build structure at Y:{yPos}, X:{xPos}");
}
-
- MI.Player.DrainEnergy(ENERGY_TAKEN_FROM_BUILDING_STRUCTURE + Values.DifficultyValueModifier());
}
}
}
diff --git a/Mundus/Service/Tiles/Mobs/Inventory.cs b/Mundus/Service/Tiles/Mobs/Inventory.cs
index ae4f141..358666e 100644
--- a/Mundus/Service/Tiles/Mobs/Inventory.cs
+++ b/Mundus/Service/Tiles/Mobs/Inventory.cs
@@ -1,90 +1,109 @@
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Items.Types;
-using System;
-using System.Linq;
-
-namespace Mundus.Service.Tiles.Mobs {
- public class Inventory {
- public enum InventoryPlace {
- Hotbar,
- Items,
- Accessories,
- Gear
- }
-
+namespace Mundus.Service.Tiles.Mobs
+{
+ using System;
+ using System.Linq;
+ using Mundus.Service.Tiles.Items;
+ using Mundus.Service.Tiles.Items.Types;
+
+ public class Inventory
+ {
/// <summary>
/// Has a size of "Screen and Inventory" and can hold Tools, Materials, Structures and Gear
/// </summary>
public ItemTile[] Hotbar { get; set; }
+
/// <summary>
/// Has a size of the "Screen and Inventory" squared and can hold Tools, Materials, Structures and Gear
/// </summary>
public ItemTile[] Items { get; set; }
+
/// <summary>
/// Has a size of double the "Screen and Inventory" and can only hold Gear
/// </summary>
public Gear[] Accessories { get; set; }
+
/// <summary>
/// Has a size of "Screen and Inventory" and can only hold Gear
/// </summary>
public Gear[] Gear { get; set; }
- public Inventory(int screenInvSize) {
+ public Inventory(int screenInvSize)
+ {
this.SetSizes(screenInvSize);
}
- public void SetSizes(int screenInvSize) {
+ public enum InventoryPlace {
+ Hotbar,
+ Items,
+ Accessories,
+ Gear
+ }
+
+ public void SetSizes(int screenInvSize)
+ {
this.Hotbar = new ItemTile[screenInvSize];
this.Items = new ItemTile[screenInvSize * screenInvSize];
this.Accessories = new Gear[screenInvSize * 2];
this.Gear = new Gear[screenInvSize];
}
- public void AppendToHotbar(ItemTile itemTile) {
+ public void AppendToHotbar(ItemTile itemTile)
+ {
this.AddToHotbar(itemTile, Array.IndexOf(this.Hotbar, this.Hotbar.First(x => x == null)));
}
- public void AddToHotbar(ItemTile itemTile, int index) {
+ public void AddToHotbar(ItemTile itemTile, int index)
+ {
this.Hotbar[index] = itemTile;
}
- public void DeleteFromHotbar(int index) {
+ public void DeleteFromHotbar(int index)
+ {
this.Hotbar[index] = null;
}
- public void AppendToItems(ItemTile itemTile) {
+ public void AppendToItems(ItemTile itemTile)
+ {
this.AddToItems(itemTile, Array.IndexOf(this.Items, this.Items.First(x => x == null)));
}
- public void AddToItems(ItemTile itemTile, int index) {
+ public void AddToItems(ItemTile itemTile, int index)
+ {
this.Items[index] = itemTile;
}
- public void DeleteFromItems(int index) {
+ public void DeleteFromItems(int index)
+ {
this.Items[index] = null;
}
- public void EquipAccessory(Gear accessory, int index) {
+ public void EquipAccessory(Gear accessory, int index)
+ {
this.Accessories[index] = accessory;
}
- public void AppendAccessories(Gear accessory) {
+ public void AppendAccessories(Gear accessory)
+ {
this.EquipAccessory(accessory, Array.IndexOf(this.Accessories, this.Accessories.First(x => x == null)));
}
- public void DeleteAccessory(int index) {
+ public void DeleteAccessory(int index)
+ {
this.Accessories[index] = null;
}
- public void EquipGear(Gear gear, int index) {
+ public void EquipGear(Gear gear, int index)
+ {
this.Gear[index] = gear;
}
- public void AppendGear(Gear gear) {
+ public void AppendGear(Gear gear)
+ {
this.EquipGear(gear, Array.IndexOf(this.Gear, this.Gear.First(x => x == null)));
}
- public void DeleteGear(int index) {
+ public void DeleteGear(int index)
+ {
this.Gear[index] = null;
}
@@ -92,23 +111,38 @@ namespace Mundus.Service.Tiles.Mobs {
/// Returns an ItemTile depending on specified place ("hotbar", "items", "accessories" or "gear")
/// and specified index
/// </summary>
- public ItemTile GetItemTile(InventoryPlace place, int index) {
+ public ItemTile GetItemTile(InventoryPlace place, int index)
+ {
ItemTile toReturn = null;
- switch (place) {
+ switch (place)
+ {
case InventoryPlace.Hotbar: toReturn = this.Hotbar[index]; break;
case InventoryPlace.Items: toReturn = this.Items[index]; break;
case InventoryPlace.Accessories: toReturn = this.Accessories[index]; break;
case InventoryPlace.Gear: toReturn = this.Gear[index]; break;
}
+
return toReturn;
}
+ public void DeleteItem(InventoryPlace place, int index)
+ {
+ switch (place)
+ {
+ case InventoryPlace.Hotbar: this.Hotbar[index] = null; break;
+ case InventoryPlace.Items: this.Items[index] = null; break;
+ case InventoryPlace.Accessories: this.Accessories[index] = null; break;
+ case InventoryPlace.Gear: this.Gear[index] = null; break;
+ }
+ }
+
/// <summary>
/// Deletes an ItemTile depending on specified place ("hotbar", "items", "accessories" or "gear")
/// and specified index
/// </summary>
- public static void DeletePlayerItemTileFromItemSelection() {
+ public static void DeletePlayerItemTileFromItemSelection()
+ {
Data.Superlayers.Mobs.MI.Player.Inventory.DeleteItem(ItemController.SelItemPlace, ItemController.SelItemIndex);
}
@@ -116,17 +150,9 @@ namespace Mundus.Service.Tiles.Mobs {
/// Returns an ItemTile depending on specified place ("hotbar", "items", "accessories" or "gear")
/// and specified index in player's inventory
/// </summary>
- public static ItemTile GetPlayerItemFromItemSelection() {
+ public static ItemTile GetPlayerItemFromItemSelection()
+ {
return Data.Superlayers.Mobs.MI.Player.Inventory.GetItemTile(ItemController.SelItemPlace, ItemController.SelItemIndex);
}
-
- public void DeleteItem(InventoryPlace place, int index) {
- switch (place) {
- case InventoryPlace.Hotbar: this.Hotbar[index] = null; break;
- case InventoryPlace.Items: this.Items[index] = null; break;
- case InventoryPlace.Accessories: this.Accessories[index] = null; break;
- case InventoryPlace.Gear: this.Gear[index] = null; break;
- }
- }
}
-}
+} \ No newline at end of file
diff --git a/Mundus/Service/Tiles/Mobs/LandMobs/LandMobsPresets.cs b/Mundus/Service/Tiles/Mobs/LandMobs/LandMobsPresets.cs
index 642116a..e19cf7c 100644
--- a/Mundus/Service/Tiles/Mobs/LandMobs/LandMobsPresets.cs
+++ b/Mundus/Service/Tiles/Mobs/LandMobs/LandMobsPresets.cs
@@ -1,23 +1,37 @@
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using Mundus.Data.SuperLayers;
-using Mundus.Service.Tiles.Items.Presets;
+namespace Mundus.Service.Tiles.Mobs.LandMobs
+{
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+ using Mundus.Service.Tiles.Items.Presets;
-namespace Mundus.Service.Tiles.Mobs.LandMobs {
- public static class LandMobsPresets {
- private static MobTile cow = new MobTile("L_cow", 10, 1, DataBaseContexts.LContext, 1, MaterialPresets.GetALandBeefSteak());
+ public static class LandMobsPresets
+ {
+ private static MobTile cow = new MobTile("L_cow", 10, 1, DataBaseContexts.LContext, 1, MaterialPresets.GetALandBeefSteak());
+
private static MobTile sheep = new MobTile("L_sheep", 8, 1, DataBaseContexts.LContext, 1, MaterialPresets.GetALandMuttonSteak());
- public static MobTile GetCow() {
+ /// <summary>
+ /// Returns a (static) cow MobTile.
+ /// Do not modify!
+ /// </summary>
+ public static MobTile GetCow()
+ {
return cow;
}
- public static MobTile GetSheep() {
+ /// <summary>
+ /// Returns a (static) sheep MobTile.
+ /// Do not modify!
+ /// </summary>
+ public static MobTile GetSheep()
+ {
return sheep;
}
- public static MobTile GetFromStock(string stock_id) {
- switch(stock_id) {
+ public static MobTile GetFromStock(string stock_id)
+ {
+ switch (stock_id)
+ {
case "L_cow": return GetCow();
case "L_sheep": return GetSheep();
case "player": return MI.Player;
diff --git a/Mundus/Service/Tiles/Mobs/LandMobs/Player.cs b/Mundus/Service/Tiles/Mobs/LandMobs/Player.cs
index f7a1329..11d6805 100644
--- a/Mundus/Service/Tiles/Mobs/LandMobs/Player.cs
+++ b/Mundus/Service/Tiles/Mobs/LandMobs/Player.cs
@@ -1,47 +1,54 @@
-using System;
-using Mundus.Data.SuperLayers;
-using Mundus.Data.Windows;
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Items.Types;
+namespace Mundus.Service.Tiles.Mobs.LandMobs
+{
+ using System;
+ using Mundus.Data.SuperLayers;
+ using Mundus.Data.Windows;
+ using Mundus.Service.Tiles.Items.Types;
-namespace Mundus.Service.Tiles.Mobs.LandMobs {
- public class Player : MobTile {
- public double Energy { get; private set; }
-
+ public class Player : MobTile
+ {
/// <summary>
/// Note: player has an rndMovementQualifier of -1 and drops first item in the hotbar
/// </summary>
public Player(string stock_id, int defence, ISuperLayerContext currentSuperLayer)
- : base(stock_id, WI.SelWin.Size * 4, defence, currentSuperLayer, WI.SelWin.Size, null, -1)
+ : base(stock_id, WI.SelWin.Size * 4, defence, currentSuperLayer, WI.SelWin.Size, null, -1)
{
this.Energy = WI.SelWin.Size * 6;
this.DroppedUponDeath = (Material)this.Inventory.Hotbar[0];
}
+
+ public double Energy { get; private set; }
/// <summary>
/// Removes energy from player. If energy gets below 0 it will start taking health
/// </summary>
/// <param name="value">Energy points to drain from player (will do nothing if value less than 0</param>
- public void DrainEnergy(double value) {
- if (value > 0) {
+ public void DrainEnergy(double value)
+ {
+ if (value > 0)
+ {
this.Energy -= value;
- if (this.Energy < 0) {
+ if (this.Energy < 0)
+ {
this.TakeDamage((int)Math.Ceiling(Math.Abs(this.Energy)));
this.Energy = 0;
}
}
- }
-
+ }
+
/// <summary>
/// Restores energy from player. If energy is maxed out (WI.SelWin.Size * 6) it starts healing the player
/// </summary>
/// <param name="value">Energy points to restore energy (will do nothing if value less than 0</param>
- public void RestoreEnergy(double value) {
- if (value > 0) {
+ public void RestoreEnergy(double value)
+ {
+ if (value > 0)
+ {
this.Energy += value;
- if (this.Energy > WI.SelWin.Size * 6) {
+ if (this.Energy > WI.SelWin.Size * 6)
+ {
this.Heal((int)Math.Ceiling(Energy - WI.SelWin.Size * 6));
this.Energy = WI.SelWin.Size * 6;
}
diff --git a/Mundus/Service/Tiles/Mobs/MobTile.cs b/Mundus/Service/Tiles/Mobs/MobTile.cs
index 10d9fef..c527437 100644
--- a/Mundus/Service/Tiles/Mobs/MobTile.cs
+++ b/Mundus/Service/Tiles/Mobs/MobTile.cs
@@ -1,57 +1,73 @@
-using Gtk;
-using Mundus.Data;
-using Mundus.Data.SuperLayers;
-using Mundus.Data.Windows;
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Items.Types;
-
-namespace Mundus.Service.Tiles.Mobs {
- public class MobTile : ITile {
+namespace Mundus.Service.Tiles.Mobs
+{
+ using Mundus.Data.SuperLayers;
+ using Mundus.Data.Windows;
+ using Mundus.Service.Tiles.Items.Types;
+
+ public class MobTile : ITile
+ {
+ public MobTile(string stock_id, int health, int defence, ISuperLayerContext currentSuperLayer, int inventorySize = 5, Material droppedUponDeath = null, int rndMovementQualifier = 3)
+ {
+ this.stock_id = stock_id;
+ this.Health = health;
+ this.Defense = defence;
+ this.CurrSuperLayer = currentSuperLayer;
+ this.DroppedUponDeath = droppedUponDeath;
+ this.Inventory = new Inventory(inventorySize);
+ this.RndMovementRate = rndMovementQualifier;
+ }
+
public string stock_id { get; private set; }
- public Image Texture { get; private set; }
+ /// <summary>
+ /// Gets or sets the superlayer the mob is currently in
+ /// </summary>
public ISuperLayerContext CurrSuperLayer { get; set; }
+
+ /// <summary>
+ /// Gets or sets the vertical (y) position where the MobTile is located
+ /// </summary>
public int YPos { get; set; }
+
+ /// <summary>
+ /// Gets or sets the horizontal (x) position where the MobTile is located
+ /// </summary>
public int XPos { get; set; }
- public int Health { get; private set; }
+
+ public int Health { get; private set; }
+
public int Defense { get; set; }
- public Material DroppedUponDeath { get; protected set; }
+
+ public Material DroppedUponDeath { get; protected set; }
+
public Inventory Inventory { get; set; }
- /// <summary>
- /// Specifies how big the chance of a mob moving (randomly) is. Lower the value, higher the chance for movement.
- /// Note: negative values (or 0) means the mob won't move randomly
- /// </summary>
+ /// <summary>
+ /// Specifies how big the chance of a mob moving (randomly) is. Lower the value, higher the chance for movement.
+ /// Note: negative values (or 0) means the mob won't move randomly
+ /// </summary>
public int RndMovementRate { get; protected set; }
- public MobTile(string stock_id, int health, int defence, ISuperLayerContext currentSuperLayer, int inventorySize = 5, Material droppedUponDeath = null, int rndMovementQualifier = 3) {
- this.stock_id = stock_id;
- this.Texture = new Image(stock_id, IconSize.Dnd);
- this.Health = health;
- this.Defense = defence;
- this.CurrSuperLayer = currentSuperLayer;
- this.RndMovementRate = rndMovementQualifier;
- this.DroppedUponDeath = droppedUponDeath;
- this.Inventory = new Inventory(inventorySize);
- }
-
- /// <summary>
- /// Removes health from mob
- /// </summary>
- /// <returns>Whether the mob can still be damaged</returns>
- public bool TakeDamage(int damagePoints) {
- this.Health -= damagePoints;
- return this.Health > 0;
- }
+ /// <summary>
+ /// Removes health from mob
+ /// </summary>
+ /// <returns>Whether the mob can still be damaged</returns>
+ public bool TakeDamage(int damagePoints)
+ {
+ this.Health -= damagePoints;
+ return this.Health > 0;
+ }
/// <summary>
- /// Heals the mobtile (unless/until it has full health (4 * inventorySize))
+ /// Heals the MobTile (unless/until it has full health (4 * inventorySize))
/// </summary>
/// <param name="healthPoints">Health points to heal with</param>
- public void Heal(int healthPoints) {
+ public void Heal(int healthPoints)
+ {
this.Health += healthPoints;
- if (this.Health > WI.SelWin.Size * 4) {
+ if (this.Health > WI.SelWin.Size * 4)
+ {
this.Health = WI.SelWin.Size * 4;
}
}
diff --git a/Mundus/Service/Windows/Calculate.cs b/Mundus/Service/Windows/Calculate.cs
index 873bf63..55220ec 100644
--- a/Mundus/Service/Windows/Calculate.cs
+++ b/Mundus/Service/Windows/Calculate.cs
@@ -1,44 +1,133 @@
-using Mundus.Data;
-using Mundus.Data.Superlayers.Mobs;
-using System;
-
-namespace Mundus.Service.Windows {
- public static class Calculate {
+namespace Mundus.Service.Windows
+{
+ using System;
+ using Mundus.Data;
+ using Mundus.Data.Superlayers.Mobs;
+
+ /// <summary>
+ /// Used to calculate values, related to the buttons on the game windows
+ /// </summary>
+ public static class Calculate
+ {
/*Depending on whether you are on the edge of the map or in the center, the screen renders a bit differently.
*On the edge it doesn't follow the player and only shows the corner "chunk". In the other parts it follows the
*the player, making sure he stays in the center of the screen.
*This means that when the player is followed, rendered part of the map depend on the player position, but when
- *he isn't, it depends on the screen and map sizes.*/
- public static int CalculateMaxY(int size) {
- int maxY = (MI.Player.YPos - size/2 >= 0) ? MI.Player.YPos + size/2 : size - 1;
- if (maxY >= (int)Values.CurrMapSize) maxY = (int)Values.CurrMapSize - 1;
+ *he isn't, it depends on the screen and map sizes.*/
+
+ public static int CalculateMaxY(int size)
+ {
+ int maxY = MI.Player.YPos + (size / 2);
+
+ // If you are on the top edge of the map
+ if (MI.Player.YPos - (size / 2) < 0)
+ {
+ maxY = size - 1;
+ }
+
+ // If you are on the bottom edge of the map
+ else if (maxY >= (int)Values.CurrMapSize)
+ {
+ maxY = (int)Values.CurrMapSize - 1;
+ }
+
return maxY;
- }
- public static int CalculateStartY(int size) {
- int startY = (MI.Player.YPos - size/2 <= (int)Values.CurrMapSize - size) ? MI.Player.YPos - size/2 : (int)Values.CurrMapSize - size;
- if (startY < 0) startY = 0;
+ }
+
+ public static int CalculateStartY(int size)
+ {
+ int startY = MI.Player.YPos - (size / 2);
+
+ // If you are on the top edge of the map
+ if (startY < 0)
+ {
+ startY = 0;
+ }
+
+ // If you are on the bottom edge of the map
+ else if (MI.Player.YPos - (size / 2) > (int)Values.CurrMapSize - size)
+ {
+ startY = (int)Values.CurrMapSize - size;
+ }
+
return startY;
- }
- public static int CalculateMaxX(int size) {
- int maxX = (MI.Player.XPos - size/2 >= 0) ? MI.Player.XPos + size/2 : size - 1;
- if (maxX >= (int)Values.CurrMapSize) maxX = (int)Values.CurrMapSize - 1;
+ }
+
+ public static int CalculateMaxX(int size)
+ {
+ int maxX = MI.Player.XPos + (size / 2);
+
+ // If you are on the leftmost edge of the map
+ if (MI.Player.XPos - (size / 2) < 0)
+ {
+ maxX = size - 1;
+ }
+
+ // If you are on the rightmost edge of the map
+ else if (maxX >= (int)Values.CurrMapSize)
+ {
+ maxX = (int)Values.CurrMapSize - 1;
+ }
+
return maxX;
- }
- public static int CalculateStartX(int size) {
- int startX = (MI.Player.XPos - size/2 <= (int)Values.CurrMapSize - size) ? MI.Player.XPos - size/2 : (int)Values.CurrMapSize - size;
- if (startX < 0) startX = 0;
+ }
+
+ public static int CalculateStartX(int size)
+ {
+ int startX = MI.Player.XPos - (size / 2);
+
+ // If you are on the leftmost edge
+ if (startX < 0)
+ {
+ startX = 0;
+ }
+
+ // If you are on the rightmost edge
+ if (MI.Player.XPos - (size / 2) > (int)Values.CurrMapSize - size)
+ {
+ startX = (int)Values.CurrMapSize - size;
+ }
+
return startX;
}
- //Screen buttons show only a certain part of the whole map
- public static int CalculateYFromButton(int buttonYPos, int size) {
- int newYPos = (MI.Player.YPos - size/2 >= 0) ? MI.Player.YPos - size/2 + buttonYPos : buttonYPos;
- if (MI.Player.YPos > (int)Values.CurrMapSize - Math.Ceiling(size/2.0)) newYPos = buttonYPos + (int)Values.CurrMapSize - size;
+ // Screen buttons show only a certain part of the whole map
+
+ public static int CalculateYFromButton(int buttonYPos, int size)
+ {
+ int newYPos = MI.Player.YPos - (size / 2) + buttonYPos;
+
+ // If you are on the top edge of the map
+ if (MI.Player.YPos - (size / 2) < 0)
+ {
+ newYPos = buttonYPos;
+ }
+
+ // If you are on the bottom edge of the map
+ if (MI.Player.YPos > (int)Values.CurrMapSize - Math.Ceiling(size / 2.0))
+ {
+ newYPos = buttonYPos + (int)Values.CurrMapSize - size;
+ }
+
return newYPos;
}
- public static int CalculateXFromButton(int buttonXPos, int size) {
- int newXPos = (MI.Player.XPos - size/2 >= 0) ? MI.Player.XPos - size/2 + buttonXPos : buttonXPos;
- if (MI.Player.XPos > (int)Values.CurrMapSize - Math.Ceiling(size/2.0)) newXPos = buttonXPos + (int)Values.CurrMapSize - size;
+
+ public static int CalculateXFromButton(int buttonXPos, int size)
+ {
+ int newXPos = MI.Player.XPos - (size / 2) + buttonXPos;
+
+ // If you are on the leftmost edge of the map
+ if (MI.Player.XPos - (size / 2) < 0)
+ {
+ newXPos = buttonXPos;
+ }
+
+ // If you are on the rightmost edge of the map
+ else if (MI.Player.XPos > (int)Values.CurrMapSize - Math.Ceiling(size / 2.0))
+ {
+ newXPos = buttonXPos + (int)Values.CurrMapSize - size;
+ }
+
return newXPos;
}
}
diff --git a/Mundus/Service/Windows/WindowController.cs b/Mundus/Service/Windows/WindowController.cs
index 09174ed..1c4a4aa 100644
--- a/Mundus/Service/Windows/WindowController.cs
+++ b/Mundus/Service/Windows/WindowController.cs
@@ -1,18 +1,20 @@
-using System;
-using Gtk;
-using Mundus.Data.Windows;
-using Mundus.Service.Tiles.Items;
-using Mundus.Service.Tiles.Mobs;
-using Mundus.Service.Tiles.Mobs.Controllers;
-using Mundus.Views.Windows;
-
-namespace Mundus.Service.Windows {
- public static class WindowController {
+namespace Mundus.Service.Windows
+{
+ using Gtk;
+ using Mundus.Data.Windows;
+ using Mundus.Service.Tiles.Items;
+ using Mundus.Service.Tiles.Mobs;
+ using Mundus.Service.Tiles.Mobs.Controllers;
+
+ public static class WindowController
+ {
+ public static bool PauseWindowVisible { get; set; }
/// <summary>
/// Shows the settings window and hides the sender
/// </summary>
- public static void ShowSettingsWindow(Window sender) {
+ public static void ShowSettingsWindow(Window sender)
+ {
sender.Hide();
WI.WSettings.Show(sender);
}
@@ -20,7 +22,8 @@ namespace Mundus.Service.Windows {
/// <summary>
/// Shows the new game window, sets it's default values and hides the sender
/// </summary>
- public static void ShowNewGameWindow(Window sender) {
+ public static void ShowNewGameWindow(Window sender)
+ {
sender.Hide();
WI.WNewGame.SetDefaults();
WI.WNewGame.Show();
@@ -29,17 +32,55 @@ namespace Mundus.Service.Windows {
/// <summary>
/// Shows the main window and hides the sender
/// </summary>
- public static void ShowMainWindow(Window sender) {
+ public static void ShowMainWindow(Window sender)
+ {
sender.Hide();
WI.WMain.Show();
}
- public static bool PauseWindowVisible { get; set; }
+ public static void React(int button)
+ {
+ int size = WI.SelWin.Size;
+
+ int buttonYPos = (button - 1) / size;
+ int buttonXPos = (button - (buttonYPos * size)) - 1;
+
+ int mapXPos = Calculate.CalculateXFromButton(buttonXPos, size);
+ int mapYPos = Calculate.CalculateYFromButton(buttonYPos, size);
+
+ if (!ItemController.HasSelectedItem())
+ {
+ MobMovement.MovePlayer(mapYPos, mapXPos, size);
+ MobMovement.MoveRandomlyAllMobs();
+ }
+ else
+ {
+ if (Inventory.GetPlayerItemFromItemSelection() != null)
+ {
+ if (MobFighting.ExistsFightTargetForPlayer(mapYPos, mapXPos))
+ {
+ MobFighting.PlayerTryFight(mapYPos, mapXPos);
+ }
+ else
+ {
+ MobTerraforming.PlayerTerraformAt(mapYPos, mapXPos);
+ }
+ }
+
+ ItemController.ResetSelection();
+ }
+
+ WI.SelWin.PrintWorldScreen();
+ WI.SelWin.PrintMainMenu();
+
+ WI.SelWin.PrintMapOrInv();
+ }
/// <summary>
/// Shows the pause window on top of all windows and "pauses" game input (bool PauseWindowVisible)
/// </summary>
- public static void ShowPauseWindow() {
+ public static void ShowPauseWindow()
+ {
WI.WPause.Show();
WI.WPause.Present();
PauseWindowVisible = true;
@@ -48,7 +89,8 @@ namespace Mundus.Service.Windows {
/// <summary>
/// Shows the music window on top of all windows
/// </summary>
- public static void ShowMusicWindow() {
+ public static void ShowMusicWindow()
+ {
WI.WMusic.Show();
WI.WMusic.Present();
}
@@ -56,49 +98,18 @@ namespace Mundus.Service.Windows {
/// <summary>
/// Shows the crafting window on top of all windows and does initializes it
/// </summary>
- public static void ShowCraftingWindow() {
+ public static void ShowCraftingWindow()
+ {
WI.WCrafting.Initialize();
WI.WCrafting.Show();
WI.WCrafting.Present();
}
- public static void ShowLogWindow() {
+ public static void ShowLogWindow()
+ {
WI.WLog.Initialize();
WI.WLog.Show();
WI.WLog.Present();
}
-
- public static void React(int button)
- {
- int size = WI.SelWin.Size;
-
- int buttonYPos = (button - 1) / size;
- int buttonXPos = (button - (buttonYPos * size)) - 1;
-
- int mapXPos = Calculate.CalculateXFromButton(buttonXPos, size);
- int mapYPos = Calculate.CalculateYFromButton(buttonYPos, size);
-
- if (!ItemController.HasSelectedItem()) {
- MobMovement.MovePlayer(mapYPos, mapXPos, size);
- MobMovement.MoveRandomlyAllMobs();
- }
- else {
- if (Inventory.GetPlayerItemFromItemSelection() != null) {
- if (MobFighting.ExistsFightTargetForPlayer(mapYPos, mapXPos)) {
- MobFighting.PlayerTryFight(mapYPos, mapXPos);
- }
- else {
- MobTerraforming.PlayerTerraformAt(mapYPos, mapXPos);
- }
- }
-
- ItemController.ResetSelection();
- }
-
- WI.SelWin.PrintWorldScreen();
- WI.SelWin.PrintMainMenu();
-
- WI.SelWin.PrintMapOrInv();
- }
}
}
diff --git a/Mundus/Views/Dialogs/ExitDialog.cs b/Mundus/Views/Dialogs/ExitDialog.cs
index 73aff2e..698bb10 100644
--- a/Mundus/Views/Dialogs/ExitDialog.cs
+++ b/Mundus/Views/Dialogs/ExitDialog.cs
@@ -9,6 +9,7 @@
protected void OnDeleteEvent(object o, Gtk.DeleteEventArgs args)
{
+
//To keep window instance (it is needed (stored in WindowInstances.cs) until Application.Quit)
args.RetVal = true;
}
diff --git a/Mundus/Views/Windows/CraftingWindow.cs b/Mundus/Views/Windows/CraftingWindow.cs
index 149e33f..f05603d 100644
--- a/Mundus/Views/Windows/CraftingWindow.cs
+++ b/Mundus/Views/Windows/CraftingWindow.cs
@@ -69,7 +69,8 @@
/// <summary>
/// Crafts the item (calls CraftingController and hides the window)
/// </summary>
- protected void OnBtnCraftClicked(object sender, EventArgs e) {
+ protected void OnBtnCraftClicked(object sender, EventArgs e)
+ {
CraftingController.CraftItemPlayer(this.recipes[this.recipeIndex]);
this.Hide();
}
diff --git a/Mundus/Views/Windows/GameWindows/Small/SmallPrinting.cs b/Mundus/Views/Windows/GameWindows/Small/SmallPrinting.cs
index 1bd5618..dfcf464 100644
--- a/Mundus/Views/Windows/GameWindows/Small/SmallPrinting.cs
+++ b/Mundus/Views/Windows/GameWindows/Small/SmallPrinting.cs
@@ -329,7 +329,9 @@
{
for (int col = Calculate.CalculateStartX(Size), maxX = Calculate.CalculateMaxX(Size); col <= maxX; col++, img++)
{
- string stockName = GetPlayerScreenImage(row, col, Layer.Structure).Stock;
+ Image image = GetPlayerScreenImage(row, col, Layer.Structure);
+
+ string stockName = (image == null) ? "blank" : image.Stock;
switch (img)
{