/** * \\ 모든 몹이 공통으로 사용하는 attack 함수로 데미지를 가한 후 특성화된 virtual debuff 발동 * \\ 인자로 Enemy를 받아야 한다(Player는 getcomponent로 접근) * @todo 왜 changeHp(temp)이죠. */ public virtual bool Attack() { if (enemyItself.Hp <= 0) { return(false); } else { float temp = (enemyItself.FinalAttackPower() - player.FinalDefensePower()); if (player.FindBuff(new Poison(1)) != null) { temp++; } if (player.FindBuff(new Stunned(3)) != null) { temp += 3; } if (player.Bufflist.Exists(x => x.GetType().Equals(typeof(Poison)))) { temp += 1.0f; } if (player.Bufflist.Exists(x => x.GetType().Equals(typeof(Stunned)))) { temp += 3.0f; } if (player.Bufflist.Exists(x => x.GetType().Equals(typeof(Adrenaline)))) { temp *= 1.2f; } if (player.Bufflist.Exists(x => x.GetType().Equals(typeof(Morfin)))) { temp *= 0.5f; } if (temp <= 1.0f) { temp = 1; } player.ChangeHp(-temp); messageMaker.MakeAttackMessage(enemyItself, MessageMaker.UnitAction.Attack, player, (int)temp); float i = Random.value; if (i < enemyItself.DebuffPercent()) { player.AddBuff(enemyItself.Debuff()); } if (player.armor is Padding) { Padding padding = player.armor as Padding; padding.OnAttacked(); } return(true); } }
/** * Player의 공격력과 상태를 기반으로 최종피해를 정한다.enemy의 체력을 깎고 Player.Weapon.Attack 메서드를 호출한다\ * 공격 전 플레이어의 buff 상태와 착용한 무기를 확인하고,(방어구는 공격에 영향을 미치지 않는다.) 이를 공격력에 반영하여 공격 데미지를 결정한다. * 공격 후 적의 공격력이 0 이하가 되었을 때, enemy object를 destroy한다.(이는 죽은 적이 공격하지 않도록 하기 위함이다.) * @todo 중독/기절 보정이 뭔가요. */ public void Attack(Enemy enemy) { int tempindex; player.weapon.GiveImpactToEnemy(enemy); //공격했을 때의 효과를 적에게 전달(데미지를 주지 않음). player.weapon.GiveImpactToPlayer(player); //공격했을 때의 효과를 나에게 전달(데미지를 주지 않음). float temp = (player.FinalAttackPower() - enemy.FinalDefensePower()); if (!(enemy is Boss)) { if (enemy.FindBuff(new Stunned(1)) != null) { temp += 3; } } if (player.FindBuff(new Adrenaline(1)) != null) { temp *= 1.6f; } else if (player.FindBuff(new Morfin(1)) != null) { temp *= 0.5f; } if (player.weapon is SharpDagger) { int dice = Random.Range(0, 10); if (dice == 0) { temp *= 3f; } } if (temp <= 1.0f) { temp = 1; } if (player.FinalAttackPower() <= 0) { temp = 0; } enemy.ChangeHp(-temp); messageMaker.MakeAttackMessage(player, MessageMaker.UnitAction.Attack, enemy, (int)temp); if (enemy.Hp <= 0) { messageMaker.MakeDeathMessage(player, enemy); gameManager.KillEnemy(enemy); } /* * if (player.Bufflist.Exists( x => x.GetType().Equals( typeof(Poison) ) )) { * temp += 1; * } * if( player.Bufflist.Exists( x => x.GetType().Equals( typeof( Poison ) ) ) ) */ if (player.weapon is Club) { Club club = player.weapon as Club; float f = Random.Range(0, 100); switch (player.weapon.rank) { case ItemManager.Rank.Common: if (f < 25) { club.DecreaseAttackMin(); } break; case ItemManager.Rank.Rare: if (f < 20) { club.DecreaseAttackMin(); } break; case ItemManager.Rank.Legendary: if (f < 15) { club.DecreaseAttackMin(); } break; } } if (player.weapon.IsDestroyed() == true) { tempindex = player.weaponindex; UnequipItem(tempindex); DumpItem(tempindex); } Debug.Log("공격 끝"); gameManager.EndPlayerTurn(Unit.Action.Attack); }