public Monster(int[] stats, int[] resists, MonsterFight mf, Classess monClass, int baseM, int basePh, string desc, char vis, ConsoleColor color) { _isPassable = false; _type = ObjectType.O_MONSTER; _monsterBehaviur = MonsterState.MS_IDLE; _pathAvaible = false; _route = new List<Point>(); _movement = new List<Point>(); _seen = false; _description = desc; _visual = vis; _color = color; _class = monClass; _primaryStats = new Dictionary<PrimaryStats, Stat>(); _resists = new Dictionary<Resists, Stat>(); _BaseResists = new Dictionary<ResistGroup, Stat>(); _monsterWeapons = mf.ListOfWeapons; _monsterArmor = mf.monsterArmor; _weaponProficiencies = new int[mf.ListOfWeapons.GetLength(0)]; _states = new bool[(int)PlayerStates.MAX_SIZE]; changeState(PlayerStates.NORMAL); for (PrimaryStats i = PrimaryStats.VITALITY; i < PrimaryStats.MAX_SIZE; i++) { _primaryStats.Add(i, new Stat(stats[(int)i])); } for (Resists i = Resists.RESIST_1; i < Resists.MAX_SIZE; i++) { _resists.Add(i, new Stat(resists[(int)i])); } _BaseResists.Add(ResistGroup.MENTAL, new Stat(baseM)); _BaseResists.Add(ResistGroup.PHYSICAL, new Stat(basePh)); Level = 0; _Stamina = new Stat(_primaryStats[PrimaryStats.VITALITY].currentValue / 10 + _primaryStats[PrimaryStats.STRENGTH].currentValue / 10); //recalculate dex and spd based on armor limitation _primaryStats[PrimaryStats.DEXTERITY].actualValue /= _monsterArmor.Limitation[0]; _primaryStats[PrimaryStats.SPEED].actualValue /= _monsterArmor.Limitation[1]; //calculate defence without weapon _defence = new Stat(_monsterArmor.Defence + Convert.ToInt16(Math.Round((_primaryStats[PrimaryStats.DEXTERITY].actualValue / 10.0f)))); _protection = new int[3]; _protection[0] = _monsterArmor.Protection[0]; _protection[1] = _monsterArmor.Protection[1]; _protection[2] = _monsterArmor.Protection[2]; //genereate weapon proficiency for all weapons for (int i = 0; i < _monsterWeapons.GetLength(0); i++) { int bonus = _monsterWeapons[i].ProfBonus; int prof = bonus + Data.PlayerClass.ClassProficiencyTable[_class][1] + Dice.Roll("d50"); _weaponProficiencies[i] = prof; } _steps = 0; _exp = MonsterGenerator.CalcualteMonsterExp(this); //calcualte magic potential for future casters _MagicPotential = new Stat(0); CalculateMagicPotential(); }
public static Castes GetCastesOfClass(Classess _class) { Classess[] fight = new Classess[4] { Classess.WARRIOR, Classess.HUNTER, Classess.BARBARIAN, Classess.GUARDSMAN}; Classess[] thief = new Classess[3] { Classess.THIEF, Classess.ASSASSIN, Classess.MERCHANT}; Classess[] priest = new Classess[4] { Classess.PRIEST, Classess.DRUID, Classess.ASTROLOGER, Classess.HALF_GOD}; Classess[] mage = new Classess[4] { Classess.MAGE, Classess.WARLOCK, Classess.ILLUSIONIST, Classess.ALCHEMIST}; Classess[] knight = new Classess[3] { Classess.KNIGHT, Classess.BLACK_KNIGHT, Classess.PALADIN}; if (fight.Contains(_class)) { return Castes.FIGHTERS; } else if (thief.Contains(_class)) { return Castes.THIEFS; } else if (priest.Contains(_class)) { return Castes.PRIESTS; } else if (mage.Contains(_class)) { return Castes.SORCERERS; } else if (knight.Contains(_class)) { return Castes.KNIGHTS; } return Castes.MAX_SIZE; }
public static int[] ParseClassLevelBonuses(Classess _class) { int k; int roll; int bon; int[] bonusStats = new int[14]; string[] values; string stat; string bonus = ""; values = ClassLevelBonuses[_class]; for (int i = 0; i < 14; i++) { k = 0; roll = 0; bonus = ""; stat = values[i]; while (k < stat.Length && char.IsDigit(stat[k])) { bonus += stat[k]; k++; } if (k < stat.Length && stat[k] == '+') { roll = Dice.Roll("d10"); } else if (k < stat.Length && stat[k] == '-') { bonusStats[i] = 0; continue; } if (bonus == "") { bon = 0; } else { bon = int.Parse(bonus); } bonusStats[i] = bon + roll; } return bonusStats; }
public static StringName ClassEnumToStringName(Classess _enum) { switch (_enum) { case Classess.WARRIOR: { return StringName.WARRIOR_TEXT; } case Classess.HUNTER: { return StringName.HUNTER_TEXT; } case Classess.BARBARIAN: { return StringName.BARBARIAN_TEXT; } case Classess.GUARDSMAN: { return StringName.GUARDSMAN_TEXT; } case Classess.THIEF: { return StringName.THIEF_TEXT; } case Classess.ASSASSIN: { return StringName.ASSASSIN_TEXT; } case Classess.MERCHANT: { return StringName.MERCHANT_TEXT; } case Classess.PRIEST: { return StringName.PRIEST_TEXT; } case Classess.DRUID: { return StringName.DRUID_TEXT; } case Classess.ASTROLOGER: { return StringName.ASTROLOGER_TEXT; } case Classess.HALF_GOD: { return StringName.HALF_GOD_TEXT; } case Classess.MAGE: { return StringName.MAGE_TEXT; } case Classess.WARLOCK: { return StringName.WARLOCK_TEXT; } case Classess.ILLUSIONIST: { return StringName.ILLUSIONIST_TEXT; } case Classess.ALCHEMIST: { return StringName.ALCHEMIST_TEXT; } case Classess.KNIGHT: { return StringName.KNIGHT_TEXT; } case Classess.PALADIN: { return StringName.PALADIN_TEXT; } case Classess.BLACK_KNIGHT: { return StringName.BLACK_KNIGHT_TEXT; } } return StringName.UNDEFINED; }
public static Monster GenerateMonster(string monsterRace, int monsterLevel = 0, Classess monsterClass = Classess.MAX_SIZE) { int[] Stats = new int[11]; int[] finalStats = new int[11]; int[] Resists = new int[10]; int[] finalResists = new int[10]; int[] classBonusStats; int[] classBonusResists; //MonsterWeapon[] wList; //= new List<MonsterWeapon>(); MonsterFight mf = new MonsterFight(); Classess usedClass; mwList.Clear(); Random rnd = new Random(); //read monster file readFile(monsterRace); //populate tables Stats = parseTable(_stats); Resists = parseTable(_resists); //select class for monster //chosen class in on the list and it's not random if (_classes.Contains(monsterClass) && monsterClass != Classess.MAX_SIZE) { //use selected class usedClass = monsterClass; } //chosen class in on the list and it's random else if (_classes.Contains(monsterClass) && monsterClass == Classess.MAX_SIZE) { //pick one at random from all available classes int size = (int)Classess.MAX_SIZE; usedClass = (Classess)rnd.Next(0, size); } //chosen class is not on the list else { //pick one at random from classes available for this race int size = _classes.Count(); int index = rnd.Next(0, size); usedClass = _classes[index]; } //generate stats //base + roll + classBonus classBonusStats = PlayerClass.ParseClassBonuses(usedClass); for (int i = 0; i < (int)PrimaryStats.MAX_SIZE; i++) { if (i == (int)PrimaryStats.VITALITY) { finalStats[i] = Stats[i] + classBonusStats[i]; } else if (i == (int)PrimaryStats.NOTICE) { if (usedClass == Classess.PRIEST || usedClass == Classess.DRUID || usedClass == Classess.ASTROLOGER || usedClass == Classess.HALF_GOD) { finalStats[i] = Stats[i] + Dice.Roll("d10") + classBonusStats[i]; } else { finalStats[i] = Stats[i] + Dice.Roll("d5") + classBonusStats[i]; } } else { finalStats[i] = Stats[i] + Dice.Roll("d50") + classBonusStats[i]; } } //generate base resists int baseMental = Dice.Roll("d10") + finalStats[(int)PrimaryStats.INTELLIGENCE] / 10 + finalStats[(int)PrimaryStats.WISDOM] / 10 + finalStats[(int)PrimaryStats.VITALITY] / 20; int basePhysical = Dice.Roll("d10") + finalStats[(int)PrimaryStats.VITALITY] / 10 + finalStats[(int)PrimaryStats.STRENGTH] / 10; //generate resist //base + racebonus + classBonus classBonusResists = PlayerClass.ParseClassResistsBonuses(usedClass); for (int i = 0; i < (int)Enums.Resists.MAX_SIZE; i++) { if (i <= (int)Enums.Resists.RESIST_5) { if (i == (int)Enums.Resists.RESIST_1) { finalResists[i] = baseMental + Resists[i] + classBonusResists[i] + finalStats[(int)PrimaryStats.INTELLIGENCE] / 10; } else if (i == (int)Enums.Resists.RESIST_2) { finalResists[i] = baseMental + Resists[i] + classBonusResists[i] + finalStats[(int)PrimaryStats.WISDOM] / 10; } else if (i == (int)Enums.Resists.RESIST_3) { finalResists[i] = baseMental + Resists[i] + classBonusResists[i] + finalStats[(int)PrimaryStats.FAITH] / 10; } else { finalResists[i] = baseMental + Resists[i] + classBonusResists[i]; } } else { finalResists[i] = basePhysical + Resists[i] + classBonusResists[i]; } } //set all fight details for monster mf.ListOfWeapons = new MonsterWeapon[mwList.Count]; mwList.CopyTo(mf.ListOfWeapons, 0); mf.monsterArmor = ma; //level up monster if (monsterLevel == 0) { return new Monster(finalStats, finalResists, mf, usedClass, baseMental, basePhysical, _description, vis, color); } else { return levelMonster(monsterLevel, new Monster(finalStats, finalResists, mf, usedClass, baseMental, basePhysical, _description, vis, color)); } }
private List<WeaponClass> select_weapon_proficiencies(Classess c, int free) { int top, left, asciiOffset; asciiOffset = 97; int fwp = free; List<WeaponClass> wpList = new List<WeaponClass>(); List<WeaponClass> finalList = new List<WeaponClass>(); for (WeaponClass wc = WeaponClass.HEAVY_SWORDS; wc < WeaponClass.MAX_SIZE; wc++) { wpList.Add(wc); } Select: left = 17; top = 16; clearScreen(0, 10, 0, 0); Console.SetCursorPosition(17, 10); Text.Write("|c[14]"+Lang[StringName.CREATE_CHARACTER_SELECT_PROFICIENCY_TEXT]); Console.SetCursorPosition(17, 13); Text.Write(Lang[StringName.CREATE_CHARACTER_PROFICIENCY_POINTS] + " :|c[10] " + fwp); Console.SetCursorPosition(69, 42); Text.Write(Lang[StringName.CREATE_CHARACTER_CONTINUE_TEXT]); //display WP for (int i = 0; i < wpList.Count; i++) { if ((i > 0) && ((i + 11) % 11 == 0)) { //move to next column and reset row top = 16 - i; left += 40; } Console.SetCursorPosition(left, top + i); Text.Write("|c[14][|c[15]" + (char)(97 + i) + "|c[14]] " + Lang[(StringName)Enum.Parse(typeof(StringName), "WEAPONCLASS_" + (WeaponClass)wpList[i])]); } int count = wpList.Count; do { ConsoleKeyInfo key = Console.ReadKey(true); if (key.KeyChar >= 97 && key.KeyChar <= asciiOffset + count) { Console.SetCursorPosition(left, 30); int index = (int)(key.KeyChar - 97); finalList.Add(wpList[index]); wpList.RemoveAt(index); fwp--; if (fwp == 0) { break; } goto Select; } if (key.Key == ConsoleKey.Spacebar) { break; } } while (true); return finalList; }