private int CompileLevels() { Level l = new Level(); Rom.ProtectionMode = RomWriteProtection.LevelData; foreach (LevelInfo li in ProjectController.LevelManager.Levels) { l.Load(li); levelAddressTable.Add(levelIndexTable[l.Guid], levelDataPointer); levelDataPointer = WriteLevel(l, levelDataPointer, li.Name); if (levelDataPointer >= 0xFC000) return -1; } int bank, address, lastLevelPointer = levelDataPointer; Rom.ProtectionMode = RomWriteProtection.LevelPointers; foreach (var index in levelAddressTable.Keys) { levelDataPointer = levelAddressTable[index]; bank = (byte)((levelDataPointer - 0x10) / 0x2000); address = (levelDataPointer - 0x10 - (bank * 0x2000) + 0xA000); Rom[0x24010 + (index * 4)] = (byte)bank; Rom[0x24011 + (index * 4)] = (byte)(address & 0x00FF); Rom[0x24012 + (index * 4)] = (byte)((address & 0xFF00) >> 8); Rom[0x24013 + (index * 4)] = (byte)levelTypeTable[index]; } return lastLevelPointer; }
private void button1_Click(object sender, EventArgs e) { StringBuilder output = new System.Text.StringBuilder(); Dictionary<BlockProperty, List<string>> powerupProperty = new Dictionary<BlockProperty, List<string>>(); powerupProperty[BlockProperty.FireFlower] = new List<string>(); powerupProperty[BlockProperty.SuperLeaf] = new List<string>(); powerupProperty[BlockProperty.FrogSuit] = new List<string>(); powerupProperty[BlockProperty.KoopaSuit] = new List<string>(); powerupProperty[BlockProperty.SledgeSuit] = new List<string>(); powerupProperty[BlockProperty.IceFlower] = new List<string>(); powerupProperty[BlockProperty.FireFoxSuit] = new List<string>(); powerupProperty[BlockProperty.BooSuit] = new List<string>(); powerupProperty[BlockProperty.NinjaSuit] = new List<string>(); foreach (LevelInfo info in ProjectController.LevelManager.Levels) { Level level = new Level(); level.Load(info); BlockDefinition definition = ProjectController.BlockManager.GetDefiniton(level.Type); for (int x = 0; x < level.Width; x++) { for (int y = 0; y < level.Height; y++) { BlockProperty bp = definition[level.LevelData[x, y]].BlockProperty; if (powerupProperty.ContainsKey(bp)) { if (!powerupProperty[bp].Contains(info.Name)) { powerupProperty[bp].Add(info.Name); } } } } } foreach (BlockProperty key in powerupProperty.Keys) { output.Append(key.ToString() + "(" + powerupProperty[key].Count + "): "); foreach (string s in powerupProperty[key]) { output.Append(s + ", "); } output.Append("\r\n\r\n\r\n"); } Output.Text = output.ToString(); }
public int WriteLevel(Level l, int levelAddress, string name) { name = name.ToUpper(); if (name.Length > 0x22) { name = name.Substring(0, 0x22); } else { name = name.PadRight(0x22, ' '); } int yStart = 0; yStart = l.YStart - 1; Rom[levelAddress++] = (byte)l.MostCommonTile; Rom[levelAddress++] = (byte)l.GraphicsBank; Rom[levelAddress++] = (byte)l.Palette; Rom[levelAddress++] = (byte)((l.AnimationType << 6) | (l.Length - 1)); Rom[levelAddress++] = (byte)(byte)(((l.XStart & 0x0F) << 4) | ((l.XStart & 0xF0) >> 4)); ; Rom[levelAddress++] = (byte)(byte)(((yStart & 0x0F) << 4) | ((yStart & 0xF0) >> 4)); ; Rom[levelAddress++] = (byte)(ProjectController.MusicManager.MusicList[l.Music].Value); Rom[levelAddress++] = (byte)(((l.Time / 100) << 4) | ((l.Time - ((l.Time / 100) * 100)) / 10)); Rom[levelAddress++] = (byte)((l.Pointers.Count << 4) | (l.VineBlocked ? 0x08 : 0x00) | l.ScrollType); Rom[levelAddress++] = (byte)((l.InvincibleEnemies ? 0x80 : 0x00) | (l.ProjectileBlocksTemporary ? 0x40 : 0x00) | (l.RhythmPlatforms ? 0x20 : 0x00) | (l.DpadTiles ? 0x10 : 0x00) | l.PaletteEffect); Rom[levelAddress++] = (byte)l.MiscByte1; Rom[levelAddress++] = (byte)l.MiscByte2; Rom[levelAddress++] = (byte)l.MiscByte3; for (int i = 0; i < 0x22; i++) { Rom[levelAddress++] = (byte)name[i]; } foreach (var p in l.Pointers.OrderBy(pt => pt.XEnter).ThenBy(pt => pt.YEnter)) { if (p.ExitsLevel) { Rom[levelAddress++] = (byte)p.World; } else { if (!levelIndexTable.ContainsKey(p.LevelGuid)) { Rom[levelAddress++] = 0; } else { Rom[levelAddress++] = levelIndexTable[p.LevelGuid]; } } int yExit = p.YExit; if (!p.ExitsLevel) { switch (p.ExitType) { default: yExit = p.YExit; break; case 0: case 2: case 3: case 4: yExit = p.YExit - 1; break; } } Rom[levelAddress++] = (byte)p.XEnter; Rom[levelAddress++] = (byte)p.YEnter; Rom[levelAddress++] = (byte)(((p.XExit & 0x0F) << 4) | ((p.XExit & 0xF0) >> 4)); if (p.ExitsLevel) { yExit += 2; } Rom[levelAddress++] = (byte)(((yExit & 0x0F) << 4) | ((yExit & 0xF0) >> 4)); Rom[levelAddress++] = (byte)((p.ExitsLevel ? 0x80 : 0x00) | (p.RedrawLevel ? 0x40 : 0x00) | (p.KeepObjects ? 0x20 : 0x00) | (p.DisableWeather ? 0x10 : 0x00) | (p.ExitType)); } byte[] levelData = l.GetCompressedData(); for (int i = 0; i < levelData.Length; i++) { Rom[levelAddress++] = levelData[i]; } Rom[levelAddress++] = (byte)0xFF; if (l.SpecialLevelType > 0 && l.SpecialLevelType < 4) { l.SpriteData.Add(new Sprite() { InGameID = 0x34, X = l.SpecialLevelType - 1 }); } if (l.ChallengeType > 0) { l.SpriteData.Add(new Sprite() { InGameID = 0xD4, Y = l.ChallengeType }); } switch (l.LevelLayout) { case LevelLayout.Horizontal: foreach (var s in from sprites in l.SpriteData orderby sprites.X select sprites) { Rom[levelAddress++] = (byte)s.InGameID; Rom[levelAddress++] = (byte)s.X; switch (s.InGameID) { case 0xA2: if (s.Property % 2 != 0) { Rom[levelAddress++] = (byte)((s.Property << 5) | (s.Y + 2)); } else { Rom[levelAddress++] = (byte)((s.Property << 5) | s.Y); } break; case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x80: case 0xA5: case 0xA7: Rom[levelAddress++] = (byte)((s.Property << 5) | (s.Y + 1)); break; case 0xA1: case 0xA3: Rom[levelAddress++] = (byte)((s.Property << 5) | (s.Y - 1)); break; default: Rom[levelAddress++] = (byte)((s.Property << 5) | s.Y); break; } } break; case LevelLayout.Vertical: foreach (var s in from sprites in l.SpriteData orderby sprites.Y select sprites) { Rom[levelAddress++] = (byte)s.InGameID; Rom[levelAddress++] = (byte)s.X; switch (s.InGameID) { case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x80: Rom[levelAddress++] = (byte)(s.Y + 1); break; default: Rom[levelAddress++] = (byte)s.Y; break; } } break; } Rom[levelAddress++] = 0xFF; return levelAddress; }
private void GetLevelInfo(Level l) { LvlView.Zoom = 1; LvlView.CurrentLevel = l; CurrentLevel = l; NumTime.Value = l.Time; NumBackground.Value = l.ClearValue; CurrentTable.SetGraphicsbank(2, ProjectController.GraphicsManager.GraphicsBanks[CurrentLevel.AnimationBank]); CurrentTable.SetGraphicsbank(3, ProjectController.GraphicsManager.GraphicsBanks[CurrentLevel.AnimationBank + 1]); CmbGraphics.SelectedIndex = l.GraphicsBank; if (CmbPalettes.Items.Count < l.Palette) { l.Palette = CmbPalettes.Items.Count - 1; } CmbPalettes.SelectedIndex = l.Palette; CmbTypes.SelectedIndex = l.Type - 1; CmbScroll.SelectedIndex = l.ScrollType; CmbMusic.SelectedIndex = l.Music >= CmbMusic.Items.Count ? 0 : l.Music; CmbLength.SelectedItem = l.Length; PntEditor.CurrentPointer = null; BtnAddPointer.Enabled = CurrentLevel.Pointers.Count <= 10; BtnDeletePointer.Enabled = false; NumSpecials.Value = (decimal)CurrentLevel.Settings.ItemTransparency; LvlView.DelayDrawing = false; LvlView.FullUpdate(); }
private void button2_Click(object sender, EventArgs e) { StringBuilder builder = new StringBuilder(); foreach (LevelInfo info in ProjectController.LevelManager.Levels) { Level l = new Level(); l.Load(info); if (l.SpriteData.Contains(CurrentSprite)) { builder.AppendLine(info.Name); } } MessageBox.Show(builder.ToString()); }
public void EditLevel(Level l) { GetLevelInfo(l); PntEditor.CurrentLevel = l; LblStartPoint.Text = string.Format("X: {0} Y: {1}", CurrentLevel.XStart.ToHexString(), CurrentLevel.YStart.ToHexString()); TsbGrid.Checked = CurrentLevel.Settings.ShowGrid; TsbItems.Checked = CurrentLevel.Settings.SpecialTiles; TsbSriteSpecials.Checked = CurrentLevel.Settings.SpecialSprites; TsbSolidity.Checked = CurrentLevel.Settings.BlockProperties; TsbStartPoint.Checked = CurrentLevel.Settings.ShowStart; TsbZoom.Checked = CurrentLevel.Settings.Zoom; txtMisc1.Text = CurrentLevel.MiscByte1.ToHexString(); txtMisc2.Text = CurrentLevel.MiscByte2.ToHexString(); txtMisc3.Text = CurrentLevel.MiscByte3.ToHexString(); CmbAnim.SelectedIndex = CurrentLevel.AnimationType; ChkInvincibleEnemies.Checked = CurrentLevel.InvincibleEnemies; CmbPaletteEffect.SelectedIndex = CurrentLevel.PaletteEffect; ChkProjectileSpins.Checked = CurrentLevel.ProjectileBlocksTemporary; ChkRhythm.Checked = CurrentLevel.RhythmPlatforms; ChkDpadTiles.Checked = CurrentLevel.DpadTiles; switch (CurrentLevel.Settings.DrawMode) { case TileDrawMode.Pencil: TsbPencil.Checked = true; TileDrawMode = TileDrawMode.Pencil; break; case TileDrawMode.Rectangle: TsbRectangle.Checked = true; TileDrawMode = TileDrawMode.Rectangle; break; case TileDrawMode.Outline: TsbOutline.Checked = true; TileDrawMode = TileDrawMode.Outline; break; case TileDrawMode.Line: TsbLine.Checked = true; TileDrawMode = TileDrawMode.Line; break; case TileDrawMode.Fill: TileDrawMode = TileDrawMode.Fill; TsbBucket.Checked = true; break; case TileDrawMode.Replace: TileDrawMode = TileDrawMode.Replace; TsbReplace.Checked = true; break; } switch (CurrentLevel.Settings.EditMode) { case EditMode.Tiles: TabEditSelector.SelectedIndex = 0; EditMode = EditMode.Tiles; break; case EditMode.Sprites: TabEditSelector.SelectedIndex = 1; EditMode = EditMode.Sprites; break; case EditMode.Pointers: TabEditSelector.SelectedIndex = 2; EditMode = EditMode.Pointers; break; } CmbLayouts.SelectedIndex = CurrentLevel.Settings.Layout; PnlHorizontalGuide.GuideColor = CurrentLevel.Settings.HGuideColor; PnlVerticalGuide.GuideColor = CurrentLevel.Settings.VGuideColor; TsbPointers.Checked = CurrentLevel.Settings.ShowPointers; this.Text = ProjectController.LevelManager.GetLevelInfo(l.Guid).Name; this.WindowState = FormWindowState.Maximized; this.Show(); LvlView.FullUpdate(); }
public bool CreateNewLevel(string name, LevelType levelType, LevelLayout layout, WorldInfo worldinfo) { Level l = new Level(); l.LevelLayout = layout; l.Palette = levelType.InGameID; switch (levelType.InGameID) { case 1: l.GraphicsBank = 0x08; l.ClearValue = 0x90; break; case 2: l.GraphicsBank = 0x10; l.ClearValue = 0x90; break; case 3: l.GraphicsBank = 0x6C; l.ClearValue = 0x90; break; case 4: l.GraphicsBank = 0x06; l.ClearValue = 0x90; break; case 5: l.GraphicsBank = 0x58; l.ClearValue = 0x90; break; case 6: l.GraphicsBank = 0x58; l.ClearValue = 0x90; break; case 7: l.GraphicsBank = 0x5C; l.ClearValue = 0x90; break; case 8: l.GraphicsBank = 0x3E; l.ClearValue = 0x80; break; case 9: l.GraphicsBank = 0x30; l.ClearValue = 0x90; break; case 10: l.GraphicsBank = 0x34; l.ClearValue = 0x90; break; case 11: l.GraphicsBank = 0x6E; l.ClearValue = 0x90; break; case 12: l.GraphicsBank = 0x18; l.ClearValue = 0x90; break; case 13: l.GraphicsBank = 0x38; l.ClearValue = 0x90; break; case 14: l.GraphicsBank = 0x1C; l.ClearValue = 0x90; break; } l.Guid = Guid.NewGuid(); l.Length = 0x0A; l.Type = levelType.InGameID; l.Music = 0x00; l.Time = 300; l.PaletteEffect = 0; l.InvincibleEnemies = false; l.VineBlocked = false; l.XStart = 0x00; l.YStart = 0x14; for(int j = 0; j < l.Height; j++) { for(int i = 0; i < l.Width; i++) { l.LevelData[i, j] = (byte) l.ClearValue; } } LevelInfo li = new LevelInfo() { Name = name, LevelGuid = l.Guid, WorldGuid = worldinfo.WorldGuid, LevelType = l.Type, Layout = l.LevelLayout }; Levels.Add(li); levelLookup.Add(l.Guid, li); if (l.Save()) { if (LevelAdded != null) LevelAdded(this, new TEventArgs<LevelInfo>(li)); } return true; }
public static void ImportLevel() { OpenFileDialog OFD = new OpenFileDialog(); OFD.DefaultExt = "lvl"; DialogResult result = OFD.ShowDialog(); OFD.Dispose(); if (result == DialogResult.OK) { Level level = new Level(); level.Load(OFD.FileName); LevelInfo li = new LevelInfo(); li.LevelGuid = level.Guid; li.WorldGuid = ProjectController.WorldManager.Worlds[0].WorldGuid; li.Name = "Imported Level"; li.LevelType = level.Type; if (!ProjectController.LevelManager.AddLevel(li)) { MessageBox.Show("Could not import level. Make sure the level does not already exist."); } else { level.Save(); } } }
public static void EditLevel(LevelInfo li) { if (editorTable.ContainsKey(li.LevelGuid)) { editorTable[li.LevelGuid].Activate(); return; } Level l = new Level(); l.Load(li); LevelEditor le = new LevelEditor(); le.MdiParent = MainWindow; le.EditLevel(l); le.FormClosed += new FormClosedEventHandler(le_FormClosed); le.Activated += new EventHandler(le_Activated); ActiveEditor = le; editorTable.Add(li.LevelGuid, le); MainWindow.HideProjectview(); }