public ISpriteSheet GetFaceTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.EmoteFrame < 0 ||
                characterRenderProperties.Emote == Emote.Trade ||
                characterRenderProperties.Emote == Emote.LevelUp)
            {
                return(new EmptySpriteSheet());
            }

            //14 rows (7 female - 7 male) / 11 columns
            const int ROWS = 14;
            const int COLS = 11;

            var texture = _gfxManager.TextureFromResource(GFXTypes.SkinSprites, 8, true);

            var widthDelta   = texture.Width / COLS;
            var heightDelta  = texture.Height / ROWS;
            var genderOffset = texture.Height / 2 * characterRenderProperties.Gender;
            //'playful' is the last face in the gfx (ndx 10), even though it has enum value of 14 (ndx 13)
            var emote = characterRenderProperties.Emote == Emote.Playful ||
                        characterRenderProperties.Emote == Emote.Drunk
                        ? 10 : (int)characterRenderProperties.Emote - 1;

            var sourceRectangle = new Rectangle(widthDelta * emote, heightDelta * characterRenderProperties.Race + genderOffset, widthDelta, heightDelta);

            return(new SpriteSheet(texture, sourceRectangle));
        }
Beispiel #2
0
        private static CharacterRenderProperties MakeCopy(ICharacterRenderProperties other)
        {
            return(new CharacterRenderProperties
            {
                CurrentAction = other.CurrentAction,

                HairStyle = other.HairStyle,
                HairColor = other.HairColor,
                Race = other.Race,
                Gender = other.Gender,

                BootsGraphic = other.BootsGraphic,
                ArmorGraphic = other.ArmorGraphic,
                HatGraphic = other.HatGraphic,
                ShieldGraphic = other.ShieldGraphic,
                WeaponGraphic = other.WeaponGraphic,

                Direction = other.Direction,
                MapX = other.MapX,
                MapY = other.MapY,

                WalkFrame = other.WalkFrame,
                AttackFrame = other.AttackFrame,
                EmoteFrame = other.EmoteFrame,

                SitState = other.SitState,
                Emote = other.Emote,

                IsHidden = other.IsHidden,
                IsDead = other.IsDead
            });
        }
        public ISpriteSheet GetEmoteTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.Emote == 0 || characterRenderProperties.EmoteFrame < 0)
            {
                return(new EmptySpriteSheet());
            }

            const int NUM_EMOTES = 15;
            const int NUM_FRAMES = 4;

            var emoteValue = Enum.GetName(typeof(Emote), characterRenderProperties.Emote) ?? "";
            var convertedValuesDictionary = Enum.GetNames(typeof(EmoteSpriteType))
                                            .ToDictionary(x => x, x => (EmoteSpriteType)Enum.Parse(typeof(EmoteSpriteType), x));
            var convertedEmote = (int)convertedValuesDictionary[emoteValue];

            var emoteTexture = _gfxManager.TextureFromResource(GFXTypes.PostLoginUI, 38, true);

            var eachSet   = emoteTexture.Width / NUM_EMOTES;
            var eachFrame = emoteTexture.Width / (NUM_EMOTES * NUM_FRAMES);
            var startX    = convertedEmote * eachSet + characterRenderProperties.EmoteFrame * eachFrame;

            var emoteRect = new Rectangle(startX, 0, eachFrame, emoteTexture.Height);

            return(new SpriteSheet(emoteTexture, emoteRect));
        }
Beispiel #4
0
        private ICharacterRenderer InitializeRendererForCharacter(ICharacterRenderProperties renderProperties)
        {
            var renderer = _characterRendererFactory.CreateCharacterRenderer(renderProperties);

            renderer.Initialize();
            return(renderer);
        }
 public HairRenderer(ICharacterRenderProperties renderProperties,
                     ISpriteSheet hairSheet)
     : base(renderProperties)
 {
     _hairSheet = hairSheet;
     _hairRenderLocationCalculator = new HairRenderLocationCalculator(_renderProperties);
 }
        public ISpriteSheet GetSkinTexture(ICharacterRenderProperties characterRenderProperties)
        {
            var sheetRows    = 7;
            var sheetColumns = 4;
            var gfxNum       = 1;

            if (characterRenderProperties.CurrentAction == CharacterActionState.Walking && characterRenderProperties.WalkFrame > 0)
            {
                gfxNum       = 2;
                sheetColumns = 16;
            }
            else if (characterRenderProperties.CurrentAction == CharacterActionState.Attacking && characterRenderProperties.AttackFrame > 0)
            {
                if (!BowIsEquipped(characterRenderProperties))
                {
                    gfxNum       = 3;
                    sheetColumns = 8;
                }
                else if (characterRenderProperties.AttackFrame == 1) //only 1 frame of bow/gun animation
                {
                    gfxNum = 7;                                      //4 columns in this one too
                }
            }
            else if (characterRenderProperties.CurrentAction == CharacterActionState.SpellCast)
            {
                gfxNum = 4;
            }
            else if (characterRenderProperties.CurrentAction == CharacterActionState.Sitting)
            {
                if (characterRenderProperties.SitState == SitState.Floor)
                {
                    gfxNum = 6;
                }
                else if (characterRenderProperties.SitState == SitState.Chair)
                {
                    gfxNum = 5;
                }
            }

            var texture = _gfxManager.TextureFromResource(GFXTypes.SkinSprites, gfxNum, true);

            var rotated = characterRenderProperties.Direction == EODirection.Left ||
                          characterRenderProperties.Direction == EODirection.Up;

            var heightDelta  = texture.Height / sheetRows;
            var widthDelta   = texture.Width / sheetColumns;
            var sectionDelta = texture.Width / 4;

            var walkExtra = characterRenderProperties.WalkFrame > 0 ? widthDelta * (characterRenderProperties.WalkFrame - 1) : 0;

            walkExtra = !BowIsEquipped(characterRenderProperties) && characterRenderProperties.AttackFrame > 0 ? widthDelta * (characterRenderProperties.AttackFrame - 1) : walkExtra;

            var sourceArea = new Rectangle(
                characterRenderProperties.Gender * widthDelta * (sheetColumns / 2) + (rotated ? sectionDelta : 0) + walkExtra,
                characterRenderProperties.Race * heightDelta,
                widthDelta,
                heightDelta);

            return(new SpriteSheet(texture, sourceArea));
        }
Beispiel #7
0
        public ICharacter WithRenderProperties(ICharacterRenderProperties renderProperties)
        {
            var character = MakeCopy(this);

            character.RenderProperties = renderProperties;
            return(character);
        }
Beispiel #8
0
        public SkinRenderer(ICharacterRenderProperties renderProperties,
                            ISpriteSheet skinSheet)
            : base(renderProperties)
        {
            _skinSheet = skinSheet;

            _skinRenderLocationCalculator = new SkinRenderLocationCalculator(_renderProperties);
        }
 public ShieldRenderer(ICharacterRenderProperties renderProperties,
                       ISpriteSheet shieldSheet,
                       bool isShieldOnBack)
     : base(renderProperties)
 {
     _shieldSheet    = shieldSheet;
     _isShieldOnBack = isShieldOnBack;
 }
Beispiel #10
0
 public ArmorRenderer(ICharacterRenderProperties renderProperties,
                      Texture2D armorTexture,
                      IPubFile <EIFRecord> itemFile)
 {
     _renderProperties = renderProperties;
     _armorTexture     = armorTexture;
     _itemFile         = itemFile;
 }
        public int CalculateOffsetY(ICharacterRenderProperties properties)
        {
            var multiplier = properties.IsFacing(EODirection.Left, EODirection.Up) ? -1 : 1;
            var walkAdjust = properties.IsActing(CharacterActionState.Walking) ? WalkHeightFactor * properties.WalkFrame : 0;

            //walkAdjust * multiplier is the old ViewAdjustY
            return(properties.MapX * HeightFactor + properties.MapY * HeightFactor + walkAdjust * multiplier);
        }
Beispiel #12
0
 public BootsRenderer(ICharacterRenderProperties renderProperties,
                      Texture2D bootsTexture,
                      IPubFile <EIFRecord> itemFile)
 {
     _renderProperties = renderProperties;
     _bootsTexture     = bootsTexture;
     _itemFile         = itemFile;
 }
Beispiel #13
0
 public EmoteRenderer(ICharacterRenderProperties renderProperties,
                      ISpriteSheet emoteSheet,
                      IPubFile <EIFRecord> itemFile)
 {
     _renderProperties             = renderProperties;
     _emoteSheet                   = emoteSheet;
     _skinRenderLocationCalculator = new SkinRenderLocationCalculator(_renderProperties, itemFile);
 }
Beispiel #14
0
 public WeaponRenderer(ICharacterRenderProperties renderProperties,
                       ISpriteSheet weaponSheet,
                       bool isRangedWeapon)
     : base(renderProperties)
 {
     _weaponSheet    = weaponSheet;
     _isRangedWeapon = isRangedWeapon;
 }
Beispiel #15
0
 public WeaponRenderer(ICharacterRenderProperties renderProperties,
                       Texture2D weaponTexture,
                       IPubFile <EIFRecord> itemFile)
 {
     _renderProperties = renderProperties;
     _weaponTexture    = weaponTexture;
     _itemFile         = itemFile;
 }
Beispiel #16
0
        public void UpdateCharacterState(int id, ICharacterRenderProperties newCharacterState)
        {
            if (!HasCharacterWithID(id))
            {
                _characterRenderProperties.Add(id, null);
            }

            _characterRenderProperties[id] = newCharacterState;
        }
Beispiel #17
0
        public HairRenderer(ICharacterRenderProperties renderProperties,
                            Texture2D hairTexture,
                            IPubFile <EIFRecord> itemFile)
        {
            _renderProperties = renderProperties;
            _hairTexture      = hairTexture;

            _hairRenderLocationCalculator = new HairRenderLocationCalculator(itemFile, _renderProperties);
        }
Beispiel #18
0
        private static bool CharacterIsAtPosition(ICharacterRenderProperties renderProperties, int row, int col)
        {
            if (renderProperties.IsActing(CharacterActionState.Walking))
            {
                return(row == renderProperties.GetDestinationY() && col == renderProperties.GetDestinationX());
            }

            return(row == renderProperties.MapY && col == renderProperties.MapX);
        }
Beispiel #19
0
        private bool IsHairOnTopOfHat(ICharacterRenderProperties renderProperties)
        {
            //todo: i might have this backwards...

            var hatInfo = EIFFile.Data.SingleOrDefault(
                x => x.Type == ItemType.Hat &&
                x.DollGraphic == renderProperties.HatGraphic);

            return(hatInfo != null && hatInfo.SubType == ItemSubType.FaceMask);
        }
 public ICharacterRenderer CreateCharacterRenderer(ICharacterRenderProperties initialRenderProperties)
 {
     return(new CharacterRenderer((Game)_gameProvider.Game,
                                  _renderTargetFactory,
                                  _characterProvider,
                                  _renderOffsetCalculator,
                                  _characterPropertyRendererBuilder,
                                  _characterTextures,
                                  _characterSpriteCalculator,
                                  initialRenderProperties));
 }
Beispiel #21
0
        public HatRenderer(IShaderProvider shaderProvider,
                           ICharacterRenderProperties renderProperties,
                           ISpriteSheet hatSheet,
                           ISpriteSheet hairSheet)
            : base(renderProperties)
        {
            _shaderProvider = shaderProvider;
            _hatSheet       = hatSheet;
            _hairSheet      = hairSheet;

            _hairRenderLocationCalculator = new HairRenderLocationCalculator(_renderProperties);
        }
Beispiel #22
0
        private bool IsWeaponBehindCharacter(ICharacterRenderProperties renderProperties)
        {
            var weaponInfo = EIFFile.Data.SingleOrDefault(
                x => x.Type == ItemType.Weapon &&
                x.DollGraphic == renderProperties.WeaponGraphic);

            var pass1 = renderProperties.AttackFrame < 2;
            var pass2 = renderProperties.IsFacing(EODirection.Up, EODirection.Left);
            var pass3 = weaponInfo == null || weaponInfo.SubType == ItemSubType.Ranged;

            return(pass1 || pass2 || pass3);
        }
        private static ICharacterRenderProperties EnsureCorrectXAndY(ICharacterRenderProperties renderProperties, byte x, byte y)
        {
            var opposite             = renderProperties.Direction.Opposite();
            var tempRenderProperties = renderProperties
                                       .WithDirection(opposite)
                                       .WithMapX(x)
                                       .WithMapY(y);

            return(renderProperties
                   .WithMapX(tempRenderProperties.GetDestinationX())
                   .WithMapY(tempRenderProperties.GetDestinationY()));
        }
Beispiel #24
0
        public void Refresh(ICharacterRenderProperties characterRenderProperties)
        {
            Boots  = _characterSpriteCalculator.GetBootsTexture(characterRenderProperties).SheetTexture;
            Armor  = _characterSpriteCalculator.GetArmorTexture(characterRenderProperties).SheetTexture;
            Hat    = _characterSpriteCalculator.GetHatTexture(characterRenderProperties).SheetTexture;
            Shield = _characterSpriteCalculator.GetShieldTexture(characterRenderProperties).SheetTexture;
            Weapon = _characterSpriteCalculator.GetWeaponTexture(characterRenderProperties).SheetTexture;

            Hair  = _characterSpriteCalculator.GetHairTexture(characterRenderProperties).SheetTexture;
            Skin  = _characterSpriteCalculator.GetSkinTexture(characterRenderProperties);
            Emote = _characterSpriteCalculator.GetEmoteTexture(characterRenderProperties);
            Face  = _characterSpriteCalculator.GetFaceTexture(characterRenderProperties);
        }
Beispiel #25
0
        private static ICharacterRenderProperties AnimateOneWalkFrame(ICharacterRenderProperties renderProperties)
        {
            var nextFrameRenderProperties = renderProperties.WithNextWalkFrame();

            if (nextFrameRenderProperties.CurrentAction != CharacterActionState.Walking)
            {
                nextFrameRenderProperties = nextFrameRenderProperties
                                            .WithMapX(nextFrameRenderProperties.GetDestinationX())
                                            .WithMapY(nextFrameRenderProperties.GetDestinationY());
            }

            return(nextFrameRenderProperties);
        }
        private bool BowIsEquipped(ICharacterRenderProperties characterRenderProperties)
        {
            if (EIFFile == null || EIFFile.Data == null)
            {
                return(false);
            }

            var itemData   = EIFFile.Data;
            var weaponInfo = itemData.SingleOrDefault(x => x.Type == ItemType.Weapon &&
                                                      x.DollGraphic == characterRenderProperties.WeaponGraphic);

            return(weaponInfo != null && weaponInfo.SubType == ItemSubType.Ranged);
        }
Beispiel #27
0
        public IEnumerable <ICharacterPropertyRenderer> BuildList(ICharacterTextures textures,
                                                                  ICharacterRenderProperties renderProperties)
        {
            bool shieldAdded = false, weaponAdded = false;

            if (IsShieldBehindCharacter(renderProperties))
            {
                shieldAdded = true;
                yield return(new ShieldRenderer(renderProperties, textures.Shield));
            }

            if (IsWeaponBehindCharacter(renderProperties))
            {
                weaponAdded = true;
                yield return(new WeaponRenderer(renderProperties, textures.Weapon, EIFFile));
            }

            yield return(new SkinRenderer(renderProperties, textures.Skin, EIFFile));

            yield return(new FaceRenderer(renderProperties, textures.Face, EIFFile));

            yield return(new EmoteRenderer(renderProperties, textures.Emote, EIFFile));

            yield return(new BootsRenderer(renderProperties, textures.Boots, EIFFile));

            yield return(new ArmorRenderer(renderProperties, textures.Armor, EIFFile));

            if (!weaponAdded)
            {
                yield return(new WeaponRenderer(renderProperties, textures.Weapon, EIFFile));
            }

            if (IsHairOnTopOfHat(renderProperties))
            {
                yield return(new HatRenderer(renderProperties, textures.Hat, EIFFile));

                yield return(new HairRenderer(renderProperties, textures.Hair, EIFFile));
            }
            else
            {
                yield return(new HairRenderer(renderProperties, textures.Hair, EIFFile));

                yield return(new HatRenderer(renderProperties, textures.Hat, EIFFile));
            }

            if (!shieldAdded)
            {
                yield return(new ShieldRenderer(renderProperties, textures.Shield));
            }
        }
        public ISpriteSheet GetBootsTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.BootsGraphic == 0)
            {
                return(new EmptySpriteSheet());
            }

            var type = BootsSpriteType.Standing;

            switch (characterRenderProperties.CurrentAction)
            {
            case CharacterActionState.Walking:
                switch (characterRenderProperties.WalkFrame)
                {
                case 1: type = BootsSpriteType.WalkFrame1; break;

                case 2: type = BootsSpriteType.WalkFrame2; break;

                case 3: type = BootsSpriteType.WalkFrame3; break;

                case 4: type = BootsSpriteType.WalkFrame4; break;
                }
                break;

            case CharacterActionState.Attacking:
                if (!BowIsEquipped(characterRenderProperties) && characterRenderProperties.AttackFrame == 2 ||
                    BowIsEquipped(characterRenderProperties) && characterRenderProperties.AttackFrame == 1)
                {
                    type = BootsSpriteType.Attack;
                }
                break;

            case CharacterActionState.Sitting:
                switch (characterRenderProperties.SitState)
                {
                case SitState.Chair: type = BootsSpriteType.SitChair; break;

                case SitState.Floor: type = BootsSpriteType.SitGround; break;
                }
                break;
            }

            var gfxFile = characterRenderProperties.Gender == 0 ? GFXTypes.FemaleShoes : GFXTypes.MaleShoes;

            var offset          = GetOffsetBasedOnState(type) * GetBaseOffsetFromDirection(characterRenderProperties.Direction);
            var baseBootGraphic = GetBaseBootGraphic(characterRenderProperties.BootsGraphic);
            var gfxNumber       = baseBootGraphic + (int)type + offset;

            return(new SpriteSheet(_gfxManager.TextureFromResource(gfxFile, gfxNumber, true)));
        }
        public ISpriteSheet GetHatTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.HatGraphic == 0)
            {
                return(new EmptySpriteSheet());
            }

            var gfxFile = characterRenderProperties.Gender == 0 ? GFXTypes.FemaleHat : GFXTypes.MaleHat;

            var offset       = 2 * GetBaseOffsetFromDirection(characterRenderProperties.Direction);
            var baseHatValue = GetBaseHatGraphic(characterRenderProperties.HatGraphic);
            var gfxNumber    = baseHatValue + 1 + offset;

            return(new SpriteSheet(_gfxManager.TextureFromResource(gfxFile, gfxNumber, true)));
        }
        public ISpriteSheet GetHairTexture(ICharacterRenderProperties characterRenderProperties)
        {
            if (characterRenderProperties.HairStyle == 0)
            {
                return(new EmptySpriteSheet());
            }

            var gfxFile   = characterRenderProperties.Gender == 0 ? GFXTypes.FemaleHair : GFXTypes.MaleHair;
            var offset    = 2 * GetBaseOffsetFromDirection(characterRenderProperties.Direction);
            var gfxNumber = GetBaseHairGraphic(characterRenderProperties.HairStyle, characterRenderProperties.HairColor) + 2 + offset;

            var hairTexture = _gfxManager.TextureFromResource(gfxFile, gfxNumber, true, true);

            return(new SpriteSheet(hairTexture));
        }