Instinct: Map Extension Support

This commit is contained in:
GrapeshotGames 2019-01-28 12:47:29 -05:00
parent fb4e0551aa
commit c6c2338443
5 changed files with 175 additions and 12 deletions

Binary file not shown.

View file

@ -42,6 +42,9 @@ namespace ServerGridEditor
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)] [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
public string islandTreasureBottleSupplyCrateOverrides = ""; public string islandTreasureBottleSupplyCrateOverrides = "";
[JsonIgnore]
public string modDir = null;
Image cachedImg = null; Image cachedImg = null;
Image cachedOptimizedImg = null; Image cachedOptimizedImg = null;

View file

@ -62,6 +62,8 @@
this.label11 = new System.Windows.Forms.Label(); this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label(); this.label12 = new System.Windows.Forms.Label();
this.instancesListBox = new System.Windows.Forms.ListBox(); this.instancesListBox = new System.Windows.Forms.ListBox();
this.label13 = new System.Windows.Forms.Label();
this.modNameTxtBox = new System.Windows.Forms.TextBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.spawnerOverridesGrid)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.spawnerOverridesGrid)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
@ -188,7 +190,6 @@
// //
// addSublevels // addSublevels
// //
this.addSublevels.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.addSublevels.Location = new System.Drawing.Point(96, 295); this.addSublevels.Location = new System.Drawing.Point(96, 295);
this.addSublevels.Name = "addSublevels"; this.addSublevels.Name = "addSublevels";
this.addSublevels.Size = new System.Drawing.Size(90, 24); this.addSublevels.Size = new System.Drawing.Size(90, 24);
@ -365,6 +366,22 @@
this.instancesListBox.Size = new System.Drawing.Size(194, 95); this.instancesListBox.Size = new System.Drawing.Size(194, 95);
this.instancesListBox.TabIndex = 39; this.instancesListBox.TabIndex = 39;
// //
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(20, 18);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(114, 13);
this.label13.TabIndex = 40;
this.label13.Text = "Unique Mod Extension";
//
// modNameTxtBox
//
this.modNameTxtBox.Location = new System.Drawing.Point(140, 15);
this.modNameTxtBox.Name = "modNameTxtBox";
this.modNameTxtBox.Size = new System.Drawing.Size(109, 20);
this.modNameTxtBox.TabIndex = 41;
//
// CreateIslandForm // CreateIslandForm
// //
this.AcceptButton = this.createBtn; this.AcceptButton = this.createBtn;
@ -372,6 +389,8 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelBtn; this.CancelButton = this.cancelBtn;
this.ClientSize = new System.Drawing.Size(609, 619); this.ClientSize = new System.Drawing.Size(609, 619);
this.Controls.Add(this.modNameTxtBox);
this.Controls.Add(this.label13);
this.Controls.Add(this.instancesListBox); this.Controls.Add(this.instancesListBox);
this.Controls.Add(this.label12); this.Controls.Add(this.label12);
this.Controls.Add(this.label11); this.Controls.Add(this.label11);
@ -454,5 +473,7 @@
private System.Windows.Forms.Label label11; private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12; private System.Windows.Forms.Label label12;
private System.Windows.Forms.ListBox instancesListBox; private System.Windows.Forms.ListBox instancesListBox;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox modNameTxtBox;
} }
} }

View file

@ -73,6 +73,8 @@ namespace ServerGridEditor
if (s != null) if (s != null)
instancesListBox.Items.Add(string.Format("({0}, {1})", s.gridX, s.gridY)); instancesListBox.Items.Add(string.Format("({0}, {1})", s.gridX, s.gridY));
} }
modNameTxtBox.Text = editedIsland.modDir;
} }
} }
@ -169,6 +171,7 @@ namespace ServerGridEditor
float.TryParse(minTreasureQualityTxtBox.Text, out minTreasureQuality); float.TryParse(minTreasureQualityTxtBox.Text, out minTreasureQuality);
float.TryParse(maxTreasureQualityTxtBox.Text, out maxTreasureQuality); float.TryParse(maxTreasureQualityTxtBox.Text, out maxTreasureQuality);
string islandRemovedFromMod = null;
if (editedIsland != null) if (editedIsland != null)
{ {
if (islandNameTxtBox.Text != editedIsland.name) //name changed if (islandNameTxtBox.Text != editedIsland.name) //name changed
@ -201,7 +204,8 @@ namespace ServerGridEditor
mainForm.islands.Add(editedIsland.name, editedIsland); mainForm.islands.Add(editedIsland.name, editedIsland);
//rename image //rename image
string newImgPath = MainForm.imgsDir + "/" + editedIsland.name + "_img.jpg"; string originalDirectory = Path.GetDirectoryName(editedIsland.imagePath);
string newImgPath = originalDirectory + "/" + editedIsland.name + "_img.jpg";
editedIsland.InvalidateImage(); editedIsland.InvalidateImage();
File.Move(editedIsland.imagePath, newImgPath); File.Move(editedIsland.imagePath, newImgPath);
@ -211,6 +215,52 @@ namespace ServerGridEditor
editedIsland.imagePath = newImgPath; editedIsland.imagePath = newImgPath;
} }
if (modNameTxtBox.Text != editedIsland.modDir)
{
//Mod dir changed
if (!string.IsNullOrWhiteSpace(modNameTxtBox.Text))
{
modNameTxtBox.Text.Trim();
string modDir = null;
modDir = MainForm.islandModsDir + "/" + modNameTxtBox.Text;
if (!Directory.Exists(modDir))
Directory.CreateDirectory(modDir);
if (!Directory.Exists(modDir + MainForm.modImgsDir))
Directory.CreateDirectory(modDir + MainForm.modImgsDir);
editedIsland.InvalidateImage();
string newImgPath = modDir + MainForm.modImgsDir + editedIsland.name + "_img.jpg";
File.Move(editedIsland.imagePath, newImgPath);
islandRemovedFromMod = editedIsland.modDir;
editedIsland.modDir = modNameTxtBox.Text;
if (pictureBox1.ImageLocation == editedIsland.imagePath)
pictureBox1.ImageLocation = newImgPath;
editedIsland.imagePath = newImgPath;
}
else
{
editedIsland.InvalidateImage();
string newImgPath = MainForm.imgsDir + "/" + editedIsland.name + "_img.jpg";
if (File.Exists(newImgPath))
File.Delete(newImgPath);
File.Move(editedIsland.imagePath, newImgPath);
islandRemovedFromMod = editedIsland.modDir;
editedIsland.modDir = null;
if (pictureBox1.ImageLocation == editedIsland.imagePath)
pictureBox1.ImageLocation = newImgPath;
editedIsland.imagePath = newImgPath;
}
}
editedIsland.x = x; editedIsland.x = x;
editedIsland.y = y; editedIsland.y = y;
@ -250,7 +300,7 @@ namespace ServerGridEditor
NewEntries.RemoveAll(item => { return string.IsNullOrWhiteSpace(item); }); NewEntries.RemoveAll(item => { return string.IsNullOrWhiteSpace(item); });
editedIsland.extraSublevels = NewEntries; editedIsland.extraSublevels = NewEntries;
mainForm.SaveIslands(); mainForm.SaveIslands(islandRemovedFromMod);
DialogResult = DialogResult.OK; DialogResult = DialogResult.OK;
Close(); Close();
} }
@ -279,8 +329,19 @@ namespace ServerGridEditor
spawnerOverrides.Add(name, template); spawnerOverrides.Add(name, template);
} }
string modDir = null;
if (!string.IsNullOrWhiteSpace(modNameTxtBox.Text))
{
modDir = MainForm.islandModsDir + "/" + modNameTxtBox.Text;
if (!Directory.Exists(modDir))
Directory.CreateDirectory(modDir);
if(!Directory.Exists(modDir + MainForm.modImgsDir))
Directory.CreateDirectory(modDir + MainForm.modImgsDir);
}
//Copy the image to our local imgs directory //Copy the image to our local imgs directory
string newImgPath = MainForm.imgsDir + "/" + Name + "_img.jpg"; string newImgPath = (modDir != null) ? (modDir + MainForm.modImgsDir) : MainForm.imgsDir;
newImgPath += "/" + Name + "_img.jpg";
File.Copy(ImgLocation, newImgPath, true); File.Copy(ImgLocation, newImgPath, true);
@ -288,6 +349,8 @@ namespace ServerGridEditor
minTreasureQuality, maxTreasureQuality, useNpcVolumesForTreasuresChkBox.Checked, useLevelBoundsForTreasuresChkBox.Checked, minTreasureQuality, maxTreasureQuality, useNpcVolumesForTreasuresChkBox.Checked, useLevelBoundsForTreasuresChkBox.Checked,
prioritizeVolumesForTreasuresChkBox.Checked, IslandTreasureBottleSupplyCrateOverridesTxtBox.Text, new List<string>(extraSublevelsTxtBox.Lines))); prioritizeVolumesForTreasuresChkBox.Checked, IslandTreasureBottleSupplyCrateOverridesTxtBox.Text, new List<string>(extraSublevelsTxtBox.Lines)));
mainForm.islands.Last().Value.modDir = modNameTxtBox.Text.Trim();
mainForm.RefreshIslandList(); mainForm.RefreshIslandList();
mainForm.SaveIslands(); mainForm.SaveIslands();

View file

@ -26,12 +26,15 @@ namespace ServerGridEditor
public partial class MainForm : Form public partial class MainForm : Form
{ {
public static string imgsDir = "./IslandImages"; public static string imgsDir = "./IslandImages";
public static string modImgsDir = "/Images/";
public static string waterTilesDir = "./WaterTiles"; public static string waterTilesDir = "./WaterTiles";
public static string foregroundTilesDir = "./Foregrounds"; public static string foregroundTilesDir = "./Foregrounds";
public static string dataDir = "./Data"; public static string dataDir = "./Data";
public static string exportDir = "./Export"; public static string exportDir = "./Export";
public static string islandModsDir = "./IslandExtensions";
public static string configSaveFile = dataDir + "/config.json"; public static string configSaveFile = dataDir + "/config.json";
public static string islandsSaveFile = dataDir + "/islands.json"; public static string islandsJson = "/islands.json";
public static string islandsSaveFile = dataDir + islandsJson;
public static string spawnersSaveFile = dataDir + "/spawners.json"; public static string spawnersSaveFile = dataDir + "/spawners.json";
public static string islandsSaveFileBackup = dataDir + "/islands-backup.json"; public static string islandsSaveFileBackup = dataDir + "/islands-backup.json";
@ -132,6 +135,8 @@ namespace ServerGridEditor
Directory.CreateDirectory(waterTilesDir); Directory.CreateDirectory(waterTilesDir);
if (!Directory.Exists(foregroundTilesDir)) if (!Directory.Exists(foregroundTilesDir))
Directory.CreateDirectory(foregroundTilesDir); Directory.CreateDirectory(foregroundTilesDir);
if (!Directory.Exists(islandModsDir))
Directory.CreateDirectory(islandModsDir);
//if (!Directory.Exists(exportDir)) //if (!Directory.Exists(exportDir))
// Directory.CreateDirectory(exportDir); // Directory.CreateDirectory(exportDir);
@ -511,7 +516,7 @@ namespace ServerGridEditor
foreach (Server s in currentProject.servers) foreach (Server s in currentProject.servers)
{ {
PointF serverCenter = new PointF(s.gridX * cellSize + cellSize / 2f, s.gridY * cellSize + cellSize / 2f); PointF serverCenter = new PointF(s.gridX * cellSize + cellSize / 2f, s.gridY * cellSize + cellSize / 2f);
serverCenter.Y -= cellSize * 0.15f; serverCenter.Y -= cellSize * 0.17f;
//Draw locks //Draw locks
if (!forExport) if (!forExport)
{ {
@ -579,6 +584,10 @@ namespace ServerGridEditor
continue; continue;
} }
string easyName = string.Format("{0}{1}", (char)(((int)'A') + s.gridX), s.gridY + 1);
g.DrawString(easyName, font, Brushes.Black, new PointF(serverCenter.X + dynamicOutlineShift, serverCenter.Y + dynamicOutlineShift), centeredStringFormat);
g.DrawString(easyName, font, Brushes.White, serverCenter, centeredStringFormat);
serverCenter.Y += stringSize.Height * 1.1f;
if (!string.IsNullOrWhiteSpace(s.MachineIdTag)) if (!string.IsNullOrWhiteSpace(s.MachineIdTag))
{ {
@ -1107,14 +1116,55 @@ namespace ServerGridEditor
mapPanel.Invalidate(); mapPanel.Invalidate();
} }
public void SaveIslands() public void SaveIslands(string islandRemovedFromMod = null)
{ {
//Take backup //Take backup
if (File.Exists(islandsSaveFile)) if (File.Exists(islandsSaveFile))
File.Copy(islandsSaveFile, islandsSaveFileBackup, true); File.Copy(islandsSaveFile, islandsSaveFileBackup, true);
string json = JsonConvert.SerializeObject(islands, Formatting.Indented); //Separate mod islands to be saved in their respective files
Dictionary<string, Dictionary<string, Island>> modsDict = new Dictionary<string, Dictionary<string, Island>>();
List<Island> allIslands = islands.Values.ToList();
Dictionary<string, Island> originalIslands = new Dictionary<string, Island>();
foreach (Island island in allIslands)
if (island.modDir != null)
{
//This is a mod island group it to be saved
Dictionary<string, Island> modIslandsDict = null;
if (!modsDict.TryGetValue(island.modDir, out modIslandsDict))
{
modIslandsDict = new Dictionary<string, Island>();
modsDict.Add(island.modDir, modIslandsDict);
}
modIslandsDict.Add(island.name, island);
}
else
{
originalIslands.Add(island.name, island);
}
//Serialize Main island file
string json = JsonConvert.SerializeObject(originalIslands, Formatting.Indented);
File.WriteAllText(islandsSaveFile, json); File.WriteAllText(islandsSaveFile, json);
//Serialize mod island files
foreach (KeyValuePair<string, Dictionary<string, Island>> kvp in modsDict)
{
string islandDataJson = islandModsDir + "/" + kvp.Key + islandsJson;
json = JsonConvert.SerializeObject(kvp.Value, Formatting.Indented);
File.WriteAllText(islandDataJson, json);
}
//Delete mod files if there are no more islands in it
if (islandRemovedFromMod != null && !modsDict.ContainsKey(islandRemovedFromMod))
{
string modDirPath = islandModsDir + "/" + islandRemovedFromMod;
if (Directory.Exists(modDirPath))
Directory.Delete(modDirPath, true);
}
} }
public void LoadIslands() public void LoadIslands()
@ -1122,15 +1172,39 @@ namespace ServerGridEditor
if (File.Exists(islandsSaveFile)) if (File.Exists(islandsSaveFile))
{ {
islands = JsonConvert.DeserializeObject<Dictionary<string, Island>>(File.ReadAllText(islandsSaveFile)); islands = JsonConvert.DeserializeObject<Dictionary<string, Island>>(File.ReadAllText(islandsSaveFile));
string[] modDirs = Directory.GetDirectories(islandModsDir);
foreach (string islandModDir in modDirs)
{
string dataFile = islandModDir + islandsJson;
if (File.Exists(dataFile))
{
Dictionary <string, Island> ModIslands = JsonConvert.DeserializeObject<Dictionary<string, Island>>(File.ReadAllText(dataFile));
if(ModIslands != null)
foreach(KeyValuePair<string, Island> kvp in ModIslands)
{
if (islands.ContainsKey(kvp.Key))
{
MessageBox.Show(string.Format("File {0} contains duplicate island named {1}, this island will not be imported", Path.GetFileName(dataFile), kvp.Key),
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
continue;
}
if (kvp.Value != null)
kvp.Value.modDir = Path.GetFileName(islandModDir);
islands.Add(kvp.Key, kvp.Value);
}
}
}
RefreshIslandList(); RefreshIslandList();
} }
} }
public void SaveProject() public void SaveProject()
{ {
JsonSerializerSettings settings = new JsonSerializerSettings(); SaveIslands();
string json = JsonConvert.SerializeObject(islands, Formatting.Indented);
File.WriteAllText(islandsSaveFile, json);
} }
/// <summary> /// <summary>
@ -1775,10 +1849,12 @@ namespace ServerGridEditor
} }
} }
string islandRemovedFromMod = null;
foreach (string islandToRemove in islandsToRemove) foreach (string islandToRemove in islandsToRemove)
{ {
//delete the image //delete the image
islands[islandToRemove].InvalidateImage(); islands[islandToRemove].InvalidateImage();
islandRemovedFromMod = islands[islandToRemove].modDir;
File.Delete(islands[islandToRemove].imagePath); File.Delete(islands[islandToRemove].imagePath);
islands.Remove(islandToRemove); islands.Remove(islandToRemove);
@ -1786,7 +1862,7 @@ namespace ServerGridEditor
RefreshIslandList(); RefreshIslandList();
mapPanel.Invalidate(); mapPanel.Invalidate();
SaveIslands(); SaveIslands(islandRemovedFromMod);
} }
private void showServerInfoCheckbox_CheckedChanged(object sender, EventArgs e) private void showServerInfoCheckbox_CheckedChanged(object sender, EventArgs e)