예제 #1
0
    public void AttackTree()
    {
        if (m_Character.m_currentWeapon.m_item != ItemType.AXE)
        {
            return;
        }

        MusicHandler.PlaySound(SoundType.AXE_SOUND);
        m_health--;
        Debug.Log("tree is attacked");
        if (m_health < 0)
        {
            gameObject.SetActive(false);
            Debug.Log("Tree is destroyed");
            SpriteManage.DESTROY_SPRITE(gameObject);
            // generate tree log after tree is cut down
            for (int i = 0; i < NUMBER_OF_TREE_LOG; i++)

            {
                GameObject temp = SpriteManage.CREATE_SPRITE(SpriteType.TREE_LOG);
                Debug.Assert(temp);
                Vector2 newPos = SpriteManage.randomAroundPoint(transform.position, 16);
                temp.transform.position = newPos;
            }
        }
    }
예제 #2
0
    public void AttackRock()
    {
        // set the selection square is show
        // if characters holding axe and clicked on  the tree in range, then tree health is -1
        if (m_Character.m_currentWeapon.m_item != ItemType.AXE)
        {
            return;
        }
        const float OFFSET   = 16;
        float       distance = Vector2.Distance(Camera.main.WorldToScreenPoint(m_Character.transform.position), Camera.main.WorldToScreenPoint(transform.position));

        MusicHandler.PlaySound(SoundType.AXE_SOUND);
        m_health--;
        Debug.Log("rock is attacked");
        if (m_health < 0)
        {
            gameObject.SetActive(false);
            Debug.Log("rock is destroyed");
            SpriteManage.DESTROY_SPRITE(gameObject);
            // generate tree log after tree is cut down
            for (int i = 0; i < NUMBER_OF_STONE; i++)

            {
                GameObject temp = SpriteManage.CREATE_SPRITE(SpriteType.STONE);
                Debug.Assert(temp);
                Vector2 newPos = SpriteManage.randomAroundPoint(transform.position, 16);
                temp.transform.position = newPos;
            }
        }
    }
    // angle in radian
    public void throwSpear(float angle)
    {
        if (m_Health <= 0)
        {
            return;
        }
        if (m_currentWeapon != null)
        {
            if (m_weaponDelay > 0)
            {
                return;
            }
            if (m_currentWeapon.m_Quantity <= 0)
            {
                return;
            }
            if (m_currentWeapon.m_item == ItemType.SPEAR)
            {
                m_currentWeapon.m_Quantity--;
                m_Weapons.setQuantity(m_currentWeapon);

                GameObject temp  = SpriteManage.CREATE_SPRITE(SpriteType.SPEAR);
                Spear      spear = temp.GetComponent <Spear>();
                spear.transform.position = transform.position;
                spear.Init(angle, ObjectSide.OUR_SIDE);
                MusicHandler.PlaySound(SoundType.SPEAR_THROW);
                m_weaponDelay = AXE_DELAY;
                if (m_currentWeapon.m_Quantity <= 0)
                {
                    changeWeapon(0);
                }
            }
        }
    }
예제 #4
0
 public override void Attack()
 {
     if (!m_IsPlaced)
     {
         return;
     }
     if (m_AttackDelay <= 0)
     {
         if (m_EnemyTarget != null)
         {
             if (!m_EnemyTarget.active || m_EnemyTarget.GetComponent <AI>().getHealth() <= 0)
             {
                 m_EnemyTarget = null;
                 return;
             }
             MusicHandler.PlaySound(SoundType.SPEAR_THROW);
             m_AttackDelay = DEFAULT_ATTACK_DELAY;
             float      angle = Mathf.Atan2(m_EnemyTarget.transform.position.y - transform.position.y, m_EnemyTarget.transform.position.x - transform.position.x);
             GameObject obj   = SpriteManage.CREATE_SPRITE(SpriteType.SPEAR);
             Debug.Assert(obj);
             obj.transform.position = transform.position;
             Spear spear = obj.GetComponent <Spear>();
             spear.Init(angle, ObjectSide.OUR_SIDE);
         }
         else
         {
             m_AttackDelay = 0;
         }
     }
 }
예제 #5
0
 void generateBoss()
 {
     if (m_CurrentWay == m_LevelManage.m_Levels.Count - 1)
     {
         Debug.Log("generate boss");
         if (boss == null)
         {
             boss = SpriteManage.CREATE_SPRITE(SpriteType.FINAL_BOSS);
         }
     }
 }
    public override void Attack()
    {
        float distance = Vector2.Distance(transform.position, m_EnemyTarget.transform.position);

        calculateAttackDistance();
        if (transform.position.x > m_EnemyTarget.transform.position.x)
        {
            m_Facing = FACING_LEFT;
        }
        else
        {
            m_Facing = FACING_RIGHT;
        }
        // if in attack range then attack
        if (distance < m_AttackDistance)
        {
            if (m_AttackDelay <= 0)
            {
                MusicHandler.PlaySound(SoundType.RED_ENEMY_ATTACK);
                m_AttackDelay = DEFAULT_ATTACK_SPEED;
                AI ai = m_EnemyTarget.GetComponent <AI>();
                ai.setHealth(ai.getHealth() - m_Damage);
                if (ai.getHealth() <= 0)
                {
                    m_EnemyTarget = null;
                }
            }
        }
        else
        {
            float   angle  = Mathf.Atan2(m_EnemyTarget.transform.position.y - transform.position.y, m_EnemyTarget.transform.position.x - transform.position.x);
            Vector2 newPos = transform.position;
            newPos.x          += Mathf.Cos(angle) * MOVING_SPEED * Time.fixedDeltaTime;
            newPos.y          += Mathf.Sin(angle) * MOVING_SPEED * Time.fixedDeltaTime;
            transform.position = newPos;
        }
        if (m_Health <= 0)
        {
            // generate heart for player to gain health
            float ran = Random.Range(0, 101);
            if (Debug.isDebugBuild)
            {
                ran = 80;
            }
            if (ran >= 70)
            {
                var heart = SpriteManage.CREATE_SPRITE(SpriteType.HEART);
                heart.transform.position = transform.position;
            }
        }
        checkHealth();
    }
예제 #7
0
    void generateEater()
    {
        GameLevel level = m_LevelManage.m_Levels[m_CurrentWay];


        if (m_ReoucesEaterGenerateTime <= 0)
        {
            if (level.m_NumberOfEater > 0)
            {
                level.m_NumberOfEater--;
                GameObject eater = SpriteManage.CREATE_SPRITE(SpriteType.RESOURCE_EATER);
                Vector2    pos   = SpriteManage.RandomPos();
                eater.transform.position = pos;
            }
            m_ReoucesEaterGenerateTime = DEFAULT_RESOURCE_EATER_TIME;
        }
    }
예제 #8
0
    void FixedUpdate()
    {
        if (mainGame.m_IsPause)
        {
            return;
        }

        if (!m_Arrived)
        {
            float   angle = Mathf.Atan2(m_Castle.transform.position.y - transform.position.y, m_Castle.transform.position.x - transform.position.x);
            Vector2 pos   = transform.position;
            pos.x += Mathf.Cos(angle) * MOVE_SPEED * Time.fixedDeltaTime;
            pos.y += Mathf.Sin(angle) * MOVE_SPEED * Time.fixedDeltaTime;
            transform.position = pos;
        }
        else
        {
            m_TimeRespawnEnemy -= Time.fixedDeltaTime;
            if (m_TimeRespawnEnemy <= 0)
            {
                if (m_NumberEnemies > 0)
                {
                    m_TimeRespawnEnemy = RESPAWN_TIME;
                    m_NumberEnemies--;
                    Vector2 castlePos  = m_Castle.transform.position;
                    Vector2 currentPos = transform.position;
                    float   angle      = Mathf.Atan2(castlePos.y - currentPos.y, castlePos.x - currentPos.x);
                    float   offset     = m_Wall.GetComponent <BoxCollider2D>().size.x;
                    currentPos.x += Mathf.Cos(angle) + offset;
                    currentPos.x += Mathf.Sin(angle) + offset;
                    GameObject enemy = SpriteManage.CREATE_SPRITE(SpriteType.RED_ENEMY);
                    enemy.transform.position = currentPos;
                }
                // delete the boat
                else
                {
                    SpriteManage.DESTROY_SPRITE(gameObject);
                }
            }
        }
        checkHealth();
    }
예제 #9
0
 void prepareTowerToPlace()
 {
     // cancel placing tower
     if (m_isPlacingTower)
     {
         // if the placing tower still active, then cancel it
         if (m_currentBuilding != null)
         {
             SpriteManage.DESTROY_SPRITE(m_currentBuilding);
             m_currentBuilding = null;
         }
         m_isPlacingTower = false;
     }
     // start placing tower
     else
     {
         m_isPlacingTower  = true;
         m_currentBuilding = SpriteManage.CREATE_SPRITE(SpriteType.TOWER);
     }
 }
예제 #10
0
    void generateAttackableBoat()
    {
        if (m_LevelManage.m_Levels[m_CurrentWay].m_NumberOfAttackableBoat <= 0)
        {
            return;
        }

        m_LevelManage.m_Levels[m_CurrentWay].m_NumberOfAttackableBoat--;

        GameObject castle = GameObject.Find("castle");
        GameObject obj    = SpriteManage.CREATE_SPRITE(SpriteType.ATTACKABLE_BOAT);
        // random angle
        float angle = Random.Range(0, Mathf.PI * 2);

        Debug.Log("angle boat: " + angle);
        float   distance = 10;
        int     wallRan  = (int)Random.Range(0, 4);
        Vector3 offset   = Random.insideUnitCircle * 30;
        Vector3 newpos   = offset + GameObject.Find("castle").transform.position;
        bool    generate = false;

        while (!generate)
        {
            generate = true;
            offset   = Random.insideUnitCircle * 30;
            newpos   = offset + GameObject.Find("castle").transform.position;
            Collider2D[] list = Physics2D.OverlapBoxAll(newpos, obj.GetComponent <SpriteRenderer>().bounds.size, 0);
            for (int i = 0; i < list.Length; i++)
            {
                Collider2D collider = list[i];
                if (collider.tag == "castle")
                {
                    generate = false;
                }
            }
        }

        obj.transform.position = newpos;
    }
예제 #11
0
    public override void Attack()
    {
        Vector2 newPos = transform.position;
        Vector2 origin = m_Castle.transform.position;
        float   radius = Vector2.Distance(transform.position, origin);

        m_CurrentAngle    += ANGLE_MOVE * Time.fixedDeltaTime;
        newPos.x           = origin.x + Mathf.Cos(m_CurrentAngle) * radius;
        newPos.y           = origin.y + Mathf.Sin(m_CurrentAngle) * radius;
        transform.position = newPos;
        if (m_AttackDelay <= 0)
        {
            m_AttackDelay = DEFAULT_ATTACK_DELAY;
            if (m_EnemyTarget != null)
            {
                var   s           = SpriteManage.CREATE_SPRITE(SpriteType.SPEAR);
                var   spear       = s.GetComponent <Spear>();
                float attackAngle = Mathf.Atan2(m_EnemyTarget.transform.position.y - newPos.y, m_EnemyTarget.transform.position.x - newPos.x);
                spear.transform.position = transform.position;
                spear.Init(attackAngle, ObjectSide.ENEMY_SIDE);
                MusicHandler.PlaySound(SoundType.SPEAR_THROW);
            }
        }
    }
예제 #12
0
    // generate resources
    void generateResouces()
    {
        if (m_LevelManage.m_Levels[m_CurrentWay].m_TotalResouces < 0)
        {
            return;
        }
        if (m_CurrentGenerateTreeTimeStep < 0)
        {
            m_CurrentGenerateTreeTimeStep = m_LevelManage.m_Levels[m_CurrentWay].m_ReseoucesInterval;
            Debug.Log("generate resouces");
            m_LevelManage.m_Levels[m_CurrentWay].m_TotalResouces--;
            int        chanceWood = m_LevelManage.m_Levels[m_CurrentWay].m_ChanceWood;
            int        ran        = (int)Random.Range(0, 101);
            GameObject ob         = null;

            if (ran <= chanceWood)
            {
                ob = SpriteManage.CREATE_SPRITE(SpriteType.TREE);
            }
            else
            {
                ob = SpriteManage.CREATE_SPRITE(SpriteType.ROCK);
            }

            bool generated = false;
            // number of attem for item generate
            int attemp = 10;

            while (!generated && attemp > 0)
            {
                //generated = true;
                Vector2 pos       = SpriteManage.RandomPos();
                var     colliders = Physics2D.OverlapBoxAll(pos, ob.GetComponent <SpriteRenderer>().bounds.size, 0);
                if (colliders.Length == 0)
                {
                    generated = true;
                }
                else
                {
                    for (int i = 0; i < colliders.Length; i++)
                    {
                        Collider2D collider = colliders[i];
                        Debug.Log("collider tag: " + collider.tag);
                        Debug.Log("type: " + collider.GetType());
                        if (collider.GetType() == typeof(BoxCollider2D))
                        {
                            generated = false;
                        }
                        else if (collider.GetType() == typeof(CircleCollider2D))
                        {
                            if (collider.tag == "castle")
                            {
                                generated = true;
                            }
                        }
                    }
                }
                if (generated)

                {
                    ob.transform.position = pos;
                }
                attemp--;
            }
            Debug.Log("generated: " + generated);
            if (!generated)
            {
                SpriteManage.DestroyObject(ob);
            }
        }
    }
예제 #13
0
    public override void Attack()
    {
        if (m_EnemyTarget == null)
        {
            if (m_Character.m_Health > 0)
            {
                m_EnemyTarget = m_Character.gameObject;
            }
            else
            {
                m_EnemyTarget = m_Castle.gameObject;
            }
        }

        if (m_EnemyTarget != null)
        {
            if (!m_EnemyTarget.active)
            {
                m_EnemyTarget = null;
                return;
            }
            float distance = Vector2.Distance(m_EnemyTarget.transform.position, transform.position);
            // attack
            if (distance <= ATTACK_RANGE)
            {
                if (m_UltimateAttack <= 0)
                {
                    for (int i = 0; i < MAX_SPEAR; i++)
                    {
                        GameObject spear = SpriteManage.CREATE_SPRITE(SpriteType.SPEAR);

                        float angle = i * 45 * Mathf.Deg2Rad;
                        Spear s     = spear.GetComponent <Spear>();
                        s.Init(angle, ObjectSide.ENEMY_SIDE);
                        s.m_speed = 9;

                        spear.transform.position = transform.position;
                    }
                    m_UltimateAttack = DEFAULT_ULTIMATE;
                    return;
                }
                if (m_AttackDelay <= 0)
                {
                    MusicHandler.PlaySound(SoundType.SPEAR_THROW);
                    if (m_Health < DEFAULT_HEALTH / 2)
                    {
                        m_AttackDelay = ATTACK_DELAY_PERIOD_2;
                    }
                    else
                    {
                        m_AttackDelay = ATTACK_DELAY_PERIOD_1;
                    }
                    GameObject spear = SpriteManage.CREATE_SPRITE(SpriteType.SPEAR);

                    float angle = Mathf.Atan2(m_EnemyTarget.transform.position.y - transform.position.y, m_EnemyTarget.transform.position.x - transform.position.x);
                    Spear s     = spear.GetComponent <Spear>();
                    s.Init(angle, ObjectSide.ENEMY_SIDE);
                    s.m_speed = 9;

                    spear.transform.position = transform.position;
                }
            }
            else
            {
                // update position
                float   angle  = Mathf.Atan2(m_EnemyTarget.transform.position.y - transform.position.y, m_EnemyTarget.transform.position.x - transform.position.x);
                Vector2 newPos = transform.position;
                newPos.x          += Mathf.Cos(angle) * DEFAULT_MOVE_SPEED * Time.fixedDeltaTime;
                newPos.y          += Mathf.Sin(angle) * DEFAULT_MOVE_SPEED * Time.fixedDeltaTime;
                transform.position = newPos;
            }
        }
    }