示例#1
0
    public static BaseEnemyCharacter GetEnemy(long objNo, ushort floor, float hpProb, float atkProb, float expProb, float startProbHp, float startProbAtk, float startProbExp)
    {
        TableEnemyData     data = Array.Find(Table, i => i.ObjNo == objNo);
        BaseEnemyCharacter item = new BaseEnemyCharacter();

        item.Initialize();
        SetData(item, data, floor, data.Level, hpProb, atkProb, expProb, startProbHp, startProbAtk, startProbExp);

        switch (item.EType)
        {
        case EnemyType.Plant_1:
            //item.PosY = 3.18f;
            item.WEType = WeaponEffectType.Stone;
            break;

        case EnemyType.Plant_King:
            //item.PosY = 3.18f;
            item.WEType = WeaponEffectType.Stone;
            break;

        case EnemyType.PA_Drone_1:
            //item.PosY = 2.9f;
            item.WEType = WeaponEffectType.MachineGun;
            break;

        default:
            break;
        }
        return(item);
    }
示例#2
0
    public static bool SetLevel(BaseEnemyCharacter unit, int level, ushort floor, float hpProb, float atkProb, float expProb, float startProbHp, float startProbAtk, float startProbExp)
    {
        TableEnemyData data = Array.Find(Table, i => i.ObjNo == unit.ObjNo);

        if (CommonFunction.IsNull(data) == true)
        {
            return(false);
        }
        else
        {
            SetData(unit, data, floor, level, hpProb, atkProb, expProb, startProbHp, startProbAtk, startProbExp);
            return(true);
        }
    }
示例#3
0
        void Start()
        {
            // Start up the FSM
            aiStateMachine = new AIFSM("BaseController of " + gameObject.name, this);

            aiStateMachine.Start(EAIState.IDLE);

            // Cache a ref to our controlled character
            character = gameObject.GetComponent <BaseEnemyCharacter>();
            character.gameObject.GetComponent <Health>().OnNoHealth.AddListener(OnCharacterDied);

            // Grab our nav mesh agent
            agent = gameObject.GetComponent <NavMeshAgent>();

            // Bind to perception events
            eyes = GetComponentInChildren <Perception>();
            eyes.OnSeenTarget.AddListener((newTarget) => { SeePlayer(newTarget); });
            eyes.OnLostTarget.AddListener(LostPlayer);
        }
示例#4
0
    private static void SetData(BaseEnemyCharacter item, TableEnemyData data, ushort floor, int level, float hpProb, float atkProb, float expProb, float startProbHp, float startProbAtk, float startProbExp)
    {
        item.ObjNo  = data.ObjNo;
        item.UnitNo = data.UnitNo;
        if (GameStateInformation.IsEnglish == false)
        {
            item.DisplayName = data.DisplayName;
        }
        else
        {
            item.DisplayName = data.DisplayNameEn;
        }
        item.EType               = data.EType;
        item.InstanceName        = data.Instance;
        item.Level               = level;
        item.Race                = data.Race;
        item.CurrentHp           = (data.Hp * level * startProbHp) + (data.MagHp * hpProb * floor);
        item.MaxHpDefault        = item.CurrentHp;
        item.FiringRange         = data.Range;
        item.DefaultActionTurn   = data.TurnMove;
        item.ActionTurn          = item.DefaultActionTurn;
        item.IsMove              = data.IsMove;
        item.AddAbnormalProb     = data.StateBad;
        item.BaseAttack          = ((data.Attack * startProbAtk) + (data.MagAtk * atkProb * floor)) * level;
        item.Dexterity           = data.Dex;
        item.BaseDefense         = ((data.Defence * startProbAtk) + (data.MagDef * atkProb * floor)) * level;
        item.PowerValue          = data.Power;
        item.Critical            = data.Cri;
        item.CriticalDexterity   = data.CriDex;
        item.HaveExperience      = Mathf.CeilToInt(((data.Exp * startProbExp) + (data.MagExp * expProb * floor)) * level);
        item.CommonString        = data.Common;
        item.CurrentExperience   = 0;
        item.NextLevelExperience = 1;

        item.HaveScore = data.HaveScore;
    }
示例#5
0
    /// <summary>
    /// 投げる効果(誰かに当たった時)
    /// </summary>
    private bool ThrowActionEffect(ManageDungeon dun, PlayerCharacter player, BaseCharacter target)
    {
        switch (BType)
        {
        case BallType.Fire:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Bomb);

            int damage = FireBallFixDamage + Mathf.FloorToInt(player.BaseAttack * 2);

            AttackState atState = target.AddDamage(damage);
            //ボールエフェクト
            EffectFireBallLanding.CreateObject(target).Play();

            //ダメージエフェクト
            EffectDamage d = EffectDamage.CreateObject(target);
            d.SetText(damage.ToString(), AttackState.Hit);
            d.Play();

            //ヒットメッセージ
            DisplayInformation.Info.AddMessage(
                target.GetMessageAttackHit(damage));

            //対象が死亡したら
            if (atState == AttackState.Death)
            {
                if (target.Type == ObjectType.Player)
                {
                    ScoreInformation.Info.CauseDeath =
                        string.Format(CommonConst.DeathMessage.Item, this.DisplayNameNormal);

                    ScoreInformation.Info.CauseDeathType = DeathCouseType.Item;
                }

                DisplayInformation.Info.AddMessage(
                    target.GetMessageDeath(target.HaveExperience));

                player.Death(target, player.AttackInfo);
                target.DeathAction(dun);
            }
            break;

        case BallType.Gyro:

            SoundInformation.Sound.Play(SoundInformation.SoundType.BucketFall);

            //ターゲットが吹き飛ぶ先のポイントを取得
            bool     isWall;
            MapPoint point = dun.GetBlow(target.CurrentPoint, Direction, out isWall);

            //対象のポイントが取得できなければ
            if (CommonFunction.IsNull(point) == true)
            {
            }
            //対象ポイントが取得できればそこに移動
            else
            {
                if (typeof(BaseEnemyCharacter) == target.GetType())
                {
                    ((BaseEnemyCharacter)target).MoveState = EnemySearchState.FightPlayer;
                }
                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.BlowCharacter, target.DisplayNameInMessage));
                target.BlowDirection = Direction;
                target.BlowPoint     = point;
                target.MoveSpeed     = CommonConst.SystemValue.MoveSpeedDash;
                dun.MoveCharacter(point, target);

                //対象に衝突ダメージ
                if (isWall == true)
                {
                    target.BlowAfterDamage = GyroFixDamage;
                }

                //吹っ飛び先に誰かがいた場合
                MapPoint      vector = CommonFunction.CharacterDirectionVector[Direction];
                MapPoint      next   = MapPoint.Get(point.X + vector.X, point.Y + vector.Y);
                BaseCharacter second = dun.CharacterMap.Get(point.X, point.Y);
                if (CommonFunction.IsNull(second) == false)
                {
                    second.BlowAfterDamage = GyroFixDamage;
                    second.BlowPoint       = second.CurrentPoint;
                }
            }

            break;

        case BallType.Change:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            if (typeof(BaseEnemyCharacter) == target.GetType())
            {
                ((BaseEnemyCharacter)target).MoveState = EnemySearchState.FightPlayer;
            }
            //ターゲットとプレイヤーの場所を交換

            EffectSmoke.CreateObject(target).Play();
            EffectSmoke.CreateObject(player).Play();
            MapPoint tarp = target.CurrentPoint;
            target.SetPosition(player.CurrentPoint.X, player.CurrentPoint.Y);
            player.SetPosition(tarp.X, tarp.Y);
            DisplayInformation.Info.AddMessage(
                string.Format(CommonConst.Message.ChangePoint, target.DisplayNameInMessage));
            break;

        case BallType.Pickoff:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //対象に混乱を付与
            int result = target.AddStateAbnormal((int)StateAbnormal.Confusion);
            //対象が混乱になったらメッセージを表示
            if (result != 0)
            {
                EffectSmoke.CreateObject(target).Play();
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Confusion, target));
            }
            break;

        case BallType.Bean:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //対象に麻痺を付与
            int bresult = target.AddStateAbnormal((int)StateAbnormal.Palalysis);
            //対象が麻痺になったらメッセージを表示
            if (bresult != 0)
            {
                EffectSmoke.CreateObject(target).Play();
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Palalysis, target));
            }
            break;

        case BallType.Decoy:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //対象にデコイを付与
            int dresult = target.AddStateAbnormal((int)StateAbnormal.Decoy);
            //対象がデコイになったらメッセージを表示
            if (dresult != 0)
            {
                EffectSmoke.CreateObject(target).Play();
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Decoy, target));
            }
            break;

        case BallType.Slow:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //対象にスローを付与
            int sresult = target.AddStateAbnormal((int)StateAbnormal.Slow);
            //対象がスローになったらメッセージを表示
            if (sresult != 0)
            {
                EffectSmoke.CreateObject(target).Play();
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Slow, target));
            }
            break;

        //ナックル
        case BallType.Knuckle:

            List <BallType> blist = new List <BallType>();
            foreach (BallType val in Enum.GetValues(typeof(BallType)))
            {
                blist.Add(val);
            }
            blist.Remove(BallType.Knuckle);
            blist.Remove(BallType.Handmaid);

            //ナックル以外の効果をランダムで取得
            BallType temp = blist[UnityEngine.Random.Range(0, blist.Count)];

            BallBase b = new BallBase();
            b.CurrentPoint = CurrentPoint;
            b.Direction    = Direction;
            b.BType        = temp;
            //効果を発動
            b.ThrowActionEffect(dun, player, target);
            break;

        case BallType.Trap:

            TrapBreaker(dun, player);
            break;

        case BallType.Handmaid:

            //ヒットエフェクト
            EffectFireBallLanding.CreateObject(target).Play();

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.AttackHit);

            //範囲拡大がついているとき
            int   plus;
            float cf;
            int   dist = 0;
            if (CommonFunction.HasOptionType(this.Options, OptionType.Wildfire, out plus, out cf) == true)
            {
                dist = plus;
            }

            dun.SetUpCharacterMap();
            List <BaseCharacter> targets = dun.GetNearCharacters(target.CurrentPoint, dist, true);

            foreach (BaseCharacter t in targets)
            {
                //int damage2 = FireBallFixDamage + Mathf.FloorToInt(player.BaseAttack * 2);
                int damage2 = Mathf.FloorToInt((15 + player.BaseAttack) / (target.CurrentPoint.DistanceAbs(t.CurrentPoint) + 1));

                //効果増幅があったら
                if (CommonFunction.HasOptionType(this.Options, OptionType.EffectUp, out plus, out cf) == true)
                {
                    damage2 = damage2 + plus * (int)cf;
                }
                //効果縮小があったら
                if (CommonFunction.HasOptionType(this.Options, OptionType.EffectDown, out plus, out cf) == true)
                {
                    damage2 = damage2 - plus * (int)cf;
                }

                //ダメージ増減30%
                float rand = 0.3f;
                if (CommonFunction.HasOptionType(this.Options, OptionType.EffectStabile, out plus, out cf) == true)
                {
                    rand -= cf * plus;
                }
                else if (CommonFunction.HasOptionType(this.Options, OptionType.EffectNotStabile, out plus, out cf) == true)
                {
                    rand += cf * plus;
                }

                damage2 += Mathf.CeilToInt(UnityEngine.Random.Range(-rand * damage2, rand * damage2));

                //通常ダメージの場合
                if (CommonFunction.HasOptionType(this.Options, OptionType.ReverceDamage) == false)
                {
                    AttackState atState2 = t.AddDamage(damage2);

                    //ダメージエフェクト
                    EffectDamage d2 = EffectDamage.CreateObject(t);
                    d2.SetText(damage2.ToString(), AttackState.Hit);
                    d2.Play();

                    //ヒットメッセージ
                    DisplayInformation.Info.AddMessage(
                        t.GetMessageAttackHit(damage2));

                    //対象が死亡したら
                    if (atState2 == AttackState.Death)
                    {
                        DisplayInformation.Info.AddMessage(
                            t.GetMessageDeath(t.HaveExperience));

                        if (t.Type == ObjectType.Player)
                        {
                            ScoreInformation.Info.CauseDeath =
                                string.Format(CommonConst.DeathMessage.Item, this.DisplayNameNormal);

                            ScoreInformation.Info.CauseDeathType = DeathCouseType.Item;

                            t.Death();
                        }
                        else
                        {
                            if (IsExp == true)
                            {
                                player.Death(t, player.AttackInfo);
                            }
                            else
                            {
                                t.Death();
                            }
                        }
                        t.DeathAction(dun);
                    }
                }
                //基本効果反転
                else
                {
                    t.RecoverHp(damage2);

                    //ヒットエフェクト
                    EffetHitShockWave.CreateObject(t).Play();

                    //ダメージエフェクト
                    EffectDamage d2 = EffectDamage.CreateObject(t);
                    d2.SetText(damage2.ToString(), AttackState.Heal);
                    d2.Play();

                    //ヒットメッセージ
                    DisplayInformation.Info.AddMessage(
                        string.Format(CommonConst.Message.RecoverHp, t.DisplayNameInMessage));
                }
            }

            //状態異常の付与
            EffectAbnormal(targets);

            //火柱があれば火柱を立てる
            if (CommonFunction.HasOptionType(this.Options, OptionType.CatchingFire) == true)
            {
                dun.SetUpTrapMap();
                if (CommonFunction.IsNull(dun.TrapMap.Get(CurrentPoint)) == true)
                {
                    BaseTrap trap = TableTrap.GetTrap(CommonConst.ObjNo.Ember);
                    trap.Options   = CommonFunction.CloneOptions(this.Options);
                    trap.IsVisible = true;
                    trap.SetThisDisplayTrap(CurrentPoint.X, CurrentPoint.Y);
                    dun.AddNewTrap(trap);

                    DisplayInformation.Info.AddMessage(
                        CommonConst.Message.TrapEmber);
                }
            }

            break;

        case BallType.Fumble:
            //対象のレベルが2以上ならレベルを下げる
            if (target.Level > 1)
            {
                if (target.Type == ObjectType.Enemy)
                {
                    BaseEnemyCharacter enemy = ((BaseEnemyCharacter)target);
                    enemy.Level--;
                    TableEnemy.SetLevel(enemy, enemy.Level,
                                        DisplayInformation.Info.Floor,
                                        DungeonInformation.Info.EnemyHpProb,
                                        DungeonInformation.Info.EnemyAtkProb,
                                        DungeonInformation.Info.EnemyExpProb,
                                        DungeonInformation.Info.StartProbHp,
                                        DungeonInformation.Info.StartProbAtk,
                                        DungeonInformation.Info.StartProbExp);

                    DisplayInformation.Info.AddMessage(
                        string.Format(CommonConst.Message.LevelDownPlayer, enemy.DisplayNameInMessage));

                    EffectBadSmoke.CreateObject(enemy).Play();
                }
            }

            break;

        case BallType.Winning:

            if (target.Type == ObjectType.Enemy)
            {
                BaseEnemyCharacter enemy = ((BaseEnemyCharacter)target);
                enemy.Level++;
                TableEnemy.SetLevel(enemy, enemy.Level,
                                    DisplayInformation.Info.Floor,
                                    DungeonInformation.Info.EnemyHpProb,
                                    DungeonInformation.Info.EnemyAtkProb,
                                    DungeonInformation.Info.EnemyExpProb,
                                    DungeonInformation.Info.StartProbHp,
                                    DungeonInformation.Info.StartProbAtk,
                                    DungeonInformation.Info.StartProbExp);

                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.LevelUpPlayer, enemy.DisplayNameInMessage));

                EffectFlareCore.CreateObject(enemy).Play();
            }
            break;

        case BallType.Four:

            if (target.Type == ObjectType.Enemy)
            {
                BaseEnemyCharacter enemy = ((BaseEnemyCharacter)target);

                if (enemy.IsFourBallCount() == true)
                {
                    int dam = Mathf.CeilToInt(enemy.MaxHp);

                    AttackState atstate = target.AddDamage(dam);
                    //ボールエフェクト
                    EffetHitShockWave.CreateObject(enemy).Play();

                    //ダメージエフェクト
                    EffectDamage dt = EffectDamage.CreateObject(target);
                    dt.SetText(dam.ToString(), AttackState.Hit);
                    dt.Play();

                    //ヒットメッセージ
                    DisplayInformation.Info.AddMessage(
                        target.GetMessageAttackHit(dam));

                    SoundInformation.Sound.Play(SoundInformation.SoundType.AttackHit);

                    //対象が死亡したら
                    if (atstate == AttackState.Death)
                    {
                        if (target.Type == ObjectType.Player)
                        {
                            ScoreInformation.Info.CauseDeath =
                                string.Format(CommonConst.DeathMessage.Item, this.DisplayNameNormal);

                            ScoreInformation.Info.CauseDeathType = DeathCouseType.Item;
                        }
                        DisplayInformation.Info.AddMessage(
                            target.GetMessageDeath(target.HaveExperience));

                        player.Death(target, player.AttackInfo);
                        target.DeathAction(dun);
                    }
                }
                else
                {
                    SoundInformation.Sound.Play(SoundInformation.SoundType.AttackHit);
                    //ボールエフェクト
                    EffetHitShockWave.CreateObject(enemy).Play();
                }
            }

            break;

        case BallType.Emery:

            if (target.Type == ObjectType.Enemy)
            {
                BaseEnemyCharacter enemy = ((BaseEnemyCharacter)target);

                if (enemy.IsBoss() == false)
                {
                    GameStateInformation.Info.EmeryTarget = target.ObjNo;

                    DisplayInformation.Info.AddMessage(
                        string.Format(CommonConst.Message.EmeryCharacter, target.DisplayNameInMessage));

                    List <BaseCharacter> emeryies = dun.Characters.FindAll(i => i.ObjNo == target.ObjNo);

                    SoundInformation.Sound.Play(SoundInformation.SoundType.Summon);

                    foreach (BaseCharacter c in emeryies)
                    {
                        EffectSmoke.CreateObject(c, false).Play();

                        dun.RemoveCharacter(c);
                        ManageDungeon.KillObjectNow(c);
                    }
                }
            }
            break;
        }
        Options = null;

        return(true);
    }
示例#6
0
    /// <summary>
    /// 奏でる
    /// </summary>
    public override bool Melody(ManageDungeon dun, PlayerCharacter player)
    {
        BaseCharacter[] targets;

        player.AttackInfo.Initialize();

        //音を鳴らす
        player.AttackInfo.AddVoice(VoiceInformation.VoiceType.Sing);

        switch (MType)
        {
        //放電
        case MelodyType.Electric:

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.ElectricMelody);

            const int ElectricDamage = 20;
            int       damage         = ElectricDamage + Mathf.FloorToInt(player.BaseAttack);

            //エフェクト
            player.AttackInfo.AddEffect(EffectSpark.CreateObject(player));

            //メッセージ
            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            //部屋の中のキャラクターを取得
            targets = dun.GetRoomCharacters(player);

            //全員にダメージ
            foreach (BaseCharacter c in targets)
            {
                AttackState atState = c.AddDamage(damage);

                //ダメージエフェクト
                EffectDamage d = EffectDamage.CreateObject(c);
                d.SetText(damage.ToString(), AttackState.Hit);
                player.AttackInfo.AddEffect(d);

                //ヒットメッセージ
                player.AttackInfo.AddMessage(
                    c.GetMessageAttackHit(damage));

                //対象が死亡したら
                if (atState == AttackState.Death)
                {
                    player.AttackInfo.AddKillList(c);

                    player.AttackInfo.AddMessage(
                        c.GetMessageDeath(c.HaveExperience));

                    player.Death(c, player.AttackInfo);
                }
            }


            break;

        //狂乱
        case MelodyType.Confusion:

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.Smoke);

            //メッセージ
            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            //部屋の中のキャラクターを取得
            targets = dun.GetRoomCharacters(player);

            //全員を混乱
            foreach (BaseCharacter c in targets)
            {
                //対象に混乱を付与
                int result = c.AddStateAbnormal((int)StateAbnormal.Confusion);
                //対象が混乱になったらメッセージを表示
                if (result != 0)
                {
                    player.AttackInfo.AddEffect(EffectSmoke.CreateObject(c));

                    player.AttackInfo.AddMessage(
                        CommonFunction.GetAbnormalMessage(StateAbnormal.Confusion, c));
                }
            }
            break;

        //まどろみ
        case MelodyType.Sleep:

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.Smoke);

            //メッセージ
            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            //部屋の中のキャラクターを取得
            targets = dun.GetRoomCharacters(player);

            //全員を睡眠
            foreach (BaseCharacter c in targets)
            {
                //対象に睡眠を付与
                int result = c.AddStateAbnormal((int)StateAbnormal.Sleep);
                //対象が睡眠になったらメッセージを表示
                if (result != 0)
                {
                    player.AttackInfo.AddEffect(EffectSmoke.CreateObject(c));

                    player.AttackInfo.AddMessage(
                        CommonFunction.GetAbnormalMessage(StateAbnormal.Sleep, c));
                }
            }
            break;

        //無秩序
        case MelodyType.Anarchy:

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.Smoke);

            //メッセージ
            player.AttackInfo.AddMessage(string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            //部屋の中のキャラクターを取得
            targets = dun.GetRoomCharacters(player);

            //全員をデコイ
            foreach (BaseCharacter c in targets)
            {
                //対象にデコイを付与
                int result = c.AddStateAbnormal((int)StateAbnormal.Decoy);
                //対象がデコイになったらメッセージを表示
                if (result != 0)
                {
                    player.AttackInfo.AddEffect(EffectSmoke.CreateObject(c));

                    player.AttackInfo.AddMessage(
                        CommonFunction.GetAbnormalMessage(StateAbnormal.Decoy, c));
                }
            }
            break;

        //薄ら日
        case MelodyType.Light:

            //エフェクト
            player.AttackInfo.AddEffect(EffectFlash.CreateObject());

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.Smoke);

            //メッセージ
            player.AttackInfo.AddMessage(string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            dun.IsVisible      = true;
            dun.IsEnemyVisible = true;
            dun.IsItemVisible  = true;
            dun.IsTrapVisible  = true;
            break;

        //角笛
        case MelodyType.Horn:

            //サウンドを鳴らす
            player.AttackInfo.AddSound(SoundInformation.SoundType.Summon);

            //エフェクトの発動
            player.AttackInfo.AddEffect(EffectSummon.CreateObject(player));

            int cnt = CommonFunction.ConvergenceRandom(3, 0.9f, 1.2f, 10);

            for (int i = 0; i < cnt; i++)
            {
                dun.SetUpCharacterMap();
                //敵の出現地点を取得
                MapPoint mp = dun.GetCharacterEmptyTarget(player.CurrentPoint);
                if (CommonFunction.IsNull(mp) == true)
                {
                    break;
                }

                int  enemytype           = TableEnemyMap.GetValue(dun.DungeonObjNo, DisplayInformation.Info.Floor);
                uint rand                = CommonFunction.GetRandomUInt32();
                BaseEnemyCharacter enemy = TableEnemyIncidence.GetEnemy(enemytype, rand, DisplayInformation.Info.Floor);

                enemy.SetCharacterDisplayObject(mp.X, mp.Y);
                dun.AddNewCharacter(enemy);
            }
            DisplayInformation.Info.AddMessage(
                CommonConst.Message.TrapSummon);

            break;

        // 忘却
        case MelodyType.Forget:

            //メッセージ
            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            //効果音
            player.AttackInfo.AddSound(SoundInformation.SoundType.Summon);

            if (dun.IsVisible == false)
            {
                for (int j = 1; j < dun.X - 1; j++)
                {
                    for (int i = 1; i < dun.Y - 1; i++)
                    {
                        dun.Dungeon.DungeonMap.Get(i, j).IsClear = false;
                    }
                }

                player.AttackInfo.AddMessage(CommonConst.Message.ForgetMap);

                player.AttackInfo.AddEffect(EffectSmoke.CreateObject(player));
            }

            break;

        //捨て置き
        case MelodyType.ThrowAway:

            //メッセージ
            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.MelodySing, DisplayNameInMessage));

            player.AttackInfo.AddMessage(
                string.Format(CommonConst.Message.ThrowAway, player.DisplayNameInMessage));

            GameStateInformation.Info.IsThrowAway = true;

            break;
        }
        return(true);
    }
示例#7
0
    public bool Invocate(ManageDungeon dun)
    {
        if (IsInvocation == false)
        {
            return(false);
        }
        IsActive     = true;
        IsInvocation = false;
        int bresult;

        //オプションによるトラップ回避
        float t = 0;

        foreach (BaseOption o in Target.Options)
        {
            t += o.DexTrap();
        }

        if (CommonFunction.IsRandom(t) == true)
        {
            DisplayInformation.Info.AddMessage(CommonConst.Message.DexTrap);
            Target = null;
            return(false);
        }

        //スコア値の更新
        DungeonHistoryInformation.Info.iTrapInvokeCount++;

        //サウンドを鳴らす
        if (Target.Type == ObjectType.Player)
        {
            VoiceInformation.Voice.Play(PlayerInformation.Info.PType, VoiceInformation.Voice.PlayRandomDefence());
        }

        bool result = false;

        //効果発動
        switch (TType)
        {
        case TrapType.Bomb:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Bomb);

            //エフェクトの発動
            EffectBigBang.CreateObject(this).Play();

            //ダメージ処理
            int         damage  = Mathf.CeilToInt(Target.CurrentHp / PerPlayerDamage);
            AttackState atState = Target.AddDamage(damage);

            //プレイヤーが死亡したら
            if (atState == AttackState.Death)
            {
                DisplayInformation.Info.AddMessage(
                    Target.GetMessageDeath(Target.HaveExperience));

                ScoreInformation.Info.CauseDeath =
                    string.Format(CommonConst.DeathMessage.Trap, DisplayNameNormal);
                ScoreInformation.Info.CauseDeathType = DeathCouseType.Trap;

                Target.Death();
                Target.DeathAction(dun);
            }


            //ダメージエフェクト
            EffectDamage d = EffectDamage.CreateObject(Target);
            d.SetText(damage.ToString(), AttackState.Hit);
            d.Play();

            //ヒットメッセージ
            DisplayInformation.Info.AddMessage(
                Target.GetMessageAttackHit(damage));

            //周辺キャラのダメージ処理
            dun.SetUpCharacterMap();
            List <BaseCharacter> list = dun.GetNearCharacters(this.CurrentPoint, 1);
            foreach (BaseCharacter c in list)
            {
                atState = c.AddDamage(CommonNumber);
                EffectDamage d2 = EffectDamage.CreateObject(c);
                d2.SetText(CommonNumber.ToString(), AttackState.Hit);
                d2.Play();

                //対象が死亡したら
                if (atState == AttackState.Death)
                {
                    DisplayInformation.Info.AddMessage(
                        string.Format(CommonConst.Message.DeathCommon, c.DisplayNameInMessage));

                    c.Death();
                    c.DeathAction(dun);
                }
            }
            result = true;
            break;

        case TrapType.ColorMonitor:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectColorMonitor.CreateObject(this).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.StiffShoulder);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.StiffShoulder, Target));
            }
            result = true;
            break;

        case TrapType.Cyclone:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Cyclone);

            //エフェクトの発動
            EffectCyclone.CreateObject(Target).Play();

            //メッセージの出力
            DisplayInformation.Info.AddMessage(
                string.Format(CommonConst.Message.TrapCyclone2, Target.DisplayNameInMessage));

            //効果

            result = true;
            break;

        case TrapType.Electric:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.ElectricTrap);

            //エフェクトの発動
            EffectThunder.CreateObject(Target).Play();

            BaseItem[] equips = PlayerCharacter.ItemList.FindAll(i => i.IsEquip == true).ToArray();

            if (equips.Length > 0)
            {
                foreach (BaseItem i in equips)
                {
                    i.ForceRemoveEquip(Target);
                }

                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.TrapEquipRemove, Target.DisplayNameInMessage));
            }

            result = true;
            break;

        case TrapType.Mud:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectBadSmoke.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Slow);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Slow, Target));
            }
            result = true;
            break;

        case TrapType.Palalysis:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectBadSmoke.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Palalysis);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Palalysis, Target));
            }
            result = true;
            break;

        case TrapType.Photo:
            if (Target.Type == ObjectType.Player)
            {
                //サウンドを鳴らす
                SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

                //エフェクトの発動
                EffectBadSmoke.CreateObject(Target).Play();

                //メッセージの出力
                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.TrapCroquette2, Target.DisplayNameInMessage));

                ((PlayerCharacter)Target).ReduceSatiety(CommonNumber);
                result = true;
            }
            break;

        case TrapType.Poison:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectBadSmoke.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Poison);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Poison, Target));
            }

            result = true;
            break;

        case TrapType.DeadlyPoison:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectBadSmoke.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.DeadlyPoison);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.DeadlyPoison, Target));
            }

            result = true;
            break;

        case TrapType.Rotation:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Rotation);

            //エフェクトの発動
            EffectRotation.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Confusion);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                EffectSmoke.CreateObject(Target);
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Confusion, Target));
            }


            result = true;
            break;

        case TrapType.SandStorm:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Cyclone);

            //エフェクトの発動
            EffectSandStorm.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Dark);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Dark, Target));
            }
            result = true;
            break;

        case TrapType.Song:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectBadSmoke.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Sleep);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Sleep, Target));
            }
            result = true;
            break;

        case TrapType.Summon:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Summon);

            //エフェクトの発動
            EffectSummon.CreateObject(Target).Play();

            int cnt = CommonFunction.ConvergenceRandom(CountStart, ProbStart, ProbReduce);

            for (int i = 0; i < cnt; i++)
            {
                dun.SetUpCharacterMap();
                //敵の出現地点を取得
                MapPoint mp = dun.GetCharacterEmptyTarget(Target.CurrentPoint);
                if (CommonFunction.IsNull(mp) == true)
                {
                    break;
                }

                int  enemytype           = TableEnemyMap.GetValue(dun.DungeonObjNo, DisplayInformation.Info.Floor);
                uint rand                = CommonFunction.GetRandomUInt32();
                BaseEnemyCharacter enemy = TableEnemyIncidence.GetEnemy(enemytype, rand, DisplayInformation.Info.Floor);

                enemy.SetCharacterDisplayObject(mp.X, mp.Y);
                dun.AddNewCharacter(enemy);
            }
            DisplayInformation.Info.AddMessage(
                CommonConst.Message.TrapSummon);

            result = true;
            break;

        case TrapType.TheFly:

            if (Target.Type == ObjectType.Player)
            {
                //サウンドを鳴らす
                SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

                //エフェクトの発動
                EffectBadSmoke.CreateObject(Target).Play();

                BaseItem[] foods = PlayerCharacter.ItemList.FindAll(i => i.IType == ItemType.Food).ToArray();

                if (foods.Length > 0)
                {
                    foreach (BaseItem i in foods)
                    {
                        PlayerCharacter.RemoveItem(i);
                        ((PlayerCharacter)Target).AddItem(TableFood.GetItem(CommonConst.ObjNo.FlyCroquette), i.SortNo);
                    }

                    //メッセージの出力
                    DisplayInformation.Info.AddMessage(
                        string.Format(CommonConst.Message.TrapFly2));
                }

                result = true;
            }
            break;

        case TrapType.WaterBucket:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.BucketFall);

            //エフェクトの発動
            EffectWaterBucket.CreateObject(Target).Play();

            //効果
            bresult = Target.AddStateAbnormal((int)StateAbnormal.Reticent);
            //対象が異常になったらメッセージを表示
            if (bresult != 0)
            {
                DisplayInformation.Info.AddMessage(
                    CommonFunction.GetAbnormalMessage(StateAbnormal.Reticent, Target));
            }

            result = true;
            break;

        //花粉
        case TrapType.Pollen:

            //サウンドを鳴らす
            SoundInformation.Sound.Play(SoundInformation.SoundType.Smoke);

            //エフェクトの発動
            EffectSmoke d3 = EffectSmoke.CreateObject(Target);
            d3.SetColor(Color.yellow);
            d3.Play();

            //力減少
            Target.ReducePower((ushort)CommonNumber);

            //メッセージの出力
            DisplayInformation.Info.AddMessage(
                string.Format(CommonConst.Message.TrapPllen2, Target.DisplayNameInMessage));

            result = true;
            break;

        case TrapType.Ember:

            //ダメージ処理
            int damage2 = CommonNumber;

            //通常ダメージの場合
            if (CommonFunction.HasOptionType(this.Options, OptionType.ReverceDamage) == false)
            {
                AttackState atState2 = Target.AddDamage(damage2);

                //ダメージエフェクト
                EffectDamage d4 = EffectDamage.CreateObject(Target);
                d4.SetText(damage2.ToString(), AttackState.Hit);
                d4.Play();

                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.TrapDamage, Target.DisplayNameInMessage, this.DisplayNameInMessage, damage2));

                //対象が死亡したら
                if (atState2 == AttackState.Death)
                {
                    DisplayInformation.Info.AddMessage(
                        Target.GetMessageDeath(Target.HaveExperience));

                    if (Target.Type == ObjectType.Player)
                    {
                        ScoreInformation.Info.CauseDeath =
                            string.Format(CommonConst.DeathMessage.Trap, DisplayNameNormal);
                        ScoreInformation.Info.CauseDeathType = DeathCouseType.Trap;
                    }
                    Target.Death();
                    Target.DeathAction(dun);
                }
            }
            //反転回復の場合
            else
            {
                Target.RecoverHp(damage2);

                //ダメージエフェクト
                EffectDamage d4 = EffectDamage.CreateObject(Target);
                d4.SetText(damage2.ToString(), AttackState.Heal);
                d4.Play();


                DisplayInformation.Info.AddMessage(
                    string.Format(CommonConst.Message.TrapRecover, Target.DisplayNameInMessage, this.DisplayNameInMessage, damage2));
            }
            break;
        }
        Target = null;

        return(result);
    }