void WeaponObjectImplementation::decay(CreatureObject* user) {
	if (_this.getReferenceUnsafeStaticCast() == user->getSlottedObject("default_weapon") || user->isAiAgent() || hasAntiDecayKit()) {
		return;
	}

	int roll = System::random(100);
	int chance = 5;

	if (hasPowerup())
		chance += 10;

	if (roll < chance) {
		if (isJediWeapon()) {
			ManagedReference<SceneObject*> saberInv = getSlottedObject("saber_inv");

			// TODO: is this supposed to be every crystal, or random crystal(s)?
			for (int i = 0; i < saberInv->getContainerObjectsSize(); i++) {
				ManagedReference<LightsaberCrystalComponent*> crystal = saberInv->getContainerObject(i).castTo<LightsaberCrystalComponent*>();

				if (crystal != NULL) {
					crystal->inflictDamage(crystal, 0, 1, true, true);
				}
			}
		} else {
			inflictDamage(_this.getReferenceUnsafeStaticCast(), 0, 1, true, true);

			if (((float)conditionDamage - 1 / (float)maxCondition < 0.75) && ((float)conditionDamage / (float)maxCondition > 0.75))
				user->sendSystemMessage("@combat_effects:weapon_quarter");
			if (((float)conditionDamage - 1 / (float)maxCondition < 0.50) && ((float)conditionDamage / (float)maxCondition > 0.50))
				user->sendSystemMessage("@combat_effects:weapon_half");
		}
	}
}
Beispiel #2
0
void LoLEngine::timerSpecialCharacterUpdate(int timerNum) {
	int v = 0;
	for (int i = 0; i < 4; i++) {
		if (!(_characters[i].flags & 1))
			continue;

		for (int ii = 0; ii < 5; ii++) {
			if (!(_characters[i].characterUpdateEvents[ii]))
				continue;

			if (--_characters[i].characterUpdateDelay[ii] > 0) {
				if (_characters[i].characterUpdateDelay[ii] > v)
					v = _characters[i].characterUpdateDelay[ii];
				continue;
			}

			switch (_characters[i].characterUpdateEvents[ii] - 1) {
			case 0:
				if (_characters[i].weaponHit) {
					_characters[i].weaponHit = 0;
					_characters[i].characterUpdateDelay[ii] = calcMonsterSkillLevel(i, 6);
					if (_characters[i].characterUpdateDelay[ii] > v)
						v = _characters[i].characterUpdateDelay[ii];
				} else {
					_characters[i].flags &= 0xfffb;
				}

				gui_drawCharPortraitWithStats(i);
				break;

			case 1:
				_characters[i].damageSuffered = 0;
				gui_drawCharPortraitWithStats(i);
				break;

			case 2:
				_characters[i].flags &= 0xffbf;
				gui_drawCharPortraitWithStats(i);
				break;

			case 3:
				v = rollDice(1, 2);
				if (inflictDamage(i, v, 0x8000, 0, 0x80)) {
					_txt->printMessage(2, getLangString(0x4022), _characters[i].name);
					_characters[i].characterUpdateDelay[ii] = 10;
					if (_characters[i].characterUpdateDelay[ii] > v)
						v = _characters[i].characterUpdateDelay[ii];
				}
				break;

			case 4:
				_characters[i].flags &= 0xfeff;
				_txt->printMessage(0, getLangString(0x4027), _characters[i].name);
				gui_drawCharPortraitWithStats(i);
				break;

			case 5:
				setTemporaryFaceFrame(i, 0, 0, 1);
				break;

			case 6:
				_characters[i].flags &= 0xefff;
				gui_drawCharPortraitWithStats(i);
				break;

			case 7:
				restoreSwampPalette();
				break;

			default:
				break;
			}

			if (_characters[i].characterUpdateDelay[ii] <= 0)
				_characters[i].characterUpdateEvents[ii] = 0;
		}
	}

	if (v) {
		_timer->enable(3);
		_timer3Para = v * 15;
	} else {
		_timer->disable(3);
	}
}