316 lines
14 KiB
C#
316 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using Microsoft.Xna.Framework;
|
|
using PyTK.Extensions;
|
|
using PyTK.Types;
|
|
using Revitalize.Framework;
|
|
using Revitalize.Framework.Crafting;
|
|
using Revitalize.Framework.Environment;
|
|
using Revitalize.Framework.Factories.Objects;
|
|
using Revitalize.Framework.Illuminate;
|
|
using Revitalize.Framework.Objects;
|
|
using Revitalize.Framework.Objects.Furniture;
|
|
using Revitalize.Framework.Player;
|
|
using Revitalize.Framework.Utilities;
|
|
using StardewModdingAPI;
|
|
using StardewValley;
|
|
using StardewValley.Objects;
|
|
using StardustCore.UIUtilities;
|
|
using StardustCore.Animations;
|
|
|
|
namespace Revitalize
|
|
{
|
|
|
|
//Bugs:
|
|
// -Chair tops cut off objects
|
|
// -load content MUST be enabled for the table to be placed?????? WTF
|
|
// TODO:
|
|
/*
|
|
*
|
|
*Menus:
|
|
* -Simple Item Grab Menu (to transfer items from one inventory to another)
|
|
* -Need to make this.
|
|
*
|
|
// -Add in object pool class to handle the multitudes of objects I'll be making. (WIP)
|
|
// -Make this mod able to load content packs for easier future modding
|
|
//
|
|
// -Multiple Lights On Object
|
|
// -Illumination Colors
|
|
// Furniture:
|
|
// -rugs (done, needs factory info/sprite)
|
|
// -tables (done)
|
|
// -lamps (done)
|
|
// -chairs (done)
|
|
// -benches (done but needs factory info/sprite)
|
|
// -dressers/other storage containers
|
|
// -fun interactables
|
|
// -More crafting tables
|
|
// -Machines
|
|
// !=Energy
|
|
// -solar
|
|
// -Furnace
|
|
// -Seed Maker
|
|
// -Stone Quarry
|
|
// -Mayo Maker
|
|
// -Cheese Maker
|
|
// -Auto fisher
|
|
// -Auto Preserves
|
|
// -Auto Keg
|
|
// -Auto Cask
|
|
// -Calcinator (oil+stone)
|
|
// -Materials
|
|
// -Tin/Bronze/Alluminum/Silver?Platinum/Etc
|
|
-titanium
|
|
-Alloys!
|
|
-Brass
|
|
-Electrum
|
|
-Liquids
|
|
-oil
|
|
-water
|
|
-coal
|
|
-juice???
|
|
// -Crafting Menu
|
|
// -Item Grab Menu (Extendable)
|
|
// -Yes/No Dialogue Box
|
|
// -Multi Choice dialogue box
|
|
// -Gift Boxes
|
|
// Magic!
|
|
// -Alchemy Bags
|
|
// -Transmutation
|
|
// -Effect Crystals
|
|
// -Spell books
|
|
// -Potions!
|
|
// -Magic Meter
|
|
// -Connected chests much like Project EE2 from MC
|
|
//
|
|
//
|
|
// -Food?
|
|
-multi flavored sodas
|
|
// -Bigger chests
|
|
//
|
|
// Festivals
|
|
// -Firework festival?
|
|
// Stargazing???
|
|
// -Moon Phases+DarkerNight
|
|
// Bigger/Better Museum?
|
|
// More Crops?
|
|
// More Food?
|
|
//
|
|
// Equippables!
|
|
// -accessories that provide buffs/regen/friendship
|
|
// -braclets/rings/broaches....more crafting for these???
|
|
//
|
|
// Music???
|
|
// -IDK maybe add in instruments???
|
|
//
|
|
// More buildings????
|
|
//
|
|
// More Animals???
|
|
//
|
|
// Readable Books?
|
|
//
|
|
// Custom NPCs for shops???
|
|
//
|
|
// Frisbee Minigame?
|
|
//
|
|
// HorseRace Minigame/Betting?
|
|
//
|
|
// Locations:
|
|
// -Small Island Home?
|
|
//
|
|
// More crops
|
|
//
|
|
// More monsters
|
|
// -boss fights
|
|
//
|
|
// More dungeons??
|
|
*/
|
|
|
|
public class ModCore : Mod
|
|
{
|
|
public static IModHelper ModHelper;
|
|
public static IMonitor ModMonitor;
|
|
public static IManifest Manifest;
|
|
|
|
public static Dictionary<string, CustomObject> customObjects;
|
|
|
|
public static Dictionary<string, MultiTiledObject>ObjectGroups;
|
|
|
|
public static PlayerInfo playerInfo;
|
|
|
|
public static Serializer Serializer;
|
|
|
|
public static Dictionary<GameLocation,MultiTiledObject> ObjectsToDraw;
|
|
|
|
public override void Entry(IModHelper helper)
|
|
{
|
|
ModHelper = helper;
|
|
ModMonitor = this.Monitor;
|
|
Manifest = this.ModManifest;
|
|
|
|
this.createDirectories();
|
|
this.initailizeComponents();
|
|
|
|
ModHelper.Events.GameLoop.SaveLoaded += this.GameLoop_SaveLoaded;
|
|
ModHelper.Events.GameLoop.TimeChanged += this.GameLoop_TimeChanged;
|
|
ModHelper.Events.GameLoop.UpdateTicked += this.GameLoop_UpdateTicked;
|
|
ModHelper.Events.GameLoop.ReturnedToTitle += this.GameLoop_ReturnedToTitle;
|
|
ModHelper.Events.Input.ButtonPressed += this.Input_ButtonPressed;
|
|
playerInfo = new PlayerInfo();
|
|
|
|
TextureManager.AddTextureManager(Manifest,"Furniture");
|
|
TextureManager.GetTextureManager(Manifest,"Furniture").searchForTextures(ModHelper,this.ModManifest,Path.Combine("Content", "Graphics", "Furniture"));
|
|
|
|
//TextureManager.addTexture("Furniture","Oak Chair", new Texture2DExtended(this.Helper, this.ModManifest, Path.Combine("Content","Graphics","Furniture", "Chairs", "Oak Chair.png")));
|
|
|
|
//Framework.Graphics.TextureManager.TextureManagers.Add("Furniture", new TextureManager(this.Helper.DirectoryPath, Path.Combine("Content", "Graphics", "Furniture")));
|
|
//Rename graphic files tohave spaces and comment out below lines
|
|
|
|
//TextureManager.addTexture("Furniture","Oak Chair", new Texture2DExtended(this.Helper, this.ModManifest, Path.Combine("Content","Graphics","Furniture", "Chairs", "Oak Chair.png")));
|
|
//
|
|
|
|
//TextureManager.addTexture("Furniture", "Oak Table", new Texture2DExtended(this.Helper, this.ModManifest, Path.Combine("Content", "Graphics", "Furniture", "Tables", "Oak Table.png")));
|
|
//TextureManager.addTexture("Furniture", "Oak Lamp", new Texture2DExtended(this.Helper, this.ModManifest, Path.Combine("Content", "Graphics", "Furniture", "Lamps", "Oak Lamp.png")));
|
|
customObjects = new Dictionary<string, CustomObject>();
|
|
ObjectGroups = new Dictionary<string, MultiTiledObject>();
|
|
|
|
|
|
Serializer = new Serializer();
|
|
ObjectsToDraw = new Dictionary<GameLocation, MultiTiledObject>();
|
|
|
|
|
|
|
|
}
|
|
|
|
private void Input_ButtonPressed(object sender, StardewModdingAPI.Events.ButtonPressedEventArgs e)
|
|
{
|
|
if(e.Button== SButton.U)
|
|
{
|
|
Game1.currentMinigame = new Revitalize.Framework.Minigame.SeasideScrambleMinigame.SeasideScramble();
|
|
}
|
|
}
|
|
|
|
private void GameLoop_ReturnedToTitle(object sender, StardewModdingAPI.Events.ReturnedToTitleEventArgs e)
|
|
{
|
|
Serializer.returnToTitle();
|
|
}
|
|
/// <summary>
|
|
/// Must be enabled for the tabled to be placed????
|
|
/// </summary>
|
|
private void loadContent()
|
|
{
|
|
|
|
MultiTiledComponent obj = new MultiTiledComponent(PyTKHelper.CreateOBJData("Omegasis.Revitalize.MultiTiledComponent.Test", TextureManager.GetTexture(Manifest,"Furniture","Oak Chair"),typeof(MultiTiledComponent),Color.White), new BasicItemInformation("CoreObjectTest", "Omegasis.TEST1", "YAY FUN!", "Omegasis.Revitalize.MultiTiledComponent.Test", Color.White, -300, 0, false, 300, Vector2.Zero, true, true, TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), new AnimationManager(TextureManager.GetExtendedTexture(Manifest, "Furniture", "Oak Chair"), new Animation(new Rectangle(0, 0, 16, 16))), Color.White, false, null, null));
|
|
MultiTiledComponent obj2 = new MultiTiledComponent(PyTKHelper.CreateOBJData("Omegasis.Revitalize.MultiTiledComponent.Test", TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), typeof(MultiTiledComponent), Color.White), new BasicItemInformation("CoreObjectTest2", "Omegasis.TEST2", "Some fun!", "Omegasis.Revitalize.MultiTiledComponent.Test", Color.White, -300, 0, false, 300, Vector2.Zero, true, true, TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), new AnimationManager(TextureManager.GetExtendedTexture(Manifest, "Furniture", "Oak Chair"), new Animation(new Rectangle(0, 16, 16, 16))), Color.White, false, null, null));
|
|
MultiTiledComponent obj3 = new MultiTiledComponent(PyTKHelper.CreateOBJData("Omegasis.Revitalize.MultiTiledComponent.Test", TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), typeof(MultiTiledComponent), Color.White), new BasicItemInformation("CoreObjectTest3", "Omegasis.TEST3", "NoFun", "Omegasis.Revitalize.MultiTiledComponent.Test", Color.White, -300, 0, false, 100, Vector2.Zero, true, true, TextureManager.GetTexture(Manifest,"Furniture","Oak Chair"), new AnimationManager(TextureManager.GetExtendedTexture(Manifest, "Furniture", "Oak Chair"), new Animation(new Rectangle(0, 32, 16, 16))), Color.Red, false, null, null));
|
|
|
|
|
|
obj3.info.lightManager.addLight(new Vector2(Game1.tileSize), new LightSource(4, new Vector2(0, 0), 2.5f, Color.Orange.Invert()), obj3);
|
|
|
|
MultiTiledObject bigObject = new MultiTiledObject(PyTKHelper.CreateOBJData("Omegasis.Revitalize.MultiTiledComponent.Test", TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), typeof(MultiTiledObject), Color.White), new BasicItemInformation("MultiTest", "Omegasis.BigTiledTest", "A really big object", "Omegasis.Revitalize.MultiTiledObject", Color.Blue, -300, 0, false, 500, Vector2.Zero, true, true, TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), new AnimationManager(), Color.White, false, null, null));
|
|
|
|
bigObject.addComponent(new Vector2(0, 0), obj);
|
|
bigObject.addComponent(new Vector2(1, 0), obj2);
|
|
bigObject.addComponent(new Vector2(2, 0), obj3);
|
|
|
|
Recipe pie = new Recipe(new Dictionary<Item, int>()
|
|
{
|
|
[bigObject] = 1
|
|
}, new KeyValuePair<Item, int>(new Furniture(3, Vector2.Zero), 1), new StatCost(100, 50, 0, 0));
|
|
|
|
customObjects.Add("Omegasis.BigTiledTest", bigObject);
|
|
|
|
|
|
Framework.Objects.Furniture.RugTileComponent rug1 = new RugTileComponent(PyTKHelper.CreateOBJData("Omegasis.Revitalize.Furniture.Basic.Rugs.TestRug", TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), typeof(RugTileComponent), Color.White), new BasicItemInformation("Rug Tile", "Omegasis.Revitalize.Furniture.Basic.Rugs.TestRug", "A rug tile", "Rug", Color.Brown, -300, 0, false, 100, Vector2.Zero, true, true, TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"), new AnimationManager(TextureManager.GetExtendedTexture(Manifest, "Furniture", "Oak Chair"), new Animation(new Rectangle(0, 0, 16, 16))), Color.White, true, null, null));
|
|
|
|
Framework.Objects.Furniture.RugMultiTiledObject rug=new RugMultiTiledObject( PyTKHelper.CreateOBJData("Omegasis.Revitalize.Furniture.Basic.Rugs.TestRug", TextureManager.GetTexture(Manifest, "Furniture", "Oak Chair"),typeof(RugMultiTiledObject),Color.White,false),new BasicItemInformation("Simple Rug Test", "Omegasis.Revitalize.Furniture.Basic.Rugs.TestRug","A simple rug for testing","Rugs",Color.Brown,-300,0,false,500,Vector2.Zero,true,true,TextureManager.GetTexture(Manifest,"Furniture","Oak Chair"),new AnimationManager(),Color.White,true,null,null));
|
|
|
|
rug.addComponent(new Vector2(0, 0), rug1);
|
|
|
|
customObjects.Add("Omegasis.Revitalize.Furniture.Rugs.RugTest", rug);
|
|
|
|
|
|
|
|
FurnitureFactory.LoadFurnitureFiles();
|
|
}
|
|
|
|
private void createDirectories()
|
|
{
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Configs"));
|
|
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Content"));
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath,"Content" ,"Graphics"));
|
|
//Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Content", "Graphics","Furniture"));
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Content", "Graphics", "Furniture","Chairs"));
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Content", "Graphics", "Furniture", "Lamps"));
|
|
Directory.CreateDirectory(Path.Combine(this.Helper.DirectoryPath, "Content", "Graphics", "Furniture", "Tables"));
|
|
}
|
|
|
|
private void initailizeComponents()
|
|
{
|
|
DarkerNight.InitializeConfig();
|
|
}
|
|
|
|
private void GameLoop_UpdateTicked(object sender, StardewModdingAPI.Events.UpdateTickedEventArgs e)
|
|
{
|
|
DarkerNight.SetDarkerColor();
|
|
playerInfo.update();
|
|
}
|
|
|
|
private void GameLoop_TimeChanged(object sender, StardewModdingAPI.Events.TimeChangedEventArgs e)
|
|
{
|
|
DarkerNight.CalculateDarkerNightColor();
|
|
}
|
|
|
|
private void GameLoop_SaveLoaded(object sender, StardewModdingAPI.Events.SaveLoadedEventArgs e)
|
|
{
|
|
this.loadContent();
|
|
|
|
|
|
Serializer.afterLoad();
|
|
|
|
if (Game1.IsServer || Game1.IsMultiplayer || Game1.IsClient)
|
|
{
|
|
throw new Exception("Can't run Revitalize in multiplayer due to lack of current support!");
|
|
}
|
|
Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.BigTiledTest"));
|
|
//Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.Revitalize.Furniture.Chairs.OakChair"));
|
|
//Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.Revitalize.Furniture.Rugs.RugTest"));
|
|
Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.Revitalize.Furniture.Tables.OakTable"));
|
|
Game1.player.addItemToInventory(GetObjectFromPool("Omegasis.Revitalize.Furniture.Lamps.OakLamp"));
|
|
/*
|
|
StardewValley.Tools.Axe axe = new StardewValley.Tools.Axe();
|
|
Serializer.Serialize(Path.Combine(this.Helper.DirectoryPath, "AXE.json"), axe);
|
|
axe =(StardewValley.Tools.Axe)Serializer.Deserialize(Path.Combine(this.Helper.DirectoryPath, "AXE.json"),typeof(StardewValley.Tools.Axe));
|
|
//Game1.player.addItemToInventory(axe);
|
|
*/
|
|
|
|
}
|
|
|
|
public static Item GetObjectFromPool(string objName)
|
|
{
|
|
if (customObjects.ContainsKey(objName))
|
|
{
|
|
CustomObject i =(CustomObject)customObjects[objName].getOne();
|
|
return i;
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Object Key name not found: " + objName);
|
|
}
|
|
}
|
|
|
|
|
|
public static void log(object message)
|
|
{
|
|
ModMonitor.Log(message.ToString());
|
|
}
|
|
|
|
public static string generatePlaceholderString()
|
|
{
|
|
return "2048/0/-300/Crafting -9/Play '2048 by Platonymous' at home!/true/true/0/2048";
|
|
}
|
|
}
|
|
}
|