Esempio n. 1
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. 2
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);
        }