/// <summary> /// Returns color index for specified item parameter. (MATERIAL for ex) /// </summary> private static int GetItemColorSlot(ModifierDb.Mod mod, string name) { // Get string pointer (aka color name) FieldInfo colptr = typeof(ModifierDb.Mod).GetField(name); string colname = (string)colptr.GetValue(mod); if (colname == null) { return(-1); } // Fetch digit on the end of the string (COLOR#) return(int.Parse(colname.Substring(colname.Length - 1)) - 1); }
/// <summary> /// Responsible for drawing complex object such as NPCs /// </summary> private Bitmap GetObjectImageSpecial(Map.Object obj, ThingDb.Thing tt, bool shadow = false) { Bitmap result = null; int index = -1, monsterSprite = 0; int[] icols; Color[] ncols; Sequence playerSeq = null; // Get monster sprite from direction if (tt.SpriteStates.Count > 0 && tt.Xfer == "MonsterXfer") { int framesPerDir = tt.SpriteStates[0].Animation.Frames.Count / 8; monsterSprite = framesPerDir * MonsterXfer.NOX_DIRECT_ANIM[obj.GetExtraData <MonsterXfer>().DirectionId];; } // Get NPC sprite from direction if (tt.Xfer == "NPCXfer") { playerSeq = FindPlayerSequence("IDLE", "NAKED"); if (playerSeq != null) { int framesPerDir = playerSeq.Frames.Length / 8; monsterSprite = framesPerDir * MonsterXfer.NOX_DIRECT_ANIM[obj.GetExtraData <NPCXfer>().DirectionId];; } } switch (tt.DrawType) { case "MonsterDraw": index = tt.SpriteStates[0].Animation.Frames[monsterSprite]; result = mapRenderer.VideoBag.GetBitmap(index); break; case "MaidenDraw": index = tt.SpriteStates[0].Animation.Frames[monsterSprite]; // Convert colors ncols = obj.GetExtraData <MonsterXfer>().MaidenBodyColors; icols = new int[6]; for (int i = 0; i < 6; i++) { icols[i] = ncols[i].ToArgb(); } // Get dyncolor result = mapRenderer.VideoBag.GetBitmapDynamic(index, icols); break; case "NPCDraw": index = playerSeq.Frames[monsterSprite]; if (shadow) { result = mapRenderer.VideoBag.GetBitmap(index); break; } // Convert colors ncols = obj.GetExtraData <NPCXfer>().NPCColors; icols = new int[6]; for (int i = 0; i < 6; i++) { icols[i] = ncols[i].ToArgb(); } // Get dyncolor result = mapRenderer.VideoBag.GetBitmapDynamic(index, icols); break; case "ArmorDraw": case "WeaponDraw": if (ModifierDb.Mods.ContainsKey(tt.Name) && tt.SpriteAnimFrames.Count > 0 && !shadow) { ModifierDb.Mod mod = ModifierDb.Mods[tt.Name]; // build color array icols = new int[] { mod.COLOR1.ToArgb(), mod.COLOR2.ToArgb(), mod.COLOR3.ToArgb(), mod.COLOR4.ToArgb(), mod.COLOR5.ToArgb(), mod.COLOR6.ToArgb(), }; // retrieve enchantments string[] enchs = null; switch (tt.Xfer) { case "ArmorXfer": enchs = obj.GetExtraData <ArmorXfer>().Enchantments; break; case "AmmoXfer": enchs = obj.GetExtraData <AmmoXfer>().Enchantments; break; case "WeaponXfer": enchs = obj.GetExtraData <WeaponXfer>().Enchantments; break; } // replace enchantment colors if (enchs != null) { // find color slots (-1 = none) int[] eslot = { GetItemColorSlot(mod, "EFFECTIVENESS"), GetItemColorSlot(mod, "MATERIAL"), GetItemColorSlot(mod, "PRIMARYENCHANTMENT"), GetItemColorSlot(mod, "SECONDARYENCHANTMENT") }; // DO IT for (int i = 0; i < 4; i++) { int slot = eslot[i]; string name = enchs[i]; if (ModifierDb.Mods.ContainsKey(name) && slot >= 0) { icols[slot] = ModifierDb.Mods[name].COLOR.ToArgb(); } } } // Get dyncolor index = tt.SpriteAnimFrames[0]; result = mapRenderer.VideoBag.GetBitmapDynamic(index, icols); } else { index = tt.SpriteMenuIcon; //index = tt.SpritePrettyImage; result = mapRenderer.VideoBag.GetBitmap(index); } break; } if (index >= 0) { drawOffsetX = mapRenderer.VideoBag.DrawOffsets[index][0]; drawOffsetY = mapRenderer.VideoBag.DrawOffsets[index][1]; } return(result); }