using System; using StardewValley; using StardewModdingAPI; using System.IO; using StardewValley.Menus; using System.Collections.Generic; using System.Linq; using StardewValley.Objects; using Microsoft.Xna.Framework; using StardewValley.Tools; /* TO DO: Items furniture swords - hats - boots - wallpapers - carpets - ring - lamp- craftables- */ namespace Custom_Shop_Mod_Redux { public class Class1 : Mod { public static IClickableMenu mymenu; static int j = 0; static Dictionary list_price = new Dictionary(); static string master_path; List myoptions = new List(); string key_binding = "U"; bool game_loaded = false; public override void Entry(params object[] objects) { //set up all of my events here StardewModdingAPI.Events.PlayerEvents.LoadedGame += PlayerEvents_LoadedGame; StardewModdingAPI.Events.ControlEvents.KeyPressed += ControlEvents_KeyPressed; } public void ControlEvents_KeyPressed(object sender, StardewModdingAPI.Events.EventArgsKeyPressed e) { if (game_loaded == false) return; if (e.KeyPressed.ToString() == key_binding) //if the key is pressed, load my cusom save function { my_key_call(); } //DataLoader_Settings(); //update the key if players changed it while playing. } public void PlayerEvents_LoadedGame(object sender, StardewModdingAPI.Events.EventArgsLoadedGameChanged e) { game_loaded = true; DataLoader_Settings(); MyWritter_Settings(); } void DataLoader_Settings() { //loads the data to the variables upon loading the game. string myname = StardewValley.Game1.player.name; string mylocation = Path.Combine(PathOnDisk, "Custom_Shop_Redux_Config"); string mylocation2 = mylocation; string mylocation3 = mylocation2 + ".txt"; master_path = PathOnDisk; Directory.CreateDirectory(Path.Combine(master_path, "Custom_Shops")); master_path = Path.Combine(master_path, "Custom_Shops"); if (!File.Exists(mylocation3)) //if not data.json exists, initialize the data variables to the ModConfig data. I.E. starting out. { // Console.WriteLine("Can't load custom save info since the file doesn't exist."); key_binding = "U"; // Log.Info("KEY TIME"); } else { // Console.WriteLine("HEY THERE IM LOADING DATA"); string[] readtext = File.ReadAllLines(mylocation3); key_binding = Convert.ToString(readtext[3]); // Log.Info(key_binding); // Log.Info(Convert.ToString(readtext[3])); } } void MyWritter_Settings() { //write all of my info to a text file. string myname = StardewValley.Game1.player.name; string mylocation = Path.Combine(PathOnDisk, "Custom_Shop_Redux_Config"); string mylocation2 = mylocation; string mylocation3 = mylocation2 + ".txt"; string[] mystring3 = new string[20]; if (!File.Exists(mylocation3)) { Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now."); mystring3[0] = "Config: Custom_Shop_Redux. Feel free to mess with these settings."; mystring3[1] = "===================================================================================="; mystring3[2] = "Key binding for saving anywhere. Press this key to save anywhere!"; mystring3[3] = key_binding.ToString(); File.WriteAllLines(mylocation3, mystring3); } else { //write out the info to a text file at the end of a day. This will run if it doesnt exist. Console.WriteLine("The custom character save info doesn't exist. It will be created when the custom saving method is run. Which is now."); mystring3[0] = "Config: Custom_Shop_Redux. Feel free to mess with these settings."; mystring3[1] = "===================================================================================="; mystring3[2] = "Key binding for saving anywhere. Press this key to save anywhere!"; mystring3[3] = key_binding.ToString(); File.WriteAllLines(mylocation3, mystring3); } } public void my_key_call() { var modpath = new Custom_Shop_Mod_Redux.Class1(); DirectoryInfo d = new DirectoryInfo(master_path);//Assuming Test is your Folder Log.Info(d); // System.Threading.Thread.Sleep(20000); FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files string str = ""; if (Files.Length == 0) { Log.Error("No shop .txt information is found. You should create one."); return; } foreach (FileInfo file in Files) { str = file.Name; // Log.Info(str); myoptions.Add(str); } if (myoptions.Count == 0) { Log.Error("No shop .txt information is found. You should create one."); return; } StardewValley.Menus.ChooseFromListMenu mychoices = new StardewValley.Menus.ChooseFromListMenu(myoptions, new ChooseFromListMenu.actionOnChoosingListOption(shop_file_call), false); Game1.activeClickableMenu = mychoices; } static void shop_file_call(string s) { List list = new List(); string mylocation = Path.Combine(master_path , s); /// Log.Info(mylocation); string[] readtext = File.ReadAllLines(mylocation); var lineCount = File.ReadLines(mylocation).Count(); // Log.Info(lineCount); if(s== "Custom_Shop_Redux_Config.txt") { Log.Info("Silly human. The config file is not a shop."); return; } int i = 4; int obj_id = 0; bool is_recipe; int price; int quality; string obj_type; obj_type = Convert.ToString(readtext[i]); i += 2; while (i < lineCount) { if (i >= lineCount) break; if (obj_type == "") break; if (readtext[i] == "") break; //read in a line for obj type here Log.Info(i); Log.Info(obj_type); if (obj_type == "item" || obj_type == "Item" || obj_type == "Object" || obj_type == "object") { obj_id = Convert.ToInt16(readtext[i]); i += 2; Log.Info(i); is_recipe = Convert.ToBoolean(readtext[i]); i += 2; Log.Info(i); price = Convert.ToInt32(readtext[i]); i += 2; Log.Info(i); quality = Convert.ToInt32(readtext[i]); // if (quality > 2) quality = 0; if (price == -1) { StardewValley.Object myobj = new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality); // Log.Info("MYPRICE"); // Log.Info(myobj.salePrice()); price = myobj.salePrice(); } // list.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality)); list_price.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality), new int[2] {price, int.MaxValue}); i += 3; if (i >= lineCount) break; } if (obj_type == "Furniture" || obj_type == "furniture") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list.Add((Item)new Furniture(obj_id, Vector2.Zero)); //ADD FUNCTIONALITY TO SHOP FILES TO TEST IF FURNITURE OR NOT. list_price.Add((Item)new Furniture(obj_id, Vector2.Zero), new int[2] { price, int.MaxValue }); i += 3; if (i>= lineCount) break; } if (obj_type == "Boots" || obj_type == "boots" || obj_type == "shoe" || obj_type == "Shoe") //just incase someone forgets it's called boots and they type shoe. { obj_id = Convert.ToInt32(readtext[i]); i += 2; price= Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Boots(obj_id),new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "WallPaper" || obj_type == "Wallpaper" || obj_type == "wallPaper" || obj_type == "wallpaper") //just incase someone forgets it's called boots and they type shoe. { if (i + 3 > lineCount) break; obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, false), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Carpet" || obj_type == "carpet" || obj_type == "Floor" || obj_type == "floor" || obj_type == "Rug" || obj_type == "rug") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, true), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Ring" || obj_type == "ring") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Ring(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Lamp" || obj_type == "lamp" || obj_type == "Torch" || obj_type == "torch" || obj_type == "Craftable" || obj_type == "craftable" || obj_type == "BigCraftable" || obj_type == "bigcraftable") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Torch(Vector2.Zero, obj_id, true), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Sword" || obj_type == "sword" || obj_type == "Weapon" || obj_type == "weapon") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new MeleeWeapon(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Hat" || obj_type == "hat" || obj_type == "Hats" || obj_type == "hats") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } //TODO: //add in support for colored objects //add in support for tools Log.Success(i); if (i >= lineCount) break; else { obj_type = Convert.ToString(readtext[i]); i += 2; } } //NEED TO TEST ALL DATA FILES TO SEE WHAT CAN AND CANT BE ADDED //list.Add((Item)new StardewValley.Objects.ColoredObject(475,300, Color.Aqua)); // Game1.activeClickableMenu = (IClickableMenu)new ShopMenu(list, 0, "Pierre"); Game1.activeClickableMenu = (IClickableMenu)new ShopMenu(list_price, 0, "Pierre"); } //very basic shop call with choosable menu to iterate through. public static void external_shop_file_call(string path, string fileName) { List list = new List(); string mylocation = Path.Combine(path, fileName); /// Log.Info(mylocation); string[] readtext = File.ReadAllLines(mylocation); var lineCount = File.ReadLines(mylocation).Count(); // Log.Info(lineCount); int i = 4; int obj_id = 0; bool is_recipe; int price; int quality; string obj_type; obj_type = Convert.ToString(readtext[i]); i += 2; while (i < lineCount) { if (i >= lineCount) break; if (obj_type == "") break; if (readtext[i] == "") break; //read in a line for obj type here Log.Info(i); Log.Info(obj_type); if (obj_type == "item" || obj_type == "Item" || obj_type == "Object" || obj_type == "object") { obj_id = Convert.ToInt16(readtext[i]); i += 2; Log.Info(i); is_recipe = Convert.ToBoolean(readtext[i]); i += 2; Log.Info(i); price = Convert.ToInt32(readtext[i]); i += 2; Log.Info(i); quality = Convert.ToInt32(readtext[i]); // if (quality > 2) quality = 0; if (price == -1) { StardewValley.Object myobj = new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality); // Log.Info("MYPRICE"); // Log.Info(myobj.salePrice()); price = myobj.salePrice(); } // list.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality)); list_price.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Furniture" || obj_type == "furniture") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list.Add((Item)new Furniture(obj_id, Vector2.Zero)); //ADD FUNCTIONALITY TO SHOP FILES TO TEST IF FURNITURE OR NOT. list_price.Add((Item)new Furniture(obj_id, Vector2.Zero), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Boots" || obj_type == "boots" || obj_type == "shoe" || obj_type == "Shoe") //just incase someone forgets it's called boots and they type shoe. { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Boots(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "WallPaper" || obj_type == "Wallpaper" || obj_type == "wallPaper" || obj_type == "wallpaper") //just incase someone forgets it's called boots and they type shoe. { if (i + 3 > lineCount) break; obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, false), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Carpet" || obj_type == "carpet" || obj_type == "Floor" || obj_type == "floor" || obj_type == "Rug" || obj_type == "rug") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, true), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Ring" || obj_type == "ring") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Ring(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Lamp" || obj_type == "lamp" || obj_type == "Torch" || obj_type == "torch" || obj_type == "Craftable" || obj_type == "craftable" || obj_type == "BigCraftable" || obj_type == "bigcraftable") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Torch(Vector2.Zero, obj_id, true), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Sword" || obj_type == "sword" || obj_type == "Weapon" || obj_type == "weapon") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new MeleeWeapon(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Hat" || obj_type == "hat" || obj_type == "Hats" || obj_type == "hats") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } //TODO: //add in support for colored objects //add in support for tools Log.Success(i); if (i >= lineCount) break; else { obj_type = Convert.ToString(readtext[i]); i += 2; } } //NEED TO TEST ALL DATA FILES TO SEE WHAT CAN AND CANT BE ADDED //list.Add((Item)new StardewValley.Objects.ColoredObject(475,300, Color.Aqua)); // Game1.activeClickableMenu = (IClickableMenu)new ShopMenu(list, 0, "Pierre"); mymenu = (IClickableMenu)new ShopMenu(list_price, 0, "Pierre"); Game1.activeClickableMenu = mymenu; //(IClickableMenu)new ShopMenu(list_price, 0, "Pierre"); }//basic default of Pierre public static void external_shop_file_call(string path, string fileName, string shopChat, NPC my_npc ) { List list = new List(); string mylocation = Path.Combine(path, fileName); /// Log.Info(mylocation); string[] readtext = File.ReadAllLines(mylocation); var lineCount = File.ReadLines(mylocation).Count(); // Log.Info(lineCount); int i = 4; int obj_id = 0; bool is_recipe; int price; int quality; string obj_type; obj_type = Convert.ToString(readtext[i]); i += 2; while (i < lineCount) { if (i >= lineCount) break; if (obj_type == "") break; if (readtext[i] == "") break; //read in a line for obj type here Log.Info(i); Log.Info(obj_type); if (obj_type == "item" || obj_type == "Item" || obj_type == "Object" || obj_type == "object") { obj_id = Convert.ToInt16(readtext[i]); i += 2; Log.Info(i); is_recipe = Convert.ToBoolean(readtext[i]); i += 2; Log.Info(i); price = Convert.ToInt32(readtext[i]); i += 2; Log.Info(i); quality = Convert.ToInt32(readtext[i]); // if (quality > 2) quality = 0; if (price == -1) { StardewValley.Object myobj = new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality); // Log.Info("MYPRICE"); // Log.Info(myobj.salePrice()); price = myobj.salePrice(); } // list.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality)); list_price.Add((Item)new StardewValley.Object(obj_id, int.MaxValue, is_recipe, price, quality), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Furniture" || obj_type == "furniture") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list.Add((Item)new Furniture(obj_id, Vector2.Zero)); //ADD FUNCTIONALITY TO SHOP FILES TO TEST IF FURNITURE OR NOT. list_price.Add((Item)new Furniture(obj_id, Vector2.Zero), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Boots" || obj_type == "boots" || obj_type == "shoe" || obj_type == "Shoe") //just incase someone forgets it's called boots and they type shoe. { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Boots(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "WallPaper" || obj_type == "Wallpaper" || obj_type == "wallPaper" || obj_type == "wallpaper") //just incase someone forgets it's called boots and they type shoe. { if (i + 3 > lineCount) break; obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, false), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Carpet" || obj_type == "carpet" || obj_type == "Floor" || obj_type == "floor" || obj_type == "Rug" || obj_type == "rug") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Wallpaper(obj_id, true), new int[2] { price, int.MaxValue }); //add in support for wallpapers and carpets i += 3; if (i >= lineCount) break; } if (obj_type == "Ring" || obj_type == "ring") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Objects.Ring(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Lamp" || obj_type == "lamp" || obj_type == "Torch" || obj_type == "torch" || obj_type == "Craftable" || obj_type == "craftable" || obj_type == "BigCraftable" || obj_type == "bigcraftable") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new StardewValley.Torch(Vector2.Zero, obj_id, true), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Sword" || obj_type == "sword" || obj_type == "Weapon" || obj_type == "weapon") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); list_price.Add((Item)new MeleeWeapon(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } if (obj_type == "Hat" || obj_type == "hat" || obj_type == "Hats" || obj_type == "hats") { obj_id = Convert.ToInt32(readtext[i]); i += 2; price = Convert.ToInt32(readtext[i]); // list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); list_price.Add((Item)new Hat(obj_id), new int[2] { price, int.MaxValue }); i += 3; if (i >= lineCount) break; } //TODO: //add in support for colored objects //add in support for tools Log.Success(i); if (i >= lineCount) break; else { obj_type = Convert.ToString(readtext[i]); i += 2; } } //NEED TO TEST ALL DATA FILES TO SEE WHAT CAN AND CANT BE ADDED //list.Add((Item)new StardewValley.Objects.ColoredObject(475,300, Color.Aqua)); // Game1.activeClickableMenu = (IClickableMenu)new ShopMenu(list, 0, "Pierre"); var shop_menu=new ShopMenu(list_price, 0, my_npc.name); shop_menu.potraitPersonDialogue = Game1.parseText(shopChat, Game1.dialogueFont, Game1.tileSize * 5 - Game1.pixelZoom * 4); shop_menu.portraitPerson = my_npc; mymenu = shop_menu; Game1.activeClickableMenu = mymenu; //(IClickableMenu)new ShopMenu(list_price, 0, "Pierre"); } //uses NPCS with new dialogue and portraits //example of a shop that I don't use. public static List myshop() { List list = new List(); list.Add((Item)new StardewValley.Object(478, int.MaxValue, false, -1, 0)); //int parentsheet index OR object_ID/int.MaxValue, bool is recipe, price, quality list.Add((Item)new StardewValley.Object(486, int.MaxValue, false, -1, 0)); list.Add((Item)new StardewValley.Object(494, int.MaxValue, false, -1, 0)); //Might be able to manipulate this code to give me recipes!!!! list.Add((Item)new StardewValley.Object(495, int.MaxValue, false, 800, 0)); //price is *2 of value shown. -1 means inherit default value switch (Game1.dayOfMonth % 7) { case 0: list.Add((Item)new StardewValley.Object(233, int.MaxValue, false, -1, 0)); break; case 1: list.Add((Item)new StardewValley.Object(88, int.MaxValue, false, -1, 0)); break; case 2: list.Add((Item)new StardewValley.Object(90, int.MaxValue, false, -1, 0)); break; case 3: list.Add((Item)new StardewValley.Object(749, int.MaxValue, false, 500, 0)); break; case 4: list.Add((Item)new StardewValley.Object(466, int.MaxValue, false, -1, 0)); break; case 5: list.Add((Item)new StardewValley.Object(340, int.MaxValue, false, -1, 0)); break; case 6: list.Add((Item)new StardewValley.Object(371, int.MaxValue, false, 100, 0)); break; } return list; } } } //end class