RIP can now chop sticks but took HOURS to figure out how. Also if I can't find the path my code becomes vunerable to crash.

This commit is contained in:
2017-11-29 18:34:53 -08:00
parent edd769b151
commit 671eb1be49
27 changed files with 3459 additions and 211 deletions

View File

@ -61,10 +61,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RuneFactoryCropsMod", "Rune
{C5F88D48-EA20-40CD-91E2-C8725DC11795} = {C5F88D48-EA20-40CD-91E2-C8725DC11795}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarAI", "..\StarAI\StarAI\StarAI\StarAI.csproj", "{93632675-991D-425B-96F9-9C2B6BFC4EFE}"
ProjectSection(ProjectDependencies) = postProject
{0756D36A-95C8-480D-8EA6-4584C03010C6} = {0756D36A-95C8-480D-8EA6-4584C03010C6}
EndProjectSection
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarAI", "..\StarAI\StarAI\StarAI.csproj", "{93632675-991D-425B-96F9-9C2B6BFC4EFE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution

View File

@ -10,6 +10,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StarAI;
using StarAI.PathFindingCore.DebrisLogic;
namespace StarAI
{
@ -27,6 +28,8 @@ namespace StarAI
ModCore.CoreHelper.ConsoleCommands.Add("Water", "Water the crops", new Action<string, string[]>(Commands.waterCrops));
ModCore.CoreHelper.ConsoleCommands.Add("Harvest", "Harvest the crops", new Action<string, string[]>(Commands.harvestCrops));
ModCore.CoreHelper.ConsoleCommands.Add("getseeds", "Get Seeds From chests.", new Action<string, string[]>(Commands.getSeedsFromChests));
ModCore.CoreHelper.ConsoleCommands.Add("choptwigs", "Chop twigs.", new Action<string, string[]>(Commands.chopAllTwigs));
pathfind("Initialize Delay 0", new string[] {
"setDelay",
"0"
@ -38,6 +41,11 @@ namespace StarAI
ChestLogic.getAllSeasonalSeedsFromAllChestsAtLocation(Game1.player.currentLocation);
}
public static void chopAllTwigs(string s, string[] args)
{
DebrisLogic.getAllSticksToChopRadius(Game1.player.currentLocation);
}
public static void runTasks(string s, string[] args)
{
ExecutionCore.TaskList.runTaskList();
@ -339,7 +347,7 @@ namespace StarAI
obj[1] = PathFindingLogic.currentGoal;
PathFindingLogic.queue = new List<TileNode>();
obj[2] = PathFindingLogic.queue;
ExecutionCore.TaskList.taskList.Add(new ExecutionCore.CustomTask(PathFindingLogic.pathFindToSingleGoal, obj,new ExecutionCore.TaskMetaData("Pathfind Command",PathFindingCore.Utilities.calculatePathCost(PathFindingLogic.source))));
ExecutionCore.TaskList.taskList.Add(new ExecutionCore.CustomTask(PathFindingLogic.pathFindToSingleGoal, obj,new ExecutionCore.TaskMetaData("Pathfind Command",PathFindingCore.Utilities.calculatePathCost(PathFindingLogic.source,false))));
//ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(PathFindingLogic.pathFindToSingleGoal),obj));
}
#endregion

View File

@ -0,0 +1,52 @@
using StarAI.PathFindingCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore
{
public class CustomTask
{
public delegate void ObjectTask(object obj);
public delegate void VoidTask();
public ObjectTask objectTask;
public object objectParameterDataArray;
public VoidTask voidTask;
public TaskMetaData taskMetaData;
/// <summary>
/// Create a custom task and calculate cost of the action automatically without having to pass cost to the meta data. Saves a lot of code space and memory.
/// </summary>
/// <param name="objTask"></param>
/// <param name="arrayData"></param>
/// <param name="TaskMetaData"></param>
public CustomTask(ObjectTask objTask,object[] arrayData, TaskMetaData TaskMetaData)
{
objectTask = objTask;
objectParameterDataArray = arrayData;
this.taskMetaData = TaskMetaData;
this.taskMetaData.calculateTaskCost((TileNode)arrayData[0]);
}
public CustomTask(VoidTask vTask, TaskMetaData TaskMetaData)
{
voidTask = vTask;
this.taskMetaData = TaskMetaData;
}
public void runTask()
{
//Check Before running task if all prerequisites are working
if (objectTask != null) objectTask.Invoke(objectParameterDataArray);
if (voidTask != null) voidTask.Invoke();
}
}
}

View File

@ -0,0 +1,88 @@
using StarAI.PathFindingCore;
using StardewModdingAPI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore
{
class TaskList
{
public static List<CustomTask> taskList = new List<CustomTask>();
public static Task executioner = new Task(new Action(runTaskList));
public static List<CustomTask> removalList = new List<CustomTask>();
public static void runTaskList()
{
//myTask t = new myTask(StarAI.PathFindingCore.CropLogic.CropLogic.harvestSingleCrop);
bool assignNewTask = true;
while(ranAllTasks()==false)
{
//recalculate cost expenses every time a task runs because we don't know where we will be at any given moment. Kind of costly unfortunately but works.
foreach(var task2 in taskList)
{
if (removalList.Contains(task2)) continue;
object[] oArray = (object[])task2.objectParameterDataArray;
TileNode t =(TileNode) oArray[0];
task2.taskMetaData.calculateTaskCost((t));
//task.taskMetaData = new TaskMetaData(task.taskMetaData.name, PathFindingCore.Utilities.calculatePathCost(task.objectParameterDataArray), task.taskMetaData.staminaPrerequisite, task.taskMetaData.toolPrerequisite);
}
//Some really cool delegate magic that sorts in place by the cost of the action!!!!
taskList.Sort(delegate (CustomTask t1, CustomTask t2)
{
return t1.taskMetaData.cost.CompareTo(t2.taskMetaData.cost);
});
CustomTask v = taskList.ElementAt(0);
int i = 0;
while (removalList.Contains(v))
{
v = taskList.ElementAt(i);
i++;
}
// v.Start();
if (v.taskMetaData.verifyAllPrerequisitesHit() == true)
{
v.runTask();
removalList.Add(v);
}
else
{
removalList.Add(v);
}
}
taskList.Clear();
removalList.Clear();
}
public static bool ranAllTasks()
{
foreach(CustomTask task in taskList)
{
if (removalList.Contains(task)) continue;
else return false;
}
return true;
}
public static void printAllTaskMetaData()
{
ModCore.CoreMonitor.Log(taskList.Count.ToString());
foreach (var task in taskList)
{
task.taskMetaData.printMetaData();
}
}
}
}

View File

@ -0,0 +1,151 @@
using StarAI.PathFindingCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore
{
public class TaskMetaData
{
public string name;
public float priority;
public float cost;
public float utility;
public float frequency;
public StarAI.ExecutionCore.TaskPrerequisites.StaminaPrerequisite staminaPrerequisite;
public StarAI.ExecutionCore.TaskPrerequisites.ToolPrerequisite toolPrerequisite;
public TaskPrerequisites.InventoryFullPrerequisite inventoryPrerequisite;
public TaskPrerequisites.BedTimePrerequisite bedTimePrerequisite;
public List<TaskPrerequisites.GenericPrerequisite> prerequisitesList;
public List<TileNode> path = new List<TileNode>();
public TaskMetaData(string Name, float Priority, float Cost, float Utility, float Frequency, TaskPrerequisites.StaminaPrerequisite StaminaPrerequisite=null, TaskPrerequisites.ToolPrerequisite ToolPrerequisite=null, TaskPrerequisites.InventoryFullPrerequisite InventoryFull = null, TaskPrerequisites.BedTimePrerequisite BedTimePrereq=null)
{
this.name = Name;
this.priority = Priority;
this.cost = Cost;
this.utility = Utility;
this.frequency = Frequency;
this.staminaPrerequisite = StaminaPrerequisite;
this.toolPrerequisite = ToolPrerequisite;
this.inventoryPrerequisite = InventoryFull;
this.bedTimePrerequisite = BedTimePrereq;
//Make sure to set values correctly incase of null
setUpStaminaPrerequisiteIfNull();
setUpToolPrerequisiteIfNull();
setUpInventoryPrerequisiteIfNull();
setUpBedTimeIfNull();
this.prerequisitesList = new List<TaskPrerequisites.GenericPrerequisite>();
this.prerequisitesList.Add(this.staminaPrerequisite);
this.prerequisitesList.Add(this.toolPrerequisite);
this.prerequisitesList.Add(this.inventoryPrerequisite);
this.prerequisitesList.Add(this.bedTimePrerequisite);
}
public TaskMetaData(string Name,float Cost,TaskPrerequisites.StaminaPrerequisite StaminaPrerequisite = null, TaskPrerequisites.ToolPrerequisite ToolPrerequisite = null, TaskPrerequisites.InventoryFullPrerequisite InventoryFull = null,TaskPrerequisites.BedTimePrerequisite BedTimePrereq=null)
{
this.name = Name;
this.cost = Cost;
this.staminaPrerequisite = StaminaPrerequisite;
this.toolPrerequisite = ToolPrerequisite;
this.inventoryPrerequisite = InventoryFull;
this.bedTimePrerequisite = BedTimePrereq;
//Make sure to set values correctly incase of null
setUpStaminaPrerequisiteIfNull();
setUpToolPrerequisiteIfNull();
setUpInventoryPrerequisiteIfNull();
setUpBedTimeIfNull();
this.prerequisitesList = new List<TaskPrerequisites.GenericPrerequisite>();
this.prerequisitesList.Add(this.staminaPrerequisite);
this.prerequisitesList.Add(this.toolPrerequisite);
this.prerequisitesList.Add(this.inventoryPrerequisite);
this.prerequisitesList.Add(this.bedTimePrerequisite);
}
public TaskMetaData(string Name, TaskPrerequisites.StaminaPrerequisite StaminaPrerequisite = null, TaskPrerequisites.ToolPrerequisite ToolPrerequisite = null, TaskPrerequisites.InventoryFullPrerequisite InventoryFull=null,TaskPrerequisites.BedTimePrerequisite bedTimePrereq=null)
{
this.name = Name;
this.staminaPrerequisite = StaminaPrerequisite;
this.toolPrerequisite = ToolPrerequisite;
this.inventoryPrerequisite = InventoryFull;
this.bedTimePrerequisite = bedTimePrereq;
//Make sure to set values correctly incase of null
setUpStaminaPrerequisiteIfNull();
setUpToolPrerequisiteIfNull();
setUpInventoryPrerequisiteIfNull();
setUpBedTimeIfNull();
this.prerequisitesList = new List<TaskPrerequisites.GenericPrerequisite>();
this.prerequisitesList.Add(this.staminaPrerequisite);
this.prerequisitesList.Add(this.toolPrerequisite);
this.prerequisitesList.Add(this.inventoryPrerequisite);
this.prerequisitesList.Add(this.bedTimePrerequisite);
}
public void calculateTaskCost(TileNode source)
{
this.cost=TaskMetaDataHeuristics.calculateTaskCost(source, this.toolPrerequisite);
//this.path = Utilities.calculatePath(source, false);
}
private void setUpToolPrerequisiteIfNull()
{
if (this.toolPrerequisite == null)
{
this.toolPrerequisite = new TaskPrerequisites.ToolPrerequisite(false, null,0);
}
}
private void setUpStaminaPrerequisiteIfNull()
{
if (this.staminaPrerequisite == null)
{
this.staminaPrerequisite = new TaskPrerequisites.StaminaPrerequisite(false, 0);
}
}
private void setUpInventoryPrerequisiteIfNull()
{
if (this.inventoryPrerequisite == null) this.inventoryPrerequisite = new TaskPrerequisites.InventoryFullPrerequisite(false);
}
private void setUpBedTimeIfNull()
{
if (this.bedTimePrerequisite == null) this.bedTimePrerequisite = new TaskPrerequisites.BedTimePrerequisite(true);
}
public bool verifyAllPrerequisitesHit()
{
foreach(var prerequisite in this.prerequisitesList)
{
if (prerequisite.checkAllPrerequisites() == false) return false;
}
return true;
}
public void printMetaData()
{
string s = "";
s += "Queued Task:"+"\n";
s += " TaskName: " + this.name + "\n";
s += " TaskCost: " + this.cost + "\n";
s += " Task Requires Stamina: " + this.staminaPrerequisite.requiresStamina + "\n";
if(this.staminaPrerequisite.requiresStamina==true) s += " Requires : " + this.staminaPrerequisite.staminaCost + "Stamina.\n";
s += " Task Requires Tool: " + this.toolPrerequisite.requiresTool + "\n";
if (this.toolPrerequisite.requiresTool == true) s += " Requires a : " + this.toolPrerequisite.requiredTool + "\n";
s += " Task Requires Tool: " + this.toolPrerequisite.requiresTool + "\n";
s += " Checks if inventory full: "+this.inventoryPrerequisite.doesTaskRequireInventorySpace.ToString() + "\n";
ModCore.CoreMonitor.Log(s);
}
}
}

View File

@ -0,0 +1,77 @@
using StarAI.ExecutionCore.TaskPrerequisites;
using StarAI.PathFindingCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore
{
/// <summary>
/// This will be used to determine how much any given action, pathing distance, etc will have on the overall cost of a given task.
/// </summary>
public class TaskMetaDataHeuristics
{
/// <summary>
/// Multiplier to be used to multiply out pathCost on any given action. Higher numbers will mean more discrimination against actions with long manhattan distances.
/// </summary>
public static int pathCostMultiplier=1;
/// <summary>
/// This is a dictionary that holds the action cost for every tool when it is used.
/// </summary>
public static Dictionary<Type, int> toolCostDictionary = new Dictionary<Type, int>();
/// <summary>
/// Used to set the values at the beginning.
/// </summary>
public static void initializeToolCostDictionary()
{
toolCostDictionary.Add(typeof(StardewValley.Tools.WateringCan), 2);
toolCostDictionary.Add(typeof(StardewValley.Tools.Axe), 4);
toolCostDictionary.Add(typeof(StardewValley.Tools.Pickaxe), 3);
toolCostDictionary.Add(typeof(StardewValley.Tools.FishingRod), 5);
toolCostDictionary.Add(typeof(StardewValley.Tools.Hoe), 2);
toolCostDictionary.Add(typeof(StardewValley.Tools.MeleeWeapon), 1);
toolCostDictionary.Add(typeof(StardewValley.Tools.Sword), 1);
}
/// <summary>
/// Used to assign a weight to using a tool a single time.
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static int parseToolCostMultiplier(TaskPrerequisites.ToolPrerequisite t)
{
Type tool = t.requiredTool;
int value=2;
bool f = toolCostDictionary.TryGetValue(tool,out value);
if (f == true) return value;
else return 2;
}
/// <summary>
/// Used to calculate the weight of using a tool to add to the overall cost of a TaskMetaData cost.
/// </summary>
/// <param name="t"></param>
/// <param name="numberOfTimesToolIsUsed"></param>
/// <returns></returns>
public static int calculateToolCostMultiplier(TaskPrerequisites.ToolPrerequisite t)
{
if (t.requiresTool == false || t.requiredTool==null) return 0; //Default tool not used.
return (parseToolCostMultiplier(t) * t.estimatedNumberOfUses);
}
public static float calculateTaskCost(TileNode v,ToolPrerequisite t)
{
PathFindingLogic.delay = 18;
int costCalculation = StarAI.PathFindingCore.Utilities.calculatePathCost(v,true);
if (costCalculation == Int32.MaxValue) return Int32.MaxValue;
float pathCost= costCalculation* pathCostMultiplier;
float toolCost = calculateToolCostMultiplier(t);
return (pathCost + toolCost);
}
}
}

View File

@ -0,0 +1,56 @@
using StardewValley;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore.TaskPrerequisites
{
public class BedTimePrerequisite : GenericPrerequisite
{
public bool checkIfEnoughTimeRemaining;
public BedTimePrerequisite(bool CheckForBedtime)
{
this.checkIfEnoughTimeRemaining = CheckForBedtime;
}
public int timeRemainingInDay()
{
int passOutTime = 2600;
return passOutTime - Game1.timeOfDay;
}
/// <summary>
/// The default here will give you 2 hrs which should be enough for bedTime.
/// </summary>
/// <returns></returns>
public bool enoughTimeToDoTask()
{
int timeRemaining = timeRemainingInDay();
if (timeRemaining > 200) return true;
else return false;
}
public bool enoughTimeToDoTask(int timeToDoTask)
{
int timeRemaining = timeRemainingInDay();
if (timeRemaining > timeToDoTask) return true;
else return false;
}
public override bool checkAllPrerequisites()
{
if (this.checkIfEnoughTimeRemaining == false) return true;
if (enoughTimeToDoTask()) return true;
else
{
ModCore.CoreMonitor.Log("Not enough time remaining in the day. You should go home.");
//Add functionality here to return home.
return false;
}
}
}
}

View File

@ -0,0 +1,39 @@
using StardewValley;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore.TaskPrerequisites
{
/// <summary>
/// Weirdly enough this will be empty because it's just a placeholder prerequisite. Doesn't need to hold any more data since the player will always have an updated inventory.
/// </summary>
public class InventoryFullPrerequisite:GenericPrerequisite
{
public bool doesTaskRequireInventorySpace;
public InventoryFullPrerequisite(bool RequiresInventorySpace)
{
this.doesTaskRequireInventorySpace = RequiresInventorySpace;
}
public bool isPlayerInventoryFull()
{
return Game1.player.isInventoryFull();
}
public override bool checkAllPrerequisites()
{
if (this.doesTaskRequireInventorySpace == false) return true;
if (isPlayerInventoryFull() == false) return true;
else//player inventory is full
{
ModCore.CoreMonitor.Log("Player inventory is full failed the task prerequisite");
return false;
}
}
}
}

View File

@ -0,0 +1,55 @@
using StardewValley;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.ExecutionCore.TaskPrerequisites
{
public class ToolPrerequisite:GenericPrerequisite
{
public bool requiresTool;
public Type requiredTool;
public int estimatedNumberOfUses;
public ToolPrerequisite(bool TaskNeedsTool, Type RequiredTool, int EstimatedNumberOfUses)
{
requiresTool = TaskNeedsTool;
requiredTool = RequiredTool;
this.estimatedNumberOfUses = EstimatedNumberOfUses;
verifyToolSetUp();
}
public void verifyToolSetUp()
{
if (requiresTool == false)
{
requiredTool = null;
estimatedNumberOfUses = 0;
}
}
public bool isToolInInventory()
{
if (requiresTool == false) return true;
foreach (var item in Game1.player.items) {
Type t = requiredTool.GetType();
if ( item.GetType()==requiredTool) return true;
}
return false;
}
public override bool checkAllPrerequisites()
{
if (isToolInInventory()) return true;
else
{
ModCore.CoreMonitor.Log("A task failed due to not having the required tool: "+this.requiredTool);
return false;
}
}
//istoolinanychests???? Needs function to be able to request an item from any given chest and go fetch it which can require moving across maps.
}
}

211
StarAI/StarAI/ModCore.cs Normal file
View File

@ -0,0 +1,211 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StardewValley;
using StardewModdingAPI;
using WindowsInput;
using Microsoft.Xna.Framework;
using StarAI.PathFindingCore;
using System.IO;
using StardustCore;
namespace StarAI
{
//TODO: Clean up initial code
//Make sure pathos doesn't update this once since it's a homework assignment. Sorry Pathos!
//Work on dijakstra's algorithm for path finding on this one? Make sure obstacles are included.
//Question how this is all going to work.
public class ModCore : Mod
{
public static StardewModdingAPI.IMonitor CoreMonitor;
public static StardewModdingAPI.IModHelper CoreHelper;
public static List<Warp> warpGoals = new List<Warp>();
public static object[] obj = new object[3];
public override void Entry(IModHelper helper)
{
obj[0] = PathFindingLogic.source;
obj[1] = PathFindingLogic.currentGoal;
obj[2] = PathFindingLogic.queue;
CoreHelper = helper;
// string[] s = new string[10];
CoreMonitor = this.Monitor;
CoreMonitor.Log("Hello AI WORLD!", LogLevel.Info);
Commands.initializeCommands();
PathFindingCore.Utilities.initializeTileExceptionList();
ExecutionCore.TaskMetaDataHeuristics.initializeToolCostDictionary();
//throw new NotImplementedException();
StardewModdingAPI.Events.LocationEvents.CurrentLocationChanged += LocationEvents_CurrentLocationChanged;
StardewModdingAPI.Events.ControlEvents.KeyPressed += ControlEvents_KeyPressed;
StardewModdingAPI.Events.SaveEvents.AfterLoad += SaveEvents_AfterLoad;
// StardewModdingAPI.Events.GraphicsEvents.OnPreRenderEvent += PathFindingCore.Utilities.addFromPlacementListBeforeDraw;
StardustCore.ModCore.SerializationManager.acceptedTypes.Add("StarAI.PathFindingCore.TileNode", new StardustCore.Serialization.SerializerDataNode(new StardustCore.Serialization.SerializerDataNode.SerializingFunction(StarAI.PathFindingCore.TileNode.Serialize), new StardustCore.Serialization.SerializerDataNode.ParsingFunction(StarAI.PathFindingCore.TileNode.ParseIntoInventory), new StardustCore.Serialization.SerializerDataNode.WorldParsingFunction(StarAI.PathFindingCore.TileNode.SerializeFromWorld), new StardustCore.Serialization.SerializerDataNode.SerializingToContainerFunction(StarAI.PathFindingCore.TileNode.Serialize)));
}
private void SaveEvents_AfterLoad(object sender, EventArgs e)
{
loadExceptionTiles();
}
public void loadExceptionTiles()
{
if (!Directory.Exists(Path.Combine(CoreHelper.DirectoryPath, PathFindingCore.Utilities.folderForExceptionTiles)))
{
Directory.CreateDirectory(Path.Combine(CoreHelper.DirectoryPath, PathFindingCore.Utilities.folderForExceptionTiles));
}
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(Path.Combine(CoreHelper.DirectoryPath,PathFindingCore.Utilities.folderForExceptionTiles));
foreach (string fileName in fileEntries)
{
try
{
TileExceptionNode t = TileExceptionNode.parseJson(fileName);
PathFindingCore.Utilities.ignoreCheckTiles.Add(t);
}
catch(Exception err)
{
ModCore.CoreMonitor.Log(err.ToString(), LogLevel.Error);
}
}
}
private void ControlEvents_KeyPressed(object sender, StardewModdingAPI.Events.EventArgsKeyPressed e)
{
//J key for shop
#region
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.J)
{
CoreMonitor.Log("OK THE J KEY WAS PRESSED!");
List<Item> shoppingList = new List<Item>();
StarAI.PathFindingCore.TileNode t = new StarAI.PathFindingCore.TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Aqua));
if (t == null)
{
CoreMonitor.Log("WTF?????");
}
try
{
if (t == null)
{
return;
}
shoppingList.Add((Item)t);
Game1.activeClickableMenu = new StardewValley.Menus.ShopMenu(shoppingList);
}
catch (Exception err)
{
CoreMonitor.Log(Convert.ToString(err));
}
}
#endregion
//K key for placing a tile.
#region
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.K)
{
CoreMonitor.Log("OK THE K KEY WAS PRESSED!");
StarAI.PathFindingCore.TileNode t = new StarAI.PathFindingCore.TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.randomColor());
if (t == null)
{
CoreMonitor.Log("WTF?????");
}
try
{
if (t == null)
{
return;
}
CoreMonitor.Log(new Vector2(Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize).ToString());
int xPos = (int)(Game1.player.getTileX()) * Game1.tileSize;
int yPos = (int)(Game1.player.getTileY()) * Game1.tileSize;
Rectangle r = new Rectangle(xPos, yPos, Game1.tileSize, Game1.tileSize);
Vector2 pos = new Vector2(r.X, r.Y);
bool ok = StarAI.PathFindingCore.TileNode.checkIfICanPlaceHere(t, pos, Game1.player.currentLocation);
if (ok == false) return;
t.placementAction(Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
//t.setAdjacentTiles(true);
}
catch (Exception err)
{
CoreMonitor.Log(Convert.ToString(err));
}
}
#endregion
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.U)
{
ExecutionCore.TaskList.printAllTaskMetaData();
}
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.O)
{
foreach (var v in Game1.player.currentLocation.map.TileSheets)
{
foreach (var q in Game1.player.currentLocation.map.Layers)
{
string[] s = q.ToString().Split(':');
string layer = s[1].Trim();
if (Game1.player.currentLocation.map.GetLayer(layer) == null)
{
ModCore.CoreMonitor.Log("SHITTTTTT: " + layer, LogLevel.Error);
}
int tileIndex = Game1.player.currentLocation.getTileIndexAt((int)Game1.player.getTileX() / Game1.tileSize, (int)Game1.player.getTileY() / Game1.tileSize, layer);
if (tileIndex == -1) continue;
//ModCore.CoreMonitor.Log("Position: " + (Game1.player.getTileLocation() / Game1.tileSize).ToString(), LogLevel.Warn);
//ModCore.CoreMonitor.Log("Layer: " + layer, LogLevel.Warn);
//ModCore.CoreMonitor.Log("Index: " + tileIndex.ToString(), LogLevel.Warn);
//ModCore.CoreMonitor.Log("Image Source: " + v.ImageSource, LogLevel.Warn);
if (layer == "Buildings")
{
TileExceptionNode tileException = new TileExceptionNode(v.ImageSource, tileIndex);
foreach(var tile in PathFindingCore.Utilities.ignoreCheckTiles)
{
if (tile.imageSource == tileException.imageSource && tile.index == tileException.index)
{
ModCore.CoreMonitor.Log("Tile exception already initialized!");
return; //tile is already initialized.
}
}
PathFindingCore.Utilities.ignoreCheckTiles.Add(tileException);
tileException.serializeJson(Path.Combine(ModCore.CoreHelper.DirectoryPath, PathFindingCore.Utilities.folderForExceptionTiles));
//StardustCore.ModCore.SerializationManager.
}
}
}
}
}
private void LocationEvents_CurrentLocationChanged(object sender, StardewModdingAPI.Events.EventArgsCurrentLocationChanged e)
{
CoreMonitor.Log("LOCATION CHANGED!");
CoreMonitor.Log(Game1.player.currentLocation.name);
foreach (var v in Game1.player.currentLocation.warps)
{
string s = "X: " + Convert.ToString(v.X) + " Y: " + Convert.ToString(v.Y) + " TargetX: " + Convert.ToString(v.TargetX) + " TargetY: " + Convert.ToString(v.TargetY) + " TargetLocationName: " + Convert.ToString(v.TargetName);
CoreMonitor.Log(s);
//warpGoals.Add(v); Disabled for now
}
//GameLocation loc=Game1.getLocationFromName("location name")
//
}
}
}

View File

@ -0,0 +1,282 @@
using Microsoft.Xna.Framework;
using StardewModdingAPI;
using StardewValley;
using StardewValley.Objects;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.PathFindingCore
{
class ChestLogic
{
public static List<TileNode> chestsAtThisLocation = new List<TileNode>();
public static void getAllSeasonalSeedsFromAllChestsAtLocation(GameLocation location)
{
object[] arr = new object[1];
arr[0] = location;
getAllSeasonalSeedsFromAllChestsAtLocation(arr);
}
public static void getAllSeasonalSeedsFromAllChestsAtLocation(object obj)
{
object[] objArr = (object[])obj;
GameLocation location = (GameLocation)objArr[0];
foreach (var v in location.objects)
{
ModCore.CoreMonitor.Log(v.Value.name);
if (v.Value is StardewValley.Objects.Chest)
{
//if contains seeds that can be planted this season.
foreach(var item in (v.Value as StardewValley.Objects.Chest).items)
{
if (item.getCategoryName() == "Seed")
{
StardewValley.Crop c = new Crop(item.parentSheetIndex, 0, 0);
if (c.seasonsToGrowIn.Contains(Game1.currentSeason))
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
//t.placementAction(Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize);
t.tileLocation=new Vector2((int)v.Key.X, (int)v.Key.Y);
t.position = new Vector2(v.Key.X*Game1.tileSize, v.Key.Y*Game1.tileSize);
t.thisLocation = location;
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Chest"));
chestsAtThisLocation.Add(t);
}
}
}
}
}
foreach (var v in chestsAtThisLocation)
{
object[] objList = new object[1];
objList[0] = v;
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(pathToSingleChest, objList, new ExecutionCore.TaskMetaData("Path to chest for seeds", null, null, new ExecutionCore.TaskPrerequisites.InventoryFullPrerequisite(true)));
if (task.taskMetaData.cost == Int32.MaxValue)
{
Utilities.clearExceptionListWithNames(true);
continue;
}
ExecutionCore.TaskList.taskList.Add(task);
Utilities.clearExceptionListWithName(true, "Child");
// waterSingleCrop(v);
}
}
public static void pathToSingleChest(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
bool moveOn = false;
foreach (var q in Utilities.tileExceptionList)
{
if (q.tile == v && q.actionType == "Chest")
{
moveOn = true;
}
}
if (moveOn == false) return;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true,false);
// ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode( t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Navigation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
//StaardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(tempSource, Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize));
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(),true,false);
if (path.Count != 0)
{
//ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(someTile);
//ModCore.CoreMonitor.Log("CAUGHT MY CULPERATE", LogLevel.Warn);
}
}
}
Console.WriteLine("GOALS COUNT:" + miniGoals.Count);
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
ModCore.CoreMonitor.Log("PATH COUNT:"+paths.Count.ToString());
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
PathFindingLogic.calculateMovement(correctPath);
if (v.tileLocation.X < Game1.player.getTileX())
{
Game1.player.faceDirection(3);
}
else if (v.tileLocation.X > Game1.player.getTileX())
{
Game1.player.faceDirection(1);
}
else if (v.tileLocation.Y < Game1.player.getTileY())
{
Game1.player.faceDirection(0);
}
else if (v.tileLocation.Y > Game1.player.getTileY())
{
Game1.player.faceDirection(2);
}
bool move = false;
Chest chest =(Chest) v.thisLocation.objects[v.tileLocation];
List<Item> removalListSeeds = new List<Item>();
//Try to grab all the seeds I can from the chest.
while (Game1.player.isInventoryFull()==false&&chest.items.Count>0)
{
if (chest.giftbox)
{
ModCore.CoreMonitor.Log("GIFT BOX", LogLevel.Warn);
v.thisLocation.objects.Remove(v.tileLocation);
}
foreach (var item in chest.items)
{
if (item.getCategoryName() == "Seed")
{
int seedIndex = item.parentSheetIndex;
if (seedIndex == 770)
{
seedIndex = Crop.getRandomLowGradeCropForThisSeason(Game1.currentSeason);
if (seedIndex == 473)
--seedIndex;
}
StardewValley.Crop c = new Crop(seedIndex, 0, 0);
if (c.seasonsToGrowIn.Contains(Game1.currentSeason))
{
Game1.player.addItemByMenuIfNecessary(item);
removalListSeeds.Add(item);
break;
}
}
}
foreach(var remove in removalListSeeds)
{
chest.items.Remove(remove);
}
// if (WindowsInput.InputSimulator.IsKeyDown(WindowsInput.VirtualKeyCode.VK_C) == false) WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.VK_C);
Vector2 center = new Vector2();
if (Game1.player.facingDirection == 2)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 1)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 0)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
continue;
}
if (Game1.player.facingDirection == 3)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y - 1);
continue;
}
Game1.player.position = center;
}
Utilities.cleanExceptionList(v);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
// StardustCore.Utilities.masterRemovalList.Add(v);
//v.performRemoveAction(v.tileLocation, v.thisLocation);
// v.thisLocation.objects.Remove(v.tileLocation);
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
//StardustCore.Utilities.masterRemovalList.Add(v);
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
//WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
}
}
}

View File

@ -0,0 +1,473 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StardewModdingAPI;
using StardustCore;
using StardewValley;
using Microsoft.Xna.Framework;
using System.IO;
using StarAI.ExecutionCore.TaskPrerequisites;
namespace StarAI.PathFindingCore.CropLogic
{
class CropLogic
{
public static List<TileNode> cropsToWater = new List<TileNode>();
public static List<TileNode> cropsToHarvest = new List<TileNode>();
public static void getAllCropsNeededToBeWatered()
{
foreach (var v in Game1.player.currentLocation.terrainFeatures)
{
if (v.Value is StardewValley.TerrainFeatures.HoeDirt)
{
if ((v.Value as StardewValley.TerrainFeatures.HoeDirt).crop != null)
{
//cropsToWater.Add(v.Key);
//If my dirt needs to be watered and the crop isn't fully grown.
if ((v.Value as StardewValley.TerrainFeatures.HoeDirt).state==0 && isCropFullGrown((v.Value as StardewValley.TerrainFeatures.HoeDirt).crop) == false)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.LightSkyBlue));
t.placementAction(Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Water"));
cropsToWater.Add(t);
}
}
}
}
//Instead of just running this function I should add it to my execution queue.
foreach(var v in cropsToWater)
{
object[] obj = new object[1];
obj[0] = v;
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
ExecutionCore.TaskList.taskList.Add(new ExecutionCore.CustomTask(waterSingleCrop, obj,new ExecutionCore.TaskMetaData("Water Crop", new StaminaPrerequisite(true,3),new ToolPrerequisite(true,w.GetType(),1))));
// waterSingleCrop(v);
}
}
public static void waterSingleCrop(TileNode v)
{
object[] obj = new object[1];
obj[0] = v;
waterSingleCrop(obj);
}
public static void waterSingleCrop(object obj) {
object[] objArr =(object[]) obj;
TileNode v =(TileNode) objArr[0];
bool moveOn = false;
foreach (var q in Utilities.tileExceptionList)
{
if(q.tile==v && q.actionType=="Water")
{
moveOn = true;
}
}
if (moveOn == false) return;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{ for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f= PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos*Game1.tileSize, v.thisLocation,true);
// ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
t.placementAction(Game1.currentLocation,(int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode( t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t,"Navigation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach(var nav in miniGoals)
{
TileNode tempSource= new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX()*Game1.tileSize, Game1.player.getTileY()*Game1.tileSize);
//StaardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(tempSource, Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize));
List<TileNode> path= PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource,nav,new List<TileNode>(),true,false);
if (path.Count!=0)
{
//ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach(var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(someTile);
//ModCore.CoreMonitor.Log("CAUGHT MY CULPERATE", LogLevel.Warn);
}
}
}
Console.WriteLine("GOALS COUNT:" + miniGoals.Count);
foreach(var q in removalList) {
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach(var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath) {
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
goodTile.placementAction(goodTile.thisLocation,(int) goodTile.tileLocation.X*Game1.tileSize, (int)goodTile.tileLocation.Y*Game1.tileSize);
}
PathFindingLogic.calculateMovement(correctPath);
if (v.tileLocation.X < Game1.player.getTileX())
{
Game1.player.faceDirection(3);
}
else if (v.tileLocation.X > Game1.player.getTileX())
{
Game1.player.faceDirection(1);
}
else if (v.tileLocation.Y < Game1.player.getTileY())
{
Game1.player.faceDirection(0);
}
else if (v.tileLocation.Y > Game1.player.getTileY())
{
Game1.player.faceDirection(2);
}
foreach (var item in Game1.player.items)
{
if(item is StardewValley.Tools.WateringCan)
{
Game1.player.CurrentToolIndex = Game1.player.getIndexOfInventoryItem(item);
}
}
bool move = false;
while ((v.thisLocation.terrainFeatures[v.tileLocation] as StardewValley.TerrainFeatures.HoeDirt).state==0)
{
if(WindowsInput.InputSimulator.IsKeyDown(WindowsInput.VirtualKeyCode.VK_C)==false) WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.VK_C);
Vector2 center=new Vector2();
if (Game1.player.facingDirection == 2)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X+1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 1)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X-1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 0)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y+1);
continue;
}
if (Game1.player.facingDirection == 3)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y-1);
continue;
}
Game1.player.position = center;
//Game1.setMousePosition((int)v.tileLocation.X*Game1.tileSize/2,(int)v.tileLocation.Y*Game1.tileSize/2);
ModCore.CoreMonitor.Log("DOESNT WATER LIKE YOU THINK IT SHOULD");
ModCore.CoreMonitor.Log("player pos: "+Game1.player.position.ToString(),LogLevel.Warn);
ModCore.CoreMonitor.Log("TilePos: "+v.position.ToString(), LogLevel.Error);
}
Utilities.cleanExceptionList(v);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
// StardustCore.Utilities.masterRemovalList.Add(v);
//v.performRemoveAction(v.tileLocation, v.thisLocation);
v.thisLocation.objects.Remove(v.tileLocation);
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
//StardustCore.Utilities.masterRemovalList.Add(v);
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
}
public static void getAllCropsNeededToBeHarvested()
{
foreach (var v in Game1.player.currentLocation.terrainFeatures)
{
if (v.Value is StardewValley.TerrainFeatures.HoeDirt)
{
if ((v.Value as StardewValley.TerrainFeatures.HoeDirt).crop != null)
{
//If my dirt needs to be watered and the crop isn't fully grown.
if (isCropFullGrown((v.Value as StardewValley.TerrainFeatures.HoeDirt).crop))
{
ModCore.CoreMonitor.Log("OK!!!!");
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.LimeGreen));
t.placementAction(Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Harvest"));
cropsToHarvest.Add(t);
}
}
}
}
//Instead of just running this function I should add it to my execution queue.
foreach (var v in cropsToHarvest)
{
object[] obj = new object[1];
obj[0] = v;
//ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(harvestSingleCrop), obj));
ExecutionCore.TaskList.taskList.Add(new ExecutionCore.CustomTask(harvestSingleCrop, obj,new ExecutionCore.TaskMetaData("HarvestSingleCrop",null,null,new ExecutionCore.TaskPrerequisites.InventoryFullPrerequisite(true))));
// waterSingleCrop(v);
}
}
public static void harvestSingleCrop(TileNode v)
{
object[] obj = new object[1];
obj[0] = v;
harvestSingleCrop(obj);
}
public static void harvestSingleCrop(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
foreach (var q in objArr){
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT !: " + q, LogLevel.Alert);
}
if(v==null) ModCore.CoreMonitor.Log("WTF MARK!!!!!!: ", LogLevel.Alert);
bool moveOn = false;
foreach (var q in Utilities.tileExceptionList)
{
if (q.tile == v && q.actionType == "Harvest")
{
moveOn = true;
}
}
if (moveOn == false) return;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_X);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true);
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Navigation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(),true,false);
if (path.Count!=0)
{
ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(v);
}
}
}
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
}
//END HERE FOR JUST CALCULATING PATH COST
PathFindingLogic.calculateMovement(correctPath);
if (v.tileLocation.X < Game1.player.getTileX())
{
Game1.player.faceDirection(3);
}
else if (v.tileLocation.X > Game1.player.getTileX())
{
Game1.player.faceDirection(1);
}
else if (v.tileLocation.Y < Game1.player.getTileY())
{
Game1.player.faceDirection(0);
}
else if (v.tileLocation.Y > Game1.player.getTileY())
{
Game1.player.faceDirection(2);
}
/*
foreach (var item in Game1.player.items)
{
//if (item is StardewValley.Tools.WateringCan)
//{
// Game1.player.CurrentToolIndex = Game1.player.getIndexOfInventoryItem(item);
//}
}
*/
bool move = false;
while ((v.thisLocation.terrainFeatures[v.tileLocation] as StardewValley.TerrainFeatures.HoeDirt).crop !=null)
{
if (WindowsInput.InputSimulator.IsKeyDown(WindowsInput.VirtualKeyCode.VK_X) == false) WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.VK_X);
Vector2 center = new Vector2();
if (Game1.player.facingDirection == 2)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 1)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 0)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
continue;
}
if (Game1.player.facingDirection == 3)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y - 1);
continue;
}
Game1.player.position = center;
}
Utilities.cleanExceptionList(v);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
v.thisLocation.objects.Remove(v.tileLocation);
//v.performRemoveAction(v.tileLocation, v.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(v);
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_X);
}
public static bool isCropFullGrown(Crop c)
{
if (c.currentPhase >= c.phaseDays.Count - 1)
{
c.currentPhase = c.phaseDays.Count - 1;
c.dayOfCurrentPhase = 0;
return true;
}
return false;
}
}
}

View File

@ -0,0 +1,366 @@
using Microsoft.Xna.Framework;
using StarAI.ExecutionCore.TaskPrerequisites;
using StardewModdingAPI;
using StardewValley;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StarAI.PathFindingCore.DebrisLogic
{
class DebrisLogic
{
public static List<TileNode> sticksToChop = new List<TileNode>();
public static void getAllSticksToChop(GameLocation location)
{
object[] arr = new object[1];
arr[0] = location;
getAllSticksToChop(arr);
}
public static void getAllSticksToChop(object obj)
{
int twingCount = 0;
object[] objArr = (object[])obj;
GameLocation location = (GameLocation)objArr[0];
foreach (var v in location.objects)
{
ModCore.CoreMonitor.Log(v.Value.name);
if (v.Value.name == "Twig")
{
ModCore.CoreMonitor.Log(v.Value.name,LogLevel.Warn);
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
//t.placementAction(Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize);
t.fakePlacementAction(Game1.currentLocation, (int)v.Key.X, (int)v.Key.Y);
//t.tileLocation = new Vector2((int)v.Key.X, (int)v.Key.Y);
//t.position = new Vector2(v.Key.X * Game1.tileSize, v.Key.Y * Game1.tileSize);
//t.thisLocation = location;
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "ChopStick"));
sticksToChop.Add(t);
twingCount++;
}
}
int ok = 0;
foreach (var v in sticksToChop)
{
object[] objList = new object[1];
objList[0] = v;
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
StardewValley.Tools.Axe w = new StardewValley.Tools.Axe();
ModCore.CoreMonitor.Log("Processing twig:" + ok.ToString() + " / " + twingCount.ToString());
ok++;
ExecutionCore.CustomTask task= new ExecutionCore.CustomTask(chopSingleStick, objList, new ExecutionCore.TaskMetaData("Chop Single Stick", new StaminaPrerequisite(true, 3), new ToolPrerequisite(true, w.GetType(), 1)));
if (task.taskMetaData.cost == Int32.MaxValue)
{
Utilities.clearExceptionListWithNames(true);
continue;
}
ModCore.CoreMonitor.Log("TASK COST:"+task.taskMetaData.cost.ToString());
ExecutionCore.TaskList.taskList.Add(task);
ModCore.CoreMonitor.Log("TASK LIST COUNT:"+ExecutionCore.TaskList.taskList.Count.ToString());
Utilities.clearExceptionListWithName(true, "Child");
// waterSingleCrop(v);
}
}
public static void getAllSticksToChopRadius(GameLocation location)
{
object[] arr = new object[1];
arr[0] = location;
getAllSticksToChopRadius(arr);
}
public static StardewValley.Object checkRadiusForObject(int radius,string name)
{
for(int x = -radius; x <= radius; x++)
{
for (int y = -radius; y <= radius; y++)
{
StardewValley.Object obj = Game1.player.currentLocation.getObjectAt((Game1.player.getTileX() + x)*Game1.tileSize, (Game1.player.getTileY() + y)*Game1.tileSize);
if (obj == null) continue;
if (obj.name==name)
{
return obj;
}
}
}
return null;
}
public static bool doesLocationContainObject(GameLocation location, string name)
{
foreach(var v in location.objects)
{
if (name == v.Value.name) return true;
}
return false;
}
public static void getAllSticksToChopRadius(object obj)
{
int radius = 1;
int twingCount = 0;
object[] objArr = (object[])obj;
GameLocation location = (GameLocation)objArr[0];
if (doesLocationContainObject(location, "Twig")) {
StardewValley.Object twig = checkRadiusForObject(radius, "Twig");
while (twig == null)
{
radius++;
twig = checkRadiusForObject(radius, "Twig");
}
ModCore.CoreMonitor.Log(twig.name);
if (twig.name == "Twig")
{
ModCore.CoreMonitor.Log(twig.name, LogLevel.Warn);
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
//t.placementAction(Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize);
t.fakePlacementAction(Game1.currentLocation, (int)twig.tileLocation.X, (int)twig.tileLocation.Y);
//t.tileLocation = new Vector2((int)v.Key.X, (int)v.Key.Y);
//t.position = new Vector2(v.Key.X * Game1.tileSize, v.Key.Y * Game1.tileSize);
//t.thisLocation = location;
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "ChopStick"));
sticksToChop.Add(t);
twingCount++;
}
}
else
{
ModCore.CoreMonitor.Log("Twig is not found at location.");
}
int ok = 0;
foreach (var v in sticksToChop)
{
object[] objList = new object[1];
objList[0] = v;
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
StardewValley.Tools.Axe w = new StardewValley.Tools.Axe();
ModCore.CoreMonitor.Log("Processing twig:" + ok.ToString() + " / " + twingCount.ToString());
ok++;
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(chopSingleStick, objList, new ExecutionCore.TaskMetaData("Chop Single Stick", new StaminaPrerequisite(true, 3), new ToolPrerequisite(true, w.GetType(), 1)));
ModCore.CoreMonitor.Log("TASK COST:" + task.taskMetaData.cost.ToString());
ExecutionCore.TaskList.taskList.Add(task);
ModCore.CoreMonitor.Log("TASK LIST COUNT:" + ExecutionCore.TaskList.taskList.Count.ToString());
//Utilities.clearExceptionListWithName(true, "Child");
// waterSingleCrop(v);
}
}
public static void chopSingleStick(TileNode v)
{
object[] obj = new object[1];
obj[0] = v;
chopSingleStick(obj);
}
public static void chopSingleStick(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
bool moveOn = false;
foreach (var q in Utilities.tileExceptionList)
{
if (q.tile == v && q.actionType == "ChopStick")
{
moveOn = true;
}
}
if (moveOn == false) return;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true);
// ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode( t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "Navigation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
//StaardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(tempSource, Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize));
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(), true, false);
if (path.Count != 0)
{
//ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(someTile);
//ModCore.CoreMonitor.Log("CAUGHT MY CULPERATE", LogLevel.Warn);
}
}
}
Console.WriteLine("GOALS COUNT:" + miniGoals.Count);
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
PathFindingLogic.calculateMovement(correctPath);
if (v.tileLocation.X < Game1.player.getTileX())
{
Game1.player.faceDirection(3);
}
else if (v.tileLocation.X > Game1.player.getTileX())
{
Game1.player.faceDirection(1);
}
else if (v.tileLocation.Y < Game1.player.getTileY())
{
Game1.player.faceDirection(0);
}
else if (v.tileLocation.Y > Game1.player.getTileY())
{
Game1.player.faceDirection(2);
}
foreach (var item in Game1.player.items)
{
if (item is StardewValley.Tools.Axe)
{
Game1.player.CurrentToolIndex = Game1.player.getIndexOfInventoryItem(item);
}
}
bool move = false;
StardewValley.Object twig = v.thisLocation.objects[v.tileLocation];
while ((twig.name=="Twig"))
{
if (!v.thisLocation.isObjectAt((int)v.tileLocation.X*Game1.tileSize, (int)v.tileLocation.Y*Game1.tileSize)) break;
if (WindowsInput.InputSimulator.IsKeyDown(WindowsInput.VirtualKeyCode.VK_C) == false) WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.VK_C);
Vector2 center = new Vector2();
if (Game1.player.facingDirection == 2)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 1)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
continue;
}
if (Game1.player.facingDirection == 0)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
continue;
}
if (Game1.player.facingDirection == 3)
{
center = Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y - 1);
continue;
}
Game1.player.position = center;
//Game1.setMousePosition((int)v.tileLocation.X*Game1.tileSize/2,(int)v.tileLocation.Y*Game1.tileSize/2);
ModCore.CoreMonitor.Log("DOESNT Axe LIKE YOU THINK IT SHOULD");
ModCore.CoreMonitor.Log("player pos: " + Game1.player.position.ToString(), LogLevel.Warn);
ModCore.CoreMonitor.Log("TilePos: " + v.position.ToString(), LogLevel.Error);
}
Utilities.cleanExceptionList(v);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
// StardustCore.Utilities.masterRemovalList.Add(v);
//v.performRemoveAction(v.tileLocation, v.thisLocation);
// v.thisLocation.objects.Remove(v.tileLocation);
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
//StardustCore.Utilities.masterRemovalList.Add(v);
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
}
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
}
}
}

View File

@ -116,7 +116,7 @@ namespace StarAI.PathFindingCore
if (x == 1 && y == 1) continue; //bottom right
//TileNode t = new TileNode(1, Vector2.Zero, Souce.texturePath,source.dataPath, source.drawColor);
TileNode.setSingleTileAsChild(currentNode, (int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y);
TileNode.setSingleTileAsChild(currentNode, (int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y,false);
Vector2 check = new Vector2((int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y);
if(check.X==Goal.tileLocation.X && check.Y == Goal.tileLocation.Y)
{
@ -275,13 +275,14 @@ namespace StarAI.PathFindingCore
/// <param name="Queue">Depreciated for further builds.</param>
/// <param name="Placement">Whether or not tiles are actually going to be placed</param>
/// <returns></returns>
public static List<TileNode> pathFindToSingleGoalReturnPath(TileNode Source, TileNode Goal, List<TileNode> Queue,bool Placement)
public static List<TileNode> pathFindToSingleGoalReturnPath(TileNode Source, TileNode Goal, List<TileNode> Queue,bool Placement,bool CheckForUtility)
{
object[] obj = new object[4];
object[] obj = new object[5];
obj[0] = Source;
obj[1] = Goal;
obj[2] = Queue;
obj[3] = Placement;
obj[4] = CheckForUtility;
return pathFindToSingleGoalReturnPath(obj);
}
@ -308,14 +309,15 @@ namespace StarAI.PathFindingCore
TileNode currentNode = Source;
bool placement = (bool)obj[3];
bool checkForUtility = (bool)obj[4];
queue.Add(currentNode);
index++;
bool goalFound = false;
while (currentNode.tileLocation != Goal.tileLocation && queue.Count != 0)
{
// ModCore.CoreMonitor.Log("LET'S GO PATH!!!!", LogLevel.Error);
// ModCore.CoreMonitor.Log("PATH FROM SOURCE: " + currentNode.tileLocation, LogLevel.Error);
// ModCore.CoreMonitor.Log("PATH To GOAL: " + Goal.tileLocation, LogLevel.Error);
//ModCore.CoreMonitor.Log("PATH FROM SOURCE: " + currentNode.tileLocation, LogLevel.Error);
//ModCore.CoreMonitor.Log("PATH To GOAL: " + Goal.tileLocation, LogLevel.Error);
//Console.WriteLine("OK WTF IS GOING ON????");
//Add children to current node
int xMin = -1;
@ -337,8 +339,8 @@ namespace StarAI.PathFindingCore
if (x == 1 && y == 1) continue; //bottom right
//TileNode t = new TileNode(1, Vector2.Zero, Souce.texturePath,source.dataPath, source.drawColor);
//ModCore.CoreMonitor.Log("HERE1", LogLevel.Error);
TileNode.setSingleTileAsChild(currentNode, (int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y,placement);
TileNode.setSingleTileAsChild(currentNode, (int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y, checkForUtility,true);
//ModCore.CoreMonitor.Log("OR NO?", LogLevel.Error);
Vector2 check = new Vector2((int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y);
if (check.X == Goal.tileLocation.X && check.Y == Goal.tileLocation.Y)
@ -462,6 +464,7 @@ namespace StarAI.PathFindingCore
}
}
List<TileNode> removalList = new List<TileNode>();
List<TileNode> ignoreList = new List<TileNode>();
foreach (var v in StardustCore.ModCore.SerializationManager.trackedObjectList)
{
if (v is TileNode)
@ -469,25 +472,52 @@ namespace StarAI.PathFindingCore
foreach (var exc in Utilities.tileExceptionList)
{
if (exc.tile == (v as TileNode)) continue;
if (ignoreList.Contains(exc.tile)) continue;
// if ( (exc.tile == (v as TileNode)&&(exc.actionType!="Child"||exc.actionType!="Navigation"||exc.actionType!="CostCalculation"))|| path.Contains(v)) continue;
if (exc.actionType == "ChopStick")
{
List<TileNode> idk = new List<TileNode>();
foreach (var q in removalList)
{
if (exc.tile.tileLocation == q.tileLocation)
{
idk.Add(q);
//removalList.Remove(exc.tile);
ignoreList.Add(exc.tile);
continue;
}
}
foreach(var h in idk)
{
removalList.Remove(exc.tile);
}
}
else removalList.Add((TileNode)v);
}
if (path.Contains(v) || goals.Contains(v) || v.drawColor == StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Red))
{
continue;
}
else
{
removalList.Add((TileNode)v);
}
}
}
foreach (var v in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
//v.performRemoveAction(v.tileLocation, v.thisLocation);
if(placement)v.thisLocation.removeObject(v.tileLocation, false);
try
{
StardewValley.Object ob = v.thisLocation.objects[v.tileLocation];
ModCore.CoreMonitor.Log(ob.name);
if (v.name != "Generic Colored Tile") continue;// ModCore.CoreMonitor.Log("Culperate 3");
if (placement) v.thisLocation.removeObject(v.tileLocation, false);
}
catch(Exception err)
{
}
//StardustCore.Utilities.masterRemovalList.Add(v);
}
return path;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,408 @@
using Microsoft.Xna.Framework;
using StardewModdingAPI;
using StardewValley;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsInput;
namespace StarAI.PathFindingCore
{
public class Utilities
{
public static List<TileExceptionMetaData> tileExceptionList = new List<TileExceptionMetaData>();
public static List<TileExceptionNode> ignoreCheckTiles = new List<TileExceptionNode>();
public static string folderForExceptionTiles="ExceptionTilesData";
public static Vector2 parseCenterFromTile(int tileX, int tileY)
{
//int x = (tileX * Game1.tileSize) + Game1.tileSize / 2;
//int y = (tileY * Game1.tileSize) + Game1.tileSize / 2;
int x = (tileX * Game1.tileSize);
int y = (tileY * Game1.tileSize);
return new Vector2(x, y);
}
public static void initializeTileExceptionList()
{
}
public static void cleanExceptionList(TileNode t)
{
TileExceptionMetaData err= new TileExceptionMetaData(null,"");
foreach (var v in tileExceptionList)
{
if (v.tile == t) err = v;
}
if(err.tile != null)
{
tileExceptionList.Remove(err);
}
}
public static TileExceptionMetaData getExceptionFromTile(TileNode t)
{
foreach(var v in tileExceptionList)
{
if (t == v.tile) return v;
}
return null;
}
public static void clearExceptionListWithNames(bool removeFromWorld)
{
List<TileNode> removalList = new List<TileNode>();
List<TileExceptionMetaData> removalList2 = new List<TileExceptionMetaData>();
foreach (var v in StardustCore.ModCore.SerializationManager.trackedObjectList)
{
TileExceptionMetaData exc = getExceptionFromTile((v as TileNode));
if (exc != null)
{
if (exc.actionType == "Navigation" || exc.actionType == "CostCalculation" || exc.actionType == "Child")
{
removalList.Add(exc.tile);
removalList2.Add(exc);
}
}
}
foreach(var v in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
if (removeFromWorld) v.thisLocation.objects.Remove(v.tileLocation);
}
foreach(var v in removalList2)
{
tileExceptionList.Remove(v);
}
}
public static void clearExceptionListWithName(bool removeFromWorld,string name)
{
List<TileNode> removalList = new List<TileNode>();
List<TileExceptionMetaData> removalList2 = new List<TileExceptionMetaData>();
foreach (var v in StardustCore.ModCore.SerializationManager.trackedObjectList)
{
TileExceptionMetaData exc = getExceptionFromTile((v as TileNode));
if (exc != null)
{
if (exc.actionType == name)
{
removalList.Add(exc.tile);
removalList2.Add(exc);
}
}
}
foreach (var v in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
if (removeFromWorld) v.thisLocation.objects.Remove(v.tileLocation);
}
foreach (var v in removalList2)
{
tileExceptionList.Remove(v);
}
}
/// <summary>
/// Used to calculate center of a tile with varience.
/// </summary>
/// <param name="position"></param>
/// <param name="goal"></param>
/// <param name="tolerance"></param>
/// <returns></returns>
public static bool isWithinRange(float position, float goal, int tolerance)
{
if (position >= goal - tolerance && position <= goal + tolerance) return true;
return false;
}
public static int calculatePathCost(TileNode v, bool Placement = true)
{
object[] obj = new object[2];
obj[0] = v;
obj[1] = Placement;
return calculatePathCost(obj);
}
public static int calculatePathCost(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
bool placement;
try
{
placement = (bool)objArr[1];
}
catch(Exception err)
{
placement = true;
}
foreach (var q in objArr)
{
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT !: " + q, LogLevel.Alert);
}
if (v == null) ModCore.CoreMonitor.Log("WTF MARK!!!!!!: ", LogLevel.Alert);
bool moveOn = false;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_X);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true,true);
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if(placement)t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
else t.fakePlacementAction(v.thisLocation, (int)pos.X, (int)pos.Y);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
//Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "CostCalculation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if(placement)tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
else tempSource.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(),true,true);
Utilities.clearExceptionListWithName(placement, "Child");
ModCore.CoreMonitor.Log(tempSource.tileLocation.ToString()+tempSource.tileLocation.ToString());
ModCore.CoreMonitor.Log(nav.tileLocation.ToString() + nav.tileLocation.ToString());
if (path.Count != 0)
{
ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
if (placement)
{
try
{
StardewValley.Object ob = someTile.thisLocation.objects[someTile.tileLocation];
ModCore.CoreMonitor.Log(ob.name);
if (ob.name == "Twig") ModCore.CoreMonitor.Log("Culperate 2");
someTile.thisLocation.objects.Remove(someTile.tileLocation);
}
catch(Exception err)
{
}
}
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(v);
}
}
}
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
if (placement)
{
try
{
StardewValley.Object ob = q.thisLocation.objects[q.tileLocation];
ModCore.CoreMonitor.Log(ob.name);
if (ob.name == "Twig") ModCore.CoreMonitor.Log("Culperate 1");
q.thisLocation.objects.Remove(q.tileLocation);
}
catch(Exception err)
{
}
}
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
}
//END HERE FOR JUST CALCULATING PATH COST
if (paths.Count == 0) return Int32.MaxValue;
return correctPath.Count;
}
public static List<TileNode> calculatePath(TileNode v, bool Placement = true)
{
object[] obj = new object[2];
obj[0] = v;
obj[1] = Placement;
return calculatePath(obj);
}
public static List<TileNode> calculatePath(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
bool placement;
try
{
placement = (bool)objArr[1];
}
catch (Exception err)
{
placement = true;
}
foreach (var q in objArr)
{
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT !: " + q, LogLevel.Alert);
}
if (v == null) ModCore.CoreMonitor.Log("WTF MARK!!!!!!: ", LogLevel.Alert);
bool moveOn = false;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_X);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true, true);
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if (placement) t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
else t.fakePlacementAction(v.thisLocation, (int)pos.X, (int)pos.Y);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
//Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "CostCalculation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if (placement) tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
else tempSource.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(), false, true);
Utilities.clearExceptionListWithName(placement, "Child");
ModCore.CoreMonitor.Log(tempSource.tileLocation.ToString() + tempSource.tileLocation.ToString());
ModCore.CoreMonitor.Log(nav.tileLocation.ToString() + nav.tileLocation.ToString());
if (path.Count != 0)
{
ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
if (placement) someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(v);
}
}
}
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
if (placement) q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
}
//END HERE FOR JUST CALCULATING PATH COST
if (correctPath.Count==0)return new List<TileNode>();
return correctPath;
}
}
}

105
StarAI/StarAI/StarAI.csproj Normal file
View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{93632675-991D-425B-96F9-9C2B6BFC4EFE}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>StarAI</RootNamespace>
<AssemblyName>StarAI</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="ConsoleCommands">
<HintPath>..\..\..\..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Stardew Valley\Mods\ConsoleCommands\ConsoleCommands.dll</HintPath>
</Reference>
<Reference Include="InputSimulator">
<HintPath>..\..\..\..\..\..\..\Downloads\InputSimulator.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\GeneralMods\StardustCore\bin\Release\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="StardustCore">
<HintPath>..\..\GeneralMods\StardustCore\bin\Release\StardustCore.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Commands.cs" />
<Compile Include="ExecutionCore\CustomTask.cs" />
<Compile Include="ExecutionCore\TaskList.cs" />
<Compile Include="ExecutionCore\TaskMetaData.cs" />
<Compile Include="ExecutionCore\TaskMetaDataHeuristics.cs" />
<Compile Include="ExecutionCore\TaskPrerequisites\BedTimePrerequisite.cs" />
<Compile Include="ExecutionCore\TaskPrerequisites\GenericPrerequisite.cs" />
<Compile Include="ExecutionCore\TaskPrerequisites\InventoryFullPrerequisite.cs" />
<Compile Include="ExecutionCore\TaskPrerequisites\StaminaPrerequisite.cs" />
<Compile Include="ExecutionCore\TaskPrerequisites\ToolPrerequisite.cs" />
<Compile Include="ModCore.cs" />
<Compile Include="PathFindingCore\ChestLogic.cs" />
<Compile Include="PathFindingCore\CropLogic\CropLogic.cs" />
<Compile Include="PathFindingCore\DebrisLogic\DebrisLogic.cs" />
<Compile Include="PathFindingCore\PathFindingLogic.cs" />
<Compile Include="PathFindingCore\PlacementNode.cs" />
<Compile Include="PathFindingCore\TileExceptionMetaData.cs" />
<Compile Include="PathFindingCore\TileExceptionNode.cs" />
<Compile Include="PathFindingCore\TileNodeObject.cs" />
<Compile Include="PathFindingCore\Utilities.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets" Condition="Exists('..\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets'))" />
</Target>
<Import Project="..\..\GeneralMods\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets" Condition="Exists('..\..\GeneralMods\packages\Pathoschild.Stardew.ModBuildConfig.2.0.2\build\Pathoschild.Stardew.ModBuildConfig.targets')" />
</Project>

View File

@ -1,188 +0,0 @@
using Microsoft.Xna.Framework;
using StardewModdingAPI;
using StardewValley;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsInput;
namespace StarAI.PathFindingCore
{
public class Utilities
{
public static List<TileExceptionMetaData> tileExceptionList = new List<TileExceptionMetaData>();
public static List<TileExceptionNode> ignoreCheckTiles = new List<TileExceptionNode>();
public static string folderForExceptionTiles="ExceptionTilesData";
public static Vector2 parseCenterFromTile(int tileX, int tileY)
{
//int x = (tileX * Game1.tileSize) + Game1.tileSize / 2;
//int y = (tileY * Game1.tileSize) + Game1.tileSize / 2;
int x = (tileX * Game1.tileSize);
int y = (tileY * Game1.tileSize);
return new Vector2(x, y);
}
public static void initializeTileExceptionList()
{
}
public static void cleanExceptionList(TileNode t)
{
TileExceptionMetaData err= new TileExceptionMetaData(null,"");
foreach (var v in tileExceptionList)
{
if (v.tile == t) err = v;
}
if(err.tile != null)
{
tileExceptionList.Remove(err);
}
}
/// <summary>
/// Used to calculate center of a tile with varience.
/// </summary>
/// <param name="position"></param>
/// <param name="goal"></param>
/// <param name="tolerance"></param>
/// <returns></returns>
public static bool isWithinRange(float position, float goal, int tolerance)
{
if (position >= goal - tolerance && position <= goal + tolerance) return true;
return false;
}
public static int calculatePathCost(TileNode v, bool Placement = true)
{
object[] obj = new object[2];
obj[0] = v;
obj[1] = Placement;
return calculatePathCost(obj);
}
public static int calculatePathCost(object obj)
{
object[] objArr = (object[])obj;
TileNode v = (TileNode)objArr[0];
bool placement;
try
{
placement = (bool)objArr[1];
}
catch(Exception err)
{
placement = true;
}
foreach (var q in objArr)
{
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT !: " + q, LogLevel.Alert);
}
if (v == null) ModCore.CoreMonitor.Log("WTF MARK!!!!!!: ", LogLevel.Alert);
bool moveOn = false;
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_X);
int xMin = -1;
int yMin = -1;
int xMax = 1;
int yMax = 1;
List<TileNode> miniGoals = new List<TileNode>();
List<List<TileNode>> paths = new List<List<TileNode>>();
//try to set children to tiles where children haven't been before
for (int x = xMin; x <= xMax; x++)
{
for (int y = yMin; y <= yMax; y++)
{
if (x == 0 && y == 0) continue;
//Include these 4 checks for just left right up down movement. Remove them to enable 8 direction path finding
if (x == -1 && y == -1) continue; //upper left
if (x == -1 && y == 1) continue; //bottom left
if (x == 1 && y == -1) continue; //upper right
if (x == 1 && y == 1) continue; //bottom right
Vector2 pos = new Vector2(v.tileLocation.X + x, v.tileLocation.Y + y);
//ModCore.CoreMonitor.Log("AHHHHHHH POSITION: " + pos.ToString(), LogLevel.Alert);
bool f = PathFindingCore.TileNode.checkIfICanPlaceHere(v, pos * Game1.tileSize, v.thisLocation, true);
ModCore.CoreMonitor.Log("OK THIS IS THE RESULT F: " + f, LogLevel.Alert);
if (f == true)
{
TileNode t = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if(placement)t.placementAction(Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize);
else t.fakePlacementAction(v.thisLocation, (int)pos.X, (int)pos.Y);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)pos.X * Game1.tileSize, (int)pos.Y * Game1.tileSize));
miniGoals.Add(t);
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "CropNavigation"));
}
}
}
List<TileNode> removalList = new List<TileNode>();
foreach (var nav in miniGoals)
{
TileNode tempSource = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
if(placement)tempSource.placementAction(Game1.player.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
else tempSource.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, nav, new List<TileNode>(), placement);
ModCore.CoreMonitor.Log(tempSource.tileLocation.ToString()+tempSource.tileLocation.ToString());
ModCore.CoreMonitor.Log(nav.tileLocation.ToString() + nav.tileLocation.ToString());
if (path.Count != 0)
{
ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
paths.Add(path);
foreach (var someTile in path)
{
if (someTile == nav) removalList.Add(someTile);
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(someTile);
if(placement)someTile.thisLocation.objects.Remove(someTile.tileLocation);
//someTile.performRemoveAction(someTile.tileLocation, someTile.thisLocation);
//StardustCore.Utilities.masterRemovalList.Add(v);
}
}
}
foreach (var q in removalList)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(q);
if(placement)q.thisLocation.objects.Remove(q.tileLocation);
}
removalList.Clear();
int pathCost = 999999999;
List<TileNode> correctPath = new List<TileNode>();
foreach (var potentialPath in paths)
{
if (potentialPath.Count == 0) continue;
if (potentialPath.Count < pathCost)
{
pathCost = potentialPath.Count;
correctPath = potentialPath;
}
}
foreach (var goodTile in correctPath)
{
StardustCore.ModCore.SerializationManager.trackedObjectList.Add(goodTile);
//goodTile.placementAction(goodTile.thisLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize);
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(goodTile, Game1.currentLocation, (int)goodTile.tileLocation.X * Game1.tileSize, (int)goodTile.tileLocation.Y * Game1.tileSize));
}
//END HERE FOR JUST CALCULATING PATH COST
if (paths.Count == 0) return Int32.MaxValue;
return correctPath.Count;
}
}
}