示例#1
0
文件: spell.cpp 项目: Gwynthell/FFDB
    bool CanUseSpell(CBattleEntity* PCaster, uint16 SpellID)
    {
        bool usable = false;
        CSpell* spell = GetSpell(SpellID);
	    if (spell != NULL)
	    {
		    uint8 JobMLVL = spell->getJob(PCaster->GetMJob());
		    uint8 JobSLVL = spell->getJob(PCaster->GetSJob());
            uint8 requirements = spell->getRequirements();

		    if(PCaster->GetMLevel() >= JobMLVL)
            {
				usable = true;
				if (requirements & SPELLREQ_TABULA_RASA)
				{
					if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_TABULA_RASA))
					{
						usable = false;
					}
				}
                if (requirements & SPELLREQ_ADDENDUM_BLACK && PCaster->GetMJob() == JOB_SCH)
                {
                    if(!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_BLACK) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT))
                    {
						usable = false;
					}
                }
                else if (requirements & SPELLREQ_ADDENDUM_WHITE && PCaster->GetMJob() == JOB_SCH)
                {
                    if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_WHITE) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT))
                    {
                        usable = false;
                    }
                }
                else if (SpellID > 0x200)
                {
                    if (PCaster->objtype == TYPE_PC)
                    {
						if (!blueutils::IsSpellSet((CCharEntity*)PCaster, (CBlueSpell*)spell))
						{
							usable = false;
						}
                    }
                }
				if (usable) { return true; }
            }
            if(PCaster->GetSLevel() >= JobSLVL)
            {
				usable = true;
				if (requirements & SPELLREQ_TABULA_RASA)
				{
					if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_TABULA_RASA))
					{
						usable = false;
					}
				}
				if (requirements & SPELLREQ_ADDENDUM_BLACK && PCaster->GetSJob() == JOB_SCH)
				{
					if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_BLACK) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT))
					{
						usable = false;
					}
				}
				else if (requirements & SPELLREQ_ADDENDUM_WHITE && PCaster->GetSJob() == JOB_SCH)
				{
					if (!PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_WHITE) && !PCaster->StatusEffectContainer->HasStatusEffect(EFFECT_ENLIGHTENMENT))
					{
						usable = false;
					}
				}
				else if (SpellID > 0x200)
				{
					if (PCaster->objtype == TYPE_PC)
					{
						if (!blueutils::IsSpellSet((CCharEntity*)PCaster, (CBlueSpell*)spell))
						{
							usable = false;
						}
					}
				}
            }
	    }
	    return usable;
    }