protected override ResourceFile OpenRoom(byte roomIndex) { var diskNum = Index.RoomResources[roomIndex].RoomNum; var diskName = Game.Pattern == null?string.Format("{0}.{1:000}", Game.Id, diskNum) : string.Format(Game.Pattern, diskNum); var game1Path = ScummHelper.NormalizePath(ServiceLocator.FileStorage.Combine(Directory, diskName)); var file = new ResourceFile7(ServiceLocator.FileStorage.OpenFileRead(game1Path)); return(file); }
public int IncreaseAnims(Actor a) { var aksq = ResourceFile7.ReadData(_akos, "AKSQ"); var akfo = ResourceFile7.ReadData(_akos, "AKFO"); var size = akfo == null ? 0 : akfo.Length / 2; var result = false; for (var i = 0; i < 16; i++) { if (a.Cost.Active[i] != 0) { result |= IncreaseAnim(a, i, aksq, akfo, size, vm); } } return(result ? 1 : 0); }
public void CostumeDecodeData(Actor a, int frame, uint usemask) { if (a.Costume == 0) { return; } LoadCostume(a.Costume); int anim; if (vm.Game.Version >= 7 && HasManyDirections()) { anim = ScummMath.ToSimpleDir(true, a.Facing) + frame * 8; } else { anim = ScummHelper.NewDirToOldDir(a.Facing) + frame * 4; } var akhd = ResourceFile7.ReadData <AkosHeader>(_akos, "AKHD"); if (anim >= akhd.num_anims) { return; } var akch = ResourceFile7.ReadData(_akos, "AKCH"); Debug.Assert(akch != null); var offs = BitConverter.ToUInt16(akch, anim * 2); if (offs == 0) { return; } var akst = ResourceFile7.ReadData(_akos, "AKST"); var aksf = ResourceFile7.ReadData(_akos, "AKSF"); var i = 0; var mask = BitConverter.ToUInt16(akch, offs); offs += 2; byte code; ushort start, len; do { if ((mask & 0x8000) != 0) { var akstPtr = 0; var aksfPtr = 0; code = akch[offs++]; if ((usemask & 0x8000) != 0) { switch (code) { case 1: a.Cost.Active[i] = 0; a.Cost.Frame[i] = (ushort)frame; a.Cost.End[i] = 0; a.Cost.Start[i] = 0; a.Cost.Curpos[i] = 0; // a.Cost.HeCondMaskTable[i] = 0; if (akst != null) { int size = akst.Length / 8; if (size > 0) { //bool found = false; while ((size--) != 0) { if (BitConverter.ToUInt32(akst, akstPtr) == 0) { // a.Cost.HeCondMaskTable[i] = BitConverter.ToUInt32(akst, akstPtr + 4); //found = true; break; } akstPtr += 8; } // if (!found) // { // Console.Error.WriteLine("Sequence not found in actor {0} costume {1}", a.Number, a.Costume); // } } } break; case 4: a.Cost.Stopped |= (ushort)(1 << i); break; case 5: a.Cost.Stopped &= (ushort)(~(1 << i)); break; default: start = BitConverter.ToUInt16(akch, offs); offs += 2; len = BitConverter.ToUInt16(akch, offs); offs += 2; // a.Cost.heJumpOffsetTable[i] = 0; // a.Cost.heJumpCountTable[i] = 0; if (aksf != null) { int size = aksf.Length / 6; if (size > 0) { //bool found = false; while ((size--) != 0) { if (BitConverter.ToUInt16(aksf, aksfPtr) == start) { // a.Cost.HeJumpOffsetTable[i] = BitConverter.ToUInt16(aksf, aksfPtr + 2); // a.Cost.HeJumpCountTable[i] = BitConverter.ToUInt16(aksf, aksfPtr + 4); //found = true; break; } aksfPtr += 6; } // if (!found) // { // Console.Error.WriteLine("Sequence not found in actor {0} costume {1}", a.Number, a.Costume); // } } } a.Cost.Active[i] = code; a.Cost.Frame[i] = (ushort)frame; a.Cost.End[i] = (ushort)(start + len); a.Cost.Start[i] = start; a.Cost.Curpos[i] = start; // a.Cost.HeCondMaskTable[i] = 0; if (akst != null) { int size = akst.Length / 8; if (size > 0) { //bool found = false; while ((size--) != 0) { if (BitConverter.ToUInt32(akst, akstPtr) == start) { // a.Cost.heCondMaskTable[i] = READ_LE_UINT32(akst + 4); //found = true; break; } akstPtr += 8; } // if (!found) // { // Console.Error.WriteLine("Sequence not found in actor {0} costume {1}", a.Number, a.Costume); // } } } break; } } else { if (code != 1 && code != 4 && code != 5) { offs += 2 * 2; } } } i++; mask <<= 1; usemask <<= 1; } while (mask != 0); }
protected bool HasManyDirections() { var akhd = ResourceFile7.ReadData <AkosHeader>(_akos, "AKHD"); return((akhd.flags & 2) != 0); }