using System.Collections.Generic; using System.IO; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using ProjectZ.InGame.SaveLoad; namespace ProjectZ.InGame.Things { internal class Resources { public class Texture { public string Name; public Texture2D SprTexture; public Texture(string name) { Name = name; } } public static Effect RoundedCornerEffect; public static Effect BlurEffect; public static Effect RoundedCornerBlurEffect; public static Effect BlurEffectV; public static Effect BlurEffectH; public static Effect BBlurEffectV; public static Effect BBlurEffectH; public static Effect BBlurMapping; public static Effect FullShadowEffect; public static Effect SaturationEffect; public static Effect WobbleEffect; public static Effect CircleShader; public static Effect LightShader; public static Effect LightFadeShader; public static Effect ThanosShader; // some sprites need different parameters set // we try to use as little different sprites effects as possible public static SpriteShader DamageSpriteShader0; public static SpriteShader DamageSpriteShader1; public static SpriteShader CloudShader; public static SpriteShader ThanosSpriteShader0; public static SpriteShader ThanosSpriteShader1; public static SpriteShader WindFishShader; public static SpriteShader ColorShader; public static SpriteShader ShockShader0; public static SpriteShader ShockShader1; public static SpriteFont EditorFont, EditorFontMonoSpace, EditorFontSmallMonoSpace; public static SpriteFont GameFont, GameHeaderFont; public static SpriteFont FontCredits, FontCreditsHeader; public static Texture2D EditorEyeOpen, EditorEyeClosed, EditorIconDelete; public static Texture2D SprWhite, SprTiledBlock, SprObjects, SprObjectsAnimated, SprItem, SprNpCs; public static Texture2D SprEnemies, SprMidBoss, SprNightmares, SprMiniMap; public static Texture2D SprShadow; public static Texture2D SprBlurTileset; public static Texture2D SprPhotos; public static Texture2D SprLink, SprLinkCloak; public static Texture2D SprGameSequences; public static Texture2D SprGameSequencesFinal; public static Texture2D SprFog; public static Texture2D SprLight; public static Texture2D SprLightRoomH; public static Texture2D SprLightRoomV; public static Texture2D NoiseTexture; public static Texture2D SprIconOptions, SprIconErase, SprIconCopy, EditorIconEdit, EditorIconSelect; public static List TextureList = new List(); public static Dictionary SpriteAtlas = new Dictionary(); public static Dictionary TilesetSizes = new Dictionary(); public static Dictionary SoundEffects = new Dictionary(); public static int GameFontHeight = 10; public static int EditorFontHeight; // resources needed to start showing the intro public static void LoadIntro(GraphicsDevice graphics, ContentManager content) { // TODO: make sure to only load the stuff needed; BlurEffect is not needed but needs changes to not load it here SprWhite = new Texture2D(graphics, 1, 1); SprWhite.SetData(new[] { Color.White }); LoadTexturesFromFolder(Values.PathContentFolder + "/Intro/"); BlurEffect = content.Load("Shader/EffectBlur"); RoundedCornerBlurEffect = content.Load("Shader/RoundedCornerEffectBlur"); AddSoundEffect(content, "D378-15-0F"); AddSoundEffect(content, "D378-12-0C"); AddSoundEffect(content, "D378-25-19"); } public static void LoadTextures(GraphicsDevice graphics, ContentManager content) { // load the tileset sizes LoadTilesetSizes(); LoadTexture(out SprGameSequences, Values.PathContentFolder + "Sequences/game sequences.png"); LoadTexture(out SprGameSequencesFinal, Values.PathContentFolder + "Sequences/end sequence.png"); LoadTexture(out SprPhotos, Values.PathContentFolder + "Photo Mode/photos.png"); LoadTexture(out var bigEditorIcons, Values.PathContentFolder + "Editor/editorIcons4x.png"); LoadTexture(out var SprUI, Values.PathContentFolder + "ui.png"); LoadTexturesFromFolder(Values.PathContentFolder + "/Sequences/"); LoadTexturesFromFolder(Values.PathContentFolder + "/Light/"); // load all the tileset textures LoadTexturesFromFolder(Values.PathTilesetFolder); LoadTexturesFromFolder(Values.PathMapObjectFolder); SprMiniMap = GetTexture("minimap.png"); SprItem = GetTexture("items.png"); SprLink = GetTexture("link0.png"); SprLinkCloak = GetTexture("link_cloak.png"); SprEnemies = GetTexture("enemies.png"); SprNpCs = GetTexture("npcs.png"); SprObjects = GetTexture("objects.png"); SprObjectsAnimated = GetTexture("objects animated.png"); SprMidBoss = GetTexture("midboss.png"); SprNightmares = GetTexture("nightmares.png"); SprBlurTileset = GetTexture("blur tileset.png"); // load fonts EditorFont = content.Load("Fonts/editor font"); EditorFontHeight = (int)EditorFont.MeasureString("H").Y; EditorFontMonoSpace = content.Load("Fonts/editor mono font"); EditorFontSmallMonoSpace = content.Load("Fonts/editor small mono font"); GameFont = content.Load("Fonts/smallFont"); GameFont.LineSpacing = GameFontHeight; GameHeaderFont = content.Load("Fonts/newHeaderFont"); FontCredits = content.Load("Fonts/credits font"); FontCreditsHeader = content.Load("Fonts/credits header font"); // load textures SprTiledBlock = new Texture2D(graphics, 2, 2); SprTiledBlock.SetData(new[] { Color.White, Color.LightGray, Color.LightGray, Color.White }); EditorEyeOpen = content.Load("Editor/eye_open"); EditorEyeClosed = content.Load("Editor/eye_closed"); EditorIconDelete = content.Load("Editor/delete"); EditorIconEdit = content.Load("Editor/edit"); EditorIconSelect = content.Load("Editor/select"); SprLight = content.Load("Light/light"); SprLightRoomH = content.Load("Light/ligth room"); SprLightRoomV = content.Load("Light/ligth room vertical"); SprShadow = content.Load("Light/shadow"); LoadContentTextureWithAtlas(content, "Light/doorLight"); SprIconOptions = content.Load("Menu/gearIcon"); SprIconErase = content.Load("Menu/trashIcon"); SprIconCopy = content.Load("Menu/copyIcon"); // need to have pre multiplied alpha SprFog = content.Load("Objects/fog"); // load shader RoundedCornerEffect = content.Load("Shader/RoundedCorner"); BlurEffectH = content.Load("Shader/BlurH"); BlurEffectV = content.Load("Shader/BlurV"); BBlurEffectH = content.Load("Shader/BBlurH"); BBlurEffectV = content.Load("Shader/BBlurV"); FullShadowEffect = content.Load("Shader/FullShadowEffect"); // used in the inventory SaturationEffect = content.Load("Shader/SaturationFilter"); WobbleEffect = content.Load("Shader/WobbleShader"); CircleShader = content.Load("Shader/CircleShader"); LightShader = content.Load("Shader/LightShader"); LightFadeShader = content.Load("Shader/LightFadeShader"); var cloudShader = content.Load("Shader/ColorCloud"); CloudShader = new SpriteShader(cloudShader); CloudShader.FloatParameter.Add("scaleX", 1); CloudShader.FloatParameter.Add("scaleY", 1); NoiseTexture = GetTexture("thanos noise.png"); ThanosShader = content.Load("Shader/ThanosShader"); ThanosShader.Parameters["NoiceTexture"].SetValue(NoiseTexture); // only works for sprites using the sequence sprite ThanosShader.Parameters["Scale"].SetValue(new Vector2( (float)SprGameSequencesFinal.Width / NoiseTexture.Width, (float)SprGameSequencesFinal.Height / NoiseTexture.Height)); ThanosSpriteShader0 = new SpriteShader(ThanosShader); ThanosSpriteShader0.FloatParameter.Add("Percentage", 0); ThanosSpriteShader1 = new SpriteShader(ThanosShader); ThanosSpriteShader1.FloatParameter.Add("Percentage", 0); WindFishShader = new SpriteShader(content.Load("Shader/WaleShader")); WindFishShader.FloatParameter.Add("Offset", 0); WindFishShader.FloatParameter.Add("Period", 0); ColorShader = new SpriteShader(content.Load("Shader/ColorShader")); var damageShader = content.Load("Shader/DamageShader"); // crow needs mark1 to have a value bigger than 0.605333 DamageSpriteShader0 = new SpriteShader(damageShader); DamageSpriteShader0.FloatParameter.Add("mark0", 0.1f); DamageSpriteShader0.FloatParameter.Add("mark1", 0.725f); // stone hinox needs mark1 to be below 0.553 DamageSpriteShader1 = new SpriteShader(damageShader); DamageSpriteShader1.FloatParameter.Add("mark0", 0.1f); DamageSpriteShader1.FloatParameter.Add("mark1", 0.55f); var shockShader = content.Load("Shader/ShockEffect"); ShockShader0 = new SpriteShader(shockShader); ShockShader0.FloatParameter.Add("mark0", 0.0f); ShockShader0.FloatParameter.Add("mark1", 0.2675f); ShockShader0.FloatParameter.Add("mark2", 0.725f); ShockShader1 = new SpriteShader(shockShader); ShockShader1.FloatParameter.Add("mark0", 0.0f); ShockShader1.FloatParameter.Add("mark1", 0.35f); ShockShader1.FloatParameter.Add("mark2", 0.625f); } public static void LoadSounds(ContentManager content) { // load all the sound effects var soundEffectFiles = Directory.GetFiles(content.RootDirectory + "/SoundEffects").ToList(); foreach (var path in soundEffectFiles) { var fileName = Path.GetFileNameWithoutExtension(path); AddSoundEffect(content, fileName); } } public static void AddSoundEffect(ContentManager content, string fileName) { var soundEffect = content.Load("SoundEffects/" + fileName); // try add is used because some files may already be loaded for the intro sequence SoundEffects.TryAdd(fileName, soundEffect); } public static void LoadContentTextureWithAtlas(ContentManager content, string filePath) { var texture = content.Load(filePath); // load the sprite atlas var atlasPath = Values.PathContentFolder + filePath + ".atlas"; SpriteAtlasSerialization.LoadSourceDictionary(texture, atlasPath, SpriteAtlas); } public static void LoadTexturesFromFolder(string path) { var texturePaths = Directory.GetFiles(path).ToList(); foreach (var filePath in texturePaths) { if (!filePath.Contains(".png")) continue; var newTexture = new Texture(Path.GetFileName(filePath)); LoadTexture(out newTexture.SprTexture, filePath); TextureList.Add(newTexture); } } public static void LoadTexture(out Texture2D texture, string strFilePath) { using Stream stream = File.Open(strFilePath, FileMode.Open); texture = Texture2D.FromStream(Game1.Graphics.GraphicsDevice, stream); // load the sprite atlas var atlasFileName = strFilePath.Replace(".png", ".atlas"); SpriteAtlasSerialization.LoadSourceDictionary(texture, atlasFileName, SpriteAtlas); } public static Texture2D GetTexture(string name) { for (var i = 0; i < TextureList.Count; i++) { if (TextureList[i].Name == name) return TextureList[i].SprTexture; } return null; } public static Rectangle SourceRectangle(string id) { return SpriteAtlas.ContainsKey(id) ? SpriteAtlas[id].ScaledRectangle : Rectangle.Empty; } public static DictAtlasEntry GetSprite(string id) { return SpriteAtlas.ContainsKey(id) ? SpriteAtlas[id] : null; } public static void LoadTilesetSizes() { var fileName = Values.PathTilesetFolder + "tileset size.txt"; if (File.Exists(fileName)) { using var reader = new StreamReader(fileName); while (!reader.EndOfStream) { var line = reader.ReadLine(); // comment? if (line.StartsWith("//")) continue; var split = line.Split(':'); if (split.Length != 2) continue; if (int.TryParse(split[1], out var value)) TilesetSizes.Add(split[0], value); } } } } }