Exemple #1
0
    /**
     * \\ 모든 몹이 공통으로 사용하는 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);
        }
    }
Exemple #2
0
    /**
     * 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);
    }