public IPubFile <EIFRecord> LoadPubFromExplicitFile(string fileName)
        {
            var fileBytes = File.ReadAllBytes(fileName);

            var pub = new EIFFile();

            pub.DeserializeFromByteArray(fileBytes, _numberEncoderService);

            return(pub);
        }
Пример #2
0
        public async Task <IPubFile> RequestFile(InitFileType fileType)
        {
            var request = new PacketBuilder(PacketFamily.Welcome, PacketAction.Agree)
                          .AddChar((byte)fileType)
                          .Build();

            var response = await _packetSendService.SendEncodedPacketAndWaitAsync(request);

            if (!PacketIsValid(response))
            {
                throw new EmptyPacketReceivedException();
            }

            var responseFileType = (InitReply)response.ReadChar();

            var extraByte = response.ReadChar();

            if (extraByte != 1)
            {
                throw new MalformedPacketException("Missing extra single byte in file transfer packet", response);
            }

            IPubFile retFile;

            switch (responseFileType)
            {
            case InitReply.ItemFile: retFile = new EIFFile(); break;

            case InitReply.NpcFile: retFile = new ENFFile(); break;

            case InitReply.SpellFile: retFile = new ESFFile(); break;

            case InitReply.ClassFile: retFile = new ECFFile(); break;

            default: throw new EmptyPacketReceivedException();
            }

            var responseBytes = response.ReadBytes(response.Length - response.ReadPosition)
                                .ToArray();

            retFile.DeserializeFromByteArray(responseBytes, _numberEncoderService);

            return(retFile);
        }
        public ISpriteSheet GetShieldTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.ShieldGraphic == 0)
            {
                return(new EmptySpriteSheet());
            }

            var type   = ArmorShieldSpriteType.Standing;
            var offset = GetBaseOffsetFromDirection(characterRenderProperties.Direction);

            //front shields have one size gfx, back arrows/wings have another size.
            if (!EIFFile.IsShieldOnBack(characterRenderProperties.ShieldGraphic))
            {
                if (characterRenderProperties.CurrentAction == CharacterActionState.Walking)
                {
                    switch (characterRenderProperties.WalkFrame)
                    {
                    case 1: type = ArmorShieldSpriteType.WalkFrame1; break;

                    case 2: type = ArmorShieldSpriteType.WalkFrame2; break;

                    case 3: type = ArmorShieldSpriteType.WalkFrame3; break;

                    case 4: type = ArmorShieldSpriteType.WalkFrame4; break;
                    }
                }
                else if (characterRenderProperties.CurrentAction == CharacterActionState.Attacking)
                {
                    switch (characterRenderProperties.AttackFrame)
                    {
                    case 1: type = ArmorShieldSpriteType.PunchFrame1; break;

                    case 2: type = ArmorShieldSpriteType.PunchFrame2; break;
                    }
                }
                else if (characterRenderProperties.CurrentAction == CharacterActionState.SpellCast)
                {
                    type = ArmorShieldSpriteType.SpellCast;
                }
                else if (characterRenderProperties.CurrentAction == CharacterActionState.Sitting)
                {
                    return(new EmptySpriteSheet());
                }

                offset *= GetOffsetBasedOnState(type);
            }
            else
            {
                //different gfx numbering scheme for shield items worn on the back:
                //    Standing = 1/2
                //    Attacking = 3/4
                //    Extra = 5 (unused?)
                if (characterRenderProperties.CurrentAction == CharacterActionState.Attacking)
                {
                    type = ArmorShieldSpriteType.ShieldItemOnBack_AttackingWithBow;
                }
            }

            var gfxFile = characterRenderProperties.Gender == 0 ? GFXTypes.FemaleBack : GFXTypes.MaleBack;

            var baseShieldValue = GetBaseShieldGraphic(characterRenderProperties.ShieldGraphic);
            var gfxNumber       = baseShieldValue + (int)type + offset;

            return(new SpriteSheet(_gfxManager.TextureFromResource(gfxFile, gfxNumber, true)));
        }