private void convert()
        {
            Monitor.Log("Converting..", LogLevel.Trace);
            string inPath = Path.Combine(Helper.DirectoryPath, "Converter", "IN");



            string[] directories = Directory.GetDirectories(inPath, "*.*", SearchOption.TopDirectoryOnly);

            foreach (string dir in directories)
            {
                DirectoryInfo inddir = new DirectoryInfo(dir);
                DirectoryInfo outdir = new DirectoryInfo(dir.Replace("IN", "OUT"));
                if (!outdir.Exists)
                {
                    outdir.Create();
                }

                foreach (FileInfo file in inddir.GetFiles())
                {
                    string importPath = Path.Combine("Converter", "IN", inddir.Name, file.Name);
                    string exportPath = Path.Combine("Converter", "OUT", inddir.Name, file.Name).Replace(".xnb", ".tmx").Replace(".tbin", ".tmx");
                    if (TMXContent.Convert(importPath, exportPath, Helper, ContentSource.ModFolder, Monitor))
                    {
                        file.Delete();
                    }
                }
            }
            Monitor.Log("..Done!", LogLevel.Trace);
        }
Esempio n. 2
0
        public override void Entry(IModHelper helper)
        {
            config = helper.ReadConfig <Config>();
            helper.WriteConfig(config);

            helper.Events.GameLoop.Saving     += OnSaving;
            helper.Events.GameLoop.SaveLoaded += OnSaveLoaded;
            helper.Events.GameLoop.DayStarted += OnDayStarted;

            responses = new List <Response>();
            responses.Add(new Response("ATM_Deposit", i18n.Get("ATM_Deposit")));
            responses.Add(new Response("ATM_Daily_Deposit", i18n.Get("ATM_Daily_Deposit")));
            responses.Add(new Response("ATM_Withdraw", i18n.Get("ATM_Withdraw")));
            responses.Add(new Response("ATM_Close", i18n.Get("ATM_Close")));

            var openATMAction = new TileAction("OpenATM", openATM);

            openATMAction.register();

            var atmWinterCheck = new TileAction("ATMWinterCheck", checkSeason);

            atmWinterCheck.register();

            var atm = TMXContent.Load(Path.Combine("Assets", "atm.tmx"), Helper);

            atm.injectInto(@"Maps/" + config.Map, new Vector2(config.Position[0], config.Position[1]), null);
        }
Esempio n. 3
0
        public override void Entry(IModHelper helper)
        {
            config = helper.ReadConfig <Config>();

            SaveEvents.AfterLoad       += SaveEvents_AfterLoad;
            SaveEvents.BeforeSave      += SaveEvents_BeforeSave;
            TimeEvents.AfterDayStarted += TimeEvents_AfterDayStarted;

            responses = new List <Response>();
            responses.Add(new Response("ATM_Deposit", i18n.Get("ATM_Deposit")));
            responses.Add(new Response("ATM_Daily_Deposit", i18n.Get("ATM_Daily_Deposit")));
            responses.Add(new Response("ATM_Withdraw", i18n.Get("ATM_Withdraw")));
            responses.Add(new Response("ATM_Close", i18n.Get("ATM_Close")));

            var openATMAction = new TileAction("OpenATM", openATM);

            openATMAction.register();

            var openATOMAction = new TileAction("OpenATOM", openATOM);

            openATOMAction.register();

            var atm = TMXContent.Load(Path.Combine("Assets", "atm.tmx"), Helper);

            atm.injectInto(@"Maps/" + config.Map, new Vector2(config.Position[0], config.Position[1]), null);
            var atom = TMXContent.Load(Path.Combine("Assets", "atom.tmx"), Helper);

            atom.injectInto(@"Maps/" + config.Map, new Vector2(config.Position[0] - 1, config.Position[1]), null);
        }
Esempio n. 4
0
            internal static void Postfix(object __instance, ref Map __result)
            {
                string Folder   = (string)__instance.GetType().GetProperty("Folder", BindingFlags.Public | BindingFlags.Instance).GetValue(__instance);
                string mapPath  = Path.Combine(Folder, "map.tmx");
                string filePath = Path.Combine(Helper.DirectoryPath, mapPath);

                if (!File.Exists(filePath))
                {
                    return;
                }

                TMXLoaderMod.monitor.Log("Loading.. " + Path.Combine(Folder, "map.tmx"));
                __result = TMXContent.Load(mapPath, Helper);
            }
        private void exportAllMaps()
        {
            string        exportFolderPath = Path.Combine(Helper.DirectoryPath, "Converter", "FullMapExport");
            DirectoryInfo exportFolder     = new DirectoryInfo(exportFolderPath);
            DirectoryInfo modFolder        = new DirectoryInfo(Helper.DirectoryPath);
            string        contentPath      = PyUtils.getContentFolder();

            if (!exportFolder.Exists && contentPath != null)
            {
                exportFolder.Create();
            }
            else
            {
                return;
            }

            string[] files = Directory.GetFiles(Path.Combine(contentPath, "Maps"), "*.xnb", SearchOption.TopDirectoryOnly);
            foreach (string file in files)
            {
                string fileName   = new FileInfo(file).Name;
                string folderName = new FileInfo(file).Directory.Name;

                if (fileName[0] == fileName.ToLower()[0])
                {
                    continue;
                }

                Map    map  = null;
                string path = Path.Combine(folderName, fileName);

                try
                {
                    map = Helper.Content.Load <Map>(path, ContentSource.GameContent);
                    map.LoadTileSheets(Game1.mapDisplayDevice);
                }
                catch
                {
                    continue;
                }

                if (map == null)
                {
                    continue;
                }

                string exportPath = Path.Combine(exportFolderPath, fileName.Replace(".xnb", ".tmx"));
                TMXContent.Save(map, exportPath, true, Monitor);
            }
        }
        private void convert()
        {
            Monitor.Log("Converting..", LogLevel.Trace);
            string inPath = Path.Combine(Helper.DirectoryPath, "Converter", "IN");

            string[] files = Directory.GetFiles(inPath, "*.*", SearchOption.TopDirectoryOnly);
            foreach (string file in files)
            {
                string   fileName   = new FileInfo(file).Name;
                string   importPath = Path.Combine("Converter", "IN", fileName);
                FileInfo importFile = new FileInfo(Path.Combine(inPath, fileName));
                string   exportPath = Path.Combine("Converter", "OUT", fileName.Replace(".xnb", ".tmx").Replace(".tbin", ".tmx"));
                if (TMXContent.Convert(importPath, exportPath, Helper, ContentSource.ModFolder, Monitor))
                {
                    importFile.Delete();
                }
            }
            Monitor.Log("..Done!", LogLevel.Trace);
        }
Esempio n. 7
0
        private static void loadLevel(int l)
        {
            Game1.player.canOnlyWalk = true;
            if (l > maxLevel)
            {
                l = 1;
            }

            highestLevel = Math.Max(l, highestLevel);
            currentLevel = l;

            var check = Game1.getLocationFromName($"JoJaBanLevel{l}");

            if (check is GameLocation gl && gl.name.Value == $"JoJaBanLevel{l}")
            {
                string[] startTile    = ((string)gl.map.Properties["Start"]).Split(',');
                Vector2  startTilePos = new Vector2(int.Parse(startTile[0]), int.Parse(startTile[1]));
                Game1.warpFarmer($"JoJaBanLevel{l}", (int)startTilePos.X, (int)startTilePos.Y, 0);
                resetLevel(Game1.getLocationFromName($"JoJaBanLevel{l}"));
                return;
            }

            Map level = TMXContent.Load(Path.Combine("assets", "levels", $"level{l}.tmx"), SHelper);

            string[] start    = ((string)level.Properties["Start"]).Split(',');
            Vector2  startPos = new Vector2(int.Parse(start[0]), int.Parse(start[1]));

            string[] exit    = ((string)level.Properties["Exit"]).Split(',');
            Vector2  exitPos = new Vector2(int.Parse(exit[0]), int.Parse(exit[1]));

            level.GetLayer("Buildings").Tiles[(int)exitPos.X, (int)exitPos.Y].Properties.Add("Action", "JoJaBan.Exit");

            level.inject($"Maps/JoJaBanLevel{l}");

            GameLocation levelLocation = new GameLocation(Path.Combine("Maps", $"JoJaBanLevel{l}"), $"JoJaBanLevel{l}");

            Game1.warpFarmer($"JoJaBanLevel{l}", (int)startPos.X, (int)startPos.Y, 0);
            resetLevel(Game1.getLocationFromName($"JoJaBanLevel{l}"));
        }
        private void loadContentPacks()
        {
            foreach (StardewModdingAPI.IContentPack pack in Helper.GetContentPacks())
            {
                TMXContentPack tmxPack = pack.ReadJsonFile <TMXContentPack>("content.json");

                if (tmxPack.scripts.Count > 0)
                {
                    foreach (string script in tmxPack.scripts)
                    {
                        PyLua.loadScriptFromFile(Path.Combine(pack.DirectoryPath, script), pack.Manifest.UniqueID);
                    }
                }

                foreach (MapEdit edit in tmxPack.addMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.inject("Maps/" + edit.name);
                    map.enableMoreMapLayers();
                    GameLocation location;
                    if (map.Properties.ContainsKey("Outdoors") && map.Properties["Outdoors"] == "F")
                    {
                        location = new GameLocation(Path.Combine("Maps", edit.name), edit.name)
                        {
                            IsOutdoors = false
                        };
                        location.loadLights();
                        location.IsOutdoors = false;
                    }
                    else
                    {
                        location = new GameLocation(Path.Combine("Maps", edit.name), edit.name);
                    }

                    location.seasonUpdate(Game1.currentSeason);
                    mapsToSync.AddOrReplace(edit.name, map);
                    SaveEvents.AfterLoad += (s, e) => Game1.locations.Add(location);
                }

                foreach (MapEdit edit in tmxPack.replaceMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    map.enableMoreMapLayers();
                    Map original = edit.retainWarps ? Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent) : map;
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.mergeMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    Map       original   = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    Rectangle?sourceArea = null;

                    if (edit.sourceArea.Length == 4)
                    {
                        sourceArea = new Rectangle(edit.sourceArea[0], edit.sourceArea[1], edit.sourceArea[2], edit.sourceArea[3]);
                    }

                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), sourceArea, true);
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.enableMoreMapLayers();
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.mergeMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    Map       original   = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    Rectangle?sourceArea = null;

                    if (edit.sourceArea.Length == 4)
                    {
                        sourceArea = new Rectangle(edit.sourceArea[0], edit.sourceArea[1], edit.sourceArea[2], edit.sourceArea[3]);
                    }

                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), sourceArea, true);
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.enableMoreMapLayers();
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.onlyWarps)
                {
                    Map map = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }
            }
        }
        private void loadContentPacks()
        {
            foreach (StardewModdingAPI.IContentPack pack in Helper.ContentPacks.GetOwned())
            {
                TMXContentPack tmxPack = pack.ReadJsonFile <TMXContentPack>("content.json");

                if (tmxPack.scripts.Count > 0)
                {
                    foreach (string script in tmxPack.scripts)
                    {
                        PyLua.loadScriptFromFile(Path.Combine(pack.DirectoryPath, script), pack.Manifest.UniqueID);
                    }
                }

                PyLua.loadScriptFromFile(Path.Combine(Helper.DirectoryPath, "sr.lua"), "Platonymous.TMXLoader.SpouseRoom");

                List <MapEdit> spouseRoomMaps = new List <MapEdit>();
                foreach (SpouseRoom room in tmxPack.spouseRooms)
                {
                    if (room.tilefix && !Overrides.NPCs.Contains(room.name))
                    {
                        Overrides.NPCs.Add(room.name);
                    }

                    if (room.file != "none")
                    {
                        spouseRoomMaps.Add(new MapEdit()
                        {
                            info = room.name, name = "FarmHouse1_marriage", file = room.file, position = new[] { 29, 1 }
                        });
                        spouseRoomMaps.Add(new MapEdit()
                        {
                            info = room.name, name = "FarmHouse2_marriage", file = room.file, position = new[] { 35, 10 }
                        });
                    }
                }

                foreach (MapEdit edit in spouseRoomMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    if (edit.info != "none")
                    {
                        foreach (Layer layer in map.Layers)
                        {
                            layer.Id = layer.Id.Replace("Spouse", edit.info);
                        }
                    }

                    map.Properties.Add("EntryAction", "Lua Platonymous.TMXLoader.SpouseRoom entry");
                    Map original = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), null, true);
                    map.injectAs("Maps/" + edit.name);
                    //  mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (TileShop shop in tmxPack.shops)
                {
                    tileShops.AddOrReplace(shop.id, shop.inventory);
                    foreach (string path in shop.portraits)
                    {
                        pack.LoadAsset <Texture2D>(path).inject(@"Portraits/" + Path.GetFileNameWithoutExtension(path));
                    }
                }

                foreach (NPCPlacement edit in tmxPack.festivalSpots)
                {
                    Map       reference = Helper.Content.Load <Map>("Maps/Town", ContentSource.GameContent);
                    Map       original  = Helper.Content.Load <Map>("Maps/" + edit.map, ContentSource.GameContent);
                    Texture2D springTex = Helper.Content.Load <Texture2D>("Maps/spring_outdoorsTileSheet", ContentSource.GameContent);
                    Dictionary <string, string> source = Helper.Content.Load <Dictionary <string, string> >("Data\\NPCDispositions", ContentSource.GameContent);
                    int       index  = source.Keys.ToList().IndexOf(edit.name);
                    TileSheet spring = original.GetTileSheet("ztemp");
                    if (spring == null)
                    {
                        spring = new TileSheet("ztemp", original, "Maps/spring_outdoorsTileSheet", new xTile.Dimensions.Size(springTex.Width, springTex.Height), original.TileSheets[0].TileSize);
                        original.AddTileSheet(spring);
                    }
                    original.GetLayer("Set-Up").Tiles[edit.position[0], edit.position[1]] = new StaticTile(original.GetLayer("Set-Up"), spring, BlendMode.Alpha, (index * 4) + edit.direction);
                    original.injectAs("Maps/" + edit.map);
                    // mapsToSync.AddOrReplace(edit.map, original);
                }

                foreach (NPCPlacement edit in tmxPack.placeNPCs)
                {
                    helper.Events.GameLoop.SaveLoaded += (s, e) =>
                    {
                        if (Game1.getCharacterFromName(edit.name) == null)
                        {
                            Game1.locations.Where(gl => gl.Name == edit.map).First().addCharacter(new NPC(new AnimatedSprite("Characters\\" + edit.name, 0, 16, 32), new Vector2(edit.position[0], edit.position[1]), edit.map, 0, edit.name, edit.datable, (Dictionary <int, int[]>)null, Helper.Content.Load <Texture2D>("Portraits\\" + edit.name, ContentSource.GameContent)));
                        }
                    };
                }

                foreach (MapEdit edit in tmxPack.addMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.inject("Maps/" + edit.name);

                    edit._map = map;
                    addedLocations.Add(edit);
                    //mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.replaceMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    Map    original = edit.retainWarps ? Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent) : map;
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                    // mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.mergeMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    Map       original   = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    Rectangle?sourceArea = null;

                    if (edit.sourceArea.Length == 4)
                    {
                        sourceArea = new Rectangle(edit.sourceArea[0], edit.sourceArea[1], edit.sourceArea[2], edit.sourceArea[3]);
                    }

                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), sourceArea, edit.removeEmpty);
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                    // mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.onlyWarps)
                {
                    Map map = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.injectAs("Maps/" + edit.name);
                    // mapsToSync.AddOrReplace(edit.name, map);
                }
            }
        }
        private void loadContentPacks()
        {
            List <TMXContentPack> packs = new List <TMXContentPack>();

            PyUtils.loadContentPacks <TMXContentPack>(out packs, Path.Combine(Helper.DirectoryPath, contentFolder), SearchOption.AllDirectories, Monitor);

            foreach (TMXContentPack pack in packs)
            {
                if (pack.scripts.Count > 0)
                {
                    foreach (string script in pack.scripts)
                    {
                        PyLua.loadScriptFromFile(Path.Combine(Helper.DirectoryPath, contentFolder, pack.folderName, script), pack.folderName);
                    }
                }


                foreach (MapEdit edit in pack.addMaps)
                {
                    string filePath = Path.Combine(contentFolder, pack.folderName, edit.file);
                    Map    map      = TMXContent.Load(filePath, Helper);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.inject("Maps/" + edit.name);
                    addMoreMapLayers(map);
                    GameLocation location;
                    if (map.Properties.ContainsKey("Outdoors") && map.Properties["Outdoors"] == "F")
                    {
                        location = new GameLocation(map, edit.name)
                        {
                            isOutdoors = false
                        };
                        location.loadLights();
                        location.isOutdoors = false;
                    }
                    else
                    {
                        location = new GameLocation(map, edit.name);
                    }

                    location.seasonUpdate(Game1.currentSeason);

                    SaveEvents.AfterLoad += (s, e) => Game1.locations.Add(location);
                }

                foreach (MapEdit edit in pack.replaceMaps)
                {
                    string filePath = Path.Combine(contentFolder, pack.folderName, edit.file);
                    Map    map      = TMXContent.Load(filePath, Helper);
                    addMoreMapLayers(map);
                    Map original = edit.retainWarps ? Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent) : map;
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                }

                foreach (MapEdit edit in pack.mergeMaps)
                {
                    string filePath = Path.Combine(contentFolder, pack.folderName, edit.file);
                    Map    map      = TMXContent.Load(filePath, Helper);

                    Map       original   = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    Rectangle?sourceArea = null;

                    foreach (KeyValuePair <string, PropertyValue> p in map.Properties)
                    {
                        if (original.Properties.ContainsKey(p.Key))
                        {
                            if (p.Key == "EntryAction")
                            {
                                original.Properties[p.Key] = original.Properties[p.Key] + ";" + p.Value;
                            }
                            else
                            {
                                original.Properties[p.Key] = p.Value;
                            }
                        }
                        else
                        {
                            original.Properties.Add(p.Key, p.Value);
                        }
                    }

                    if (edit.sourceArea.Length == 4)
                    {
                        sourceArea = new Rectangle(edit.sourceArea[0], edit.sourceArea[1], edit.sourceArea[2], edit.sourceArea[3]);
                    }

                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), sourceArea);
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    addMoreMapLayers(map);
                    map.injectAs("Maps/" + edit.name);
                }

                foreach (MapEdit edit in pack.onlyWarps)
                {
                    Map map = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.injectAs("Maps/" + edit.name);
                }
            }
        }
Esempio n. 11
0
        private void loadContentPacks()
        {
            foreach (StardewModdingAPI.IContentPack pack in Helper.GetContentPacks())
            {
                TMXContentPack tmxPack = pack.ReadJsonFile <TMXContentPack>("content.json");

                if (tmxPack.scripts.Count > 0)
                {
                    foreach (string script in tmxPack.scripts)
                    {
                        PyLua.loadScriptFromFile(Path.Combine(pack.DirectoryPath, script), pack.Manifest.UniqueID);
                    }
                }

                PyLua.loadScriptFromFile(Path.Combine(Helper.DirectoryPath, "sr.lua"), "Platonymous.TMXLoader.SpouseRoom");

                List <MapEdit> spouseRoomMaps = new List <MapEdit>();
                foreach (SpouseRoom room in tmxPack.spouseRooms)
                {
                    if (room.tilefix && !Overrides.NPCs.Contains(room.name))
                    {
                        Overrides.NPCs.Add(room.name);
                    }

                    if (room.file != "none")
                    {
                        spouseRoomMaps.Add(new MapEdit()
                        {
                            info = room.name, name = "FarmHouse1_marriage", file = room.file, position = new[] { 29, 1 }
                        });
                        spouseRoomMaps.Add(new MapEdit()
                        {
                            info = room.name, name = "FarmHouse2_marriage", file = room.file, position = new[] { 35, 10 }
                        });
                    }
                }

                foreach (MapEdit edit in spouseRoomMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    if (edit.info != "none")
                    {
                        foreach (Layer layer in map.Layers)
                        {
                            layer.Id = layer.Id.Replace("Spouse", edit.info);
                        }
                    }

                    map.Properties.Add("EntryAction", "Lua Platonymous.TMXLoader.SpouseRoom entry");
                    Map original = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), null, true);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (NPCPlacement edit in tmxPack.festivalSpots)
                {
                    Map       reference = Helper.Content.Load <Map>("Maps/Town", ContentSource.GameContent);
                    Map       original  = Helper.Content.Load <Map>("Maps/" + edit.map, ContentSource.GameContent);
                    Texture2D springTex = Helper.Content.Load <Texture2D>("Maps/spring_outdoorsTileSheet", ContentSource.GameContent);
                    Dictionary <string, string> source = Helper.Content.Load <Dictionary <string, string> >("Data\\NPCDispositions", ContentSource.GameContent);
                    int       index  = source.Keys.ToList().IndexOf(edit.name);
                    TileSheet spring = original.GetTileSheet("ztemp");
                    if (spring == null)
                    {
                        spring = new TileSheet("ztemp", original, "Maps/spring_outdoorsTileSheet", new xTile.Dimensions.Size(springTex.Width, springTex.Height), original.TileSheets[0].TileSize);
                        original.AddTileSheet(spring);
                    }
                    original.GetLayer("Set-Up").Tiles[edit.position[0], edit.position[1]] = new StaticTile(original.GetLayer("Set-Up"), spring, BlendMode.Alpha, (index * 4) + edit.direction);
                    original.injectAs("Maps/" + edit.map);
                    mapsToSync.AddOrReplace(edit.map, original);
                }

                foreach (MapEdit edit in tmxPack.addMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.inject("Maps/" + edit.name);
                    GameLocation location;
                    if (map.Properties.ContainsKey("Outdoors") && map.Properties["Outdoors"] == "F")
                    {
                        location = new GameLocation(Path.Combine("Maps", edit.name), edit.name)
                        {
                            IsOutdoors = false
                        };
                        location.loadLights();
                        location.IsOutdoors = false;
                    }
                    else
                    {
                        location = new GameLocation(Path.Combine("Maps", edit.name), edit.name);
                    }

                    location.seasonUpdate(Game1.currentSeason);
                    mapsToSync.AddOrReplace(edit.name, map);
                    helper.Events.GameLoop.SaveLoaded += (s, e) => Game1.locations.Add(location);
                }

                foreach (MapEdit edit in tmxPack.replaceMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);
                    Map    original = edit.retainWarps ? Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent) : map;
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.mergeMaps)
                {
                    string filePath = Path.Combine(pack.DirectoryPath, edit.file);
                    Map    map      = TMXContent.Load(edit.file, Helper, pack);

                    Map       original   = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    Rectangle?sourceArea = null;

                    if (edit.sourceArea.Length == 4)
                    {
                        sourceArea = new Rectangle(edit.sourceArea[0], edit.sourceArea[1], edit.sourceArea[2], edit.sourceArea[3]);
                    }

                    map = map.mergeInto(original, new Vector2(edit.position[0], edit.position[1]), sourceArea, edit.removeEmpty);
                    editWarps(map, edit.addWarps, edit.removeWarps, original);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }

                foreach (MapEdit edit in tmxPack.onlyWarps)
                {
                    Map map = Helper.Content.Load <Map>("Maps/" + edit.name, ContentSource.GameContent);
                    editWarps(map, edit.addWarps, edit.removeWarps, map);
                    map.injectAs("Maps/" + edit.name);
                    mapsToSync.AddOrReplace(edit.name, map);
                }
            }
        }