예제 #1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="script"></param>
        /// <returns></returns>
        public static Monster FromScript(Script script)
        {
            Monster m = new Monster();
            m.Index = script.ReadByte();
            m.TimerID = script.ReadByte();
            m.Location = Location.FromScript(script);
            m.SubPosition = (BlockSubPosition)script.ReadByte();
            m.Direction = (Compass)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
 /// <summary>
 /// 
 /// </summary>
 /// <param name="script"></param>
 public CreateMonsterToken(Script script)
     : base(script)
 {
     Monster = Monster.FromScript(script);
 }
예제 #3
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filename"></param>
        public static Maze FromFile(byte id, string filename)
        {
            Maze maze = new Maze(id);
            byte b;
            ushort s;

            #region Loading INF file
            using (BinaryReader reader = new BinaryReader(File.Open(filename + ".inf", FileMode.Open)))
            {

                // Hunk1 offset
                maze.Hunks[1] = reader.ReadUInt16();

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

                    if (reader.BaseStream.Position < maze.Hunks[1])
                    {
                        MazeHeader header = new MazeHeader();

                        // Chunk offsets
                        header.NextHunk = reader.ReadUInt16();

                        b = reader.ReadByte();
                        if (b == 0xEC)
                        {
                            #region General informations
                            header.MazeName = ReadString(reader, 13);
                            header.VmpVcnName = ReadString(reader, 13);

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

                            header.SoundName = ReadString(reader, 13);

                            #endregion

                            #region Door name & Positions + offset
                            for (byte i = 0; i < 2; i++)
                            {

                                b = reader.ReadByte();
                                if (b == 0xEC || b == 0xEA)
                                {
                                    DoorInfo door = new DoorInfo();
                                    door.GfxName = ReadString(reader, 13);
                                    door.Id = reader.ReadByte();
                                    door.Type = reader.ReadByte();
                                    door.knob = reader.ReadByte();

                                    for (byte t = 0; t < 3; t++)
                                        door.DoorRectangle[t] = new Rectangle(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16());

                                    for (byte t = 0; t < 2; t++)
                                        door.ButtonRectangles[t] = new Rectangle(reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16(), reader.ReadInt16());

                                    for (byte t = 0; t < 2; t++)
                                        door.ButtonPositions[t] = new Point(reader.ReadInt16(), reader.ReadInt16());
                                    header.Doors[i] = door;
                                }
                            }
                            #endregion

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

                            #region Monsters graphics informations
                            for (byte i = 0; i < 2; i++)
                            {
                                b = reader.ReadByte();
                                if (b == 0xEC)
                                {
                                    MonsterGFX gfx = new MonsterGFX();
                                    gfx.LoadProg = reader.ReadByte();
                                    gfx.unk0 = reader.ReadByte();
                                    gfx.Label = ReadString(reader, 13);
                                    gfx.unk1 = reader.ReadByte();
                                    header.MonsterGFX[i] = gfx;
                                }
                            }
                            #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] = new Dice(reader);
                                }

                                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.Add(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 = new DecorationFileName();
                                        deco.Files.GFXName = ReadString(reader, 13);
                                        deco.Files.DECName = ReadString(reader, 13);
                                    }
                                    else if (b == 0xFB)
                                    {
                                        deco.WallMappings = new WallMapping();
                                        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.Add(deco);
                                }
                            }
                            #endregion

                            while (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.Add(reader.ReadByte());
                    }
                    #endregion

                    #region Monster descriptions
                    for (byte i = 0; i < 30; i++)
                    {
                        Monster m = new Monster();
                        m.Index = reader.ReadByte();
                        m.TimerID = reader.ReadByte();
                        s = reader.ReadUInt16();
                        m.Location = Location.FromValue(s); // new Point(s >> 5, s & 0x1F);
                        m.SubPosition = (BlockSubPosition)reader.ReadByte();
                        m.Direction = (Compass)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.Add(m);
                    }
                    #endregion
                }
                #endregion

                #region Scripts
                s = reader.ReadUInt16();            // Script length
                maze.Script = new Script(maze, reader.ReadBytes(s - 2));
                #endregion

                #region Messages
                while (reader.BaseStream.Position < maze.Hunks[2])
                {
                    string str = SearchString(reader);
                    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.Add(t);
                }

                #endregion
            }
            #endregion

            #region Load .MAZ file
            if (File.Exists(filename + ".maz"))
            {
                using (BinaryReader reader = new BinaryReader(File.Open(filename + ".maz", FileMode.Open)))
                {
                    maze.Size = new Size(reader.ReadUInt16(), reader.ReadUInt16());
                    maze.WallFaces = reader.ReadUInt16();

                    maze.Blocks = new MazeBlock[maze.Size.Width, maze.Size.Height];

                    for (byte y = 0; y < maze.Size.Height; y++)
                    {
                        for (byte x = 0; x < maze.Size.Width; x++)
                        {
                            maze.Blocks[x, y] = MazeBlock.FromFile(reader);
                        }
                    }
                }
            }
            #endregion

            return maze;
        }