コード例 #1
0
        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);
        }
コード例 #2
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);
        }
コード例 #3
0
        protected bool HasManyDirections()
        {
            var akhd = ResourceFile7.ReadData <AkosHeader>(_akos, "AKHD");

            return((akhd.flags & 2) != 0);
        }