/// <summary> /// Create an instance of a mobile from the provided template. /// </summary> /// <param name="mobTemplate"></param> /// <returns></returns> public static CharData CreateMobile(MobTemplate mobTemplate) { int count; if (!mobTemplate) { Log.Error("CreateMobile: null MobTemplate.", 0); throw new NullReferenceException(); } CharData mob = new CharData(); mob.MobileTemplate = mobTemplate; mob.Followers = null; mob.Name = mobTemplate.PlayerName; mob.ShortDescription = mobTemplate.ShortDescription; mob.FullDescription = mobTemplate.FullDescription; mob.Description = mobTemplate.Description; mob.SpecialFunction = mobTemplate.SpecFun; mob.SpecialFunctionNames = mobTemplate.SpecFunNames; mob.CharacterClass = mobTemplate.CharacterClass; mob.Level = MUDMath.FuzzyNumber(mobTemplate.Level); mob.ActionFlags = mobTemplate.ActionFlags; mob.CurrentPosition = mobTemplate.DefaultPosition; mob.ChatterBotName = mobTemplate.ChatterBotName; // TODO: Look up the chatter bot name and load a runtime bot into the variable. mob.ChatBot = null; for (count = 0; count < Limits.NUM_AFFECT_VECTORS; ++count) { mob.AffectedBy[count] = mobTemplate.AffectedBy[count]; } mob.Alignment = mobTemplate.Alignment; mob.Gender = mobTemplate.Gender; mob.SetPermRace(mobTemplate.Race); mob.CurrentSize = Race.RaceList[mob.GetRace()].DefaultSize; if (mob.HasActionBit(MobTemplate.ACT_SIZEMINUS)) { mob.CurrentSize--; } if (mob.HasActionBit(MobTemplate.ACT_SIZEPLUS)) { mob.CurrentSize++; } mob.CastingSpell = 0; mob.CastingTime = 0; mob.PermStrength = MUDMath.Dice(2, 46) + 8; mob.PermIntelligence = MUDMath.Dice(2, 46) + 8; mob.PermWisdom = MUDMath.Dice(2, 46) + 8; mob.PermDexterity = MUDMath.Dice(2, 46) + 8; mob.PermConstitution = MUDMath.Dice(2, 46) + 7; mob.PermAgility = MUDMath.Dice(2, 46) + 8; mob.PermCharisma = MUDMath.Dice(2, 46) + 8; mob.PermPower = MUDMath.Dice(2, 46) + 8; mob.PermLuck = MUDMath.Dice(2, 46) + 8; mob.ModifiedStrength = 0; mob.ModifiedIntelligence = 0; mob.ModifiedWisdom = 0; mob.ModifiedDexterity = 0; mob.ModifiedConstitution = 0; mob.ModifiedAgility = 0; mob.ModifiedCharisma = 0; mob.ModifiedPower = 0; mob.ModifiedLuck = 0; mob.Resistant = mobTemplate.Resistant; mob.Immune = mobTemplate.Immune; mob.Susceptible = mobTemplate.Susceptible; mob.Vulnerable = mobTemplate.Vulnerable; mob.MaxMana = mob.Level * 10; if (Race.RaceList[mobTemplate.Race].Coins) { int level = mobTemplate.Level; mob.ReceiveCopper(MUDMath.Dice(12, level) / 32); mob.ReceiveSilver(MUDMath.Dice(9, level) / 32); mob.ReceiveGold(MUDMath.Dice(5, level) / 32); mob.ReceivePlatinum(MUDMath.Dice(2, level) / 32); } else { mob.SetCoins(0, 0, 0, 0); } mob.ArmorPoints = MUDMath.Interpolate(mob.Level, 100, -100); // * MOB HITPOINTS * // // Was level d 8, upped it to level d 13 // considering mobs *still* won't have as many hitpoints as some players until // at least level 10, this shouldn't be too big an upgrade. // // Mob hitpoints are not based on constitution *unless* they have a // constitution modifier from an item, spell, or other affect // In light of recent player dissatisfaction with the // mob hitpoints, I'm implementing a log curve, using // hp = exp( 2.15135 + level*0.151231) // This will will result in the following hp matrix: // Level Hitpoints // 20 175 // 30 803 // 40 3643 // 50 16528 // 55 35207 // 60 75000 mob.MaxHitpoints = MUDMath.Dice(mob.Level, 13) + 1; // Mob hps are non-linear above level 10. if (mob.Level > 20) { int upper = (int)Math.Exp(1.85 + mob.Level * 0.151231); int lower = (int)Math.Exp(1.80 + mob.Level * 0.151231); mob.MaxHitpoints += MUDMath.NumberRange(lower, upper); } else if (mob.Level > 10) { mob.MaxHitpoints += MUDMath.NumberRange(mob.Level * 2, ((mob.Level - 8) ^ 2 * mob.Level) / 2); } // Demons/devils/dragons gain an extra 30 hitpoints per level (+1500 at lvl 50). if (mob.GetRace() == Race.RACE_DEMON || mob.GetRace() == Race.RACE_DEVIL || mob.GetRace() == Race.RACE_DRAGON) { mob.MaxHitpoints += (mob.Level * 30); } mob.Hitpoints = mob.GetMaxHit(); // Horses get more moves, necessary for mounts. if (Race.RaceList[mob.GetRace()].Name.Equals("Horse", StringComparison.CurrentCultureIgnoreCase)) { mob.MaxMoves = 290 + MUDMath.Dice(4, 5); mob.CurrentMoves = mob.MaxMoves; } mob.LoadRoomIndexNumber = 0; // Insert in list. CharList.Add(mob); // Increment count of in-game instances of mob. mobTemplate.NumActive++; return(mob); }