commit
928df83457
|
@ -8,5 +8,8 @@ namespace Omegasis.SaveAnywhere.Framework.Models
|
|||
|
||||
/// <summary>The saved character data.</summary>
|
||||
public CharacterData[] Characters { get; set; }
|
||||
|
||||
/// <summary>Checks if the character was swimming at save time.</summary>
|
||||
public bool IsCharacterSwimming { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,5 +3,7 @@
|
|||
namespace Omegasis.SaveAnywhere.Framework
|
||||
{
|
||||
/// <summary>A marker subclass to detect when a custom save is in progress.</summary>
|
||||
internal class NewSaveGameMenu : SaveGameMenu { }
|
||||
internal class NewSaveGameMenu : SaveGameMenu {}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
** Properties
|
||||
*********/
|
||||
/// <summary>The private field on the shipping menu which indicates the game has already been saved, which prevents it from saving.</summary>
|
||||
private readonly IPrivateField<bool> SavedYet;
|
||||
private readonly IReflectedField<bool> SavedYet;
|
||||
|
||||
|
||||
/*********
|
||||
|
@ -25,7 +25,19 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
public NewShippingMenu(List<Item> items, IReflectionHelper reflection)
|
||||
: base(items)
|
||||
{
|
||||
this.SavedYet = reflection.GetPrivateField<bool>(this, "savedYet");
|
||||
this.SavedYet = reflection.GetField<bool>(this, "savedYet");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides some base functionality of the shipping menu to enable proper closing.
|
||||
/// </summary>
|
||||
/// <param name="x"></param>
|
||||
/// <param name="y"></param>
|
||||
/// <param name="playSound"></param>
|
||||
public override void receiveLeftClick(int x, int y, bool playSound = true)
|
||||
{
|
||||
if (this.okButton.containsPoint(x, y)) this.exitThisMenu(true);
|
||||
base.receiveLeftClick(x, y, playSound);
|
||||
}
|
||||
|
||||
/// <summary>Updates the menu during the game's update loop.</summary>
|
||||
|
|
|
@ -84,7 +84,8 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
PlayerData data = new PlayerData
|
||||
{
|
||||
Time = Game1.timeOfDay,
|
||||
Characters = this.GetPositions().ToArray()
|
||||
Characters = this.GetPositions().ToArray(),
|
||||
IsCharacterSwimming = Game1.player.swimming
|
||||
};
|
||||
|
||||
// save to disk
|
||||
|
@ -92,7 +93,7 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
Directory.CreateDirectory(new FileInfo(this.SavePath).Directory.FullName);
|
||||
this.Helper.WriteJsonFile(this.SavePath, data);
|
||||
|
||||
// clear any legacy data (no longer needed as backup)
|
||||
// clear any legacy data (no longer needed as backup)1
|
||||
this.RemoveLegacyDataForThisPlayer();
|
||||
}
|
||||
|
||||
|
@ -106,10 +107,31 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
|
||||
// apply
|
||||
Game1.timeOfDay = data.Time;
|
||||
this.ResumeSwimming(data);
|
||||
this.SetPositions(data.Characters);
|
||||
this.OnLoaded?.Invoke();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks to see if the player was swimming when the game was saved and if so, resumes the swimming animation.
|
||||
/// </summary>
|
||||
/// <param name="data"></param>
|
||||
public void ResumeSwimming(PlayerData data)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (data.IsCharacterSwimming == true)
|
||||
{
|
||||
Game1.player.changeIntoSwimsuit();
|
||||
Game1.player.swimming = true;
|
||||
}
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
//Here to allow compatability with old save files.
|
||||
}
|
||||
}
|
||||
|
||||
/*********
|
||||
** Private methods
|
||||
|
@ -135,7 +157,7 @@ namespace Omegasis.SaveAnywhere.Framework
|
|||
CharacterType? type = this.GetCharacterType(npc);
|
||||
if (type == null)
|
||||
continue;
|
||||
|
||||
if (npc == null || npc.currentLocation == null) continue;
|
||||
string name = npc.name;
|
||||
string map = npc.currentLocation.name;
|
||||
Point tile = npc.getTileLocationPoint();
|
||||
|
|
|
@ -31,6 +31,15 @@ namespace Omegasis.SaveAnywhere
|
|||
private bool IsCustomSaving;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Used to access the Mod's helper from other files associated with the mod.
|
||||
/// </summary>
|
||||
public static IModHelper ModHelper;
|
||||
/// <summary>
|
||||
/// Used to access the Mod's monitor to allow for debug logging in other files associated with the mod.
|
||||
/// </summary>
|
||||
public static IMonitor ModMonitor;
|
||||
|
||||
/*********
|
||||
** Public methods
|
||||
*********/
|
||||
|
@ -46,6 +55,8 @@ namespace Omegasis.SaveAnywhere
|
|||
ControlEvents.KeyPressed += this.ControlEvents_KeyPressed;
|
||||
GameEvents.UpdateTick += this.GameEvents_UpdateTick;
|
||||
TimeEvents.AfterDayStarted += this.TimeEvents_AfterDayStarted;
|
||||
ModHelper = helper;
|
||||
ModMonitor = Monitor;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -61,7 +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}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StarAI", "..\StarAI\StarAI\StarAI.csproj", "{93632675-991D-425B-96F9-9C2B6BFC4EFE}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{0756D36A-95C8-480D-8EA6-4584C03010C6} = {0756D36A-95C8-480D-8EA6-4584C03010C6}
|
||||
EndProjectSection
|
||||
|
|
|
@ -1566,3 +1566,4 @@ namespace StardustCore
|
|||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Serialization\Serialization.cs" />
|
||||
<Compile Include="Serialization\SerializerDataNode.cs" />
|
||||
<Compile Include="StaticClass.cs" />
|
||||
<Compile Include="Utilities.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StardustCore
|
||||
{
|
||||
public static class StaticExtentions
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Thank you stack overflow. https://stackoverflow.com/questions/3907299/if-statements-matching-multiple-values
|
||||
/// Ex:) if(1.In(1,2,3)) //This returns true since 1 is in the parameter list.
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="obj">Object to pass in value.</param>
|
||||
/// <param name="args">A list like (1,2,3) to see if it's contained.</param>
|
||||
/// <returns></returns>
|
||||
public static bool In<T>(this T obj, params T[] args)
|
||||
{
|
||||
return args.Contains(obj);
|
||||
}
|
||||
|
||||
public static bool HasValue(this double value)
|
||||
{
|
||||
return !Double.IsNaN(value) && !Double.IsInfinity(value);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -774,5 +774,149 @@ namespace StardustCore
|
|||
}
|
||||
|
||||
|
||||
public static StardewValley.Object checkRadiusForObject(int radius, string name)
|
||||
{
|
||||
for (int x = -radius; x <= radius; x++)
|
||||
{
|
||||
for (int y = -radius; y <= radius; y++)
|
||||
{
|
||||
bool f = Game1.player.currentLocation.isObjectAt((Game1.player.getTileX() + x) * Game1.tileSize, (Game1.player.getTileY() + y) * Game1.tileSize);
|
||||
if (f == false) continue;
|
||||
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 StardewValley.Object checkCardinalForObject(string name)
|
||||
{
|
||||
for (int x = -1; x <= 1; x++)
|
||||
{
|
||||
for (int y = -1; y <= 1; y++)
|
||||
{
|
||||
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
|
||||
bool f = Game1.player.currentLocation.isObjectAt((Game1.player.getTileX() + x) * Game1.tileSize, (Game1.player.getTileY() + y) * Game1.tileSize);
|
||||
if (f == false) continue;
|
||||
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 void faceDirectionTowardsSomething(Vector2 tileLocation)
|
||||
{
|
||||
|
||||
if (tileLocation.X < Game1.player.getTileX())
|
||||
{
|
||||
Game1.player.faceDirection(3);
|
||||
}
|
||||
else if (tileLocation.X > Game1.player.getTileX())
|
||||
{
|
||||
Game1.player.faceDirection(1);
|
||||
}
|
||||
else if (tileLocation.Y < Game1.player.getTileY())
|
||||
{
|
||||
Game1.player.faceDirection(0);
|
||||
}
|
||||
else if (tileLocation.Y > Game1.player.getTileY())
|
||||
{
|
||||
Game1.player.faceDirection(2);
|
||||
}
|
||||
}
|
||||
|
||||
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 KeyValuePair<Vector2,TerrainFeature> checkRadiusForTerrainFeature(int radius, Type terrainType)
|
||||
{
|
||||
for (int x = -radius; x <= radius; x++)
|
||||
{
|
||||
for (int y = -radius; y <= radius; y++)
|
||||
{
|
||||
Vector2 pos = new Vector2((Game1.player.getTileX() + x), (Game1.player.getTileY() + y));
|
||||
bool f = Game1.player.currentLocation.isTerrainFeatureAt((int)pos.X,(int)pos.Y);
|
||||
if (f == false) continue;
|
||||
TerrainFeature t = Game1.player.currentLocation.terrainFeatures[pos]; //((Game1.player.getTileX() + x) * Game1.tileSize, (Game1.player.getTileY() + y) * Game1.tileSize);
|
||||
if (t == null) continue;
|
||||
if (t.GetType() == terrainType)
|
||||
{
|
||||
return new KeyValuePair<Vector2, TerrainFeature> (pos,t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new KeyValuePair<Vector2, TerrainFeature>(new Vector2(),null);
|
||||
}
|
||||
|
||||
public static KeyValuePair<Vector2, TerrainFeature> checkCardinalForTerrainFeature(Type terrainType)
|
||||
{
|
||||
for (int x = -1; x <= 1; x++)
|
||||
{
|
||||
for (int y = -1; y <= 1; y++)
|
||||
{
|
||||
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((Game1.player.getTileX() + x), (Game1.player.getTileY() + y));
|
||||
bool f = Game1.player.currentLocation.isTerrainFeatureAt((int)pos.X, (int)pos.Y);
|
||||
if (f == false) continue;
|
||||
TerrainFeature t = Game1.player.currentLocation.terrainFeatures[pos]; //((Game1.player.getTileX() + x) * Game1.tileSize, (Game1.player.getTileY() + y) * Game1.tileSize);
|
||||
if (t == null) continue;
|
||||
if (t.GetType() == terrainType)
|
||||
{
|
||||
return new KeyValuePair<Vector2, TerrainFeature>(pos, t);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new KeyValuePair<Vector2, TerrainFeature>(new Vector2(), null);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static bool doesLocationContainTerrainFeature(GameLocation location, Type terrain)
|
||||
{
|
||||
foreach (var v in location.terrainFeatures)
|
||||
{
|
||||
if (terrain == v.Value.GetType()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Item getItemFromInventory(int index)
|
||||
{
|
||||
foreach(var v in Game1.player.items)
|
||||
{
|
||||
if (v.parentSheetIndex == index) return v;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public static Item getItemFromInventory(string name)
|
||||
{
|
||||
foreach (var v in Game1.player.items)
|
||||
{
|
||||
if (v.Name == name) return v;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.CheatCore
|
||||
{
|
||||
class DoorsToWarps
|
||||
{
|
||||
|
||||
public static void makeAllDoorsWarps()
|
||||
{
|
||||
foreach(var v in Game1.locations)
|
||||
{
|
||||
foreach(var door in v.doors)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log(v.name.ToString());
|
||||
// ModCore.CoreMonitor.Log(door.Key.ToString());
|
||||
// ModCore.CoreMonitor.Log(door.Value);
|
||||
|
||||
foreach(var warp in Game1.getLocationFromName(door.Value).warps)
|
||||
{
|
||||
if (warp.TargetName == v.name && warp.TargetX==door.Key.X&& warp.TargetY==door.Key.Y+1)
|
||||
{
|
||||
Warp w = new Warp(door.Key.X, door.Key.Y, door.Value, warp.X, warp.Y - 1,false);
|
||||
v.warps.Add(w);
|
||||
ModCore.CoreMonitor.Log("Star AI: Cheat Core: Adding warp on door at:" + door.Value + " " + new Vector2(door.Key.X, door.Key.Y));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,6 +10,11 @@ using System.Linq;
|
|||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using StarAI;
|
||||
using StarAI.PathFindingCore.WaterLogic;
|
||||
using StarAI.TaskCore.MapTransitionLogic;
|
||||
using StarAI.TaskCore;
|
||||
using StarAI.TaskCore.CropLogic;
|
||||
using StarAI.TaskCore.DebrisLogic;
|
||||
|
||||
namespace StarAI
|
||||
{
|
||||
|
@ -21,83 +26,315 @@ namespace StarAI
|
|||
ModCore.CoreHelper.ConsoleCommands.Add("hello", "Ok?", new Action<string, string[]>(hello));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("pathfind", "pathy?", new Action<string, string[]>(Commands.pathfind));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("pathfinding", "pathy?", new Action<string, string[]>(Commands.pathfind));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("Execute", "Run tasks", new Action<string,string[]>(Commands.runTasks));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("Execute", "Run tasks", new Action<string, string[]>(Commands.runTasks));
|
||||
//ModCore.CoreHelper.ConsoleCommands.Add("execute", "Run tasks", new Action<string, string[]>(Commands.runTasks));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("runTasks", "Run tasks", new Action<string, string[]>(Commands.runTasks));
|
||||
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));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("chopsticks", "Chop twigs.", new Action<string, string[]>(Commands.chopAllTwigs));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("choptrees", "Chop trees down.", new Action<string, string[]>(Commands.chopAllTrees));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("cuttrees", "Chop trees down.", new Action<string, string[]>(Commands.chopAllTrees));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("breakstones", "Break small stones with pickaxe.", new Action<string, string[]>(Commands.breakAllStones));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("cutweed", "Cut weeds with a tool.", new Action<string, string[]>(Commands.cutAllWeeds));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("cutweeds", "Cut weeds with a tool", new Action<string, string[]>(Commands.cutAllWeeds));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("watercan", "Fill my watering can.", new Action<string, string[]>(Commands.fillWateringCan));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("fillcan", "Fill my watering can.", new Action<string, string[]>(Commands.fillWateringCan));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("digdirt", "Dig out dirt on the farm.", new Action<string, string[]>(Commands.hoeDirtAmount));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("tillsoil", "Dig out dirt on the farm.", new Action<string, string[]>(Commands.hoeDirtAmount));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("hoedirt", "Dig out dirt on the farm.", new Action<string, string[]>(Commands.hoeDirtAmount));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("plant", "Plant Seeds", new Action<string, string[]>(Commands.plantSeeds));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("plantseeds", "Plant Seeds", new Action<string, string[]>(Commands.plantSeeds));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("shippingbin", "Goto shipping bin", new Action<string, string[]>(Commands.goToShippingBin));
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("shipItem", "Ship an Item", new Action<string, string[]>(Commands.shipItem));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("pathto", "Path to the adjacent map", new Action<string, string[]>(Commands.pathToMap));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("goto", "Path to a given waypoint", new Action<string, string[]>(Commands.wayPoints));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("waypoints", "Utilities to deal with waypoints", new Action<string, string[]>(Commands.wayPoints));
|
||||
|
||||
ModCore.CoreHelper.ConsoleCommands.Add("placement", "Toggleplacement", new Action<string, string[]>(Commands.togglePlacement));
|
||||
|
||||
// ModCore.CoreHelper.ConsoleCommands.Add("chopsticks", "Chop twigs.", new Action<string, string[]>(Commands.chopAllTwigs));
|
||||
pathfind("Initialize Delay 0", new string[] {
|
||||
"setDelay",
|
||||
"0"
|
||||
});
|
||||
}
|
||||
|
||||
public static void hoeDirtAmount(string s, string[] args)
|
||||
{
|
||||
if (args.Length != 3)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Error, need to specify 3 paramaters:<Game location name>, <Number of tiles to dig.>, <Radius to search around farmer>");
|
||||
return;
|
||||
}
|
||||
GameLocation loc = Game1.getLocationFromName(args[0]);
|
||||
if (loc == null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Error location " + args[0] + "is not valid");
|
||||
return;
|
||||
}
|
||||
SeedLogic.makeAsMuchDirtAsSpecifiedAroundFarmer(loc, Convert.ToInt32(args[1]), Convert.ToInt32(args[2]));
|
||||
}
|
||||
|
||||
public static void plantSeeds(string s, string[] args)
|
||||
{
|
||||
SeedLogic.plantSeeds(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
public static void taskListCommands(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Error: Need more parameters. Possible command paramaters are...");
|
||||
ModCore.CoreMonitor.Log("(Pop/pop): pop off the first task and remove it");
|
||||
ModCore.CoreMonitor.Log("(Clear/clear/Flush/flush):Remove all tasks from the task list");
|
||||
return;
|
||||
}
|
||||
if (args[0] == "Pop" || args[0] == "pop")
|
||||
{
|
||||
ExecutionCore.TaskList.taskList.Remove(ExecutionCore.TaskList.taskList.ElementAt(0));
|
||||
ModCore.CoreMonitor.Log("Removed top task from tasklist.");
|
||||
return;
|
||||
}
|
||||
if (args[0] == "Clear" || args[0] == "clear")
|
||||
{
|
||||
ExecutionCore.TaskList.taskList.Clear();
|
||||
ModCore.CoreMonitor.Log("Cleared out the task list");
|
||||
return;
|
||||
}
|
||||
if (args[0] == "Flush" || args[0] == "flush")
|
||||
{
|
||||
ExecutionCore.TaskList.taskList.Clear();
|
||||
ModCore.CoreMonitor.Log("Cleared out the task list");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static void wayPoints(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Invalid arguments. Possible arguments are:");
|
||||
ModCore.CoreMonitor.Log("Print: Print all waypoints");
|
||||
ModCore.CoreMonitor.Log("print: Print all waypoints");
|
||||
ModCore.CoreMonitor.Log("goto <waypointName>: Go to a specified waypoint in the world.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (s == "goto")
|
||||
{
|
||||
if (args.Length == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Please specify a waypoint name. They can be fetched with the command line \"waypoints print\"");
|
||||
return;
|
||||
}
|
||||
WayPoints.pathToWayPoint(args[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (args[0] == "Print" || args[0] == "print")
|
||||
{
|
||||
WayPoints.printWayPoints();
|
||||
}
|
||||
if (args[0] == "goto" || args[0] == "GoTo" || args[0] == "goTo")
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Please specify a waypoint name. They can be fetched with the command line \"waypoints print\"");
|
||||
return;
|
||||
}
|
||||
WayPoints.pathToWayPoint(args[1]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static void pathToMap(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Need 1 parameter. MapName");
|
||||
ModCore.CoreMonitor.Log("OR need 3 parameters. MapName, xTile, yTile");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
//path to the map location.
|
||||
WarpGoal.getWarpChain(Game1.player.currentLocation, args[0]);
|
||||
}
|
||||
|
||||
if (args.Length >= 3)
|
||||
{
|
||||
//path to the map location.
|
||||
WarpGoal.pathToWorldTile(Game1.player.currentLocation, args[0], Convert.ToInt32(args[1]), Convert.ToInt32(args[2]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void getSeedsFromChests(string s, string[] args)
|
||||
{
|
||||
ChestLogic.getAllSeasonalSeedsFromAllChestsAtLocation(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
public static void shipItem(string s, string[] args)
|
||||
{
|
||||
if (args.Length < 2)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("NOT ENOUGH PARAMETERS. NEED 2 ARGS. ItemIndex,Amount");
|
||||
return;
|
||||
}
|
||||
StardewValley.Object ok = new StardewValley.Object(Convert.ToInt32(args[0]), Convert.ToInt32(args[1]));
|
||||
|
||||
if (ok == null) {
|
||||
ModCore.CoreMonitor.Log("ITEM IS NULL????");
|
||||
return;
|
||||
}
|
||||
ExecutionCore.TaskPrerequisites.ItemPrerequisite pre = new ExecutionCore.TaskPrerequisites.ItemPrerequisite(ok, ok.stack);
|
||||
if (pre.doesPlayerHaveEnoughOfMe())
|
||||
{
|
||||
ShippingLogic.goToShippingBinShipItem(ok);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Player does not have: " + ok.name + ": amount: " + ok.stack.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
public static void goToShippingBin(string s, string[] args)
|
||||
{
|
||||
ShippingLogic.goToShippingBinSetUp();
|
||||
}
|
||||
|
||||
public static void fillWateringCan(string s, string[] args)
|
||||
{
|
||||
WaterLogic.getAllWaterTiles(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
public static void chopAllTrees(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
if (args[0] == "All" || args[0] == "all")
|
||||
{
|
||||
ModCore.CoreMonitor.Log("CHOP ALL TREES");
|
||||
DebrisLogic.getAllTreesToChop(Game1.player.currentLocation);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
DebrisLogic.getAllTreesToChop(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
/*
|
||||
public void goPickUpDebris()
|
||||
{
|
||||
public static void removeSquareDebrisFromTile(int tileX, int tileY)
|
||||
{
|
||||
for (int index = Game1.currentLocation.debris.Count - 1; index >= 0; --index)
|
||||
{
|
||||
if (Game1.currentLocation.debris[index].debrisType == Debris.DebrisType.SQUARES && (int)((double)Game1.currentLocation.debris[index].Chunks[0].position.X / (double)Game1.tileSize) == tileX && Game1.currentLocation.debris[index].chunkFinalYLevel / Game1.tileSize == tileY)
|
||||
Game1.currentLocation.debris.RemoveAt(index);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
public static void chopAllTwigs(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
if (args[0] == "All" || args[0] == "all")
|
||||
{
|
||||
DebrisLogic.getAllSticksToChop(Game1.player.currentLocation);
|
||||
return;
|
||||
}
|
||||
}
|
||||
DebrisLogic.getAllSticksToChop(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
|
||||
public static void goToMap(string s, string[] args)
|
||||
{
|
||||
if (args.Length < 1)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Need args length of 1. Param: Name of location to go to.");
|
||||
return;
|
||||
}
|
||||
TaskCore.MapTransitionLogic.TransitionLogic.transitionToAdjacentMap(Game1.player.currentLocation, args[0]);
|
||||
}
|
||||
|
||||
public static void breakAllStones(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
if (args[0] == "All" || args[0] == "all")
|
||||
{
|
||||
DebrisLogic.getAllStonesToBreak(Game1.player.currentLocation);
|
||||
return;
|
||||
}
|
||||
}
|
||||
DebrisLogic.getAllStonesToBreak(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
public static void cutAllWeeds(string s, string[] args)
|
||||
{
|
||||
if (args.Length == 1)
|
||||
{
|
||||
if (args[0] == "All" || args[0] == "all")
|
||||
{
|
||||
DebrisLogic.getAllWeedsToCut(Game1.player.currentLocation);
|
||||
return;
|
||||
}
|
||||
}
|
||||
DebrisLogic.getAllWeedsToCut(Game1.player.currentLocation);
|
||||
}
|
||||
|
||||
public static void runTasks(string s, string[] args)
|
||||
{
|
||||
ExecutionCore.TaskList.runTaskList();
|
||||
/*
|
||||
ModCore.CoreMonitor.Log("EXECUTE TASKS");
|
||||
PathFindingLogic.source = null;
|
||||
PathFindingLogic.currentGoal = null;
|
||||
if (ExecutionCore.TaskList.executioner.Status == TaskStatus.Running)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Tasklist is already executing. Just going to return.");
|
||||
return;
|
||||
}
|
||||
if (ExecutionCore.TaskList.executioner.Status == TaskStatus.RanToCompletion)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Tasklist is finished. Going to restart");
|
||||
|
||||
List<Task> removalList = new List<Task>();
|
||||
foreach(var v in ExecutionCore.TaskList.taskList)
|
||||
{
|
||||
if (v.IsCompleted) removalList.Add(v);
|
||||
}
|
||||
foreach(var v in removalList)
|
||||
{
|
||||
ExecutionCore.TaskList.taskList.Remove(v);
|
||||
}
|
||||
|
||||
ExecutionCore.TaskList.executioner = new Task(new Action(ExecutionCore.TaskList.runTaskList));
|
||||
ExecutionCore.TaskList.executioner.Start();
|
||||
// ExecutionCore.TaskList.taskList.Clear();
|
||||
return;
|
||||
//ExecutionCore.TaskList.runTaskList();
|
||||
|
||||
}
|
||||
|
||||
if (ExecutionCore.TaskList.executioner.Status == TaskStatus.Faulted)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(ExecutionCore.TaskList.executioner.Exception.ToString());
|
||||
}
|
||||
|
||||
if (ExecutionCore.TaskList.executioner.Status == TaskStatus.Created)
|
||||
{
|
||||
//ExecutionCore.TaskList.runTaskList();
|
||||
List<Task> removalList = new List<Task>();
|
||||
ExecutionCore.TaskList.executioner.Start();
|
||||
|
||||
return;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void waterCrops(string s, string[] args)
|
||||
{
|
||||
PathFindingCore.CropLogic.CropLogic.getAllCropsNeededToBeWatered();
|
||||
CropLogic.getAllCropsNeededToBeWatered();
|
||||
}
|
||||
|
||||
public static void harvestCrops(string s,string[] args)
|
||||
public static void harvestCrops(string s, string[] args)
|
||||
{
|
||||
PathFindingCore.CropLogic.CropLogic.getAllCropsNeededToBeHarvested();
|
||||
CropLogic.getAllCropsNeededToBeHarvested();
|
||||
}
|
||||
|
||||
public static void togglePlacement(string s, string[] args)
|
||||
{
|
||||
if (PathFindingCore.Utilities.placement == true)
|
||||
{
|
||||
PathFindingLogic.delay = 0;
|
||||
PathFindingCore.Utilities.placement = false;
|
||||
ModCore.CoreMonitor.Log("Placement disabled");
|
||||
return;
|
||||
}
|
||||
if (PathFindingCore.Utilities.placement == false)
|
||||
{
|
||||
PathFindingLogic.delay = 100;
|
||||
PathFindingCore.Utilities.placement = true;
|
||||
ModCore.CoreMonitor.Log("Placement enabled");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -339,7 +576,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
|
|
@ -0,0 +1,55 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.DialogueCore
|
||||
{
|
||||
public class ReponseLogic
|
||||
{
|
||||
public static void answerDialogueResponses()
|
||||
{
|
||||
if (Game1.player.currentLocation.lastQuestionKey != null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(Game1.player.currentLocation.lastQuestionKey);
|
||||
while (Game1.player.currentLocation.lastQuestionKey == "Sleep")
|
||||
{
|
||||
//WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.ESCAPE);
|
||||
Game1.player.currentLocation.lastQuestionKey = null;
|
||||
ModCore.CoreMonitor.Log("GO TO SLEEP");
|
||||
answerDialogueSleep();
|
||||
//Game1.player.currentLocation.answerDialogue(new Response(Game1.player.currentLocation.lastQuestionKey, "Yes"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void answerDialogueSleep()
|
||||
{
|
||||
GameLocation location = Game1.player.currentLocation;
|
||||
if ((double)location.LightLevel == 0.0 && Game1.timeOfDay < 2000)
|
||||
{
|
||||
location.LightLevel = 0.6f;
|
||||
|
||||
Game1.playSound("openBox");
|
||||
Game1.NewDay(600f);
|
||||
}
|
||||
else if ((double)location.LightLevel > 0.0 && Game1.timeOfDay >= 2000)
|
||||
{
|
||||
location.LightLevel = 0.0f;
|
||||
Game1.playSound("openBox");
|
||||
Game1.NewDay(600f);
|
||||
}
|
||||
else
|
||||
Game1.NewDay(0.0f);
|
||||
Game1.player.mostRecentBed = Game1.player.position;
|
||||
Game1.player.doEmote(24);
|
||||
Game1.player.freezePause = 2000;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
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;
|
||||
try
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("ONE COST");
|
||||
this.taskMetaData.calculateTaskCost((TileNode)arrayData[0], false); //Used for pathing to a single tile in a location
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log(err.ToString());
|
||||
}
|
||||
try
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("TWO COST");
|
||||
this.taskMetaData.calculateTaskCost((List<TileNode>)arrayData[0], false); //used to calculate best path stuff
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log(err.ToString());
|
||||
}
|
||||
try
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("THREE COST");
|
||||
this.taskMetaData.calculateTaskCost((List<List<TileNode>>)arrayData[0], false); //and this one is for multiple paths.
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
//ModCore.CoreMonitor.Log(err.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,394 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.PathFindingCore;
|
||||
using StarAI.PathFindingCore.WaterLogic;
|
||||
using StarAI.TaskCore.MapTransitionLogic;
|
||||
using StardewModdingAPI;
|
||||
using StardewValley;
|
||||
using StardewValley.Tools;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
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 bool pathafterLocationChange;
|
||||
public static void runTaskList()
|
||||
{
|
||||
|
||||
//myTask t = new myTask(StarAI.PathFindingCore.CropLogic.CropLogic.harvestSingleCrop);
|
||||
|
||||
bool assignNewTask = true;
|
||||
|
||||
if(TaskPrerequisites.BedTimePrerequisite.enoughTimeToDoTaskStatic() == false)
|
||||
{
|
||||
CustomTask task = WayPoints.pathToWayPointReturnTask("bed");
|
||||
if (task == null) ModCore.CoreMonitor.Log("SOMETHING WENT WRONG WHEN TRYING TO GO TO BED", LogLevel.Error);
|
||||
ModCore.CoreMonitor.Log("Not enough time remaining in day. Going home.", LogLevel.Alert);
|
||||
task.runTask();
|
||||
Utilities.tileExceptionList.Clear();
|
||||
taskList.Clear();
|
||||
removalList.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
while(ranAllTasks()==false||TaskPrerequisites.BedTimePrerequisite.enoughTimeToDoTaskStatic()==false)
|
||||
{
|
||||
Utilities.tileExceptionList.Clear();
|
||||
foreach (var task2 in taskList)
|
||||
{
|
||||
if (removalList.Contains(task2)) continue;
|
||||
var temp = task2;
|
||||
recalculateTask(ref temp);
|
||||
//task.taskMetaData = new TaskMetaData(task.taskMetaData.name, PathFindingCore.Utilities.calculatePathCost(task.objectParameterDataArray), task.taskMetaData.staminaPrerequisite, task.taskMetaData.toolPrerequisite);
|
||||
}
|
||||
// ModCore.CoreMonitor.Log("DONE CALCULATING JUNK NOW RUNNING TASK");
|
||||
//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();
|
||||
bool recalculate= interruptionTasks(v);
|
||||
|
||||
if (recalculate) {
|
||||
recalculateTask(ref v);
|
||||
}
|
||||
if (v.taskMetaData.verifyAllPrerequisitesHit() == true)
|
||||
{
|
||||
v.runTask();
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
removalList.Add(v);
|
||||
}
|
||||
else
|
||||
{
|
||||
removalList.Add(v);
|
||||
}
|
||||
}
|
||||
|
||||
Utilities.tileExceptionList.Clear();
|
||||
taskList.Clear();
|
||||
removalList.Clear();
|
||||
|
||||
}
|
||||
|
||||
public static void recalculateTask(ref CustomTask v)
|
||||
{
|
||||
object[] oArray = (object[])v.objectParameterDataArray;
|
||||
// ModCore.CoreMonitor.Log("RECALCULATING: "+ v.taskMetaData.name);
|
||||
|
||||
if (v.taskMetaData.name.Contains("Path to "))
|
||||
{
|
||||
Utilities.tileExceptionList.Clear();
|
||||
// ModCore.CoreMonitor.Log("POKE DEW VALLEY: " + v.taskMetaData.name);
|
||||
string[] s = v.taskMetaData.name.Split(' ');
|
||||
ModCore.CoreMonitor.Log(s.ElementAt(s.Length-1));
|
||||
List<List<TileNode>> newPaths = new List<List<TileNode>>();
|
||||
newPaths = TaskCore.MapTransitionLogic.WarpGoal.getWarpChainReturn(Game1.player.currentLocation, s.ElementAt(s.Length-1));
|
||||
v.taskMetaData.cost = 0;
|
||||
int value = 0;
|
||||
foreach (var path in newPaths)
|
||||
{
|
||||
value+= (path.Count * TaskMetaDataHeuristics.pathCostMultiplier);
|
||||
}
|
||||
object[] arr = (object[])v.objectParameterDataArray;
|
||||
arr[3] = newPaths;
|
||||
v.taskMetaData.cost = value;
|
||||
v.taskMetaData.pathsToTake = newPaths;
|
||||
//ModCore.CoreMonitor.Log("IDK ANY MORE: " + v.taskMetaData.cost);
|
||||
return;
|
||||
}
|
||||
Utilities.tileExceptionList.Clear();
|
||||
try
|
||||
{
|
||||
Utilities.tileExceptionList.Clear();
|
||||
TileNode t = (TileNode)oArray[0];
|
||||
Utilities.tileExceptionList.Clear();
|
||||
//ModCore.CoreMonitor.Log("Premtive calculate 1");
|
||||
//ModCore.CoreMonitor.Log("Valaue before???:" + v.taskMetaData.pathsToTake[0].Count);
|
||||
v.taskMetaData.calculateTaskCost(t, false);
|
||||
//v.taskMetaData.pathsToTake = new List<List<TileNode>>();
|
||||
//v.taskMetaData.pathsToTake.Add(StarAI.PathFindingCore.Utilities.getIdealPath(v));
|
||||
|
||||
|
||||
object[] objArr = new object[10];
|
||||
objArr[0] = (object)t;
|
||||
objArr[1] = (object)v.taskMetaData.pathsToTake[0];
|
||||
//ModCore.CoreMonitor.Log("HMM SO WHAT'S HAPPENING???:" + v.taskMetaData.pathsToTake[0].Count);
|
||||
int malcolm = 0;
|
||||
objArr[2] = (object)v.taskMetaData.pathsToTake[0].ElementAt(malcolm); //source of whatever is hit.
|
||||
try
|
||||
{
|
||||
objArr[3] = oArray[3];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[4] = oArray[4];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[5] = oArray[5];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
v.objectParameterDataArray = objArr;
|
||||
return;
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Utilities.tileExceptionList.Clear();
|
||||
List<TileNode> t = (List<TileNode>)oArray[0];
|
||||
// ModCore.CoreMonitor.Log("Premtive calculate 2");
|
||||
foreach (var s in Utilities.tileExceptionList)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(s.actionType);
|
||||
}
|
||||
v.taskMetaData.calculateTaskCost(t, false);
|
||||
object[] objArr = new object[10];
|
||||
objArr[0] = (object)t; //List of trees to use for path calculations
|
||||
objArr[1] = (object)v.taskMetaData.pathsToTake[0]; //The path itself.
|
||||
int malcolm = 0;
|
||||
// ModCore.CoreMonitor.Log("THIS IS MALCOLM:" + malcolm);
|
||||
objArr[2] = (object)v.taskMetaData.pathsToTake[0].ElementAt(malcolm); //source of whatever is hit.
|
||||
try
|
||||
{
|
||||
objArr[3] = oArray[3];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[4] = oArray[4];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[5] = oArray[5];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
v.objectParameterDataArray = objArr;
|
||||
Utilities.tileExceptionList.Clear();
|
||||
return;
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Utilities.tileExceptionList.Clear();
|
||||
List<List<TileNode>> t = (List<List<TileNode>>)oArray[3];
|
||||
// ModCore.CoreMonitor.Log("Premtive calculate 3");
|
||||
foreach (var s in Utilities.tileExceptionList)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(s.actionType);
|
||||
}
|
||||
v.taskMetaData.calculateTaskCost(t, false);
|
||||
object[] objArr = new object[10];
|
||||
objArr[0] = (object)t; //List of trees to use for path calculations
|
||||
objArr[1] = (object)v.taskMetaData.pathsToTake; //The path itself.
|
||||
int malcolm = 0;
|
||||
// ModCore.CoreMonitor.Log("THIS IS MALCOLM:" + malcolm);
|
||||
objArr[2] = (object)v.taskMetaData.pathsToTake[0].ElementAt(malcolm); //source of whatever is hit.
|
||||
try
|
||||
{
|
||||
objArr[3] = oArray[3];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[4] = oArray[4];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
try
|
||||
{
|
||||
objArr[5] = oArray[5];
|
||||
}
|
||||
catch (Exception err2)
|
||||
{
|
||||
|
||||
}
|
||||
v.objectParameterDataArray = objArr;
|
||||
Utilities.tileExceptionList.Clear();
|
||||
return;
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static bool interruptionTasks(CustomTask v)
|
||||
{
|
||||
|
||||
if (v.taskMetaData.bedTimePrerequisite.enoughTimeToDoTask() == false)
|
||||
{
|
||||
CustomTask task = WayPoints.pathToWayPointReturnTask("bed");
|
||||
if (task == null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("SOMETHING WENT WRONG WHEN TRYING TO GO TO BED", LogLevel.Error);
|
||||
return false;
|
||||
}
|
||||
ModCore.CoreMonitor.Log("Not enough time remaining in day. Going home and removing tasks.", LogLevel.Alert);
|
||||
task.runTask();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (v.taskMetaData.locationPrerequisite.isPlayerAtLocation() == false)
|
||||
{
|
||||
//Force player to move to that location, but also need the cost again....
|
||||
// ModCore.CoreMonitor.Log("PLAYERS LOCATION:"+Game1.player.currentLocation.name);
|
||||
Utilities.tileExceptionList.Clear();
|
||||
CustomTask task= WarpGoal.getWarpChainReturnTask(Game1.player.currentLocation, v.taskMetaData.locationPrerequisite.location.name);
|
||||
if (task == null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("SOMETHING WENT WRONG WHEN TRYING TO GO TO" + v.taskMetaData.locationPrerequisite.location.name, LogLevel.Error);
|
||||
return false;
|
||||
}
|
||||
|
||||
task.runTask();
|
||||
object[] arr = (object[])v.objectParameterDataArray;
|
||||
List<TileNode> path;
|
||||
try
|
||||
{
|
||||
|
||||
List<List<TileNode>> okList = (arr[0] as List<List<TileNode>>);
|
||||
List<TileNode> smallList = okList.ElementAt(okList.Count - 1);
|
||||
TileNode tile = smallList.ElementAt(smallList.Count - 1);
|
||||
//arr[0] = WarpGoal.pathToWorldTileReturnTask(Game1.player.currentLocation, v.taskMetaData.locationPrerequisite.location.name,(int) tile.tileLocation.X,(int) tile.tileLocation.Y);
|
||||
TileNode s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
|
||||
s.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
|
||||
|
||||
path = Utilities.getIdealPath(tile, s);
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
|
||||
Utilities.tileExceptionList.Clear();
|
||||
List<TileNode> smallList = (arr[1] as List<TileNode>);
|
||||
TileNode tile = smallList.ElementAt(smallList.Count-1);
|
||||
//ModCore.CoreMonitor.Log("LOC:" + tile.thisLocation + tile.thisLocation);
|
||||
|
||||
|
||||
Warp lastWarp = new Warp(-1, -1, "Grahm", -1, -1, false);
|
||||
GameLocation fakeLocation = Game1.getLocationFromName(Game1.player.currentLocation.name);
|
||||
foreach(var ok in fakeLocation.warps)
|
||||
{
|
||||
if (ok.X == Game1.player.getTileX() && ok.Y == Game1.player.getTileY() + 1) lastWarp = ok;
|
||||
}
|
||||
|
||||
//ModCore.CoreMonitor.Log("MYLOC:" + lastWarp.TargetName + lastWarp.TargetX +" "+lastWarp.TargetY);
|
||||
//arr[0] = WarpGoal.pathToWorldTileReturnTask(Game1.player.currentLocation, v.taskMetaData.locationPrerequisite.location.name,(int) tile.tileLocation.X,(int) tile.tileLocation.Y);
|
||||
TileNode s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
|
||||
s.fakePlacementAction(Game1.getLocationFromName(lastWarp.TargetName), lastWarp.TargetX, lastWarp.TargetY);
|
||||
|
||||
path = Utilities.getIdealPath(tile, s);
|
||||
//arr[0] = s;
|
||||
}
|
||||
|
||||
// ModCore.CoreMonitor.Log("PATHCOUNT:"+path.Count);
|
||||
|
||||
//arr[1] = path;
|
||||
//v.objectParameterDataArray = arr;
|
||||
PathFindingLogic.calculateMovement(path);
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
if (v.taskMetaData.name == "Water Crop")
|
||||
{
|
||||
StardewValley.Tools.WateringCan w = new WateringCan();
|
||||
bool found = false;
|
||||
foreach (var item in Game1.player.items)
|
||||
{
|
||||
if (item == null) continue;
|
||||
if (item.GetType() == typeof(StardewValley.Tools.WateringCan))
|
||||
{
|
||||
w = (WateringCan)item;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (found == false)
|
||||
{
|
||||
removalList.Add(v);
|
||||
return false;
|
||||
}
|
||||
if (w.WaterLeft == 0)
|
||||
{
|
||||
CustomTask waterRefill = WaterLogic.getAllWaterTilesTask(Game1.player.currentLocation);
|
||||
ModCore.CoreMonitor.Log("No water in can. Going to refil");
|
||||
waterRefill.runTask();
|
||||
return true;
|
||||
}
|
||||
//
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
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
|
||||
{
|
||||
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 TaskPrerequisites.ItemPrerequisite itemPrerequisite;
|
||||
public LocationPrerequisite locationPrerequisite;
|
||||
|
||||
public List<TaskPrerequisites.GenericPrerequisite> prerequisitesList;
|
||||
|
||||
|
||||
public List<List<TileNode>> pathsToTake = new List<List<TileNode>>();
|
||||
|
||||
|
||||
|
||||
public TaskMetaData(string Name, LocationPrerequisite LocationPrereque, StaminaPrerequisite StaminaPrerequisite = null, ToolPrerequisite ToolPrerequisite = null, InventoryFullPrerequisite InventoryFull=null,BedTimePrerequisite bedTimePrereq=null, ItemPrerequisite ItemPrereque = null)
|
||||
{
|
||||
this.name = Name;
|
||||
this.staminaPrerequisite = StaminaPrerequisite;
|
||||
this.toolPrerequisite = ToolPrerequisite;
|
||||
this.inventoryPrerequisite = InventoryFull;
|
||||
this.pathsToTake = new List<List<TileNode>>();
|
||||
this.bedTimePrerequisite = bedTimePrereq;
|
||||
|
||||
this.itemPrerequisite = ItemPrereque;
|
||||
this.locationPrerequisite = LocationPrereque;
|
||||
//Make sure to set values correctly incase of null
|
||||
setUpLocationPrerequsiteIfNull();
|
||||
setUpStaminaPrerequisiteIfNull();
|
||||
setUpToolPrerequisiteIfNull();
|
||||
setUpInventoryPrerequisiteIfNull();
|
||||
setUpBedTimeIfNull();
|
||||
setUpItemPrerequisiteIfNull();
|
||||
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);
|
||||
this.prerequisitesList.Add(this.itemPrerequisite);
|
||||
}
|
||||
|
||||
public void calculateTaskCost(TileNode source,bool unknownPath)
|
||||
{
|
||||
var pair = TaskMetaDataHeuristics.calculateTaskCost(source, this.toolPrerequisite, unknownPath);
|
||||
this.cost= pair.Key;
|
||||
this.pathsToTake = new List<List<TileNode>>();
|
||||
this.pathsToTake.Add(pair.Value);
|
||||
//this.path = Utilities.calculatePath(source, false);
|
||||
}
|
||||
|
||||
public void calculateTaskCost(List<TileNode> source, bool unknownPath)
|
||||
{
|
||||
var pair = TaskMetaDataHeuristics.calculateTaskCost(source, this.toolPrerequisite, unknownPath);
|
||||
this.cost = pair.Key;
|
||||
this.pathsToTake = new List<List<TileNode>>();
|
||||
this.pathsToTake.Add(pair.Value);
|
||||
//this.path = Utilities.calculatePath(source, false);
|
||||
}
|
||||
|
||||
public void calculateTaskCost(List<List<TileNode>> source, bool unknownPath)
|
||||
{
|
||||
var pair = TaskMetaDataHeuristics.calculateTaskCost(source, this.toolPrerequisite, unknownPath);
|
||||
this.cost = pair.Key;
|
||||
this.pathsToTake = pair.Value;
|
||||
//this.path = Utilities.calculatePath(source, false);
|
||||
}
|
||||
|
||||
private void setUpLocationPrerequsiteIfNull()
|
||||
{
|
||||
if (this.locationPrerequisite == null) this.locationPrerequisite = new LocationPrerequisite(null);
|
||||
}
|
||||
|
||||
private void setUpToolPrerequisiteIfNull()
|
||||
{
|
||||
if (this.toolPrerequisite == null)
|
||||
{
|
||||
this.toolPrerequisite = new TaskPrerequisites.ToolPrerequisite(false, null,0);
|
||||
}
|
||||
}
|
||||
|
||||
private void setUpItemPrerequisiteIfNull()
|
||||
{
|
||||
if (this.itemPrerequisite == null)
|
||||
{
|
||||
this.itemPrerequisite = new TaskPrerequisites.ItemPrerequisite(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";
|
||||
if (this.locationPrerequisite.location != null)
|
||||
{
|
||||
s += " Task Location: " + this.locationPrerequisite.location.name + "\n";
|
||||
}
|
||||
TileNode t = pathsToTake.ElementAt(pathsToTake.Count - 1).ElementAt(pathsToTake.ElementAt(pathsToTake.Count - 1).Count-1);
|
||||
s += " Goal Location: " + t.thisLocation.name + " " + t.tileLocation;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
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 KeyValuePair<int,List<TileNode>> calculateTaskCost(TileNode v,ToolPrerequisite t,bool unknownPath)
|
||||
{
|
||||
//if(unknownPath) PathFindingLogic.delay = 18;
|
||||
// else PathFindingLogic.delay = 0;
|
||||
List<TileNode> idealPath = StarAI.PathFindingCore.Utilities.getIdealPath(v);
|
||||
int costCalculation;
|
||||
|
||||
if (idealPath.Count == 0) costCalculation = Int32.MaxValue;
|
||||
else costCalculation = idealPath.Count;
|
||||
|
||||
if (costCalculation == Int32.MaxValue) return new KeyValuePair<int, List<TileNode>>(Int32.MaxValue,new List<TileNode>());
|
||||
|
||||
float pathCost= costCalculation* pathCostMultiplier;
|
||||
float toolCost = calculateToolCostMultiplier(t);
|
||||
return new KeyValuePair<int,List<TileNode>>(((int)pathCost + (int)toolCost),idealPath);
|
||||
}
|
||||
|
||||
public static KeyValuePair<int, List<TileNode>> calculateTaskCost(List<TileNode> v, ToolPrerequisite t, bool unknownPath)
|
||||
{
|
||||
//if (unknownPath) PathFindingLogic.delay = 18;
|
||||
//else PathFindingLogic.delay = 0;
|
||||
List<TileNode> idealPath = StarAI.PathFindingCore.Utilities.getIdealPath(v);
|
||||
int costCalculation;
|
||||
|
||||
if (idealPath.Count == 0) costCalculation = Int32.MaxValue;
|
||||
else costCalculation = idealPath.Count;
|
||||
|
||||
if (costCalculation == Int32.MaxValue) return new KeyValuePair<int, List<TileNode>>(Int32.MaxValue, new List<TileNode>());
|
||||
|
||||
float pathCost = costCalculation * pathCostMultiplier;
|
||||
float toolCost = calculateToolCostMultiplier(t);
|
||||
return new KeyValuePair<int, List<TileNode>>(((int)pathCost + (int)toolCost), idealPath);
|
||||
}
|
||||
|
||||
public static KeyValuePair<int, List<List<TileNode>>> calculateTaskCost(List<List<TileNode>> v, ToolPrerequisite t, bool unknownPath)
|
||||
{
|
||||
//if (unknownPath) PathFindingLogic.delay = 18;
|
||||
//else PathFindingLogic.delay = 0;
|
||||
float totalCalculation = 0;
|
||||
List < List < TileNode >> idealPaths=new List<List<TileNode>>();
|
||||
foreach (var path in v)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("HMMM" + path.ElementAt(0).thisLocation.name.ToString());
|
||||
ModCore.CoreMonitor.Log("HMMM" + path.ElementAt(0).tileLocation.ToString());
|
||||
List<TileNode> idealPath = StarAI.PathFindingCore.Utilities.getIdealPath(path);
|
||||
int costCalculation=0;
|
||||
|
||||
if (idealPath.Count == 0) costCalculation = Int32.MaxValue;
|
||||
else costCalculation = idealPath.Count;
|
||||
|
||||
//There was an error somewhere and now this won't work!!!!
|
||||
if (costCalculation == Int32.MaxValue) return new KeyValuePair<int, List<List<TileNode>>>(Int32.MaxValue, new List<List<TileNode>>());
|
||||
|
||||
float pathCost = costCalculation * pathCostMultiplier;
|
||||
|
||||
ModCore.CoreMonitor.Log("I THINK THIS IS MY PATH COST: " + costCalculation);
|
||||
float toolCost = calculateToolCostMultiplier(t);
|
||||
totalCalculation += toolCost + pathCost;
|
||||
idealPaths.Add(idealPath);
|
||||
}
|
||||
return new KeyValuePair<int, List<List<TileNode>>>((int)totalCalculation, idealPaths);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
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 static int timeRemainingInDayStatic()
|
||||
{
|
||||
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 static bool enoughTimeToDoTaskStatic()
|
||||
{
|
||||
int timeRemaining = timeRemainingInDayStatic();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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 ItemPrerequisite:GenericPrerequisite
|
||||
{
|
||||
public Item item;
|
||||
public int amount;
|
||||
|
||||
public ItemPrerequisite(Item DesiredItem, int Amount)
|
||||
{
|
||||
this.item = DesiredItem;
|
||||
this.amount = Amount;
|
||||
}
|
||||
|
||||
public override bool checkAllPrerequisites()
|
||||
{
|
||||
if (this.item == null || this.amount == 0) return true;
|
||||
if (doesPlayerInventoryContainMe() == false) return false;
|
||||
if (doesPlayerHaveEnoughOfMe() == false) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool doesPlayerInventoryContainMe()
|
||||
{
|
||||
foreach(var item in Game1.player.items)
|
||||
{
|
||||
if (item == null) continue;
|
||||
if (isItemSameTypeAsMe(item)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool isItemSameTypeAsMe(Item I)
|
||||
{
|
||||
if (I.GetType() == this.item.GetType()) return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
public bool doesPlayerHaveEnoughOfMe()
|
||||
{
|
||||
foreach (var item in Game1.player.items)
|
||||
{
|
||||
if (item == null) continue;
|
||||
if (isItemSameTypeAsMe(item)&&item.Stack>=amount) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.ExecutionCore.TaskPrerequisites
|
||||
{
|
||||
public class LocationPrerequisite:GenericPrerequisite
|
||||
{
|
||||
public GameLocation location;
|
||||
|
||||
public LocationPrerequisite(GameLocation Location)
|
||||
{
|
||||
this.location = Location;
|
||||
}
|
||||
|
||||
public bool isPlayerAtLocation()
|
||||
{
|
||||
if (this.location == null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Location calculation is null");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ModCore.CoreMonitor.Log("THIS IS THE LOCATION"+this.location);
|
||||
|
||||
}
|
||||
if (Game1.player.currentLocation == this.location || Game1.player.currentLocation.name == this.location.name) return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
public override bool checkAllPrerequisites()
|
||||
{
|
||||
if (this.location == null) return true;
|
||||
if (isPlayerAtLocation()) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -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.
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.InterfaceCore
|
||||
{
|
||||
public class InterfaceLogic
|
||||
{
|
||||
public static void interactWithCurrentMenu()
|
||||
{
|
||||
|
||||
if (Game1.activeClickableMenu == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.ESCAPE);
|
||||
//ModCore.CoreMonitor.Log(Game1.activeClickableMenu.ToString());
|
||||
if(Game1.activeClickableMenu is StardewValley.Menus.DialogueBox)
|
||||
{
|
||||
Game1.activeClickableMenu.exitThisMenu(true);
|
||||
ModCore.CoreMonitor.Log("BYE");
|
||||
}
|
||||
|
||||
if (Game1.activeClickableMenu is StardewValley.Menus.ShippingMenu)
|
||||
{
|
||||
//(Game1.activeClickableMenu as StardewValley.Menus.ShippingMenu).readyToClose
|
||||
//Game1.activeClickableMenu.exitThisMenu(true);
|
||||
ShippingMenuCore.closeMenu();
|
||||
ModCore.CoreMonitor.Log("Hello");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.InterfaceCore
|
||||
{
|
||||
class ShippingMenuCore
|
||||
{
|
||||
public static void closeMenu()
|
||||
{
|
||||
(Game1.activeClickableMenu as StardewValley.Menus.ShippingMenu).okButton.snapMouseCursorToCenter();
|
||||
if (Game1.activeClickableMenu is StardewValley.Menus.ShippingMenu)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("PRESS ALREADY!");
|
||||
WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.ESCAPE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,442 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using StardewValley;
|
||||
using StardewValley.Menus;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using StardustCore;
|
||||
namespace StarAI.MenuCore
|
||||
{
|
||||
|
||||
public class CropUtilityMenu : IClickableMenu
|
||||
{
|
||||
public static int widthToMoveActiveTab = Game1.tileSize / 8;
|
||||
private string descriptionText = "";
|
||||
private string hoverText = "";
|
||||
public List<ClickableTextureComponent> sideTabs = new List<ClickableTextureComponent>();
|
||||
public Dictionary<int, List<List<ClickableTextureComponent>>> collections = new Dictionary<int, List<List<ClickableTextureComponent>>>();
|
||||
public const int region_sideTabShipped = 7001;
|
||||
public const int region_sideTabFish = 7002;
|
||||
public const int region_sideTabArtifacts = 7003;
|
||||
public const int region_sideTabMinerals = 7004;
|
||||
public const int region_sideTabCooking = 7005;
|
||||
public const int region_sideTabAchivements = 7006;
|
||||
public const int region_forwardButton = 707;
|
||||
public const int region_backButton = 706;
|
||||
public const int organicsTab = 0;
|
||||
public const int fishTab = 1;
|
||||
public const int archaeologyTab = 2;
|
||||
public const int mineralsTab = 3;
|
||||
public const int cookingTab = 4;
|
||||
public const int achievementsTab = 5;
|
||||
public const int distanceFromMenuBottomBeforeNewPage = 128;
|
||||
public ClickableTextureComponent backButton;
|
||||
public ClickableTextureComponent forwardButton;
|
||||
private int currentTab;
|
||||
private int currentPage;
|
||||
private int value;
|
||||
|
||||
|
||||
|
||||
public CropUtilityMenu(int x, int y, int width, int height)
|
||||
: base(x, y, width, height, false)
|
||||
{
|
||||
List<ClickableTextureComponent> sideTabs1 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent1 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4 + CollectionsPage.widthToMoveActiveTab, this.yPositionOnScreen + Game1.tileSize * 2, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Shipped"), Game1.mouseCursors, new Rectangle(640, 80, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num1 = 7001;
|
||||
textureComponent1.myID = num1;
|
||||
int num2 = 7002;
|
||||
textureComponent1.downNeighborID = num2;
|
||||
int num3 = 0;
|
||||
textureComponent1.rightNeighborID = num3;
|
||||
sideTabs1.Add(textureComponent1);
|
||||
this.collections.Add(0, new List<List<ClickableTextureComponent>>());
|
||||
List<ClickableTextureComponent> sideTabs2 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent2 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 3, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Fish"), Game1.mouseCursors, new Rectangle(640, 64, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num4 = 7002;
|
||||
textureComponent2.myID = num4;
|
||||
int num5 = 7001;
|
||||
textureComponent2.upNeighborID = num5;
|
||||
int num6 = 7003;
|
||||
textureComponent2.downNeighborID = num6;
|
||||
int num7 = 0;
|
||||
textureComponent2.rightNeighborID = num7;
|
||||
sideTabs2.Add(textureComponent2);
|
||||
this.collections.Add(1, new List<List<ClickableTextureComponent>>());
|
||||
List<ClickableTextureComponent> sideTabs3 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent3 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 4, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Artifacts"), Game1.mouseCursors, new Rectangle(656, 64, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num8 = 7003;
|
||||
textureComponent3.myID = num8;
|
||||
int num9 = 7002;
|
||||
textureComponent3.upNeighborID = num9;
|
||||
int num10 = 7004;
|
||||
textureComponent3.downNeighborID = num10;
|
||||
int num11 = 0;
|
||||
textureComponent3.rightNeighborID = num11;
|
||||
sideTabs3.Add(textureComponent3);
|
||||
this.collections.Add(2, new List<List<ClickableTextureComponent>>());
|
||||
List<ClickableTextureComponent> sideTabs4 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent4 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 5, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Minerals"), Game1.mouseCursors, new Rectangle(672, 64, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num12 = 7004;
|
||||
textureComponent4.myID = num12;
|
||||
int num13 = 7003;
|
||||
textureComponent4.upNeighborID = num13;
|
||||
int num14 = 7005;
|
||||
textureComponent4.downNeighborID = num14;
|
||||
int num15 = 0;
|
||||
textureComponent4.rightNeighborID = num15;
|
||||
sideTabs4.Add(textureComponent4);
|
||||
this.collections.Add(3, new List<List<ClickableTextureComponent>>());
|
||||
List<ClickableTextureComponent> sideTabs5 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent5 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 6, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Cooking"), Game1.mouseCursors, new Rectangle(688, 64, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num16 = 7005;
|
||||
textureComponent5.myID = num16;
|
||||
int num17 = 7004;
|
||||
textureComponent5.upNeighborID = num17;
|
||||
int num18 = 7006;
|
||||
textureComponent5.downNeighborID = num18;
|
||||
int num19 = 0;
|
||||
textureComponent5.rightNeighborID = num19;
|
||||
sideTabs5.Add(textureComponent5);
|
||||
this.collections.Add(4, new List<List<ClickableTextureComponent>>());
|
||||
List<ClickableTextureComponent> sideTabs6 = this.sideTabs;
|
||||
ClickableTextureComponent textureComponent6 = new ClickableTextureComponent("", new Rectangle(this.xPositionOnScreen - Game1.tileSize * 3 / 4, this.yPositionOnScreen + Game1.tileSize * 7, Game1.tileSize, Game1.tileSize), "", Game1.content.LoadString("Strings\\UI:Collections_Achievements"), Game1.mouseCursors, new Rectangle(656, 80, 16, 16), (float)Game1.pixelZoom, false);
|
||||
int num20 = 7006;
|
||||
textureComponent6.myID = num20;
|
||||
int num21 = 7005;
|
||||
textureComponent6.upNeighborID = num21;
|
||||
int num22 = 0;
|
||||
textureComponent6.rightNeighborID = num22;
|
||||
sideTabs6.Add(textureComponent6);
|
||||
this.collections.Add(5, new List<List<ClickableTextureComponent>>());
|
||||
CollectionsPage.widthToMoveActiveTab = Game1.tileSize / 8;
|
||||
ClickableTextureComponent textureComponent7 = new ClickableTextureComponent(new Rectangle(this.xPositionOnScreen + Game1.tileSize * 3 / 4, this.yPositionOnScreen + height - 20 * Game1.pixelZoom, 12 * Game1.pixelZoom, 11 * Game1.pixelZoom), Game1.mouseCursors, new Rectangle(352, 495, 12, 11), (float)Game1.pixelZoom, false);
|
||||
int num23 = 706;
|
||||
textureComponent7.myID = num23;
|
||||
int num24 = -7777;
|
||||
textureComponent7.rightNeighborID = num24;
|
||||
this.backButton = textureComponent7;
|
||||
ClickableTextureComponent textureComponent8 = new ClickableTextureComponent(new Rectangle(this.xPositionOnScreen + width - Game1.tileSize / 2 - 15 * Game1.pixelZoom, this.yPositionOnScreen + height - 20 * Game1.pixelZoom, 12 * Game1.pixelZoom, 11 * Game1.pixelZoom), Game1.mouseCursors, new Rectangle(365, 495, 12, 11), (float)Game1.pixelZoom, false);
|
||||
int num25 = 707;
|
||||
textureComponent8.myID = num25;
|
||||
int num26 = -7777;
|
||||
textureComponent8.leftNeighborID = num26;
|
||||
this.forwardButton = textureComponent8;
|
||||
int[] numArray = new int[this.sideTabs.Count];
|
||||
int num27 = this.xPositionOnScreen + IClickableMenu.borderWidth + IClickableMenu.spaceToClearSideBorder;
|
||||
int num28 = this.yPositionOnScreen + IClickableMenu.borderWidth + IClickableMenu.spaceToClearTopBorder - Game1.tileSize / 4;
|
||||
int num29 = 10;
|
||||
foreach (KeyValuePair<int, string> keyValuePair in Game1.objectInformation)
|
||||
{
|
||||
string str = keyValuePair.Value.Split('/')[3];
|
||||
bool drawShadow = false;
|
||||
int index;
|
||||
if (str.Contains("Arch"))
|
||||
{
|
||||
index = 2;
|
||||
if (Game1.player.archaeologyFound.ContainsKey(keyValuePair.Key))
|
||||
drawShadow = true;
|
||||
}
|
||||
else if (str.Contains("Fish"))
|
||||
{
|
||||
if (keyValuePair.Key < 167 || keyValuePair.Key >= 173)
|
||||
{
|
||||
index = 1;
|
||||
if (Game1.player.fishCaught.ContainsKey(keyValuePair.Key))
|
||||
drawShadow = true;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
else if (str.Contains("Mineral") || str.Substring(str.Length - 3).Equals("-2"))
|
||||
{
|
||||
index = 3;
|
||||
if (Game1.player.mineralsFound.ContainsKey(keyValuePair.Key))
|
||||
drawShadow = true;
|
||||
}
|
||||
else if (str.Contains("Cooking") || str.Substring(str.Length - 3).Equals("-7"))
|
||||
{
|
||||
index = 4;
|
||||
if (Game1.player.recipesCooked.ContainsKey(keyValuePair.Key))
|
||||
drawShadow = true;
|
||||
if (keyValuePair.Key == 217 || keyValuePair.Key == 772 || keyValuePair.Key == 773)
|
||||
continue;
|
||||
}
|
||||
else if(keyValuePair.Key>0)
|
||||
{
|
||||
index = 0;
|
||||
StardewValley.Object obj = new StardewValley.Object(keyValuePair.Key, 1);
|
||||
if (obj.getCategoryName()!="Seed") continue;
|
||||
drawShadow = true;
|
||||
|
||||
}
|
||||
else
|
||||
continue;
|
||||
int x1 = num27 + numArray[index] % num29 * (Game1.tileSize + 4);
|
||||
int y1 = num28 + numArray[index] / num29 * (Game1.tileSize + 4);
|
||||
if (y1 > this.yPositionOnScreen + height - 128)
|
||||
{
|
||||
this.collections[index].Add(new List<ClickableTextureComponent>());
|
||||
numArray[index] = 0;
|
||||
x1 = num27;
|
||||
y1 = num28;
|
||||
}
|
||||
if (this.collections[index].Count == 0)
|
||||
this.collections[index].Add(new List<ClickableTextureComponent>());
|
||||
StardewValley.Object o = new StardewValley.Object(keyValuePair.Key, 1);
|
||||
if (o.getCategoryName() != "Seed") continue;
|
||||
List<ClickableTextureComponent> textureComponentList = this.collections[index].Last<List<ClickableTextureComponent>>();
|
||||
float scale= Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(o.parentSheetIndex));
|
||||
if (UtilityCore.SeedCropUtility.getUtilityScaleValue(o.parentSheetIndex)==0) scale = 1.00f;
|
||||
ClickableTextureComponent textureComponent9 = new ClickableTextureComponent(keyValuePair.Key.ToString() + " " + drawShadow.ToString(), new Rectangle(x1, y1, Game1.tileSize, Game1.tileSize), (string)null, "", Game1.objectSpriteSheet, Game1.getSourceRectForStandardTileSheet(Game1.objectSpriteSheet, keyValuePair.Key, 16, 16),Game1.pixelZoom, drawShadow);
|
||||
textureComponent9.scale = scale;
|
||||
int count = this.collections[index].Last<List<ClickableTextureComponent>>().Count;
|
||||
textureComponent9.myID = count;
|
||||
int num30 = (this.collections[index].Last<List<ClickableTextureComponent>>().Count + 1) % num29 == 0 ? -1 : this.collections[index].Last<List<ClickableTextureComponent>>().Count + 1;
|
||||
textureComponent9.rightNeighborID = num30;
|
||||
int num31 = this.collections[index].Last<List<ClickableTextureComponent>>().Count % num29 == 0 ? 7001 : this.collections[index].Last<List<ClickableTextureComponent>>().Count - 1;
|
||||
textureComponent9.leftNeighborID = num31;
|
||||
int num32 = y1 + (Game1.tileSize + 4) > this.yPositionOnScreen + height - 128 ? -7777 : this.collections[index].Last<List<ClickableTextureComponent>>().Count + num29;
|
||||
textureComponent9.downNeighborID = num32;
|
||||
int num33 = this.collections[index].Last<List<ClickableTextureComponent>>().Count < num29 ? 12345 : this.collections[index].Last<List<ClickableTextureComponent>>().Count - num29;
|
||||
textureComponent9.upNeighborID = num33;
|
||||
int num34 = 1;
|
||||
textureComponent9.fullyImmutable = num34 != 0;
|
||||
textureComponentList.Add(textureComponent9);
|
||||
++numArray[index];
|
||||
}
|
||||
if (this.collections[5].Count == 0)
|
||||
this.collections[5].Add(new List<ClickableTextureComponent>());
|
||||
}
|
||||
|
||||
protected override void customSnapBehavior(int direction, int oldRegion, int oldID)
|
||||
{
|
||||
base.customSnapBehavior(direction, oldRegion, oldID);
|
||||
if (direction == 2)
|
||||
{
|
||||
if (this.currentPage > 0)
|
||||
this.currentlySnappedComponent = this.getComponentWithID(706);
|
||||
else if (this.currentPage == 0 && this.collections[this.currentTab].Count > 1)
|
||||
this.currentlySnappedComponent = this.getComponentWithID(707);
|
||||
this.backButton.upNeighborID = oldID;
|
||||
this.forwardButton.upNeighborID = oldID;
|
||||
}
|
||||
else if (direction == 3)
|
||||
{
|
||||
if (oldID != 707 || this.currentPage <= 0)
|
||||
return;
|
||||
this.currentlySnappedComponent = this.getComponentWithID(706);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (direction != 1 || oldID != 706 || this.collections[this.currentTab].Count <= this.currentPage + 1)
|
||||
return;
|
||||
this.currentlySnappedComponent = this.getComponentWithID(707);
|
||||
}
|
||||
}
|
||||
|
||||
public override void snapToDefaultClickableComponent()
|
||||
{
|
||||
base.snapToDefaultClickableComponent();
|
||||
this.currentlySnappedComponent = this.getComponentWithID(0);
|
||||
this.snapCursorToCurrentSnappedComponent();
|
||||
}
|
||||
|
||||
public override void receiveLeftClick(int x, int y, bool playSound = true)
|
||||
{
|
||||
for (int index = 0; index < this.sideTabs.Count; ++index)
|
||||
{
|
||||
if (this.sideTabs[index].containsPoint(x, y) && this.currentTab != index)
|
||||
{
|
||||
Game1.playSound("smallSelect");
|
||||
this.sideTabs[this.currentTab].bounds.X -= CollectionsPage.widthToMoveActiveTab;
|
||||
this.currentTab = index;
|
||||
this.currentPage = 0;
|
||||
this.sideTabs[index].bounds.X += CollectionsPage.widthToMoveActiveTab;
|
||||
}
|
||||
}
|
||||
if (this.currentPage > 0 && this.backButton.containsPoint(x, y))
|
||||
{
|
||||
this.currentPage = this.currentPage - 1;
|
||||
Game1.playSound("shwip");
|
||||
this.backButton.scale = this.backButton.baseScale;
|
||||
if (Game1.options.snappyMenus && Game1.options.gamepadControls && this.currentPage == 0)
|
||||
{
|
||||
this.currentlySnappedComponent = (ClickableComponent)this.forwardButton;
|
||||
Game1.setMousePosition(this.currentlySnappedComponent.bounds.Center);
|
||||
}
|
||||
}
|
||||
ClickableTextureComponent texture;
|
||||
foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage])
|
||||
{
|
||||
if (textureComponent.containsPoint(x, y))
|
||||
{
|
||||
string[] s = textureComponent.name.Split(' ');
|
||||
ModCore.CoreMonitor.Log(s[0]);
|
||||
ModCore.CoreMonitor.Log("CLICKED A THING!");
|
||||
UtilityCore.SeedCropUtility.updateUserUtilities(Convert.ToInt32(s[0]), 0.05f);
|
||||
textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])));
|
||||
if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0]))==0) textureComponent.scale = 1.00f;
|
||||
texture = textureComponent;
|
||||
}
|
||||
}
|
||||
if (this.currentPage >= this.collections[this.currentTab].Count - 1 || !this.forwardButton.containsPoint(x, y))
|
||||
return;
|
||||
this.currentPage = this.currentPage + 1;
|
||||
Game1.playSound("shwip");
|
||||
this.forwardButton.scale = this.forwardButton.baseScale;
|
||||
if (!Game1.options.snappyMenus || !Game1.options.gamepadControls || this.currentPage != this.collections[this.currentTab].Count - 1)
|
||||
return;
|
||||
this.currentlySnappedComponent = (ClickableComponent)this.backButton;
|
||||
Game1.setMousePosition(this.currentlySnappedComponent.bounds.Center);
|
||||
}
|
||||
|
||||
public override void receiveRightClick(int x, int y, bool playSound = true)
|
||||
{
|
||||
foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage])
|
||||
{
|
||||
if (textureComponent.containsPoint(x, y))
|
||||
{
|
||||
string[] s = textureComponent.name.Split(' ');
|
||||
ModCore.CoreMonitor.Log(s[0]);
|
||||
ModCore.CoreMonitor.Log("CLICKED A THING!");
|
||||
UtilityCore.SeedCropUtility.updateUserUtilities(Convert.ToInt32(s[0]), -0.05f);
|
||||
//ModCore.CoreMonitor.Log(textureComponent.scale.ToString());
|
||||
textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])));
|
||||
if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void performHoverAction(int x, int y)
|
||||
{
|
||||
this.descriptionText = "";
|
||||
this.hoverText = "";
|
||||
this.value = -1;
|
||||
int i = 0;
|
||||
foreach (ClickableTextureComponent sideTab in this.sideTabs)
|
||||
{
|
||||
if (i != 0) break;
|
||||
if (sideTab.containsPoint(x, y))
|
||||
{
|
||||
this.hoverText = sideTab.hoverText;
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
foreach (ClickableTextureComponent textureComponent in this.collections[this.currentTab][this.currentPage])
|
||||
{
|
||||
if (textureComponent.containsPoint(x, y))
|
||||
{
|
||||
string[] s = textureComponent.name.Split(' ');
|
||||
|
||||
textureComponent.scale = Game1.pixelZoom * (1+ UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])));
|
||||
if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f;
|
||||
if (Convert.ToBoolean(textureComponent.name.Split(' ')[1]) || this.currentTab == 5) {
|
||||
this.hoverText = this.createDescription(Convert.ToInt32(textureComponent.name.Split(' ')[0]));
|
||||
this.hoverText += "\n\nAI Utility Value: " +Math.Round(UtilityCore.SeedCropUtility.CropSeedUtilityDictionary[(Convert.ToInt32(s[0]))],3);
|
||||
this.hoverText += "\n\nUser Utility Value: " +Math.Round(UtilityCore.SeedCropUtility.UserCropSeedUtilityDictionary[(Convert.ToInt32(s[0]))],3);
|
||||
this.hoverText += "\n\nTotal Utility Value: " +Math.Round(UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])),3);
|
||||
}
|
||||
else
|
||||
this.hoverText = "???";
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] s = textureComponent.name.Split(' ');
|
||||
textureComponent.scale = Game1.pixelZoom * (1 + UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])));
|
||||
if (UtilityCore.SeedCropUtility.getUtilityScaleValue(Convert.ToInt32(s[0])) == 0) textureComponent.scale = 1.00f;
|
||||
}
|
||||
}
|
||||
this.forwardButton.tryHover(x, y, 0.5f);
|
||||
this.backButton.tryHover(x, y, 0.5f);
|
||||
}
|
||||
|
||||
public string createDescription(int index)
|
||||
{
|
||||
string str1 = "";
|
||||
string str2;
|
||||
if (this.currentTab == 5)
|
||||
{
|
||||
string[] strArray = Game1.achievements[index].Split('^');
|
||||
str2 = str1 + strArray[0] + Environment.NewLine + Environment.NewLine + strArray[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] strArray = Game1.objectInformation[index].Split('/');
|
||||
string str3 = strArray[4];
|
||||
string str4 = str1 + str3 + Environment.NewLine + Environment.NewLine + Game1.parseText(strArray[5], Game1.smallFont, Game1.tileSize * 4) + Environment.NewLine + Environment.NewLine;
|
||||
if (strArray[3].Contains("Arch"))
|
||||
{
|
||||
string str5 = str4;
|
||||
string str6;
|
||||
if (!Game1.player.archaeologyFound.ContainsKey(index))
|
||||
str6 = "";
|
||||
else
|
||||
str6 = Game1.content.LoadString("Strings\\UI:Collections_Description_ArtifactsFound", (object)Game1.player.archaeologyFound[index][0]);
|
||||
str2 = str5 + str6;
|
||||
}
|
||||
else if (strArray[3].Contains("Cooking"))
|
||||
{
|
||||
string str5 = str4;
|
||||
string str6;
|
||||
if (!Game1.player.recipesCooked.ContainsKey(index))
|
||||
str6 = "";
|
||||
else
|
||||
str6 = Game1.content.LoadString("Strings\\UI:Collections_Description_RecipesCooked", (object)Game1.player.recipesCooked[index]);
|
||||
str2 = str5 + str6;
|
||||
}
|
||||
else if (strArray[3].Contains("Fish"))
|
||||
{
|
||||
str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_FishCaught", (object)(Game1.player.fishCaught.ContainsKey(index) ? Game1.player.fishCaught[index][0] : 0));
|
||||
if (Game1.player.fishCaught.ContainsKey(index) && Game1.player.fishCaught[index][1] > 0)
|
||||
str2 = str2 + Environment.NewLine + Game1.content.LoadString("Strings\\UI:Collections_Description_BiggestCatch", (object)(LocalizedContentManager.CurrentLanguageCode != LocalizedContentManager.LanguageCode.en ? Math.Round((double)Game1.player.fishCaught[index][1] * 2.54) : (double)Game1.player.fishCaught[index][1]));
|
||||
}
|
||||
else if (strArray[3].Contains("Minerals") || strArray[3].Substring(strArray[3].Length - 3).Equals("-2"))
|
||||
str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_MineralsFound", (object)(Game1.player.mineralsFound.ContainsKey(index) ? Game1.player.mineralsFound[index] : 0));
|
||||
else
|
||||
str2 = str4 + Game1.content.LoadString("Strings\\UI:Collections_Description_NumberShipped", (object)(Game1.player.basicShipped.ContainsKey(index) ? Game1.player.basicShipped[index] : 0));
|
||||
this.value = Convert.ToInt32(strArray[1]);
|
||||
}
|
||||
return str2;
|
||||
}
|
||||
|
||||
public override void draw(SpriteBatch b)
|
||||
{
|
||||
Game1.drawDialogueBox(this.xPositionOnScreen, this.yPositionOnScreen, this.width, this.height, false, true);
|
||||
int i = 0;
|
||||
foreach (ClickableTextureComponent sideTab in this.sideTabs)
|
||||
{
|
||||
sideTab.draw(b);
|
||||
i++;
|
||||
if (i != 0) break;
|
||||
}
|
||||
if (this.currentPage > 0)
|
||||
this.backButton.draw(b);
|
||||
if (this.currentPage < this.collections[this.currentTab].Count - 1)
|
||||
this.forwardButton.draw(b);
|
||||
b.End();
|
||||
b.Begin(SpriteSortMode.FrontToBack, BlendState.NonPremultiplied, SamplerState.PointClamp, (DepthStencilState)null, (RasterizerState)null);
|
||||
foreach (ClickableTextureComponent textureComponent in this.collections[0][this.currentPage])
|
||||
{
|
||||
bool boolean = textureComponent.scale.Equals(1.00f);
|
||||
textureComponent.draw(b, boolean ? Color.White * 0.6f : Color.White, 0.86f);
|
||||
if (this.currentTab == 5 & boolean)
|
||||
{
|
||||
int num = new Random(Convert.ToInt32(textureComponent.name.Split(' ')[0])).Next(12);
|
||||
b.Draw(Game1.mouseCursors, new Vector2((float)(textureComponent.bounds.X + 16 + Game1.tileSize / 4), (float)(textureComponent.bounds.Y + 20 + Game1.tileSize / 4)), new Rectangle?(new Rectangle(256 + num % 6 * Game1.tileSize / 2, 128 + num / 6 * Game1.tileSize / 2, Game1.tileSize / 2, Game1.tileSize / 2)), Color.White, 0.0f, new Vector2((float)(Game1.tileSize / 4), (float)(Game1.tileSize / 4)), textureComponent.scale, SpriteEffects.None, 0.88f);
|
||||
}
|
||||
}
|
||||
b.End();
|
||||
b.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, (DepthStencilState)null, (RasterizerState)null);
|
||||
if (this.hoverText.Equals(""))
|
||||
{
|
||||
this.drawMouse(b);
|
||||
return;
|
||||
}
|
||||
IClickableMenu.drawHoverText(b, this.hoverText, Game1.smallFont, 0, 0, this.value, (string)null, -1, (string[])null, (Item)null, 0, -1, -1, -1, -1, 1f, (CraftingRecipe)null);
|
||||
this.drawMouse(b);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,278 @@
|
|||
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;
|
||||
using StardewValley.Menus;
|
||||
using StarAI.TaskCore.MapTransitionLogic;
|
||||
|
||||
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 static bool throwUpShippingMenu;
|
||||
private bool playerHasLoadedGame;
|
||||
|
||||
public override void Entry(IModHelper helper)
|
||||
{
|
||||
obj[0] = PathFindingLogic.source;
|
||||
obj[1] = PathFindingLogic.currentGoal;
|
||||
obj[2] = PathFindingLogic.queue;
|
||||
CoreHelper = helper;
|
||||
throwUpShippingMenu = false;
|
||||
|
||||
CoreMonitor = this.Monitor;
|
||||
CoreMonitor.Log("Hello AI WORLD!", LogLevel.Info);
|
||||
|
||||
initializeEverything();
|
||||
|
||||
StardewModdingAPI.Events.ControlEvents.KeyPressed += ControlEvents_KeyPressed;
|
||||
StardewModdingAPI.Events.SaveEvents.AfterLoad += SaveEvents_AfterLoad;
|
||||
StardewModdingAPI.Events.SaveEvents.BeforeSave += SaveEvents_BeforeSave;
|
||||
StardewModdingAPI.Events.SaveEvents.AfterSave += SaveEvents_AfterSave;
|
||||
|
||||
StardewModdingAPI.Events.GameEvents.UpdateTick += GameEvents_UpdateTick;
|
||||
playerHasLoadedGame = false;
|
||||
|
||||
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)));
|
||||
|
||||
PathFindingCore.Utilities.placement = false;
|
||||
}
|
||||
|
||||
private void GameEvents_UpdateTick(object sender, EventArgs e)
|
||||
{
|
||||
if (playerHasLoadedGame == false) return;
|
||||
DialogueCore.ReponseLogic.answerDialogueResponses();
|
||||
InterfaceCore.InterfaceLogic.interactWithCurrentMenu();
|
||||
}
|
||||
|
||||
private void SaveEvents_AfterSave(object sender, EventArgs e)
|
||||
{
|
||||
WayPoints.setUpBedWaypoint();
|
||||
UtilityCore.SeedCropUtility.setUpCropUtilityDictionaryDaily();
|
||||
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.ESCAPE);
|
||||
|
||||
}
|
||||
|
||||
public void initializeEverything()
|
||||
{
|
||||
Commands.initializeCommands();
|
||||
PathFindingCore.Utilities.initializeTileExceptionList();
|
||||
ExecutionCore.TaskMetaDataHeuristics.initializeToolCostDictionary();
|
||||
WayPoints.initializeWaypoints();
|
||||
|
||||
}
|
||||
|
||||
private void SaveEvents_BeforeSave(object sender, EventArgs e)
|
||||
{
|
||||
List<TileNode> removalList = new List<TileNode>();
|
||||
foreach(var v in StardustCore.ModCore.SerializationManager.trackedObjectList)
|
||||
{
|
||||
if(v.getCategoryName()=="Tile Node")
|
||||
{
|
||||
//StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
removalList.Add((v as TileNode));
|
||||
}
|
||||
}
|
||||
foreach(var v in removalList)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
}
|
||||
|
||||
Stack<IClickableMenu> menus = new Stack<IClickableMenu>();
|
||||
|
||||
if (throwUpShippingMenu == true)
|
||||
{
|
||||
List<Item> itemList = new List<Item>();
|
||||
foreach (var item in Game1.shippingBin)
|
||||
{
|
||||
itemList.Add(item);
|
||||
}
|
||||
menus.Push(new StardewValley.Menus.ShippingMenu(itemList));
|
||||
foreach (var q in Game1.shippingBin)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(q.name);
|
||||
}
|
||||
throwUpShippingMenu = false;
|
||||
}
|
||||
foreach(var v in Game1.endOfNightMenus)
|
||||
{
|
||||
menus.Push(v);
|
||||
}
|
||||
Game1.endOfNightMenus = menus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void SaveEvents_AfterLoad(object sender, EventArgs e)
|
||||
{
|
||||
// loadExceptionTiles();
|
||||
CheatCore.DoorsToWarps.makeAllDoorsWarps();
|
||||
WayPoints.setUpBedWaypoint();
|
||||
WayPoints.verifyWayPoints();
|
||||
UtilityCore.SeedCropUtility.setUpUserCropUtilityDictionary(); //Runs once
|
||||
UtilityCore.SeedCropUtility.setUpCropUtilityDictionaryDaily(); //Runs daily
|
||||
playerHasLoadedGame = true;
|
||||
}
|
||||
|
||||
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.Y)
|
||||
{
|
||||
ShopCore.ShopLogic.openSeedShopMenu();
|
||||
}
|
||||
|
||||
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.T)
|
||||
{
|
||||
Game1.activeClickableMenu = new MenuCore.CropUtilityMenu((int)(Game1.viewport.Width * .1f), (int)(Game1.viewport.Height * .05f), (int)(Game1.viewport.Width*.7f),(int)(Game1.viewport.Height*.75f));
|
||||
}
|
||||
|
||||
if (e.KeyPressed == Microsoft.Xna.Framework.Input.Keys.U)
|
||||
{
|
||||
ExecutionCore.TaskList.printAllTaskMetaData();
|
||||
foreach(var v in PathFindingCore.Utilities.tileExceptionList)
|
||||
{
|
||||
ModCore.CoreMonitor.Log(v.actionType);
|
||||
}
|
||||
}
|
||||
|
||||
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(), (int)Game1.player.getTileY(), layer);
|
||||
if (tileIndex == -1) continue;
|
||||
ModCore.CoreMonitor.Log("Position: " + (Game1.player.getTileLocation()).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")
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -21,7 +21,7 @@ namespace StarAI.PathFindingCore
|
|||
public static int delay;
|
||||
|
||||
|
||||
public static int index = 0;
|
||||
// public static int index = 0;
|
||||
|
||||
|
||||
public static void pathFindToAllGoals()
|
||||
|
@ -71,9 +71,10 @@ namespace StarAI.PathFindingCore
|
|||
|
||||
public static void pathFindToSingleGoal(object data)
|
||||
{
|
||||
int index = 0;
|
||||
List<TileNode> path = new List<TileNode>();
|
||||
//path.Clear();
|
||||
ModCore.CoreMonitor.Log("LET'S GO!!!!", LogLevel.Error);
|
||||
//ModCore.CoreMonitor.Log("LET'S GO!!!!", LogLevel.Error);
|
||||
object[] obj = (object[])data;
|
||||
|
||||
TileNode Source =(TileNode) obj[0];
|
||||
|
@ -116,7 +117,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)
|
||||
{
|
||||
|
@ -189,13 +190,13 @@ namespace StarAI.PathFindingCore
|
|||
|
||||
if (currentNode.tileLocation != Goal.tileLocation)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("NO PATH FOUND", LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("NO PATH FOUND", LogLevel.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (currentNode.tileLocation == Goal.tileLocation)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("SWEET BEANS!!!!!!", LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("SWEET BEANS!!!!!!", LogLevel.Error);
|
||||
queue.Clear();
|
||||
index = 0;
|
||||
//ModCore.CoreMonitor.Log(currentNode.parent.ToString(), LogLevel.Error);
|
||||
|
@ -275,21 +276,34 @@ 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);
|
||||
}
|
||||
|
||||
public static List<TileNode> pathFindToSingleGoalReturnPath(TileNode Source, List<TileNode> Goal, List<TileNode> Queue, bool Placement, bool CheckForUtility)
|
||||
{
|
||||
object[] obj = new object[5];
|
||||
obj[0] = Source;
|
||||
obj[1] = Goal;
|
||||
obj[2] = Queue;
|
||||
obj[3] = Placement;
|
||||
obj[4] = CheckForUtility;
|
||||
return pathFindToSingleGoalReturnPathList(obj);
|
||||
}
|
||||
|
||||
public static List<TileNode> pathFindToSingleGoalReturnPath(object data)
|
||||
{
|
||||
int index = 0;
|
||||
List<TileNode> path = new List<TileNode>();
|
||||
//path.Clear();
|
||||
ModCore.CoreMonitor.Log("LET'S GO!!!!", LogLevel.Error);
|
||||
//ModCore.CoreMonitor.Log("LET'S GO!!!!", LogLevel.Error);
|
||||
object[] obj = (object[])data;
|
||||
|
||||
TileNode Source = (TileNode)obj[0];
|
||||
|
@ -308,14 +322,17 @@ namespace StarAI.PathFindingCore
|
|||
TileNode currentNode = Source;
|
||||
|
||||
bool placement = (bool)obj[3];
|
||||
bool checkForUtility = (bool)obj[4];
|
||||
queue.Add(currentNode);
|
||||
index++;
|
||||
bool goalFound = false;
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
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;
|
||||
|
@ -338,7 +355,7 @@ namespace StarAI.PathFindingCore
|
|||
//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,placement);
|
||||
//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)
|
||||
|
@ -414,7 +431,7 @@ namespace StarAI.PathFindingCore
|
|||
|
||||
if (currentNode.tileLocation != Goal.tileLocation)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("NO PATH FOUND", LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("NO PATH FOUND", LogLevel.Error);
|
||||
return new List<TileNode>();
|
||||
}
|
||||
|
||||
|
@ -462,32 +479,33 @@ 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)
|
||||
{
|
||||
|
||||
foreach (var exc in Utilities.tileExceptionList)
|
||||
{
|
||||
if (exc.tile == (v as TileNode)) continue;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -497,12 +515,262 @@ namespace StarAI.PathFindingCore
|
|||
}
|
||||
|
||||
|
||||
public static KeyValuePair<bool, TileNode> doesNodeEqualGoal(TileNode currentNode, List<TileNode> goal)
|
||||
{
|
||||
foreach(var v in goal)
|
||||
{
|
||||
if (v.tileLocation == currentNode.tileLocation) return new KeyValuePair<bool, TileNode>(true, v);
|
||||
}
|
||||
return new KeyValuePair<bool, TileNode>(false, null);
|
||||
}
|
||||
|
||||
public static KeyValuePair<bool,TileNode> doesNodeEqualGoal(Vector2 currentNode, List<TileNode> goal)
|
||||
{
|
||||
foreach (var v in goal)
|
||||
{
|
||||
if (v.tileLocation.X == currentNode.X && v.tileLocation.Y == currentNode.Y) return new KeyValuePair<bool, TileNode> (true,v);
|
||||
}
|
||||
return new KeyValuePair<bool, TileNode>(false,null);
|
||||
}
|
||||
public static List<TileNode> pathFindToSingleGoalReturnPathList(object data)
|
||||
{
|
||||
int index = 0;
|
||||
List<TileNode> path = new List<TileNode>();
|
||||
//path.Clear();
|
||||
//ModCore.CoreMonitor.Log("LET'S GO 2222!!!!", LogLevel.Error);
|
||||
object[] obj = (object[])data;
|
||||
|
||||
TileNode Source = (TileNode)obj[0];
|
||||
|
||||
if (Source.parent != null)
|
||||
{
|
||||
Source.parent = null;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
List<TileNode> Goals = (List<TileNode>)obj[1];
|
||||
List<TileNode> Queue = (List<TileNode>)obj[2];
|
||||
totalPathCost = 0;
|
||||
TileNode currentNode = Source;
|
||||
|
||||
bool placement = (bool)obj[3];
|
||||
bool checkForUtility = (bool)obj[4];
|
||||
queue.Add(currentNode);
|
||||
// index++;
|
||||
bool goalFound = false;
|
||||
while (doesNodeEqualGoal(currentNode,Goals).Key==false && queue.Count != 0)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("LET'S GO PATH!!!!", LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("PATH FROM Node: " + currentNode.tileLocation, LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("PATH FROM Source: " + Source.tileLocation, LogLevel.Error);
|
||||
// ModCore.CoreMonitor.Log("GOALS COUNT " + Goals.Count, LogLevel.Error);
|
||||
|
||||
// ModCore.CoreMonitor.Log("THIS IS MY MISTAKE!!!!!!! " + Goals.Count, LogLevel.Error);
|
||||
|
||||
//Console.WriteLine("OK WTF IS GOING ON????");
|
||||
//Add children to current node
|
||||
int xMin = -1;
|
||||
int yMin = -1;
|
||||
int xMax = 1;
|
||||
int yMax = 1;
|
||||
|
||||
//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
|
||||
//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, checkForUtility, placement);
|
||||
// ModCore.CoreMonitor.Log("OR NO?", LogLevel.Error);
|
||||
Vector2 check = new Vector2((int)currentNode.tileLocation.X + x, (int)currentNode.tileLocation.Y + y);
|
||||
if (doesNodeEqualGoal(check,Goals).Key==true)
|
||||
{
|
||||
doesNodeEqualGoal(check, Goals).Value.parent = currentNode;
|
||||
// Goal = doesNodeEqualGoal(check, Goals).Value;
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.LightGreen);
|
||||
currentNode = doesNodeEqualGoal(check, Goals).Value;
|
||||
// ModCore.CoreMonitor.Log("SNAGED THE GOAL!!!!!!");
|
||||
//System.Threading.Thread.Sleep(2000);
|
||||
goalFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (goalFound == true)
|
||||
{
|
||||
currentNode = doesNodeEqualGoal(currentNode, Goals).Value;
|
||||
// ModCore.CoreMonitor.Log("FOUND YOU!!!");
|
||||
|
||||
// path.Add(currentNode);
|
||||
//System.Threading.Thread.Sleep(2000);
|
||||
break;
|
||||
}
|
||||
List<TileNode> adjList = new List<TileNode>();
|
||||
foreach (var node in currentNode.children)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("MAYBE HERE",LogLevel.Warn);
|
||||
//TileNode t = new TileNode(1, Vector2.Zero, Souce.texturePath,source.dataPath, source.drawColor);
|
||||
//TileNode.setSingleTileAsChild(source, (int)source.tileLocation.X + x, (int)source.tileLocation.Y + y);
|
||||
if (node.parent == null)
|
||||
{
|
||||
//ModCore.CoreMonitor.Log("I DONT UNDERSTAND!");
|
||||
System.Threading.Thread.Sleep(delay);
|
||||
}
|
||||
//ModCore.CoreMonitor.Log("ok checking adj:" + node.tileLocation.ToString());
|
||||
|
||||
|
||||
if (node.seenState == 0)
|
||||
{
|
||||
node.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.LightPink); //Seen
|
||||
|
||||
}
|
||||
if (node.seenState == 1)
|
||||
{
|
||||
node.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Blue);
|
||||
}
|
||||
if (node.seenState == 2)
|
||||
{
|
||||
node.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.DarkOrange);
|
||||
}
|
||||
adjList.Add(node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
foreach (var v in adjList)
|
||||
{
|
||||
if (queue.Contains(v)) continue;
|
||||
else queue.Add(v);
|
||||
}
|
||||
currentNode.seenState = 2;
|
||||
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.DarkOrange); //Finished
|
||||
try
|
||||
{
|
||||
currentNode = queue.ElementAt(index);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
|
||||
//ModCore.CoreMonitor.Log("INDEX ERROR:"+index, LogLevel.Error);
|
||||
break;
|
||||
}
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Blue); //Working
|
||||
index++;
|
||||
|
||||
}
|
||||
|
||||
if (doesNodeEqualGoal(currentNode,Goals).Key==false)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("NO PATH FOUND", LogLevel.Error);
|
||||
return new List<TileNode>();
|
||||
}
|
||||
|
||||
if (doesNodeEqualGoal(currentNode, Goals).Key == true)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("SWEET BEANS!!!!!!", LogLevel.Error);
|
||||
queue.Clear();
|
||||
index = 0;
|
||||
//ModCore.CoreMonitor.Log(currentNode.parent.ToString(), LogLevel.Error);
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.LightGreen);
|
||||
//currentGoal.drawColor=
|
||||
}
|
||||
|
||||
while (currentNode.parent != null)
|
||||
{
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Red); //Working
|
||||
path.Add(currentNode);
|
||||
if (currentNode.parent.tileLocation.X < currentNode.tileLocation.X)
|
||||
{
|
||||
currentNode.parent.animationManager.setAnimation("Right", 0);
|
||||
}
|
||||
if (currentNode.parent.tileLocation.X > currentNode.tileLocation.X)
|
||||
{
|
||||
currentNode.parent.animationManager.setAnimation("Left", 0);
|
||||
}
|
||||
if (currentNode.parent.tileLocation.Y < currentNode.tileLocation.Y)
|
||||
{
|
||||
currentNode.parent.animationManager.setAnimation("Down", 0);
|
||||
}
|
||||
if (currentNode.parent.tileLocation.Y > currentNode.tileLocation.Y)
|
||||
{
|
||||
currentNode.parent.animationManager.setAnimation("Up", 0);
|
||||
}
|
||||
if (currentNode.parent.tileLocation == currentNode.tileLocation)
|
||||
{
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Black); //Working
|
||||
}
|
||||
currentNode.parent.animationManager.enableAnimation();
|
||||
currentNode = currentNode.parent;
|
||||
System.Threading.Thread.Sleep(delay);
|
||||
if (currentNode.parent == null)
|
||||
{
|
||||
currentNode.drawColor = StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Red); //Working
|
||||
path.Add(currentNode);
|
||||
}
|
||||
// ModCore.CoreMonitor.Log("??????");
|
||||
}
|
||||
List<TileNode> removalList = new List<TileNode>();
|
||||
List<TileNode> ignoreList = new List<TileNode>();
|
||||
foreach (var v in StardustCore.ModCore.SerializationManager.trackedObjectList)
|
||||
{
|
||||
if (v is TileNode)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("Removing item: " + why + " / " + StardustCore.ModCore.SerializationManager.trackedObjectList.Count);
|
||||
removalList.Add((TileNode)v);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var v in removalList)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
//v.performRemoveAction(v.tileLocation, v.thisLocation);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (path.Count==0&& goalFound==true)
|
||||
{
|
||||
path.Add(Source);
|
||||
}
|
||||
return path;
|
||||
//calculateMovement(path);
|
||||
// goals.Remove(Goal);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static void calculateMovement(List<TileNode> path)
|
||||
{
|
||||
path.Reverse();
|
||||
|
||||
ModCore.CoreMonitor.Log("PATH COUNT TIME!!!!: " + path.Count);
|
||||
// ModCore.CoreMonitor.Log("PATH COUNT TIME!!!!: " + path.Count);
|
||||
bool xTargetReached = false;
|
||||
bool yTargetReached = false;
|
||||
List<TileNode> removalList = new List<TileNode>();
|
||||
|
@ -510,9 +778,14 @@ namespace StarAI.PathFindingCore
|
|||
while (path.Count > 0)
|
||||
{
|
||||
TileNode w = path[0];
|
||||
//ModCore.CoreMonitor.Log("Goto: " + w.tileLocation.ToString());
|
||||
|
||||
// ModCore.CoreMonitor.Log("Here: " +Game1.player.position.ToString());
|
||||
// ModCore.CoreMonitor.Log("LOC: " + Game1.player.currentLocation);
|
||||
Vector2 center2 = Utilities.parseCenterFromTile((int)w.tileLocation.X, (int)w.tileLocation.Y);
|
||||
// ModCore.CoreMonitor.Log("Goto: " + center2);
|
||||
//ModCore.CoreMonitor.Log("My position now: " + Game1.player.getTileLocation());
|
||||
//ModCore.CoreMonitor.Log("My Point position now: " + Game1.player.getTileLocationPoint());
|
||||
|
||||
if (Game1.player.getTileX() == w.tileLocation.X && Game1.player.getTileY() == w.tileLocation.Y)
|
||||
{
|
||||
|
||||
|
@ -617,15 +890,23 @@ namespace StarAI.PathFindingCore
|
|||
|
||||
|
||||
ModCore.CoreMonitor.Log("UNCAUGHT EXCEPTION", LogLevel.Error);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_A);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_D);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_W);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_S);
|
||||
}
|
||||
}
|
||||
foreach(var v in removalList)
|
||||
{
|
||||
//v.thisLocation.objects.Remove(v.tileLocation);
|
||||
v.thisLocation.removeObject(v.tileLocation, false);
|
||||
//v.thisLocation.removeObject(v.tileLocation, false);
|
||||
//v.performRemoveAction(v.tileLocation, v.thisLocation);
|
||||
//StardustCore.Utilities.masterRemovalList.Add(v);
|
||||
v.thisLocation.objects.Remove(v.tileLocation);
|
||||
//ModCore.CoreMonitor.Log("WHUT???"+v.tileLocation);
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
//var ok = v;
|
||||
//ok = null;
|
||||
}
|
||||
//goals.Clear();
|
||||
}
|
|
@ -25,19 +25,6 @@ namespace StarAI.PathFindingCore
|
|||
index = TileIndex;
|
||||
}
|
||||
|
||||
public static TileExceptionNode parseJson(string s)
|
||||
{
|
||||
dynamic obj = JObject.Parse(s);
|
||||
TileExceptionNode t = new TileExceptionNode();
|
||||
t.imageSource = obj.imageSource;
|
||||
t.index = obj.index;
|
||||
return t;
|
||||
}
|
||||
|
||||
public void serializeJson(string s)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.WriteToJsonFile(Path.Combine(s, "tileExceptionData"+ this.index.ToString() + ".json"), (TileExceptionNode)this);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,600 @@
|
|||
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 bool placement;
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\spring_outdoorsTileSheet", 779));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\spring_outdoorsTileSheet", 780));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\spring_outdoorsTileSheet", 781));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\spring_outdoorsTileSheet", 782));
|
||||
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\summer_outdoorsTileSheet", 779));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\summer_outdoorsTileSheet", 780));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\summer_outdoorsTileSheet", 781));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\summer_outdoorsTileSheet", 782));
|
||||
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\fall_outdoorsTileSheet", 779));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\fall_outdoorsTileSheet", 780));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\fall_outdoorsTileSheet", 781));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\fall_outdoorsTileSheet", 782));
|
||||
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\winter_outdoorsTileSheet", 779));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\winter_outdoorsTileSheet", 780));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\winter_outdoorsTileSheet", 781));
|
||||
ignoreCheckTiles.Add(new TileExceptionNode("Maps\\winter_outdoorsTileSheet", 782));
|
||||
}
|
||||
|
||||
|
||||
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.tileLocation == v.tile.tileLocation) 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(string name)
|
||||
{
|
||||
List<TileExceptionMetaData> removalList = new List<TileExceptionMetaData>();
|
||||
foreach(var v in tileExceptionList)
|
||||
{
|
||||
//ModCore.CoreMonitor.Log("DING");
|
||||
if (v.actionType == name) removalList.Add(v);
|
||||
}
|
||||
foreach(var v in removalList)
|
||||
{
|
||||
Utilities.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(v.thisLocation, (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(v.thisLocation, (int)v.tileLocation.X, (int)v.tileLocation.Y);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is used to pathfind to a single explicit target.
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
public static List<TileNode> getIdealPath(TileNode target, TileNode Source=null)
|
||||
{
|
||||
object[] arr = new object[2];
|
||||
arr[0] = target;
|
||||
arr[1] = Source;
|
||||
return getIdealPath(arr);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is used to pathfind to a single explicit target.
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
public static List<TileNode> getIdealPath(object obj)
|
||||
{
|
||||
object[] objArr = (object[])obj;
|
||||
TileNode v = (TileNode)objArr[0];
|
||||
TileNode s;
|
||||
try
|
||||
{
|
||||
s = (TileNode)objArr[1];
|
||||
if (s == null)
|
||||
{
|
||||
s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
|
||||
s.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
|
||||
// ModCore.CoreMonitor.Log("WHUT???????");
|
||||
}
|
||||
}
|
||||
catch(Exception err)
|
||||
{
|
||||
s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.RosyBrown));
|
||||
s.fakePlacementAction(Game1.player.currentLocation, Game1.player.getTileX(), Game1.player.getTileY());
|
||||
ModCore.CoreMonitor.Log("ICECREAM!!!!!!???????");
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool utility = true;
|
||||
|
||||
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, utility);
|
||||
if (f == false)
|
||||
{
|
||||
// ModCore.CoreMonitor.Log("FAILED TO PUT DOWN A GOAL????");
|
||||
ModCore.CoreMonitor.Log(v.thisLocation.ToString()+pos.ToString());
|
||||
}
|
||||
// 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(v.thisLocation, (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, "Navigation"));
|
||||
}
|
||||
}
|
||||
}
|
||||
List<TileNode> removalList = new List<TileNode>();
|
||||
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
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(v.thisLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize);
|
||||
else tempSource.fakePlacementAction(s.thisLocation, (int)s.tileLocation.X, (int)s.tileLocation.Y);
|
||||
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(tempSource, "Navigation"));
|
||||
//StaardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(tempSource, Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize));
|
||||
|
||||
|
||||
//have this take in a list of goals and see which goal it reaches first
|
||||
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, miniGoals, new List<TileNode>(), placement, utility);
|
||||
if (path.Count == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("NOPE, no path I guess.", LogLevel.Warn);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModCore.CoreMonitor.Log("There is a path", LogLevel.Alert);
|
||||
ModCore.CoreMonitor.Log("COST OF THE PATH IS: " + path.Count.ToString(), LogLevel.Alert);
|
||||
}
|
||||
if (path.Count != 0)
|
||||
{
|
||||
//ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
|
||||
paths.Add(path);
|
||||
foreach (var someTile in path)
|
||||
{
|
||||
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(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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return correctPath;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// This is used to pathfind to any target that statisfies conditions. The first one hit becomes the new goal.
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
public static List<TileNode> getIdealPath(List<TileNode> t)
|
||||
{
|
||||
object[] arr = new object[1];
|
||||
arr[0] = t;
|
||||
return getAnyIdealPath(arr);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is used to pathfind to any target that statisfies conditions. The first one hit becomes the new goal.
|
||||
/// </summary>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static List<TileNode> getAnyIdealPath(object obj)
|
||||
{
|
||||
object[] objArr = (object[])obj;
|
||||
List<TileNode> vList = (List<TileNode>)objArr[0];
|
||||
|
||||
bool utility = true;
|
||||
|
||||
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
|
||||
foreach (var v in vList)
|
||||
{
|
||||
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, utility);
|
||||
// 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(v.thisLocation, (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, "Navigation"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
List<TileNode> removalList = new List<TileNode>();
|
||||
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
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());
|
||||
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(tempSource, "Navigation"));
|
||||
//StaardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(tempSource, Game1.currentLocation, Game1.player.getTileX() * Game1.tileSize, Game1.player.getTileY() * Game1.tileSize));
|
||||
|
||||
|
||||
//have this take in a list of goals and see which goal it reaches first
|
||||
List<TileNode> path = PathFindingCore.PathFindingLogic.pathFindToSingleGoalReturnPath(tempSource, miniGoals, new List<TileNode>(), placement, utility);
|
||||
|
||||
ModCore.CoreMonitor.Log("OK MY PATH IS:" + path.Count);
|
||||
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
if (path.Count == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("NOPE, no path I guess.", LogLevel.Warn);
|
||||
}
|
||||
else
|
||||
{
|
||||
ModCore.CoreMonitor.Log("There is a path", LogLevel.Alert);
|
||||
ModCore.CoreMonitor.Log("COST OF THE PATH IS: " + path.Count.ToString(), LogLevel.Alert);
|
||||
}
|
||||
if (path.Count != 0)
|
||||
{
|
||||
//ModCore.CoreMonitor.Log("PATH WAS NOT NULL", LogLevel.Warn);
|
||||
paths.Add(path);
|
||||
foreach (var someTile in path)
|
||||
{
|
||||
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(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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return correctPath;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.ShopCore
|
||||
{
|
||||
class ShopLogic
|
||||
{
|
||||
|
||||
public static void openSeedShopMenu()
|
||||
{
|
||||
Game1.activeClickableMenu = new StardewValley.Menus.ShopMenu(UtilityCore.SeedCropUtility.sortSeedListByUtility(getGeneralStoreSeedStock(true)));
|
||||
}
|
||||
|
||||
public static List<Item> getGeneralStoreSeedStock(bool removeExpensiveItems){
|
||||
List<Item> buyableSeeds = new List<Item>();
|
||||
foreach (var location in Game1.locations)
|
||||
{
|
||||
if (location.name == "SeedShop")
|
||||
{
|
||||
List<Item> stock=(location as StardewValley.Locations.SeedShop).shopStock();
|
||||
foreach(var item in stock)
|
||||
{
|
||||
if (item.getCategoryName() == "Seed")
|
||||
{
|
||||
if (removeExpensiveItems)
|
||||
{
|
||||
if (item.salePrice() > Game1.player.money) continue;
|
||||
}
|
||||
buyableSeeds.Add(item);
|
||||
}
|
||||
}
|
||||
return buyableSeeds;
|
||||
}
|
||||
}
|
||||
return buyableSeeds;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
<?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="CheatCore\DoorsToWarps.cs" />
|
||||
<Compile Include="Commands.cs" />
|
||||
<Compile Include="DialogueCore\ReponseLogic.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\ItemPrerequisite.cs" />
|
||||
<Compile Include="ExecutionCore\TaskPrerequisites\LocationPrerequisite.cs" />
|
||||
<Compile Include="ExecutionCore\TaskPrerequisites\StaminaPrerequisite.cs" />
|
||||
<Compile Include="ExecutionCore\TaskPrerequisites\ToolPrerequisite.cs" />
|
||||
<Compile Include="InterfaceCore\InterfaceLogic.cs" />
|
||||
<Compile Include="InterfaceCore\ShippingMenuCore.cs" />
|
||||
<Compile Include="MenuCore\CropUtilityMenu.cs" />
|
||||
<Compile Include="ModCore.cs" />
|
||||
<Compile Include="ShopCore\ShopLogic.cs" />
|
||||
<Compile Include="TaskCore\ChestLogic.cs" />
|
||||
<Compile Include="TaskCore\CropLogic\CropLogic.cs" />
|
||||
<Compile Include="TaskCore\CropLogic\SeedLogic.cs" />
|
||||
<Compile Include="TaskCore\CropLogic\ShippingLogic.cs" />
|
||||
<Compile Include="TaskCore\DebrisLogic\DebrisLogic.cs" />
|
||||
<Compile Include="TaskCore\MapTransitionLogic\TransitionLogic.cs" />
|
||||
<Compile Include="TaskCore\MapTransitionLogic\WarpGoal.cs" />
|
||||
<Compile Include="PathFindingCore\PathFindingLogic.cs" />
|
||||
<Compile Include="TaskCore\MapTransitionLogic\WayPoints.cs" />
|
||||
<Compile Include="PathFindingCore\TileNodes\PlacementNode.cs" />
|
||||
<Compile Include="PathFindingCore\TileNodes\TileExceptionMetaData.cs" />
|
||||
<Compile Include="PathFindingCore\TileNodes\TileExceptionNode.cs" />
|
||||
<Compile Include="PathFindingCore\TileNodes\TileNodeObject.cs" />
|
||||
<Compile Include="PathFindingCore\Utilities.cs" />
|
||||
<Compile Include="TaskCore\WaterLogic\WaterLogic.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="UtilityCore\SeedCropUtility.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>
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,207 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.PathFindingCore;
|
||||
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.TaskCore
|
||||
{
|
||||
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[2];
|
||||
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("GetSeasonalSeedsFromChest",new ExecutionCore.TaskPrerequisites.LocationPrerequisite(v.thisLocation), 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");
|
||||
if (task.taskMetaData.pathsToTake == null)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("WTF???");
|
||||
}
|
||||
ModCore.CoreMonitor.Log("COST:"+task.taskMetaData.cost);
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
task.objectParameterDataArray = objList;
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.clearExceptionListWithName("Navigation");
|
||||
|
||||
// waterSingleCrop(v);
|
||||
}
|
||||
chestsAtThisLocation.Clear();
|
||||
}
|
||||
|
||||
public static void pathToSingleChest(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[0];
|
||||
//List<TileNode> correctPath = Utilities.pathStuff(v);//(List<TileNode>)objArray[1];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,328 @@
|
|||
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;
|
||||
using StarAI.PathFindingCore;
|
||||
|
||||
namespace StarAI.TaskCore.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));
|
||||
PathFindingCore.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[2];
|
||||
obj[0] = v;
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(waterSingleCrop, obj, new ExecutionCore.TaskMetaData("Water Crop", new LocationPrerequisite(v.thisLocation),new StaminaPrerequisite(true, 3), new ToolPrerequisite(true, w.GetType(), 1)));
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithNames(true);
|
||||
continue;
|
||||
}
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
obj[1] = task.taskMetaData.pathsToTake[0];
|
||||
task.objectParameterDataArray = obj;
|
||||
// waterSingleCrop(v);
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithName("Child");
|
||||
}
|
||||
cropsToWater.Clear();
|
||||
}
|
||||
|
||||
public static void waterSingleCrop(TileNode v,List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
waterSingleCrop(obj);
|
||||
}
|
||||
|
||||
|
||||
public static void waterSingleCrop(object obj) {
|
||||
|
||||
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[0];
|
||||
//List<TileNode> correctPath = Utilities.pathStuff(v);//(List<TileNode>)objArray[1];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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 = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X+1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 1)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X-1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 0)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y+1);
|
||||
continue;
|
||||
|
||||
}
|
||||
if (Game1.player.facingDirection == 3)
|
||||
{
|
||||
center = StarAI.PathFindingCore.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);
|
||||
}
|
||||
StarAI.PathFindingCore.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));
|
||||
StarAI.PathFindingCore.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[2];
|
||||
obj[0] = v;
|
||||
//ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(harvestSingleCrop), obj));
|
||||
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(harvestSingleCrop, obj, new ExecutionCore.TaskMetaData("HarvestSingleCrop",new LocationPrerequisite(v.thisLocation) ,null, null, new ExecutionCore.TaskPrerequisites.InventoryFullPrerequisite(true)));
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithNames(true);
|
||||
continue;
|
||||
}
|
||||
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
obj[1] = task.taskMetaData.pathsToTake[0];
|
||||
task.objectParameterDataArray = obj;
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithName("Child");
|
||||
// waterSingleCrop(v);
|
||||
}
|
||||
cropsToHarvest.Clear();
|
||||
}
|
||||
|
||||
public static void harvestSingleCrop(TileNode v,List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
harvestSingleCrop(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void harvestSingleCrop(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[0];
|
||||
//List<TileNode> correctPath = Utilities.pathStuff(v);//(List<TileNode>)objArray[1];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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).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 = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 1)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 0)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
|
||||
continue;
|
||||
|
||||
}
|
||||
if (Game1.player.facingDirection == 3)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y - 1);
|
||||
continue;
|
||||
}
|
||||
Game1.player.position = center;
|
||||
}
|
||||
StarAI.PathFindingCore.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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,369 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.ExecutionCore.TaskPrerequisites;
|
||||
using StarAI.PathFindingCore;
|
||||
using StardewModdingAPI;
|
||||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using xTile.Dimensions;
|
||||
|
||||
namespace StarAI.TaskCore.CropLogic
|
||||
{
|
||||
class SeedLogic
|
||||
{
|
||||
|
||||
public static void makeAsMuchDirtAsSpecifiedAroundFarmer(GameLocation location, int amount, int radius)
|
||||
{
|
||||
List<TileNode> hoeDirtThings = new List<TileNode>();
|
||||
for(int i = -radius; i <= radius;i++)
|
||||
{
|
||||
for (int j = -radius; j <= radius;j++)
|
||||
{
|
||||
Vector2 position = new Vector2(Game1.player.getTileX() + i, Game1.player.getTileY() + j);
|
||||
//if (hoeDirtThings.Count >= amount) continue;
|
||||
if(canBeHoeDirt(location, position))
|
||||
{
|
||||
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)i* Game1.tileSize, (int)j * Game1.tileSize);
|
||||
t.fakePlacementAction(location, (int)position.X,(int)position.Y);
|
||||
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
|
||||
PathFindingCore.Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "HoeDirt"));
|
||||
hoeDirtThings.Add(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
int taskAmount = 0;
|
||||
foreach (var v in hoeDirtThings)
|
||||
{
|
||||
if (taskAmount >= amount) break;
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
StardewValley.Tools.Hoe w = new StardewValley.Tools.Hoe();
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(hoeSingleTileOfDirt, obj, new ExecutionCore.TaskMetaData("Dig Dirt", new LocationPrerequisite(v.thisLocation), new StaminaPrerequisite(true, 3), new ToolPrerequisite(true, w.GetType(), 1)));
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithNames(true);
|
||||
Utilities.tileExceptionList.Clear();
|
||||
continue;
|
||||
}
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
taskAmount++;
|
||||
obj[1] = task.taskMetaData.pathsToTake[0];
|
||||
task.objectParameterDataArray = obj;
|
||||
// waterSingleCrop(v);
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithName("Child");
|
||||
}
|
||||
hoeDirtThings.Clear();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void hoeSingleTileOfDirt(object obj)
|
||||
{
|
||||
|
||||
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[0];
|
||||
//List<TileNode> correctPath = Utilities.pathStuff(v);//(List<TileNode>)objArray[1];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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.Hoe)
|
||||
{
|
||||
Game1.player.CurrentToolIndex = Game1.player.getIndexOfInventoryItem(item);
|
||||
}
|
||||
}
|
||||
bool move = false;
|
||||
|
||||
|
||||
while (Game1.player.currentLocation.isTileHoeDirt(v.tileLocation)==false)
|
||||
{
|
||||
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 = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 1)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
|
||||
continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 0)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
|
||||
continue;
|
||||
|
||||
}
|
||||
if (Game1.player.facingDirection == 3)
|
||||
{
|
||||
center = StarAI.PathFindingCore.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 Dig dirt 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);
|
||||
}
|
||||
|
||||
StarAI.PathFindingCore.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 bool canBeHoeDirt(GameLocation location, Vector2 tileLocation)
|
||||
{
|
||||
if (location.doesTileHaveProperty((int)tileLocation.X, (int)tileLocation.Y, "Diggable", "Back") == null || location.isTileOccupied(tileLocation, "") || !location.isTilePassable(new Location((int)tileLocation.X, (int)tileLocation.Y), Game1.viewport))
|
||||
return false;
|
||||
else return true;
|
||||
//this.terrainFeatures.Add(tileLocation, (TerrainFeature)new HoeDirt(!Game1.isRaining || !this.isOutdoors ? 0 : 1));
|
||||
}
|
||||
|
||||
public static Crop parseCropFromSeedIndex(int index)
|
||||
{
|
||||
return new Crop(index, 0, 0);
|
||||
}
|
||||
|
||||
public static KeyValuePair<int, Crop> getSeedCropPair(int index) {
|
||||
|
||||
return new KeyValuePair<int, Crop>(index, parseCropFromSeedIndex(index));
|
||||
}
|
||||
|
||||
public static void buySeeds()
|
||||
{
|
||||
var retList = UtilityCore.SeedCropUtility.sortSeedListByUtility(ShopCore.ShopLogic.getGeneralStoreSeedStock(true));
|
||||
var item = retList.ElementAt(0);
|
||||
item.Stack++;
|
||||
while (Game1.player.money >= item.salePrice())
|
||||
{
|
||||
item.Stack++;
|
||||
Game1.player.money -= item.salePrice();
|
||||
}
|
||||
Game1.player.addItemToInventoryBool(item);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void plantSeeds(GameLocation location2)
|
||||
{
|
||||
List<TileNode> seedsToPlant = new List<TileNode>();
|
||||
GameLocation location = Game1.getLocationFromName("Farm");
|
||||
string name = "";
|
||||
foreach (var seed in Game1.player.items)
|
||||
{
|
||||
if (seed == null) continue;
|
||||
if (seed.getCategoryName() == "Seed")
|
||||
{
|
||||
if (parseCropFromSeedIndex(seed.parentSheetIndex).seasonsToGrowIn.Contains(Game1.currentSeason))
|
||||
{
|
||||
name = seed.Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name == "")
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Error: No valid seeds to plant found in inventory. Try to go buy some");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var terrain in location.terrainFeatures)
|
||||
{
|
||||
if (terrain.Value is StardewValley.TerrainFeatures.HoeDirt)
|
||||
{
|
||||
//Vector2 position = new Vector2(Game1.player.getTileX() + i, Game1.player.getTileY() + j);
|
||||
//if (hoeDirtThings.Count >= amount) continue;
|
||||
if ((terrain.Value as StardewValley.TerrainFeatures.HoeDirt).crop != null) continue;
|
||||
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)i* Game1.tileSize, (int)j * Game1.tileSize);
|
||||
t.fakePlacementAction(location, (int)terrain.Key.X, (int)terrain.Key.Y);
|
||||
//StardustCore.Utilities.masterAdditionList.Add(new StardustCore.DataNodes.PlacementNode(t, Game1.currentLocation, (int)v.Key.X * Game1.tileSize, (int)v.Key.Y * Game1.tileSize));
|
||||
PathFindingCore.Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "PlantSeeds"));
|
||||
seedsToPlant.Add(t);
|
||||
}
|
||||
}
|
||||
int taskAmount = 0;
|
||||
foreach (var v in seedsToPlant)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(plantSingleSeedPacket, obj, new ExecutionCore.TaskMetaData("Plant "+name, new LocationPrerequisite(v.thisLocation), null, null));
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithNames(true);
|
||||
Utilities.tileExceptionList.Clear();
|
||||
continue;
|
||||
}
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
taskAmount++;
|
||||
obj[1] = task.taskMetaData.pathsToTake[0];
|
||||
task.objectParameterDataArray = obj;
|
||||
// waterSingleCrop(v);
|
||||
StarAI.PathFindingCore.Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
}
|
||||
seedsToPlant.Clear();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void plantSingleSeedPacket(object obj)
|
||||
{
|
||||
|
||||
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[0];
|
||||
//List<TileNode> correctPath = Utilities.pathStuff(v);//(List<TileNode>)objArray[1];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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 == null) continue;
|
||||
if (item.getCategoryName()=="Seed")
|
||||
{
|
||||
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 = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X + 1, (int)v.tileLocation.Y);
|
||||
//continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 1)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X - 1, (int)v.tileLocation.Y);
|
||||
// continue;
|
||||
}
|
||||
if (Game1.player.facingDirection == 0)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y + 1);
|
||||
//continue;
|
||||
|
||||
}
|
||||
if (Game1.player.facingDirection == 3)
|
||||
{
|
||||
center = StarAI.PathFindingCore.Utilities.parseCenterFromTile((int)v.tileLocation.X, (int)v.tileLocation.Y - 1);
|
||||
// continue;
|
||||
}
|
||||
//Game1.player.position = center;
|
||||
|
||||
Crop c= parseCropFromSeedIndex(Game1.player.ActiveObject.parentSheetIndex);
|
||||
(v.thisLocation.terrainFeatures[v.tileLocation] as StardewValley.TerrainFeatures.HoeDirt).crop = c;
|
||||
|
||||
if (Game1.player.ActiveObject.stack > 1)
|
||||
{
|
||||
Game1.player.reduceActiveItemByOne();
|
||||
// Game1.player.ActiveObject.stack--;
|
||||
}
|
||||
else
|
||||
{
|
||||
Game1.player.items.Remove(Game1.player.ActiveObject);
|
||||
Game1.player.ActiveObject = null;
|
||||
}
|
||||
|
||||
//Game1.setMousePosition((int)v.tileLocation.X*Game1.tileSize/2,(int)v.tileLocation.Y*Game1.tileSize/2);
|
||||
ModCore.CoreMonitor.Log("DOESNT Plant Seeds 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);
|
||||
}
|
||||
|
||||
StarAI.PathFindingCore.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_X);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,214 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.ExecutionCore.TaskPrerequisites;
|
||||
using StarAI.PathFindingCore;
|
||||
using StardewValley;
|
||||
using StardewValley.Menus;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.TaskCore.CropLogic
|
||||
{
|
||||
class ShippingLogic
|
||||
{
|
||||
public static void goToShippingBinSetUp()
|
||||
{
|
||||
List<TileNode> shippingTiles = new List<TileNode>();
|
||||
if (Game1.player.currentLocation.name == "Farm")
|
||||
{
|
||||
//CHEATING AND STUPID WAY BUT WILL PATH TO SHIPPING BIN.
|
||||
for (int i = 0; i <= 1; i++)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, 71+i, 14);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "ShippingBin"));
|
||||
shippingTiles.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[3];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in shippingTiles)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
|
||||
//ModCore.CoreMonitor.Log("Processing water tiles:" + shippingTiles.Count.ToString() + " / " + twingCount.ToString());
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToShippingBin, objList, new ExecutionCore.TaskMetaData("GoToShippingBin", null, null,null,null,null));
|
||||
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void goToShippingBin(TileNode v, List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
goToShippingBin(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void goToShippingBin(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[2];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
PathFindingLogic.calculateMovement(correctPath);
|
||||
Vector2 tileLocation = v.tileLocation;
|
||||
//ModCore.CoreMonitor.Log(tileLocation.ToString());
|
||||
//if(v.thisLocation.isTerrainFeatureAt)
|
||||
|
||||
//DO SOME LOGIC HERE IF I WANT TO SHIP???
|
||||
|
||||
Utilities.cleanExceptionList(v);
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
foreach (var goodTile in correctPath)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
|
||||
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void goToShippingBinShipItem(Item I)
|
||||
{
|
||||
List<TileNode> shippingTiles = new List<TileNode>();
|
||||
ModCore.CoreMonitor.Log(I.Name);
|
||||
|
||||
if (I==null) ModCore.CoreMonitor.Log("DIE");
|
||||
if (Game1.player.currentLocation.name == "Farm")
|
||||
{
|
||||
//CHEATING AND STUPID WAY BUT WILL PATH TO SHIPPING BIN.
|
||||
for (int i = 0; i <= 1; i++)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, 71 + i, 14);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "ShippingBin"));
|
||||
shippingTiles.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[4];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in shippingTiles)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
objList[3] = I;
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
//ModCore.CoreMonitor.Log("Processing water tiles:" + shippingTiles.Count.ToString() + " / " + twingCount.ToString());
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToShippingBinShipItem, objList, new ExecutionCore.TaskMetaData("GoToShippingBin",new LocationPrerequisite(Game1.getLocationFromName("Farm")), null, null, null, null,new ItemPrerequisite(I,I.Stack)));
|
||||
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void goToShippingBinShipItem(TileNode v, List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
goToShippingBinShipItem(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void goToShippingBinShipItem(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
Item I= (Item)objArray[3];
|
||||
|
||||
TileNode v = (TileNode)objArray[2];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
PathFindingLogic.calculateMovement(correctPath);
|
||||
Vector2 tileLocation = v.tileLocation;
|
||||
//ModCore.CoreMonitor.Log(tileLocation.ToString());
|
||||
//if(v.thisLocation.isTerrainFeatureAt)
|
||||
|
||||
//DO SOME LOGIC HERE IF I WANT TO SHIP???
|
||||
int amount = I.Stack;
|
||||
|
||||
Item ok= StardustCore.Utilities.getItemFromInventory(I.Name);
|
||||
Item cool = new StardewValley.Object(I.parentSheetIndex, amount);
|
||||
//Game1.player.removeItemsFromInventory(StardewValley.Game1.player.getIndexOfInventoryItem(ok), 1);
|
||||
Game1.shippingBin.Add((StardewValley.Object)cool);
|
||||
|
||||
int value= ok.Stack - amount;
|
||||
ModCore.CoreMonitor.Log("AMOUNT:" + amount);
|
||||
if (value <= 0) {
|
||||
Game1.player.items.Remove(ok);
|
||||
ok = null;
|
||||
}
|
||||
else ok.Stack = value;
|
||||
//Game1.shipObject((StardewValley.Object)I);
|
||||
|
||||
ModCore.throwUpShippingMenu = true;
|
||||
|
||||
|
||||
Utilities.cleanExceptionList(v);
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
foreach (var goodTile in correctPath)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
|
||||
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,398 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using WindowsInput;
|
||||
using StarAI.PathFindingCore;
|
||||
using StarAI.ExecutionCore;
|
||||
|
||||
namespace StarAI.TaskCore.MapTransitionLogic
|
||||
{
|
||||
class TransitionLogic
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Will transition to the next map by using warp goals if the map is adjacent to the one I am at and I can path to it.
|
||||
/// </summary>
|
||||
/// <param name="location"></param>
|
||||
/// <param name="targetName"></param>
|
||||
public static void transitionToAdjacentMap(GameLocation location,string targetName)
|
||||
{
|
||||
List<TileNode> warpGoals = new List<TileNode>();
|
||||
foreach(var v in location.warps)
|
||||
{
|
||||
if (v.TargetName == targetName)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, v.X, v.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
warpGoals.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[4];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in warpGoals)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToAdjacentWarpGoal, objList, new ExecutionCore.TaskMetaData("GoTo adj map", null, null, null, null, null));
|
||||
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
objList[3] = targetName;
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
warpGoals.Clear();
|
||||
}
|
||||
|
||||
public static CustomTask transitionToAdjacentMapReturnTask(GameLocation location, string targetName)
|
||||
{
|
||||
List<TileNode> warpGoals = new List<TileNode>();
|
||||
foreach (var v in location.warps)
|
||||
{
|
||||
if (v.TargetName == targetName)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, v.X, v.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
warpGoals.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[4];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in warpGoals)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToAdjacentWarpGoal, objList, new ExecutionCore.TaskMetaData("GoTo adj map", null, null, null, null, null));
|
||||
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return null;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
objList[3] = targetName;
|
||||
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
warpGoals.Clear();
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
public static List<TileNode> transitionToAdjacentMapReturn(GameLocation location, string targetName)
|
||||
{
|
||||
List<TileNode> warpGoals = new List<TileNode>();
|
||||
foreach (var v in location.warps)
|
||||
{
|
||||
if (v.TargetName == targetName)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, v.X, v.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
warpGoals.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[4];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in warpGoals)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
return tempList;
|
||||
objList[0] = tempList;
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToAdjacentWarpGoal, objList, new ExecutionCore.TaskMetaData("Path to adj map", null, null, null, null, null));
|
||||
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return null;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
objList[3] = targetName;
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
warpGoals.Clear();
|
||||
}
|
||||
|
||||
|
||||
public static void goToAdjacentWarpGoal(TileNode v, List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
goToAdjacentWarpGoal(obj);
|
||||
}
|
||||
|
||||
public static void goToAdjacentWarpGoal(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[2];
|
||||
string locationName = (string)objArray[3];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
PathFindingLogic.calculateMovement(correctPath);
|
||||
Vector2 tileLocation = v.tileLocation;
|
||||
|
||||
for(int i = -1; i <= 1; i++)
|
||||
{
|
||||
|
||||
for (int j = -1; j <= 1; j++)
|
||||
{
|
||||
foreach (var warp in v.thisLocation.warps)
|
||||
{
|
||||
if (warp.X == Game1.player.getTileX()+i && warp.Y == Game1.player.getTileY()+j)
|
||||
{
|
||||
Game1.warpFarmer(warp.TargetName, warp.TargetX, warp.TargetY, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if (Game1.player.facingDirection == 2)
|
||||
{
|
||||
if (InputSimulator.IsKeyDown(VirtualKeyCode.VK_S) == false) InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_S);
|
||||
}
|
||||
if (Game1.player.facingDirection == 1)
|
||||
{
|
||||
if (InputSimulator.IsKeyDown(VirtualKeyCode.VK_D) == false) InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_D);
|
||||
}
|
||||
if (Game1.player.facingDirection == 0)
|
||||
{
|
||||
if (InputSimulator.IsKeyDown(VirtualKeyCode.VK_W) == false) InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_W);
|
||||
|
||||
}
|
||||
if (Game1.player.facingDirection == 3)
|
||||
{
|
||||
if (InputSimulator.IsKeyDown(VirtualKeyCode.VK_A) == false) InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_A);
|
||||
}
|
||||
|
||||
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_W);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_A);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_S);
|
||||
InputSimulator.SimulateKeyUp(VirtualKeyCode.VK_D);
|
||||
*/
|
||||
//ModCore.CoreMonitor.Log(tileLocation.ToString());
|
||||
//if(v.thisLocation.isTerrainFeatureAt)
|
||||
|
||||
Utilities.cleanExceptionList(v);
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
foreach (var goodTile in correctPath)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
|
||||
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void transitionToAdjacentMap(GameLocation location, string targetName,int tileX, int tileY)
|
||||
{
|
||||
List<TileNode> warpGoals = new List<TileNode>();
|
||||
foreach (var v in location.warps)
|
||||
{
|
||||
if (v.TargetName == targetName)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, v.X, v.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
warpGoals.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[10];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in warpGoals)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToAdjacentWarpGoalTile, objList, new ExecutionCore.TaskMetaData("GoTo adj map tile", null, null, null, null, null));
|
||||
|
||||
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
objList[3] = targetName;
|
||||
objList[4] = new Vector2(tileX, tileY);
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
warpGoals.Clear();
|
||||
}
|
||||
|
||||
public static CustomTask transitionToAdjacentMapReturnTask(GameLocation location, string targetName, int tileX, int tileY)
|
||||
{
|
||||
List<TileNode> warpGoals = new List<TileNode>();
|
||||
foreach (var v in location.warps)
|
||||
{
|
||||
if (v.TargetName == targetName)
|
||||
{
|
||||
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.fakePlacementAction(Game1.currentLocation, v.X, v.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
warpGoals.Add(t);
|
||||
}
|
||||
}
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[10];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in warpGoals)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToAdjacentWarpGoalTile, objList, new ExecutionCore.TaskMetaData("GoTo adj map tile", null, null, null, null, null));
|
||||
|
||||
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return null;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
objList[3] = targetName;
|
||||
objList[4] = new Vector2(tileX, tileY);
|
||||
task.objectParameterDataArray = objList;
|
||||
|
||||
//ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
Utilities.tileExceptionList.Clear();
|
||||
|
||||
warpGoals.Clear();
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void goToAdjacentWarpGoalTile(TileNode v, List<TileNode> path,string mapName ,Vector2 position)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
obj[3] = mapName;
|
||||
obj[4] = position;
|
||||
goToAdjacentWarpGoalTile(obj);
|
||||
}
|
||||
|
||||
public static void goToAdjacentWarpGoalTile(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
List<TileNode> tileList = (List<TileNode>)objArray[0];
|
||||
string locationName = (string)objArray[3];
|
||||
Vector2 position = (Vector2)objArray[4];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
PathFindingLogic.calculateMovement(correctPath);
|
||||
Warp lastWarp = new Warp(-1, -1, "Claire", -1, -1, false);
|
||||
foreach (var v in tileList)
|
||||
{
|
||||
Vector2 tileLocation = v.tileLocation;
|
||||
|
||||
for (int i = -1; i <= 1; i++)
|
||||
{
|
||||
|
||||
for (int j = -1; j <= 1; j++)
|
||||
{
|
||||
foreach (var warp in v.thisLocation.warps)
|
||||
{
|
||||
if (warp.X == Game1.player.getTileX() + i && warp.Y == Game1.player.getTileY() + j)
|
||||
{
|
||||
Game1.warpFarmer(warp.TargetName, warp.TargetX, warp.TargetY, false);
|
||||
lastWarp = warp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Utilities.cleanExceptionList(v);
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(v);
|
||||
foreach (var goodTile in correctPath)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
|
||||
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
|
||||
}
|
||||
}
|
||||
|
||||
ModCore.CoreMonitor.Log("Going here I guess???" + locationName + " : " + position);
|
||||
ModCore.CoreMonitor.Log("From Here???" + Game1.getLocationFromName(lastWarp.TargetName) + " " + lastWarp.TargetX + " " + lastWarp.TargetY);
|
||||
TileNode s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
|
||||
s.fakePlacementAction(Game1.getLocationFromName(lastWarp.TargetName), lastWarp.TargetX, lastWarp.TargetY);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(s, "WarpGoal"));
|
||||
|
||||
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.fakePlacementAction(Game1.getLocationFromName(locationName), (int)position.X, (int)position.Y);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WarpGoal"));
|
||||
|
||||
PathFindingLogic.calculateMovement(Utilities.getIdealPath(t, s));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,128 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.ExecutionCore;
|
||||
using StarAI.PathFindingCore;
|
||||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.TaskCore.MapTransitionLogic
|
||||
{
|
||||
public class WayPoints
|
||||
{
|
||||
public static Dictionary<string, KeyValuePair<string, Vector2>> wayPoints = new Dictionary<string, KeyValuePair<string, Vector2>>();
|
||||
|
||||
//Positions listed here will always put the player exactly 1 tile away from what is listed here.
|
||||
public static void initializeWaypoints()
|
||||
{
|
||||
wayPoints.Add("seeds", new KeyValuePair<string, Vector2>("SeedShop", new Vector2(5, 18))); //This waypoint will position the player at the General store 1 tile below the counter.
|
||||
wayPoints.Add("bed", new KeyValuePair<string, Vector2>("FarmHouse", new Vector2(-1, -1))); //to be initialized after load.
|
||||
wayPoints.Add("porch", new KeyValuePair<string, Vector2>("Farm", new Vector2(64, 15))); //to be initialized after load.
|
||||
|
||||
ModCore.CoreMonitor.Log("Star AI WayPoints: Done initializing: " + wayPoints.Count + " waypoints.");
|
||||
}
|
||||
|
||||
|
||||
public static void pathToWayPoint(string wayPointName)
|
||||
{
|
||||
KeyValuePair<string, Vector2> outValue;
|
||||
bool isAvailable = wayPoints.TryGetValue(wayPointName, out outValue);
|
||||
if (isAvailable == true)
|
||||
{
|
||||
MapTransitionLogic.WarpGoal.pathToWorldTile(Game1.player.currentLocation, outValue.Key, (int)outValue.Value.X, (int)outValue.Value.Y);
|
||||
}
|
||||
}
|
||||
|
||||
public static CustomTask pathToWayPointReturnTask(string wayPointName)
|
||||
{
|
||||
KeyValuePair<string, Vector2> outValue;
|
||||
bool isAvailable = wayPoints.TryGetValue(wayPointName, out outValue);
|
||||
if (isAvailable == true)
|
||||
{
|
||||
return MapTransitionLogic.WarpGoal.pathToWorldTileReturnTask(Game1.player.currentLocation, outValue.Key, (int)outValue.Value.X, (int)outValue.Value.Y);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static void printWayPoints()
|
||||
{
|
||||
foreach(var v in wayPoints)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Waypoint Name:" + v.Key);
|
||||
ModCore.CoreMonitor.Log("Waypoint Position:" + v.Value.Key+" "+v.Value.Value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// To be called after load and after save.
|
||||
/// </summary>
|
||||
public static void setUpBedWaypoint()
|
||||
{
|
||||
Vector2 vec = Game1.player.mostRecentBed / Game1.tileSize;
|
||||
int x = (int)Math.Floor(vec.X);
|
||||
x += 2;
|
||||
int y = (int)Math.Floor(vec.Y);
|
||||
vec = new Vector2(x, y);
|
||||
wayPoints["bed"] = new KeyValuePair<string, Vector2>("FarmHouse",vec);
|
||||
}
|
||||
|
||||
public static void verifyWayPoints()
|
||||
{
|
||||
List<string> removalList = new List<string>();
|
||||
int i = 0;
|
||||
foreach(var waypoint in wayPoints)
|
||||
{
|
||||
i++;
|
||||
ModCore.CoreMonitor.Log("Validating waypoints " + i + " / " + wayPoints.Count);
|
||||
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.fakePlacementAction(Game1.getLocationFromName(waypoint.Value.Key),(int)waypoint.Value.Value.X,(int)waypoint.Value.Value.Y);
|
||||
|
||||
// bool canWaypointBeHere=TileNode.checkIfICanPlaceHere(t, waypoint.Value.Value * Game1.tileSize, Game1.getLocationFromName(waypoint.Value.Key), true, false);
|
||||
bool canPathHere = false;
|
||||
foreach(Warp w in Game1.getLocationFromName(waypoint.Value.Key).warps)
|
||||
{
|
||||
TileNode s = new TileNode(1, Vector2.Zero, Path.Combine("Tiles", "GenericUncoloredTile.xnb"), Path.Combine("Tiles", "TileData.xnb"), StardustCore.IlluminateFramework.Colors.invertColor(StardustCore.IlluminateFramework.ColorsList.Brown));
|
||||
s.fakePlacementAction(Game1.getLocationFromName(waypoint.Value.Key), w.X, w.Y);
|
||||
|
||||
var path=Utilities.getIdealPath(t, s);
|
||||
//If I can't find the goal at first keep trying.
|
||||
if (path.Count == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{ //I found the goal so this is a valid waypoint.
|
||||
canPathHere = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//Valid waypoint don't remove.
|
||||
if (canPathHere == true)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("Waypoint: " + waypoint.Key + " has been validated as a valid waypoint position at:" + waypoint.Value.Key + " " + waypoint.Value.Value,StardewModdingAPI.LogLevel.Alert);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Couldn't path to this location. Guess I'll remove it.
|
||||
ModCore.CoreMonitor.Log("Removing waypoint: " + waypoint.Key, StardewModdingAPI.LogLevel.Alert);
|
||||
ModCore.CoreMonitor.Log("Can't find path at the location to: " + waypoint.Value.Key + " " + waypoint.Value.Value, StardewModdingAPI.LogLevel.Alert);
|
||||
removalList.Add(waypoint.Key);
|
||||
}
|
||||
}
|
||||
|
||||
foreach(var wayPointName in removalList)
|
||||
{
|
||||
wayPoints.Remove(wayPointName);
|
||||
}
|
||||
|
||||
Utilities.tileExceptionList.Clear();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,263 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using StarAI.ExecutionCore;
|
||||
using StarAI.ExecutionCore.TaskPrerequisites;
|
||||
using StardewModdingAPI;
|
||||
using StardewValley;
|
||||
using StardewValley.Tools;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using xTile.Layers;
|
||||
|
||||
namespace StarAI.PathFindingCore.WaterLogic
|
||||
{
|
||||
public class WaterLogic
|
||||
{
|
||||
|
||||
public static List<TileNode> waterTilesAvailable = new List<TileNode>();
|
||||
|
||||
public static void getAllWaterTiles(GameLocation location)
|
||||
{
|
||||
object[] arr = new object[1];
|
||||
arr[0] = location;
|
||||
getAllWaterTiles(arr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void getAllWaterTiles(object obj)
|
||||
{
|
||||
int twingCount = 0;
|
||||
object[] objArr = (object[])obj;
|
||||
GameLocation location = (GameLocation)objArr[0];
|
||||
// string targetName = "Weeds";
|
||||
|
||||
Layer layer = location.map.GetLayer("Back");
|
||||
for(int i=0; i <= layer.LayerSize.Width; i++)
|
||||
{
|
||||
for (int j = 0; j <= layer.LayerSize.Height; j++)
|
||||
{
|
||||
if (location.isOpenWater(i, j))
|
||||
{
|
||||
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.fakePlacementAction(location, i,j);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "ChopTree"));
|
||||
waterTilesAvailable.Add(t);
|
||||
twingCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[3];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in waterTilesAvailable)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
|
||||
ModCore.CoreMonitor.Log("Processing water tiles:" + waterTilesAvailable.Count.ToString() + " / " + twingCount.ToString());
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToSingleWaterTile, objList, new ExecutionCore.TaskMetaData("GoToWaterTile", new LocationPrerequisite(location), new StaminaPrerequisite(true, 2 * numberOfUses), new ToolPrerequisite(true, w.GetType(), numberOfUses)));
|
||||
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
task.objectParameterDataArray = objList;
|
||||
ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
|
||||
waterTilesAvailable.Clear();
|
||||
Utilities.tileExceptionList.Clear();
|
||||
}
|
||||
|
||||
|
||||
public static CustomTask getAllWaterTilesTask(GameLocation location)
|
||||
{
|
||||
object[] arr = new object[1];
|
||||
arr[0] = location;
|
||||
return getAllWaterTilesTask(arr);
|
||||
}
|
||||
|
||||
public static CustomTask getAllWaterTilesTask(object obj)
|
||||
{
|
||||
int twingCount = 0;
|
||||
object[] objArr = (object[])obj;
|
||||
GameLocation location = (GameLocation)objArr[0];
|
||||
// string targetName = "Weeds";
|
||||
|
||||
Layer layer = location.map.GetLayer("Back");
|
||||
for (int i = 0; i <= layer.LayerSize.Width; i++)
|
||||
{
|
||||
for (int j = 0; j <= layer.LayerSize.Height; j++)
|
||||
{
|
||||
if (location.isOpenWater(i, j))
|
||||
{
|
||||
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.fakePlacementAction(location, i, j);
|
||||
Utilities.tileExceptionList.Add(new TileExceptionMetaData(t, "WaterTile"));
|
||||
waterTilesAvailable.Add(t);
|
||||
twingCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ok = 0;
|
||||
|
||||
object[] objList = new object[3];
|
||||
List<TileNode> tempList = new List<TileNode>();
|
||||
foreach (var v in waterTilesAvailable)
|
||||
{
|
||||
tempList.Add(v);
|
||||
}
|
||||
objList[0] = tempList;
|
||||
|
||||
// ExecutionCore.TaskList.taskList.Add(new Task(new Action<object>(waterSingleCrop), obj));
|
||||
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
|
||||
ModCore.CoreMonitor.Log("Processing water tiles:" + waterTilesAvailable.Count.ToString() + " / " + twingCount.ToString());
|
||||
ok++;
|
||||
int numberOfUses = 1;
|
||||
ExecutionCore.CustomTask task = new ExecutionCore.CustomTask(goToSingleWaterTile, objList, new ExecutionCore.TaskMetaData("GoToWaterTile", new LocationPrerequisite(location), new StaminaPrerequisite(true, 2 * numberOfUses), new ToolPrerequisite(true, w.GetType(), numberOfUses)));
|
||||
|
||||
|
||||
if (task.taskMetaData.cost == Int32.MaxValue)
|
||||
{
|
||||
Utilities.clearExceptionListWithNames(true);
|
||||
return null;
|
||||
}
|
||||
objList[1] = task.taskMetaData.pathsToTake[0];
|
||||
objList[2] = task.taskMetaData.pathsToTake[0].ElementAt(0);
|
||||
task.objectParameterDataArray = objList;
|
||||
// ExecutionCore.TaskList.taskList.Add(task);
|
||||
Utilities.clearExceptionListWithName("Child");
|
||||
|
||||
waterTilesAvailable.Clear();
|
||||
Utilities.tileExceptionList.Clear();
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
public static void goToSingleWaterTile(TileNode v, List<TileNode> path)
|
||||
{
|
||||
object[] obj = new object[2];
|
||||
obj[0] = v;
|
||||
obj[1] = path;
|
||||
goToSingleWaterTile(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void goToSingleWaterTile(object obj)
|
||||
{
|
||||
object[] objArray = (object[])obj;
|
||||
|
||||
TileNode v = (TileNode)objArray[2];
|
||||
List<TileNode> correctPath = (List<TileNode>)objArray[1];
|
||||
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);
|
||||
}
|
||||
PathFindingLogic.calculateMovement(correctPath);
|
||||
Vector2 tileLocation = v.tileLocation;
|
||||
ModCore.CoreMonitor.Log(tileLocation.ToString());
|
||||
//if(v.thisLocation.isTerrainFeatureAt)
|
||||
|
||||
if (v.thisLocation.isOpenWater((int)v.tileLocation.X-1,(int)v.tileLocation.Y)) //v.thisLocation.terrainFeatures[new Vector2(tileLocation.X - 1, tileLocation.Y)] is StardewValley.TerrainFeatures.Tree)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("1Good");
|
||||
Game1.player.faceDirection(3);
|
||||
}
|
||||
if (v.thisLocation.isOpenWater((int)v.tileLocation.X + 1, (int)v.tileLocation.Y)) //v.thisLocation.terrainFeatures[new Vector2(tileLocation.X - 1, tileLocation.Y)] is StardewValley.TerrainFeatures.Tree)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("2Good");
|
||||
Game1.player.faceDirection(1);
|
||||
}
|
||||
if (v.thisLocation.isOpenWater((int)v.tileLocation.X, (int)v.tileLocation.Y-1)) //v.thisLocation.terrainFeatures[new Vector2(tileLocation.X - 1, tileLocation.Y)] is StardewValley.TerrainFeatures.Tree)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("3Good");
|
||||
Game1.player.faceDirection(0);
|
||||
}
|
||||
if (v.thisLocation.isOpenWater((int)v.tileLocation.X, (int)v.tileLocation.Y+1)) //v.thisLocation.terrainFeatures[new Vector2(tileLocation.X - 1, tileLocation.Y)] is StardewValley.TerrainFeatures.Tree)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("4Good");
|
||||
Game1.player.faceDirection(2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
StardewValley.Tools.WateringCan w = new StardewValley.Tools.WateringCan();
|
||||
foreach (var item in Game1.player.items)
|
||||
{
|
||||
if (item is StardewValley.Tools.WateringCan)
|
||||
{
|
||||
Game1.player.CurrentToolIndex = Game1.player.getIndexOfInventoryItem(item);
|
||||
w = (WateringCan)item;
|
||||
}
|
||||
}
|
||||
|
||||
while (w.WaterLeft!=w.waterCanMax)
|
||||
{
|
||||
// if (!v.thisLocation.isTerrainFeatureAt((int)v.tileLocation.X, (int)v.tileLocation.Y)) 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);
|
||||
foreach (var goodTile in correctPath)
|
||||
{
|
||||
StardustCore.ModCore.SerializationManager.trackedObjectList.Remove(goodTile);
|
||||
goodTile.performRemoveAction(goodTile.tileLocation, goodTile.thisLocation);
|
||||
}
|
||||
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.VK_C);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,243 @@
|
|||
using StardewValley;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StarAI.UtilityCore
|
||||
{
|
||||
class SeedCropUtility
|
||||
{
|
||||
public static Dictionary<int, float> CropSeedUtilityDictionary = new Dictionary<int, float>();
|
||||
public static Dictionary<int, float> UserCropSeedUtilityDictionary = new Dictionary<int, float>();
|
||||
public static Dictionary<int, float> ScaleUtilityDictionary = new Dictionary<int, float>();
|
||||
|
||||
public static void setUpUserCropUtilityDictionary()
|
||||
{
|
||||
UserCropSeedUtilityDictionary.Clear();
|
||||
Dictionary<KeyValuePair<int, Crop>, float> tempDictionary = new Dictionary<KeyValuePair<int, Crop>, float>();
|
||||
foreach (var item in Game1.objectInformation)
|
||||
{
|
||||
StardewValley.Object test = new StardewValley.Object(item.Key, 1);
|
||||
if (test.getCategoryName() == "Seed")
|
||||
{
|
||||
KeyValuePair<int, Crop> pair = StarAI.TaskCore.CropLogic.SeedLogic.getSeedCropPair(test.parentSheetIndex);
|
||||
|
||||
|
||||
if (pair.Value == null) continue;
|
||||
//if (utilityValue <= 0) continue;
|
||||
UserCropSeedUtilityDictionary.Add(test.parentSheetIndex, 0); //CHANGE THIS TO BE BASED ON THE MENU UTILITY
|
||||
//numberOfInitializedUtilitySeedValues++;
|
||||
ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for user utility picking with a value of: 0");
|
||||
}
|
||||
}
|
||||
ModCore.CoreMonitor.Log("UTIL COUNT:" + UserCropSeedUtilityDictionary.Count);
|
||||
}
|
||||
|
||||
public static void setUpCropUtilityDictionaryDaily()
|
||||
{
|
||||
CropSeedUtilityDictionary.Clear();
|
||||
Dictionary<int, float> tempDictionary = new Dictionary<int, float>();
|
||||
int numberOfInitializedUtilitySeedValues = 0;
|
||||
float totalValue = 0;
|
||||
foreach (var item in Game1.objectInformation)
|
||||
{
|
||||
StardewValley.Object test = new StardewValley.Object(item.Key, 1);
|
||||
if (test.getCategoryName() == "Seed")
|
||||
{
|
||||
KeyValuePair<int, Crop> pair = StarAI.TaskCore.CropLogic.SeedLogic.getSeedCropPair(test.parentSheetIndex);
|
||||
if (pair.Value == null) continue;
|
||||
|
||||
float utilityValue = averageGoldPerDay(pair.Value, test);
|
||||
if (!pair.Value.seasonsToGrowIn.Contains(Game1.currentSeason)) utilityValue = 0;
|
||||
totalValue += utilityValue;
|
||||
utilityValue =(float) Math.Round(utilityValue, 2);
|
||||
//if (utilityValue <= 0) continue;
|
||||
tempDictionary.Add(test.parentSheetIndex, utilityValue); //CHANGE THIS TO BE BASED ON THE MENU UTILITY
|
||||
numberOfInitializedUtilitySeedValues++;
|
||||
//ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for utility picking with a value of: "+utilityValue.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var c in tempDictionary)
|
||||
{
|
||||
KeyValuePair<int, float> hello = c;
|
||||
float afterValue = hello.Value / totalValue;
|
||||
CropSeedUtilityDictionary.Add(hello.Key, afterValue);
|
||||
StardewValley.Object test = new StardewValley.Object(c.Key, 1);
|
||||
ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + test.name + " for utility picking value of (" + hello.Value + " : " + (afterValue * 100).ToString() + "%)");
|
||||
}
|
||||
ModCore.CoreMonitor.Log("Star AI: Utility Core: Calculating " + numberOfInitializedUtilitySeedValues + " seeds for utility picking.");
|
||||
if (numberOfInitializedUtilitySeedValues == 0)
|
||||
{
|
||||
ModCore.CoreMonitor.Log("No seed values initialized. There must be no possible seeds I can grow for the rest of this season.", StardewModdingAPI.LogLevel.Alert);
|
||||
}
|
||||
recalculateAllUtilityValues();
|
||||
}
|
||||
|
||||
|
||||
public static void recalculateAllUtilityValues()
|
||||
{
|
||||
ScaleUtilityDictionary.Clear();
|
||||
float totalValue = 0;
|
||||
foreach(var v in CropSeedUtilityDictionary)
|
||||
{
|
||||
totalValue +=Math.Abs(v.Value);
|
||||
}
|
||||
foreach (var v in UserCropSeedUtilityDictionary)
|
||||
{
|
||||
totalValue +=Math.Abs(v.Value);
|
||||
}
|
||||
Dictionary<int, float> ok = new Dictionary<int, float>();
|
||||
foreach(var v in CropSeedUtilityDictionary)
|
||||
{
|
||||
ok.Add(v.Key, v.Value);
|
||||
}
|
||||
|
||||
Dictionary<int, float> ok2 = new Dictionary<int, float>();
|
||||
foreach (var v in UserCropSeedUtilityDictionary)
|
||||
{
|
||||
ok2.Add(v.Key, v.Value);
|
||||
}
|
||||
|
||||
foreach (var v in ok)
|
||||
{
|
||||
CropSeedUtilityDictionary[v.Key] = CropSeedUtilityDictionary[v.Key] / totalValue;
|
||||
}
|
||||
foreach (var v in ok2)
|
||||
{
|
||||
UserCropSeedUtilityDictionary[v.Key] = UserCropSeedUtilityDictionary[v.Key] / totalValue;
|
||||
}
|
||||
ModCore.CoreMonitor.Log("TOTAL VALUE:"+totalValue.ToString());
|
||||
|
||||
foreach (var v in CropSeedUtilityDictionary)
|
||||
{
|
||||
if (StardustCore.StaticExtentions.HasValue(CropSeedUtilityDictionary[v.Key]) == false)
|
||||
{
|
||||
CropSeedUtilityDictionary[v.Key] = 0;
|
||||
}
|
||||
if (StardustCore.StaticExtentions.HasValue(UserCropSeedUtilityDictionary[v.Key]) == false)
|
||||
{
|
||||
UserCropSeedUtilityDictionary[v.Key] = 0;
|
||||
}
|
||||
float scale = CropSeedUtilityDictionary[v.Key] + UserCropSeedUtilityDictionary[v.Key];
|
||||
if (scale <= 0)
|
||||
{
|
||||
scale = 0;
|
||||
}
|
||||
ScaleUtilityDictionary.Add(v.Key,scale);
|
||||
StardewValley.Object obj = new StardewValley.Object(v.Key, 1);
|
||||
ModCore.CoreMonitor.Log("Updated: " + obj.name + " to now have a percent utility contribution of: "+ (CropSeedUtilityDictionary[v.Key] + UserCropSeedUtilityDictionary[v.Key]).ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static float getUtilityScaleValue(int seedIndex)
|
||||
{
|
||||
return ScaleUtilityDictionary[seedIndex];
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static int numberOfDaysToGrow(Crop c)
|
||||
{
|
||||
int total = 0;
|
||||
foreach(var v in c.phaseDays)
|
||||
{
|
||||
if (v != -1) total += v;
|
||||
}
|
||||
return (total-100000+1);
|
||||
}
|
||||
|
||||
public static void updateUserUtilities(int seedIndex,float amount)
|
||||
{
|
||||
|
||||
ModCore.CoreMonitor.Log("This is the seed index:" + seedIndex);
|
||||
UserCropSeedUtilityDictionary[seedIndex] += amount;
|
||||
//if (UserCropSeedUtilityDictionary[seedIndex] <= 0) UserCropSeedUtilityDictionary[seedIndex] = 0;
|
||||
UserCropSeedUtilityDictionary[seedIndex] = (float) Math.Round(UserCropSeedUtilityDictionary[seedIndex], 2);
|
||||
StardewValley.Object obj = new StardewValley.Object(seedIndex, 1);
|
||||
ModCore.CoreMonitor.Log("Updated: " + obj.name + " to now have a user utility value of " + UserCropSeedUtilityDictionary[seedIndex] + " and a total utlity value of: " +(UserCropSeedUtilityDictionary[seedIndex] + CropSeedUtilityDictionary[seedIndex]));
|
||||
recalculateAllUtilityValues();
|
||||
}
|
||||
|
||||
//AI cares about money, user might care about other things.
|
||||
//Doesn't recalculate crops that regrow. Favors crops with mutiple yields. Quantity over quality I suppose.
|
||||
public static float averageGoldPerDay(Crop c,Item seeds)
|
||||
{
|
||||
|
||||
StardewValley.Object crop = new StardewValley.Object(c.indexOfHarvest, 1);
|
||||
|
||||
|
||||
int days = numberOfDaysToGrow(c);
|
||||
//ModCore.CoreMonitor.Log("DAYS: " + days);
|
||||
if (days <= 0) return 0;
|
||||
int maxHarvest = maxHarvestsRemaining(c);
|
||||
if (maxHarvest == 0) return 0;
|
||||
if (c.maxHarvest <= 0)
|
||||
{
|
||||
return ((Game1.player.farmingLevel * .02f + 1.01f) * (maxHarvest) * crop.price) - seeds.salePrice() / days;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ((Game1.player.farmingLevel * .02f + 1.01f) * (maxHarvest *c.maxHarvest) * crop.price) - seeds.salePrice() / days;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static int maxHarvestsRemaining(Crop c)
|
||||
{
|
||||
return (28-Game1.dayOfMonth)/numberOfDaysToGrow(c);
|
||||
}
|
||||
|
||||
|
||||
public static List<Item> sortSeedListByUtility(List<Item> seedList)
|
||||
{
|
||||
List<KeyValuePair<int, float>> sortList = new List<KeyValuePair<int ,float>>();
|
||||
foreach(var seeds in seedList)
|
||||
{
|
||||
var ret = getKeyBySeedIndex(seeds.parentSheetIndex,ScaleUtilityDictionary);
|
||||
if (ret.Key == -999) continue;
|
||||
sortList.Add(ret);
|
||||
}
|
||||
|
||||
//Sort the list by utility of the seeds.
|
||||
sortList.Sort(delegate (KeyValuePair < int,float> t1, KeyValuePair<int, float> t2)
|
||||
{
|
||||
return t1.Value.CompareTo(t2.Value);
|
||||
});
|
||||
|
||||
sortList.Reverse(); //I want max to be first instead of min.
|
||||
|
||||
float maxUtility = sortList.ElementAt(0).Value;
|
||||
List<int> finalList = new List<int>();
|
||||
foreach(var utilitySeed in sortList)
|
||||
{
|
||||
if (utilitySeed.Value >= maxUtility) finalList.Add(utilitySeed.Key);
|
||||
}
|
||||
List<Item> finalShopStock = new List<Item>();
|
||||
foreach(var seedIndex in finalList)
|
||||
{
|
||||
foreach(var seeds in seedList)
|
||||
{
|
||||
if (seedIndex == seeds.parentSheetIndex) finalShopStock.Add(seeds);
|
||||
}
|
||||
}
|
||||
|
||||
return finalShopStock;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static KeyValuePair<int, float> getKeyBySeedIndex(int seedIndex,Dictionary<int,float> dic)
|
||||
{
|
||||
foreach (var key in dic)
|
||||
{
|
||||
if (key.Key == seedIndex) return key;
|
||||
}
|
||||
return new KeyValuePair<int, float>(-999, -999);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue