public static void LevelUp(GameObject critter, Stat classStat) { if (!D20ClassSystem.Classes.ContainsKey(classStat)) { throw new ArgumentException($"{classStat} is not a valid class"); } var packet = new LevelupPacket { classCode = classStat }; var classCode = SpellSystem.GetSpellClass(classStat); foreach (var spell in GameSystems.Spell.AllSpells) { if (spell.SpellLevelForSpellClass(classCode) != -1) { packet.spellEnums.Add(spell.spellEnum); } } GameSystems.Level.LevelUpApply(critter, packet); packet.spellEnums.Clear(); // Memorize some spells and make it so they aren't used foreach (var spell in GameSystems.Spell.AllSpells) { if (GameSystems.Spell.IsSpellKnown(critter, spell.spellEnum)) { MemorizeSpell(critter, spell.spellEnum, classStat); } } }
public int LevelUpApply(GameObject obj, LevelupPacket levelUpPacket) { var numLvls = obj.GetArrayLength(obj_f.critter_level_idx); obj.SetInt32(obj_f.critter_level_idx, numLvls, (int)levelUpPacket.classCode); if ((levelUpPacket.flags & 1) == 0) { // Raise stat var scoreRaised = levelUpPacket.abilityScoreRaised; if (scoreRaised >= Stat.strength && scoreRaised <= Stat.charisma) { var currentValue = obj.GetBaseStat(levelUpPacket.abilityScoreRaised); GameSystems.Stat.SetBasicStat(obj, levelUpPacket.abilityScoreRaised, currentValue + 1); } foreach (var feat in levelUpPacket.feats) { if (feat != FeatId.NONE) { GameSystems.Feat.AddFeat(obj, feat); } if (feat == FeatId.SKILL_MASTERY) { GameUiBridge.ApplySkillMastery(obj); } } foreach (var kvp in levelUpPacket.skillPointsAdded) { GameSystems.Skill.AddSkillRanks(obj, kvp.Key, kvp.Value); } var spellClassCode = ((int)levelUpPacket.classCode & 0x7F) | 0x80; var spellToRemove = levelUpPacket.spellEnumToRemove; if (spellToRemove != 0) { var spellLevel = GameSystems.Spell.GetSpellLevelBySpellClass(spellToRemove, spellClassCode); GameSystems.Spell.SpellKnownRemove(obj, levelUpPacket.spellEnumToRemove, spellLevel, spellClassCode); } foreach (var spellEnum in levelUpPacket.spellEnums) { var spellLevel = GameSystems.Spell.GetSpellLevelBySpellClass(spellEnum, spellClassCode); GameSystems.Spell.SpellKnownAdd(obj, spellEnum, spellClassCode, spellLevel, 1, 0); } var conMod = obj.GetBaseStat(Stat.con_mod); var classHitDie = D20ClassSystem.GetClassHitDice(levelUpPacket.classCode); var hpRolled = classHitDie.Roll(); if (hpRolled + conMod < 1) { hpRolled = 1 - conMod; } var maxHp = obj.GetBaseStat(Stat.hp_max); GameSystems.Stat.SetBasicStat(obj, Stat.hp_max, maxHp + hpRolled); GameSystems.D20.Status.D20StatusRefresh(obj); GameSystems.Critter.BuildRadialMenu(obj); } return(obj.GetBaseStat(levelUpPacket.classCode)); }