bool ConditionDamage::startCondition(Creature* creature)
{
	if(!Condition::startCondition(creature) || !init())
		return false;

	if(delayed)
		return true;

	int32_t damage = 0;
	return !getNextDamage(damage) || doDamage(creature, damage);
}
Exemple #2
0
void ConditionDamage::addCondition(Creature* creature, const Condition* addCondition)
{
	if (addCondition->getType() == conditionType)
	{
		const ConditionDamage& conditionDamage = static_cast<const ConditionDamage&>(*addCondition);

		if (updateCondition(&conditionDamage))
		{
			setTicks(addCondition->getTicks());
			owner = conditionDamage.owner;
			maxDamage = conditionDamage.maxDamage;
			minDamage = conditionDamage.minDamage;
			startDamage = conditionDamage.startDamage;
			tickInterval = conditionDamage.tickInterval;
			periodDamage = conditionDamage.periodDamage;
			int32_t nextTimeLeft = tickInterval;

			if (!damageList.empty())
			{
				//save previous timeLeft
				IntervalInfo& damageInfo = damageList.front();
				nextTimeLeft = damageInfo.timeLeft;
				damageList.clear();
			}

			damageList = conditionDamage.damageList;

			if (init())
			{
				if (!damageList.empty())
				{
					//restore last timeLeft
					IntervalInfo& damageInfo = damageList.front();
					damageInfo.timeLeft = nextTimeLeft;
				}

				if (!delayed)
				{
					int32_t damage = 0;

					if (getNextDamage(damage))
					{
						doDamage(creature, damage);
					}
				}
			}
		}
	}
}
Exemple #3
0
bool ConditionDamage::startCondition(Creature* creature)
{
	if(!Condition::startCondition(creature))
		return false;

	if(!init())
		return false;

	if(!delayed)
	{
		int32_t damage = 0;
		if(getNextDamage(damage))
			return doDamage(creature, damage);
	}
	return true;
}