public bool HasEnoughMana() { float curMana = mana.GetAttributeValue(); if (curMana < manaCost) { return(false); } return(true); }
private bool AttackInQueue() { isFromQueue = false; KeyValuePair <FollowerAttackName, int> attackAndCost; // Check player HP threshold over attack queue float hp = playerHealth.GetPercentage(); float mana = playerMana.GetAttributeValue(); if (hp <= healThreshold) { FollowerAttackPool[] healSkills = new FollowerAttackPool[2] { FollowerAttackPool.HealBig, FollowerAttackPool.HealSmall }; foreach (var heal in healSkills) { attackAndCost = attackManager.GetAttackCost(heal); if (!IsOnCooldown(attackAndCost.Key) && attackAndCost.Value <= mana) { currentAttack = attackAndCost.Key; resourceTypes = new IAttribute[1]; resourceTypes[0] = playerHealth as IAttribute; return(true); } } } // Check player mana if (playerMana.GetPercentage() <= manaThreshold && attackManager.HasAttackInPool(FollowerAttackPool.ManaGain)) { attackAndCost = attackManager.GetAttackCost(FollowerAttackPool.ManaGain); if (!IsOnCooldown(attackAndCost.Key)) { currentAttack = attackAndCost.Key; resourceTypes = new IAttribute[2]; resourceTypes[0] = playerMana as IAttribute; resourceTypes[1] = selfMana as IAttribute; return(true); } } // Check for lower priority heal over time threshold if (hp < regenThreshold) { attackAndCost = attackManager.GetAttackCost(FollowerAttackPool.HealOverTime); if (!IsOnCooldown(attackAndCost.Key) && !IsAttackQueued(attackAndCost.Key)) { atkQueue.Enqueue(attackAndCost.Key); } } if (atkQueue.Count > 0) { currentAttack = atkQueue.Peek(); if (!IsOnCooldown(currentAttack)) { isFromQueue = true; return(true); } Debug.Log("Attack in queue is on cooldown? " + currentAttack); } return(false); }
private void DecideNextAction() { if (timeSinceLastAttack >= timeBetweenAttacks) { // actionModifier should probably affect this... float foodValue = fullness.DigestFood(digestSpeed); // TODO: figure out base mana recovery when stomach is empty float manaAmount = Mathf.Max(1, foodValue * manaConversion); selfMana.GainAttribute(manaAmount); timeSinceLastAttack = 0; string chatMessage = null; float fullPercent = fullness.GetPercentage(); // Check for hunger and whether inventory has consumable if (fullPercent <= starveValue && consumableIndex.Count > 0) { chatMessage = GetItemToEat(); } else if (AttackInQueue()) { FollowerAttackStats attackStats = attackManager.GetAttackStats(currentAttack); // Check if have mana to cover attack cost if (attackStats.Cost < selfMana.GetAttributeValue()) { attackSpeed = 100 / fighter.GetStat(Stat.AttackSpeed); timeToAct = attackStats.CastTime * attackSpeed; actionModifier = attackStats.ActionModifier; selfMana.UseMana(attackStats.Cost); timeSinceActionStart = 0; isAttackActive = true; isEffectOnHit = attackStats.ApplyEffect == ApplyEffectOn.OnHit; Sprite sprite = followerAttackIconDB.GetSprite(currentAttack); SpawnHitTimer(sprite); CheckEffectActivation(false); if (isFromQueue) { atkQueue.Dequeue(); } if (attackStats.isRecastSkill) { float recastTime = attackStats.RecastTimer + timeToAct; skillRecastRoutines[currentAttack] = StartCoroutine(SkillRecast(currentAttack, recastTime)); } chatMessage = "Casting " + attackStats.Name; } else { // Message out of mana, extra check for hunger chatMessage = "I'm OOMing!"; actionModifier = 2f; if (fullPercent <= hungerValue && consumableIndex.Count > 0) { chatMessage = GetItemToEat(); } } } // check if under soft cap for hunger else if (fullPercent <= hungerValue && consumableIndex.Count > 0) { chatMessage = GetItemToEat(); } else { chatMessage = "Nothing to do?"; actionModifier = 2f; } combatLog.SendMessageToChat(chatMessage); } }