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; }
/// <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()); } }
/// <summary> /// /// </summary> /// <param name="script"></param> public CreateMonsterToken(Script script) : base(script) { Monster = Monster.FromScript(script); }