public NPC(NPCData data) : base(EOGame.Instance) { ApplyData(data); bool success = true; npcSheet = new EONPCSpriteSheet(((EOGame)Game).GFXManager, this); int tries = 0; do { try { //attempt to get standing frame 1. It will have non-black pixels if it exists. Frame = NPCFrame.StandingFrame1; Texture2D tmp = npcSheet.GetNPCTexture(); Color[] tmpData = new Color[tmp.Width*tmp.Height]; tmp.GetData(tmpData); hasStandFrame1 = tmpData.Any(_c => _c.R != 0 || _c.G != 0 || _c.B != 0); //get the first non-transparent pixel to determine offsets for name labels and damage counters Frame = NPCFrame.Standing; tmp = npcSheet.GetNPCTexture(); tmpData = new Color[tmp.Width*tmp.Height]; tmp.GetData(tmpData); int i = 0; while (i < tmpData.Length && tmpData[i].A == 0) i++; TopPixel = i == tmpData.Length - 1 ? 0 : i/tmp.Height; } //this block throws errors sometimes..no idea why. Keep looping until it works. catch (InvalidOperationException) { success = false; tries++; } } while (!success && tries < 3); if(tries >= 3) throw new InvalidOperationException("Something weird happened initializing this NPC."); m_chatBubble = new EOChatBubble(this); m_damageCounter = new DamageCounter(this); _mouseoverName = new XNALabel(new Rectangle(1, 1, 1, 1), Constants.FontSize08pt75) { Visible = false, Text = Data.Name, ForeColor = Color.White, AutoSize = false, DrawOrder = (int) ControlDrawLayer.BaseLayer + 3 }; _mouseoverName.DrawLocation = new Vector2( DrawArea.X + (DrawArea.Width - _mouseoverName.ActualWidth)/2f, DrawArea.Y + TopPixel - _mouseoverName.ActualHeight - 4); _mouseoverName.ResizeBasedOnText(); }