Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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());
        }
Esempio n. 6
0
        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();
        }
Esempio n. 7
0
        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;
        }
Esempio n. 8
0
        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();
                }
            }
        }
Esempio n. 9
0
        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();
        }