コード例 #1
0
    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);
            }
        }
    }
コード例 #2
0
    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));
    }