protected unsafe override void WndProc(ref Message m) { switch (m.Msg) { // #define WM_WINDOWPOSCHANGED 0x0047 // #define SWP_NOZORDER 0x0004 case 0x47: WINDOWPOS *ppos = (WINDOWPOS *)m.LParam; if (ppos == null || (ppos->flags & 4) == 0) { DocManager.SetActiveDocument(typeof(LevelDoc), m_doc); DocManager.SetCommandTarget(this); } break; // #define WM_NCACTIVATE 0x0086 case 0x86: if (((ushort)m.WParam) != 0) { DocManager.SetCommandTarget(this); } break; } base.WndProc(ref m); }
private void menuItemScaleDown_Click(object sender, System.EventArgs e) { // If no template doc active, bail if (m_tmpdActive == null) { return; } // Make sure 24 x 24 (could actually allow any sort of conversion...) if (m_tmpdActive.TileSize.Width != 24 && m_tmpdActive.TileSize.Height != 24) { MessageBox.Show(DocManager.GetFrameParent(), "The current template collection must be 24 x 24 tile size"); return; } // Get busy TemplateDoc tmpdDst = TemplateTools.CloneTemplateDoc(m_tmpdActive); TemplateTools.ScaleTemplates(tmpdDst, new Size(16, 16)); TemplateTools.QuantizeTemplates(tmpdDst, null, 0, 0, 0); DocManager.SetActiveDocument(typeof(TemplateDoc), tmpdDst); }
private void menuItemQuantizeOnly_Click(object sender, System.EventArgs e) { if (m_tmpdActive == null) { return; } TemplateDoc tmpdDst = TemplateTools.CloneTemplateDoc(m_tmpdActive); TemplateTools.QuantizeTemplates(tmpdDst, null, 0, 0, 0); DocManager.SetActiveDocument(typeof(TemplateDoc), tmpdDst); }
public static TemplateDoc CloneTemplateDoc(TemplateDoc tmpdSrc) { // This should probably be on ICloneable::Clone() on TemplateDoc TemplateDoc tmpdDst = (TemplateDoc)DocManager.NewDocument(typeof(TemplateDoc), new Object[] { tmpdSrc.TileSize }); DocManager.SetActiveDocument(typeof(TemplateDoc), tmpdSrc); Template[] atmplSrc = tmpdSrc.GetTemplates(); Template tmplSrcBackground = tmpdSrc.GetBackgroundTemplate(); Template tmplDstBackground = null; ArrayList alsTmplDst = new ArrayList(); foreach (Template tmplSrc in atmplSrc) { Template tmplDst = new Template(tmpdDst, tmplSrc.Name); tmplDst.OccupancyMap = tmplSrc.OccupancyMap; tmplDst.TerrainMap = tmplSrc.TerrainMap; tmplDst.Bitmap = (Bitmap)tmplSrc.Bitmap.Clone(); alsTmplDst.Add(tmplDst); if (tmplSrc == tmplSrcBackground) { tmplDstBackground = tmplDst; } } if (tmplDstBackground != null) { tmpdDst.SetBackgroundTemplate(tmplDstBackground); } tmpdDst.AddTemplates((Template[])alsTmplDst.ToArray(typeof(Template))); Palette palSrc = tmpdSrc.GetPalette(); if (palSrc != null) { tmpdDst.SetPalette(palSrc, false); } return(tmpdDst); }
public static void SaveExpansionPdb(string strFile, Document[] adoc, string strVersion) { // First save all level docs //annoying //DocManager.SaveAllModified(typeof(LevelDoc)); // Remember active document LevelDoc lvldActive = (LevelDoc)DocManager.GetActiveDocument(typeof(LevelDoc)); // Save documents adoc in an expansion .pdb. Expansion .pdbs need: // - .lvl, .tmap, .trmap, but not .tsets since these come from game .pdbs // - need a version.txt // - need an if demo trigger check "inserted" at save time // - .pdb needs WARI creator, ADD1 type // - data should be compressed for obfuscation purposes PdbPacker pdbp = new PdbPacker(); // Add version.txt byte[] abT = new byte[strVersion.Length + 1]; for (int n = 0; n < strVersion.Length; n++) { abT[n] = (byte)strVersion[n]; } abT[abT.Length - 1] = 0; pdbp.Add(new PdbPacker.File("version.txt", abT)); // Load res.h from embedded resource in prep for pre-process System.Reflection.Assembly ass = typeof(GobImage).Module.Assembly; Stream stmResDotH = ass.GetManifestResourceStream("m.EmbeddedResources." + "res.h"); if (stmResDotH == null) { throw new Exception("Cannot load res.h"); } // Compile levels Random rand = new Random(); ArrayList alsTileSets = new ArrayList(); foreach (LevelDoc lvld in adoc) { // Need to do this unfortunately; some of the "saving" code relies on what the "active" document // is!! DocManager.SetActiveDocument(typeof(LevelDoc), lvld); TemplateDoc tmpd = lvld.GetTemplateDoc(); // Get appropriate TileSet, or make one if this map // uses a new tile collection TileSet tset = null; foreach (TileSet tsetT in alsTileSets) { if (tsetT.TemplateDoc == tmpd) { tset = tsetT; break; } } // Create new tile set if none found if (tset == null) { tset = new TileSet(tmpd, tmpd.GetName() + ".tset"); alsTileSets.Add(tset); } #if false // Generate base file name for this level (this is never user-visible, but it should be // as unique as possible char[] achBase = new char[16]; for (int n = 0; n < achBase.Length; n++) { int nT = rand.Next() % (26 + 10); if (nT < 26) { achBase[n] = (char)(nT + 97); } else { achBase[n] = (char)(nT + 48 - 26); } } if (lvld.MaxPlayers > 1) { achBase[0] = 'm'; achBase[1] = '_'; } string strBase = new String(achBase); #else // This isn't unique which can cause problems due to how packfiles work. // Could change packfile api to accept .pdb parameter. // Note1: set next mission action requires predictable filename // Note2: mission sorting is based on filename, not title // Could put lots of "support" in to fix these problems, or just ship // it like this. // // Hack: filename length 29 // Maximum extension on filename: 7 string strBase = lvld.Title; if (strBase.Length > 29 - 7) { strBase = strBase.Substring(0, 29 - 7); } // If multiplayer, add "m_" to the name by losing the last two characters // so sort order is preserved if (lvld.MaxPlayers > 1) { strBase = "m_" + strBase.Substring(0, strBase.Length - 2); } #endif // Get tile map file for this level MemoryStream stmTmap = new MemoryStream(); TileMap tmap = TileMap.CreateFromImage(tset, lvld.GetMapBitmap(tmpd.TileSize, tmpd, true), tmpd.TileSize); tmap.Save(stmTmap); string strTmap = strBase + ".tmap"; pdbp.Add(new PdbPacker.File(strTmap, stmTmap.ToArray())); stmTmap.Close(); // Get the terrain map file for this level MemoryStream stmTRmap = new MemoryStream(); TerrainMap trmap = new TerrainMap(lvld.GetTerrainMap(tmpd.TileSize, tmpd, false)); trmap.Save(stmTRmap); string strTRmap = strBase + ".trmap"; pdbp.Add(new PdbPacker.File(strTRmap, stmTRmap.ToArray())); stmTRmap.Close(); // Save .ini file for this level doc MemoryStream stmLvld = new MemoryStream(); lvld.SaveIni(stmLvld, -1, strTmap, strTRmap, tmpd.GetName() + ".palbin", true); // Pre-process stmLvld.Seek(0, SeekOrigin.Begin); MemoryStream stmPreprocessed = Misc.PreprocessStream(stmLvld, stmResDotH); stmPreprocessed.Seek(0, SeekOrigin.Begin); Ini iniPreProcessed = new Ini(stmPreprocessed); MemoryStream stmLvldPreProcessedBinary = new MemoryStream(); iniPreProcessed.SaveBinary(stmLvldPreProcessedBinary); stmLvldPreProcessedBinary.Close(); string strLvlName = lvld.OutputFilename; if (strLvlName == null) { strLvlName = strBase + ".lvl"; } pdbp.Add(new PdbPacker.File(strLvlName, stmLvldPreProcessedBinary.ToArray())); stmLvldPreProcessedBinary.Close(); } stmResDotH.Close(); // Restore active document if (lvldActive != null) { DocManager.SetActiveDocument(typeof(LevelDoc), lvldActive); } // Now save out pdb pdbp.Save(strFile, "WARI", "ADD2"); }
private void comboDocs_SelectedIndexChanged(object sender, System.EventArgs e) { ComboItem ci = (ComboItem)comboDocs.Items[comboDocs.SelectedIndex]; DocManager.SetActiveDocument(typeof(TemplateDoc), ci.m_tmpd); }