상속: MonoBehaviour
예제 #1
0
 public StateBasicEnemyAir(BasicEnemy _p, float _speedX=-1)
 {
     p = _p;
     speedX = _speedX;
     if (speedX != -1)
         p.rb().velocity = new Vector3(speedX, p.rb().velocity.y, 0);
 }
예제 #2
0
 void Start()
 {
     basicEnemy        = enemy.GetComponent <BasicEnemy>();
     playerInViewRange = false;
 }
예제 #3
0
    private void SpawnEnemies(List <WaveEntity> selectedFormationEntities, int[] shipTypes, float minVerticalStartCoord,
                              float maxVerticalStartCoord, float enemyHorizontalDist, float enemyVerticalDist, float maxEnemyHorizontalDist)
    {
        bool    waveManeuvers = false;
        Vector2 maneuveringVector;
        float   maneuveringVerticalLength = 0.0f;

        float selectedVerticalStartCoord = Random.Range(minVerticalStartCoord, maxVerticalStartCoord);
        float diffFromCeiling            = maxVerticalStartCoord - selectedVerticalStartCoord;
        float diffFromFloor = selectedVerticalStartCoord - minVerticalStartCoord;

        float waveManeuveringRoom;

        if (diffFromCeiling > diffFromFloor)
        {
            waveManeuveringRoom = diffFromCeiling;
            maneuveringVector   = Vector2.up * ManeuveringDirectionMoveSpeed;
        }
        else
        {
            waveManeuveringRoom = diffFromFloor;
            maneuveringVector   = Vector2.down * ManeuveringDirectionMoveSpeed;
        }

        if (waveManeuveringRoom > ShipColliderVertSize)
        {
            //20 40 60 80 100 percent chance of a maneuvering wave depending on difficulty coefficient
            float waveManeuveringChangePercentage = (float)(_difficultyManagerScript.DifficultyCoefs[DifficultyParameter.DpWaveManeuveringChance] * 100) /
                                                    GameConstants.MaxDifficulty;

            int doManeuver = Random.Range(0, 100);
            if (doManeuver < waveManeuveringChangePercentage)
            {
                waveManeuvers             = true;
                maneuveringVerticalLength = Random.Range(ShipColliderVertSize, waveManeuveringRoom);
            }
        }

        //VII. Spawn Enemies
        GameObject waveScoreIndicator = Instantiate(WaveScoreIndicatorPrefab);

        waveScoreIndicator.transform.SetParent(CanvasScorePanel.transform, false);

        GameObject lineRendererObject = Instantiate(ShipConnectionPrefab, Vector3.zero, Quaternion.identity);

        EnemyWave curEnemyWave = new EnemyWave(_playerScript, lineRendererObject.GetComponent <LineRenderer>(),
                                               _canvasRectTransform, waveScoreIndicator, _scoreLeftAnchorXPos, _scoreRightAnchorXPos);

        for (int i = 0; i < selectedFormationEntities.Count; i++)
        {
            int        enemyKind         = shipTypes[i];
            GameObject enemyPrefab       = EnemyPrefabArray[enemyKind];
            BasicEnemy enemyPrefabScript = enemyPrefab.GetComponent <BasicEnemy>();

            Vector2 enemyPos;
            if (i > 0)
            {
                Vector2 posDiff = selectedFormationEntities[i].Position - selectedFormationEntities[i - 1].Position;

                int xPosDiff = (int)posDiff.x;
                int yPosDiff = (int)posDiff.y;

                int xIncrement = xPosDiff != 0 ? Math.Sign(xPosDiff) : 0;
                int yIncrement = yPosDiff != 0 ? Math.Sign(yPosDiff) : 0;

                Vector3 previousEnemyPos = curEnemyWave.GetLastEnemyPosition();

                enemyPos = new Vector2(previousEnemyPos.x + xIncrement * enemyHorizontalDist, previousEnemyPos.y + yIncrement * enemyVerticalDist);
            }
            else
            {
                //determining first enemy position
                enemyPos = new Vector2(enemyPrefabScript.HorizontalSpawnCoord + selectedFormationEntities[i].Position.x * maxEnemyHorizontalDist, selectedVerticalStartCoord);
            }

            GameObject enemy = Instantiate(enemyPrefab, enemyPos, Quaternion.identity);
            Assert.IsNotNull(enemy);

            BasicEnemy basicEnemyScript = enemy.GetComponent <BasicEnemy>();
            BasicMove  basicMoveScript  = enemy.GetComponent <BasicMove>();

            curEnemyWave.AddNewEnemy(enemy, basicEnemyScript);
            basicEnemyScript.Initialize(_playerScript, _difficultyManagerScript, basicMoveScript, selectedFormationEntities[i].MoveDir, curEnemyWave);
            basicEnemyScript.SetMoveDir(selectedFormationEntities[i].MoveDir);
        }
        curEnemyWave.FinalizeAfterWaveIsFilled(waveManeuvers, maneuveringVector, maneuveringVerticalLength);
        _enemyWaves.Add(curEnemyWave);
    }
예제 #4
0
 public override void OnEnterState(BasicEnemy enemy)
 {
     currentTime = 0;
 }
예제 #5
0
 // Use this for initialization
 void Start()
 {
     player            = GameObject.FindGameObjectWithTag("Player");
     basicenemy        = enemy.GetComponent <BasicEnemy>();
     playerInTerritory = false;
 }
 // Start is called before the first frame update
 void Start()
 {
     target       = Waypoints.points[0];
     enemy        = GetComponent <BasicEnemy>();
     lastPosition = transform.position;
 }
예제 #7
0
 public override Vector2 GetSteering(BasicEnemy enemy, Vector2 currentSteering)
 {
     return(Vector2.zero);
 }
예제 #8
0
 public EnemyAttributes(BasicEnemy b, int h)
 {
     myType = b;
     health = h;
 }
예제 #9
0
 /// <summary>
 /// Removes an enemy from the list of enemies that can be assasinated.
 /// </summary>
 /// <param name="enemy">
 /// The enemy that can no longer be assasinated.
 /// </param>
 public void RemoveAssasinatableEnemy(BasicEnemy enemy)
 {
     _assasinatableEnemies.Remove(enemy);
 }
예제 #10
0
 private void Awake()
 {
     basicEnemy = GetComponent <BasicEnemy>();
     shellCollider.gameObject.SetActive(false);
     rb = GetComponent <Rigidbody2D>();
 }
예제 #11
0
        public override void Update()
        {
            Position.X += velocity;

            if (this.CollideFirst((int)GameTags.Solid, Position) != null)
            {
                RemoveSelf();
            }

            if (this.CollideFirst((int)GameTags.MovingPlatform, Position) != null)
            {
                RemoveSelf();
            }

            if (this.CollideFirst((int)GameTags.MovingPlatformVert, Position) != null)
            {
                RemoveSelf();
            }

            if (this.CollideFirst((int)GameTags.FallingPlatform, Position) != null)
            {
                RemoveSelf();
            }

            using (List <Entity> .Enumerator enumerator = base.Scene[(int)GameTags.Enemy].GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    BasicEnemy enemy = (BasicEnemy)enumerator.Current;

                    if (this.CollideFirst((int)GameTags.Enemy, Position) != null)
                    {
                        enemy.Hit();
                        enemy.HitPoints -= 6;
                        RemoveSelf();
                    }
                }
            }

            using (List <Entity> .Enumerator enumerator = base.Scene[(int)GameTags.Player].GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Player player = (Player)enumerator.Current;
                    foreach (Hitbox hurt in player.Hurtboxes)
                    {
                        if (hurt.Intersects((Hitbox)Collider) == true &&
                            player.Action == PlayerAction.Parry && bounceBack == false)
                        {
                            player.Pause(pauseTime);
                            counters["parryTimer"] = pauseTime;
                            bounceBack             = true;
                            velocity = 0;
                            return;
                        }
                    }

                    if (this.CollideFirst((int)GameTags.Player, Position) != null && bounceBack == false)
                    {
                        player.Hurt(hurtPoints);
                        RemoveSelf();
                    }
                }
            }
            base.Update();

            if (counters["parryTimer"] > 0)
            {
                return;
            }

            if (bounceBack == true)
            {
                velocity   = -speed;
                bounceBack = false;
            }
        }
예제 #12
0
 public virtual void onHeroGetsDamagedByEnemy(BasicEnemy enemy, int damage, bool critical)
 {
 }
예제 #13
0
 public virtual void onEnemySpawn(BasicEnemy enemy)
 {
 }
예제 #14
0
 // Start is called before the first frame update
 void Start()
 {
     _basicenemy        = enemy.GetComponent <BasicEnemy> ();
     _playerInTerritory = false;
 }
예제 #15
0
 public MoveState(BasicEnemy basicEnemy)
 {
     this.basicEnemy = basicEnemy;
 }
예제 #16
0
 public void QueueDestruction(BasicEnemy enemy)
 {
     active_enemies.Remove(enemy);
     enemy.SpawnDeathPart();
 }
예제 #17
0
 // Use this for initialization
 void Start()
 {
     myScript    = GetComponent <BasicEnemy>();
     myMaxHealth = myScript.health;
 }
예제 #18
0
    public override void OnClick()
    {
        int posX, posY;
        //将游戏地图上的坐标转换为地图数组的下标
        Vector2 pos = m_UISelectedArea.GetClickMapPos();

        posX = (int)pos.x;
        posY = (int)pos.y;
        GameObject m_SelectedTower = m_UISelectedArea.GetSelectedTower();
        GameObject m_SelectedEnemy = m_UISelectedArea.GetEnemy();

        //如果在地图范围内
        if (m_UISelectedArea.IsOutRange() == false)
        {
            MapType mapType = m_MapManager.GetMap(posX, posY);
            //如果点击到怪物
            if (m_SelectedEnemy != null)
            {
                //隐藏UI
                m_ConstructUIController.Hide();
                m_UIRangeIndicator.Disable();

                BasicEnemy m_BasicEnemy = m_SelectedEnemy.GetComponent <BasicEnemy>();
                if (m_MonsterManager.m_FocusedEnemy == null)
                {
                    m_BasicEnemy.isFocused          = true;
                    m_MonsterManager.m_FocusedEnemy = m_BasicEnemy;
                }
                else if (m_MonsterManager.m_FocusedEnemy == m_BasicEnemy)
                {
                    //如果已经被标记,则取消标记
                    m_BasicEnemy.isFocused          = false;
                    m_MonsterManager.m_FocusedEnemy = null;
                }
                else
                {
                    //取消之前的标记,标记新的怪物
                    m_MonsterManager.m_FocusedEnemy.isFocused = false;
                    m_BasicEnemy.isFocused          = true;
                    m_MonsterManager.m_FocusedEnemy = m_BasicEnemy;
                }
            }
            else
            {
                //如果处于升级模式,则不能建造塔,也不能显示UI
                if (TowerManager.isOnUpdate)
                {
                    GameObject m_MergeableTower = m_UISelectedArea.GetUpdateTower();

                    //如果用户点击的塔可以合并
                    if (m_MergeableTower != null)
                    {
                        GameObject m_UpdatableTower = m_ConstructUIController.GetTowerGameObject();
                        pos  = m_UISelectedArea.RealPosToMapPos(m_MergeableTower.transform.position);
                        posX = (int)pos.x;
                        posY = (int)pos.y;
                        m_MapManager.DeleteTower(posX, posY);

                        //只有在建造塔的状态时 奖励塔的机制才会启动
                        if (currentStateName == "Construct")
                        {
                            m_TowerManager.UpdateTower(m_UpdatableTower, m_MergeableTower, true);
                        }
                        else
                        {
                            m_TowerManager.UpdateTower(m_UpdatableTower, m_MergeableTower, false);
                        }
                        //升级后销毁被升级的塔
                        m_TowerManager.DestroyTower(m_MergeableTower);

                        //显示升级后的塔的范围
                        m_UIRangeIndicator.ShowTowerRangeIndicator(m_UpdatableTower);
                        //再次搜索
                        m_TowerManager.RetrieveUpdatableTower();
                    }
                    else
                    {
                        //取消升级状态
                        TowerManager.isOnUpdate = false;
                        m_TowerManager.RetrieveUpdatableTower();

                        //隐藏所有UI
                        m_ConstructUIController.Hide();
                        m_UIRangeIndicator.Disable();
                    }
                }
                else
                {
                    switch (mapType)
                    {
                    case MapType.Empty:
                    {
                        //隐藏UI
                        m_ConstructUIController.Hide();
                        m_UIRangeIndicator.Disable();

                        //如果现在允许建造
                        if (currentStateName == "Construct")
                        {
                            //如果现在允许建造石头
                            if (ConstructState.isStone)
                            {
                                //直接建造 不经过UI确认
                                //如果可以添加到地图
                                if (m_MapManager.ModifyMap(posX, posY, MapType.Basic))
                                {
                                    m_TowerManager.RandomInstantiateStone(m_UISelectedArea.GetClickOffsetRealPos());
                                }
                            }
                        }

                        break;
                    }

                    case MapType.Basic:
                    {
                        //隐藏范围指示器
                        m_UIRangeIndicator.Disable();

                        //如果现在允许建造
                        if (currentStateName == "Construct")
                        {
                            //如果现在允许建造石头
                            if (ConstructState.isStone)
                            {
                                //直接删除 不经过UI确认
                                if (m_MapManager.GetMap(posX, posY) == MapType.Basic)
                                {
                                    //先删除石头实体模型,再删除地图上的石头信息,防止石头模型实体未被删除,地图已被删除的情况,石头的Collider未覆盖整个石头建造区域
                                    //由于边界的石头没有实体模型,所以同时可以防止边界石头的地图信息被删除
                                    if (m_TowerManager.DestroyStone(m_UISelectedArea.GetCameraRay()))
                                    {
                                        m_MapManager.DeleteStone(posX, posY);
                                    }
                                }
                            }
                            else
                            {
                                //如果点击的是地图外围的石头 则不会相应
                                //虽然看不到外围石头 但在地图数据上存在,用于方便约束寻路
                                if (posX == 0 || posX == MapManager.mapRegionX - 1 || posY == 0 || posY == MapManager.mapRegionY - 1)
                                {
                                    return;
                                }
                                //如果还有剩余的建造塔数量,显示建造UI
                                if (UIRemainTowerCount.remainTowerCount > 0)
                                {
                                    UpdateConstructUIConstroller("Tower");
                                }
                                else
                                {
                                    m_ConstructUIController.Hide();
                                }
                            }
                        }
                        else
                        {
                            m_ConstructUIController.Hide();
                        }

                        break;
                    }

                    case MapType.Tower:
                    {
                        //如果现在允许建造石头
                        if (ConstructState.isStone)
                        {
                            return;
                        }

                        //显示范围指示器
                        m_UIRangeIndicator.ShowTowerRangeIndicator(m_SelectedTower);

                        GameObject m_Tower = m_UISelectedArea.GetUpdateTower();
                        //如果该塔可以升级
                        if (m_Tower != null)
                        {
                            UpdateConstructUIConstroller("Upgrade");
                            m_ConstructUIController.SetTowerGameObject(m_Tower);
                        }
                        else
                        {
                            m_ConstructUIController.Hide();
                        }
                        break;
                    }
                    }
                }
            }
        }
        else
        {
            //在地图外,隐藏所有UI
            m_ConstructUIController.Hide();
            m_UIRangeIndicator.Disable();
        }
    }
예제 #19
0
 public SearchForPlayer(BasicEnemy basicEnemy)
 {
     this.basicEnemy = basicEnemy;
 }
예제 #20
0
 //Code will need to be altered for different enemy types
 private void SlowEnemy(BasicEnemy enemy)
 {
     enemy.ChangeSpeed(0.5f, true);
 }
예제 #21
0
 public override float GetWeight(BasicEnemy enemy, int numSteerables)
 {
     return(0);
 }
예제 #22
0
 private void ResetEnemy(BasicEnemy enemy)
 {
     enemy.ChangeSpeed(1, false);
 }
예제 #23
0
 public void Init(float fireDamage, float fireStrikeArmor, float fireStunTime, int slowDownLevel, Vector3 m_AttackerPotision, BasicEnemy m_BasicEnemy)
 {
     this.fireDamage         = fireDamage;
     this.fireStrikeArmor    = fireStrikeArmor;
     this.fireStunTime       = fireStunTime;
     this.slowDownLevel      = slowDownLevel;
     this.m_AttackerPotision = m_AttackerPotision;
     this.m_BasicEnemy       = m_BasicEnemy;
 }
예제 #24
0
 public RemoveWayPointState(BasicEnemy basicEnemy)
 {
     this.basicEnemy = basicEnemy;
 }
예제 #25
0
    void Update()
    {
        variate              = !variate;
        deathTimer          -= Time.deltaTime;
        timedUncontrollable -= Time.deltaTime;
        dashTime            -= Time.deltaTime;
        meleeTime           -= Time.deltaTime;
        animationOverride   -= Time.deltaTime;
        timedInvulnerable   -= Time.deltaTime;
        curA *= 0.95f;
        if (curA < 0.05f)
        {
            if (cr.gameObject.activeSelf)
            {
                cr.gameObject.SetActive(false);
            }
        }
        else if (cr.gameObject.activeSelf)
        {
            cr.SetAlpha(Mathf.Min(curA, 1));
        }
        else
        {
            cr.gameObject.SetActive(true);
        }
        if (deathTimer <= 0f)
        {
            respawn();
        }
        if (noUpdate)
        {
            return;
        }
        if (!shadow)
        {
            genShadow();
        }
        else
        {
            if (shadow.GetComponent <SpriteRenderer>().sprite != sr.sprite)
            {
                genShadow();
            }
            shadow.GetComponent <SpriteRenderer>().flipX = sr.flipX;
        }
        if (fallTime <= deathFallTime)
        {
            fallTime         -= Time.deltaTime;
            gameObject.layer  = noclipLayer;
            pysc.gravityScale = 7f;
            gameObject.layer  = dashLayer;
            if (fallTime <= 0f)
            {
                kill();
            }
            transform.position = new Vector3(transform.position.x, transform.position.y, (transform.position.y + autoOrderOffset) / 100f);
            return;
        }
        if (light.barPercent <= 0f)
        {
            kill();
            return;
        }
        Vector2 redirect = Vector2.right;

        feetPos = pysc.position + cc.offset;
        armPos  = pysc.position + (Vector2)(fireArm.transform.localPosition);
        if (isDashing = dashPos.sqrMagnitude > 0.1f)
        {
            gameObject.layer = dashLayer;
            if (shadow.activeSelf && overAir)
            {
                shadow.SetActive(false);
            }
        }
        else
        {
            gameObject.layer = playerLayer;
            if (!shadow.activeSelf && overAir)
            {
                shadow.SetActive(true);
            }
        }
        float       closestA = float.PositiveInfinity;
        Activatable aInRange = null;

        foreach (RaycastHit2D rh in Physics2D.CircleCastAll(feetPos, 0.5f, Vector2.down, 0f))
        {
            if (rh.collider.isTrigger)
            {
                if (!isDashing && rh.collider.gameObject.GetComponent <Air>())
                {
                    fallTime = deathFallTime;
                    if (Mathf.Abs(lastInput.x) >= Mathf.Abs(lastInput.y))
                    {
                        ani.Play(lastInput.x > 0 ? "RightFall" : "LeftFall", 0);
                    }
                    else
                    {
                        ani.Play(lastInput.y > 0 ? "UpFall" : "DownFall", 0);
                    }
                    return;
                }
                else if (rh.collider.gameObject.GetComponent <Activatable>() && rh.distance < closestA)
                {
                    closestA = rh.distance;
                    aInRange = rh.collider.gameObject.GetComponent <Activatable>();
                }
                if (rh.collider.gameObject.GetComponent <MovementRedirect>())
                {
                    redirect = rh.collider.gameObject.GetComponent <MovementRedirect>().dir;
                }
            }
        }
        if (timedUncontrollable < 0f)
        {
            if (controllable)
            {
                Vector2 input       = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
                Vector2 rPosFromArm = ((Vector2)(Camera.main.ScreenToWorldPoint(Input.mousePosition)) - armPos).normalized;
                if (animationOverride <= 0f)
                {
                    rooted = false;
                }
                if (!isDashing)
                {
                    if (input.sqrMagnitude != 0f && animationOverride <= 0f && !arrowLoaded)
                    {
                        comboCount = 0;
                        rooted     = false;
                        lastInput  = input;
                        input      = input.normalized;
                        input      = redirect * input.x + new Vector2(-redirect.y, redirect.x) * input.y;
                        pysc.AddForce((input * charSpeed - pysc.velocity) * pysc.mass, ForceMode2D.Impulse);
                        if (Mathf.Abs(input.x) >= Mathf.Abs(input.y))
                        {
                            ani.Play(input.x > 0 ? "RightWalk" : "LeftWalk", 0);
                        }
                        else
                        {
                            ani.Play(input.y > 0 ? "UpWalk" : "DownWalk", 0);
                        }
                    }
                    else
                    {
                        brake();
                        if (!(rooted || arrowLoaded))
                        {
                            playIdleAnimation();
                        }
                    }
                    if (Input.GetKeyDown(Settings.keys[Settings.player, Settings.dash]) && !arrowLoaded && dashTime <= 0f)
                    {
                        comboCount = 0;
                        float closest = dashDist;
                        lastInput = rPosFromArm;
                        overAir   = false;
                        foreach (RaycastHit2D rh in Physics2D.RaycastAll(feetPos, rPosFromArm, dashDist))
                        {
                            if (!rh.collider.isTrigger && rh.distance < closest && !(rh.collider.attachedRigidbody && rh.collider.attachedRigidbody.gameObject == gameObject) && rh.collider.gameObject != gameObject)
                            {
                                closest = rh.distance;
                            }
                            if (!overAir && rh.collider.gameObject.GetComponent <Air>())
                            {
                                overAir = true;
                            }
                        }
                        dashPos = rPosFromArm * closest;
                        if (Mathf.Abs(dashPos.x) > Mathf.Abs(dashPos.y))
                        {
                            ani.Play(overAir ? dashPos.x > 0 ? "RightDash" : "LeftDash" : dashPos.x > 0 ? "RightRoll" : "LeftRoll", 0);
                        }
                        else
                        {
                            ani.Play(overAir ? dashPos.y > 0 ? "UpDash" : "DownDash" : dashPos.y > 0 ? "UpRoll" : "DownRoll", 0);
                        }
                        dashTime = dashCoolDown;
                        SoundManager.script.playOnListener(SoundManager.script.dash, 0.7f);
                    }
                    if (!arrowLoaded && Input.GetMouseButtonDown(0))
                    {
                        comboCount++;
                    }
                    if ((light.barPercent > arrowCost || !usingLight) && Input.GetMouseButtonDown(1) && canAfford(arrowCost))
                    {
                        arrowLoaded = true;
                        comboCount  = 0;
                        handAni.Play("boxWindUp", 0);
                        SoundManager.script.playOnListener(SoundManager.script.bowDraw);
                    }
                    if (arrowLoaded && Input.GetMouseButton(1))
                    {
                        arrowTime += Time.deltaTime;
                        if (Input.GetKeyDown(Settings.keys[Settings.player, Settings.cancel]))
                        {
                            arrowLoaded = false;
                            handAni.Play("NoAnimation", 0);
                            arrowTime   = 0f;
                            arrowLoaded = false;
                        }
                        fireArm.transform.localRotation = Quaternion.LookRotation(Vector3.forward, -rPosFromArm);
                        if (Mathf.Abs(rPosFromArm.x) > Mathf.Abs(rPosFromArm.y))
                        {
                            ani.Play(rPosFromArm.x < 0 ? "LeftFireState" : "RightFireState", 0);
                            if (fireHand.transform.localPosition.z != 0.01f)
                            {
                                fireArm.transform.localPosition = new Vector3(fireArm.transform.localPosition.x, fireArm.transform.localPosition.y, 0.0001f);
                            }
                        }
                        else if (rPosFromArm.y > 0)
                        {
                            ani.Play("UpFireState", 0);
                            if (fireHand.transform.localPosition.z != 0.01f)
                            {
                                fireArm.transform.localPosition = new Vector3(fireArm.transform.localPosition.x, fireArm.transform.localPosition.y, 0.0001f);
                            }
                        }
                        else if (fireHand.transform.localPosition.z != -0.01f)
                        {
                            ani.Play("DownFireState", 0);
                            fireArm.transform.localPosition = new Vector3(fireArm.transform.localPosition.x, fireArm.transform.localPosition.y, -0.0001f);
                        }
                    }
                    else
                    {
                        if (arrowTime >= arrowWindUp)
                        {
                            fire(rPosFromArm);
                        }
                        handAni.Play("NoAnimation", 0);
                        arrowTime   = 0f;
                        arrowLoaded = false;
                    }
                    if (!arrowLoaded && meleeTime <= 0f && comboCount > 0)
                    {
                        comboCount--;
                        BasicEnemy be = null;
                        foreach (RaycastHit2D rh in Physics2D.CircleCastAll(pysc.position, meleeRadius, Vector2.down, 0f))
                        {
                            if (!rh.collider.isTrigger && (be = rh.collider.gameObject.GetComponent <BasicEnemy>()) && Vector2.Dot((rh.point - pysc.position).normalized, rPosFromArm) >= meleeField)
                            {
                                be.damage((int)(meleeDamage / diff), BasicEnemy.MELEE_DAMAGE);
                                corrupt(meleeDamage);
                                SoundManager.script.playOnListener(variate ? SoundManager.script.enemyHit1 : SoundManager.script.enemyHit2, 0.8f);
                            }
                        }
                        SoundManager.script.playOnListener(variate ? SoundManager.script.sword1 : SoundManager.script.sword2, 0.8f);
                        meleeTime         = meleeCoolDown;
                        rooted            = true;
                        animationOverride = meleeCoolDown;
                        if (Mathf.Abs(rPosFromArm.x) >= Mathf.Abs(rPosFromArm.y))
                        {
                            if (variate)
                            {
                                ani.Play(rPosFromArm.x > 0 ? "RightAttack1" : "LeftAttack1", 0, 0);
                            }
                            else
                            {
                                ani.Play(rPosFromArm.x > 0 ? "RightAttack2" : "LeftAttack2", 0, 0);
                            }
                        }
                        else if (variate)
                        {
                            ani.Play(rPosFromArm.y > 0 ? "UpAttack" : "DownAttack", 0, 0);
                        }
                        else
                        {
                            ani.Play(rPosFromArm.y > 0 ? "UpAttack2" : "DownAttack2", 0, 0);
                        }
                        lastInput = rPosFromArm;
                        pysc.AddForce(rPosFromArm * meleeAdv);
                    }
                }
                else
                {
                    brake();
                }
                if (Input.GetKeyDown(Settings.keys[Settings.player, Settings.use]))
                {
                    if (aInRange && aInRange.playerActivatable)
                    {
                        aInRange.activate(this);
                    }
                    else
                    {
                        SoundManager.script.playOnListener(SoundManager.script.lightSwitch, 1f);
                        usingLight  = !usingLight;
                        gem.isLight = usingLight;
                        (usingLight ? lightP : darkP).GetComponent <ParticleSystem>().Play();
                    }
                }
            }
            else
            {
                playIdleAnimation();
                brake();
            }
        }
        if ((lastJuicePosition - pysc.position).sqrMagnitude >= sqrUnitPerSound)
        {
            lastJuicePosition = pysc.position;
            if (!isDashing && fallTime > deathFallTime)
            {
                SoundManager.script.playOnListener(variate ? SoundManager.script.step1 : SoundManager.script.step2, 0.8f);
            }
        }
        transform.position = new Vector3(transform.position.x, transform.position.y, (transform.position.y + autoOrderOffset) / 100f);
    }
예제 #26
0
    //Determines what targeting method is being used and calls the appropraite method.
    void TargetEnemy(string targetCase)
    {
        GameObject[] enemies          = GameObject.FindGameObjectsWithTag(enemyTag);
        float        shortestDistance = Mathf.Infinity;
        GameObject   nearestEnemy     = null;

        switch (targetCase)
        {
        //Targets closest enemy in range
        case "TargetClosest":
            foreach (GameObject enemy in enemies)
            {
                float distanceToEnemy = Vector2.Distance(transform.position, enemy.transform.position);

                if (distanceToEnemy < shortestDistance)
                {
                    shortestDistance = distanceToEnemy;
                    nearestEnemy     = enemy;
                }
            }

            if (nearestEnemy != null && shortestDistance <= range)
            {
                //sets the old target as no longer under fire
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target      = nearestEnemy.transform;
                targetEnemy = nearestEnemy.GetComponent <BasicEnemy>();
            }
            else
            {
                //sets the last target to leave range as no longer under fire.
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target = null;
            }
            break;

        //Targets the enemy with the most health in range
        case "TargetStrong":
            float      mostHealth     = 0f;
            GameObject strongestEnemy = null;
            foreach (GameObject enemy in enemies)
            {
                float      distanceToEnemy = Vector2.Distance(transform.position, enemy.transform.position);
                BasicEnemy enemyScript     = enemy.GetComponent <BasicEnemy>();
                if (distanceToEnemy <= range && enemyScript.currentHealth > mostHealth)
                {
                    Debug.Log("Reached");
                    mostHealth     = enemyScript.currentHealth;
                    strongestEnemy = enemy;
                }
            }
            if (strongestEnemy != null)
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target      = strongestEnemy.transform;
                targetEnemy = strongestEnemy.GetComponent <BasicEnemy>();
            }
            else
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target = null;
            }
            break;

        //Targets Last enemy in range
        case "TargetLast":
            float      leastTraveled = Mathf.Infinity;
            GameObject lastEnemy     = null;
            foreach (GameObject enemy in enemies)
            {
                float         distanceToEnemy = Vector2.Distance(transform.position, enemy.transform.position);
                EnemyMovement mvmtScrpt       = enemy.GetComponent <EnemyMovement>();
                if (distanceToEnemy <= range && mvmtScrpt.distanceTraveled < leastTraveled)
                {
                    Debug.Log("Reached");
                    leastTraveled = mvmtScrpt.distanceTraveled;
                    lastEnemy     = enemy;
                }
            }
            if (lastEnemy != null)
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target      = lastEnemy.transform;
                targetEnemy = lastEnemy.GetComponent <BasicEnemy>();
            }
            else
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target = null;
            }
            break;

        //Targets First enemy in range
        default:
            float      mostTraveled = 0f;
            GameObject firstEnemy   = null;
            foreach (GameObject enemy in enemies)
            {
                float         distanceToEnemy = Vector2.Distance(transform.position, enemy.transform.position);
                EnemyMovement mvmtScrpt       = enemy.GetComponent <EnemyMovement>();
                if (distanceToEnemy <= range && mvmtScrpt.distanceTraveled > mostTraveled)
                {
                    mostTraveled = mvmtScrpt.distanceTraveled;
                    firstEnemy   = enemy;
                }
            }
            if (firstEnemy != null)
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target      = firstEnemy.transform;
                targetEnemy = firstEnemy.GetComponent <BasicEnemy>();
            }
            else
            {
                if (target != null)
                {
                    targetEnemy.underFire = false;
                }
                target = null;
            }
            break;
        }
    }
예제 #27
0
 private void ResetMinEnemyHealth()
 {
     minEnemyHealth        = 500000;
     m_BasicEnemyMinHealth = null;
 }
예제 #28
0
        public override void Update(GameTime gameTime)
        {
            switch (ScreenState)
            {
            case ScreenStates.TransitionIn:
                if (!IsTransitionDone(gameTime.TotalGameTime, TransitionInTime))
                {
                }
                else
                {
                    ScreenState = ScreenStates.Active;
                }
                break;

            case ScreenStates.TransitionOut:
                if (!IsTransitionDone(gameTime.TotalGameTime, TransitionOutTime))
                {
                    alpha += 127 / (float)(TransitionOutTime.TotalMilliseconds / gameTime.ElapsedGameTime.TotalMilliseconds);
                }
                break;

            case ScreenStates.TransitionNextArea:
                if (wrapAround)
                {
                    wrapAroundXDest -= 10;
                }
                backgroundRectangle.X += 10;
                foreach (Player player in PlayerManager.Players)
                {
                    // move player back to left
                    player.Character.Position.X   -= 7.5F;
                    player.Character.DrawHealthBar = false;
                    player.Character.CurrentAnimation.Update(gameTime);
                }
                foreach (Enemy enemy in enemyManager.Enemies)
                {
                    enemy.Position.X -= 10;
                }
                if (wrapAround && wrapAroundXDest == 0)
                {
                    backgroundRectangle = new Rectangle(0, 0, 1280, 720);
                    wrapAround          = false;
                    ScreenState         = ScreenStates.Active;
                }
                else if (backgroundRectangle.X == 1280 * (areaCounter - 1))
                {
                    ScreenState = ScreenStates.Active;
                }
                break;

            case ScreenStates.Active:
                bool allPlayersDead        = true;
                bool allPlayersOnRightEdge = true;
                foreach (Player player in PlayerManager.Players)
                {
                    player.Character.DrawHealthBar = true;
                    if (!player.Character.MarkForDelete)
                    {
                        allPlayersDead = false;
                    }
                    if (player.Character.Position.X < 1000)
                    {
                        allPlayersOnRightEdge = false;
                    }
                }
                if (allPlayersDead)
                {
                    ScreenState = ScreenStates.TransitionOut;
                }

                if (enemyManager.Enemies.Count == 0 && allPlayersOnRightEdge && areaCounter == 1)
                {
                    areaCounter++;
                    foreach (Player player in PlayerManager.Players)
                    {
                        player.Character.FacingLeft = false;
                        player.Character.SelectAnimation(player.Character.RunningAnimation);
                        player.Character.Health = Math.Max(player.Character.Health + player.Character.MaxHealth / 3, player.Character.MaxHealth);
                    }
                    for (int i = 0; i < 3; i++)
                    {
                        Chaser basicEnemy = new Chaser(PlayerManager);
                        basicEnemy.Position.X = (i * 50) + 800 + 1280;
                        basicEnemy.Position.Y = (i * 100) + 275;
                        enemyManager.Enemies.Add(basicEnemy);
                    }
                    for (int i = 0; i < 4; i++)
                    {
                        Chaser chaser = new Chaser(PlayerManager);
                        chaser.Position.X = (i * 50) + 1000 + 1280;
                        chaser.Position.Y = (i * 100) + 225;
                        enemyManager.Enemies.Add(chaser);
                    }
                    enemyManager.LoadContent(ContentManager);
                    ScreenState = ScreenStates.TransitionNextArea;
                    break;
                }
                else if (enemyManager.Enemies.Count == 0 && allPlayersOnRightEdge && areaCounter == 2)
                {
                    areaCounter++;
                    foreach (Player player in PlayerManager.Players)
                    {
                        player.Character.FacingLeft = false;
                        player.Character.SelectAnimation(player.Character.RunningAnimation);
                        player.Character.Health = Math.Max(player.Character.Health + player.Character.MaxHealth / 3, player.Character.MaxHealth);
                    }
                    for (int i = 0; i < 3; i++)
                    {
                        BasicEnemy chaser = new BasicEnemy(PlayerManager);
                        chaser.Position.X = (i * 50) + 800 + 1280;
                        chaser.Position.Y = (i * 100) + 275;
                        enemyManager.Enemies.Add(chaser);
                    }
                    for (int i = 0; i < 4; i++)
                    {
                        Chaser chaser = new Chaser(PlayerManager);
                        chaser.Position.X = (i * 50) + 1000 + 1280;
                        chaser.Position.Y = (i * 100) + 225;
                        enemyManager.Enemies.Add(chaser);
                    }
                    enemyManager.LoadContent(ContentManager);
                    ScreenState = ScreenStates.TransitionNextArea;
                    break;
                }
                else if (enemyManager.Enemies.Count == 0 && allPlayersOnRightEdge && areaCounter == 3)
                {
                    areaCounter = 1;
                    wrapAround  = true;
                    foreach (Player player in PlayerManager.Players)
                    {
                        player.Character.FacingLeft = false;
                        player.Character.SelectAnimation(player.Character.RunningAnimation);
                        player.Character.Health = Math.Max(player.Character.Health + player.Character.MaxHealth / 3, player.Character.MaxHealth);
                    }
                    for (int i = 0; i < 3; i++)
                    {
                        BasicEnemy chaser = new BasicEnemy(PlayerManager);
                        chaser.Position.X = (i * 50) + 800 + 1280;
                        chaser.Position.Y = (i * 100) + 275;
                        enemyManager.Enemies.Add(chaser);
                    }
                    for (int i = 0; i < 4; i++)
                    {
                        BasicEnemy chaser = new BasicEnemy(PlayerManager);
                        chaser.Position.X = (i * 50) + 1000 + 1280;
                        chaser.Position.Y = (i * 100) + 225;
                        enemyManager.Enemies.Add(chaser);
                    }
                    enemyManager.LoadContent(ContentManager);
                    ScreenState = ScreenStates.TransitionNextArea;
                    break;
                }

                PlayerManager.Update(gameTime);
                entityManager.Update(gameTime);
                enemyManager.Update(gameTime);
                break;
            }
        }
예제 #29
0
 public override void OnLeaveState(BasicEnemy enemy)
 {
 }
예제 #30
0
 void attackEnemy(BasicEnemy enemy)
 {
     enemy.dealDamage(damage);
 }
예제 #31
0
 public StateBasicEnemyNormal(BasicEnemy _p)
 {
     p = _p;
     totalTime = 0;
 }
예제 #32
0
파일: Dead.cs 프로젝트: Kainkun/Shock
 public Dead(BasicEnemy basicEnemy, Collider playerMovementCollider)
 {
     this.basicEnemy             = basicEnemy;
     this.playerMovementCollider = playerMovementCollider;
 }