コード例 #1
0
ファイル: Monster.cs プロジェクト: iliak/EOB2-Extractor
        public static Monster FromScript(Script script)
        {
            Monster m = new Monster();
            m.Index = script.ReadByte();
            m.TimeDelay = script.ReadByte();
            m.Position = Location.FromScript(script);
            m.SubPosition = script.ReadByte();
            m.Direction = script.ReadByte();
            m.Type = script.ReadByte();
            m.PictureIndex = script.ReadByte();
            m.Phase = script.ReadByte();
            m.Pause = script.ReadByte();
            m.Weapon = script.ReadAddr();
            m.PocketItem = script.ReadAddr();

            return m;
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: iliak/EOB2-Extractor
        /// <summary>
        /// 
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            byte b;
            ushort s;
            uint l;

            Maze = new Maze();

            //for (byte id = 1; id <= 16; id++)
            {
                //string filename = string.Format(@"c:\eob2-uncps\LEVEL{0}.INF_uncps", id);
                string filename = @"c:\eob2-uncps\LEVEL4.INF_uncps";
                using (Reader = new BinaryReader(File.Open(filename, FileMode.Open)))
                {

                    // Hunk1 offset
                    Maze.Hunks[1] = Reader.ReadUInt16();

                    #region Sub level data
                    for (byte sub = 0; sub < 2; sub++)
                    {
                        Header header = new Header();

                        if (Reader.BaseStream.Position < Maze.Hunks[1])
                        {
                            // Chunk offsets
                            header.NextHunk = Reader.ReadUInt16();

                            b = Reader.ReadByte();
                            if (b == 0xEC)
                            {
                                #region General informations
                                header.mazeName = ReadString(13);
                                header.vmpVcnName = ReadString(13);

                                if (Reader.ReadByte() != 0xFF)
                                    header.paletteName = ReadString(13);

                                header.SoundName = ReadString(13);

                                #endregion

                                #region Door name & Positions + offset
                                for (byte i = 0; i < 2; i++)
                                {
                                    DoorInfo door = header.Doors[i];

                                    b = Reader.ReadByte();
                                    if (b == 0xEC || b == 0xEA)
                                    {
                                        door.gfxfile = ReadString(13);
                                        door.idx = Reader.ReadByte();
                                        door.type = Reader.ReadByte();
                                        door.knob = Reader.ReadByte();

                                        for (byte t = 0; t < 3; t++)
                                        {
                                            door.DoorRectangle[t].X = Reader.ReadInt16();
                                            door.DoorRectangle[t].Y = Reader.ReadInt16();
                                            door.DoorRectangle[t].Width = Reader.ReadInt16();
                                            door.DoorRectangle[t].Height = Reader.ReadInt16();
                                        }

                                        for (byte t = 0; t < 2; t++)
                                        {
                                            door.ButtonRectangles[t].X = Reader.ReadInt16();
                                            door.ButtonRectangles[t].Y = Reader.ReadInt16();
                                            door.ButtonRectangles[t].Width = Reader.ReadInt16();
                                            door.ButtonRectangles[t].Height = Reader.ReadInt16();
                                        }

                                        for (byte t = 0; t < 2; t++)
                                        {
                                            door.ButtonPositions[t].X = Reader.ReadInt16();
                                            door.ButtonPositions[t].Y = Reader.ReadInt16();
                                        }
                                    }

                                }
                                #endregion

                                // Max nomber of monster ??
                                s = Reader.ReadUInt16();

                                #region Monsters graphics informations
                                for (byte i = 0; i < 2; i++)
                                {
                                    MonsterGFX gfx = header.MonsterGFX[i];

                                    b = Reader.ReadByte();
                                    if (b == 0xEC)
                                    {
                                        gfx.LoadProg = Reader.ReadByte();
                                        gfx.unk0 = Reader.ReadByte();
                                        gfx.label = ReadString(13);
                                        gfx.unk1 = Reader.ReadByte();
                                    }
                                }
                                #endregion

                                #region Monster definitions
                                while ((b = Reader.ReadByte()) != 0xFF)
                                {
                                    MonsterType m = new MonsterType();
                                    m.index = b;
                                    m.unk0 = Reader.ReadByte();
                                    m.THAC0 = Reader.ReadByte();
                                    m.unk1 = Reader.ReadByte();

                                    m.HPDice.Rolls = Reader.ReadByte();
                                    m.HPDice.Sides = Reader.ReadByte();
                                    m.HPDice.Base = Reader.ReadByte();

                                    m.numberOfAttacks = Reader.ReadByte();
                                    for (byte i = 0; i < 3; i++)
                                    {
                                        m.AttackDice[i].Rolls = Reader.ReadByte();
                                        m.AttackDice[i].Sides = Reader.ReadByte();
                                        m.AttackDice[i].Base = Reader.ReadByte();
                                    }

                                    m.specialAttackFlag = Reader.ReadUInt16();
                                    m.AbilitiesFlag = Reader.ReadUInt16();
                                    m.unk2 = Reader.ReadUInt16();
                                    m.EXPGain = Reader.ReadUInt16();
                                    m.size = Reader.ReadByte();
                                    m.attackSound = Reader.ReadByte();
                                    m.moveSound = Reader.ReadByte();
                                    m.unk3 = Reader.ReadByte();

                                    b = (byte)Reader.ReadByte();
                                    if (b != 0xff)
                                    {
                                        m.isAttack2 = true;
                                        m.distantAttack = Reader.ReadByte();
                                        m.maxAttackCount = Reader.ReadByte();

                                        for (byte i = 0; i < m.maxAttackCount; i++)
                                        {
                                            m.attackList[i] = Reader.ReadByte();

                                            Reader.ReadByte(); // Pad ???
                                        }
                                    }

                                    m.turnUndeadValue = Reader.ReadByte();
                                    m.unk4 = Reader.ReadByte();
                                    m.unk5[0] = Reader.ReadByte();
                                    m.unk5[1] = Reader.ReadByte();
                                    m.unk5[2] = Reader.ReadByte();

                                    header.MonsterTypes.Enqueue(m);
                                }
                                #endregion

                                #region Wall decoration data
                                b = Reader.ReadByte();
                                if (b != 0xFF)
                                {
                                    ushort decorateblocks = Reader.ReadUInt16();
                                    for (ushort i = 0; i < decorateblocks; i++)
                                    {
                                        DecorationInfo deco = new DecorationInfo();

                                        b = Reader.ReadByte();
                                        if (b == 0xEC)
                                        {
                                            deco.Files.GFXName = ReadString(13);
                                            deco.Files.DECName = ReadString(13);
                                        }
                                        else if (b == 0xFB)
                                        {
                                            deco.WallMappings.index = Reader.ReadByte();
                                            deco.WallMappings.WallType = Reader.ReadByte();
                                            deco.WallMappings.DecorationID = Reader.ReadByte();
                                            deco.WallMappings.EventMask = Reader.ReadByte();
                                            deco.WallMappings.Flags = Reader.ReadByte();
                                        }

                                        header.Decorations.Enqueue(deco);
                                    }
                                }
                                #endregion

                                while ((l = Reader.ReadUInt32()) != 0xFFFFFFFF)
                                {
                                }
                            }
                        }

                        Maze.Headers[sub] = header;
                    }
                    #endregion

                    // Hunk2 offset
                    Maze.Hunks[2] = Reader.ReadUInt16();

                    #region Monsters
                    b = Reader.ReadByte();
                    if (b != 0xff)
                    {
                        #region Monster timers
                        while ((b = Reader.ReadByte()) != 0xff)
                        {
                            Maze.Timer.Enqueue(Reader.ReadByte());
                        }
                        #endregion

                        #region Monster descriptions
                        for (byte i = 0; i < 30; i++)
                        {
                            Monster m = new Monster();
                            m.Index = Reader.ReadByte();
                            m.TimeDelay = Reader.ReadByte();
                            s = Reader.ReadUInt16();
                            m.Position = Location.FromValue(s); // new Point(s >> 5, s & 0x1F);
                            m.SubPosition = Reader.ReadByte();
                            m.Direction = Reader.ReadByte();
                            m.Type = Reader.ReadByte();
                            m.PictureIndex = Reader.ReadByte();
                            m.Phase = Reader.ReadByte();
                            m.Pause = Reader.ReadByte();
                            m.Weapon = Reader.ReadUInt16();
                            m.PocketItem = Reader.ReadUInt16();

                            Maze.Monsters.Enqueue(m);
                        }
                        #endregion
                    }
                    #endregion

                    #region Scripts
                    s = Reader.ReadUInt16();            // Script length
                    Maze.Script = new Script(Reader.ReadBytes(s - 2));
                    #endregion

                    #region Messages
                    while (Reader.BaseStream.Position < Maze.Hunks[2])
                    {
                        string str = SearchString();
                        Maze.Messages.Add(str);
                    }

                    #endregion

                    #region Triggers
                    ushort triggercount = Reader.ReadUInt16();
                    for (ushort i = 0; i < triggercount; i++)
                    {
                        Trigger t = new Trigger();
                        s = Reader.ReadUInt16();
                        t.Location = Location.FromValue(s); // new Point((byte)(s & 0x1f), (byte)((s >> 5) & 0x1f));
                        //t.Position = new Point((byte)((s >> 5) & 0x1f), (byte)(s & 0x1f));
                        //t.Position = new Point(s >> 5, s & 0x1F);
                        t.Flags = (TriggerFlag)Reader.ReadUInt16();
                        t.Offset = Reader.ReadUInt16();

                        Maze.Triggers.Enqueue(t);
                    }

                    #endregion
                }

                Console.WriteLine(Maze.Script.Decompile());
            }
        }
コード例 #3
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="script"></param>
 public CreateMonsterToken(Script script)
     : base(script)
 {
     Monster = Monster.FromScript(script);
 }