Exemple #1
0
    protected void OnCollisionEnter(Collision collision)
    {
        if (m_thrower == null)
        {
            return;
        }

        if (collision.collider == LevelGenerator.Instance.m_groundCollider)
        {
            m_thrower = null;
            return;
        }


        BaseBuildingPart part = collision.collider.GetComponentInParent <BaseBuildingPart>();

        if (part != null)
        {
            part.TakeDamage(3, -collision.contacts[0].normal);
        }
        else
        {
            BaseActor actor = collision.collider.GetComponentInParent <BaseActor>();
            if (actor != null && m_thrower != actor)
            {
                actor.TakeDamage(2, -collision.contacts[0].normal);
            }
        }
    }
Exemple #2
0
    public void Claim(PlayerData.PlayerId owner)
    {
        Color ownerColor = Main.Instance.GetPlayerData(owner).m_color;
        //SetColor(ownerColor);
        int scoreLost   = 0;
        int scoreGained = 0;
        int totalValue  = 0;

        bool roofed = GetTopPart().m_type == BaseBuildingPart.BuildingPartType.Roof;

        if (roofed)
        {
            ownerColor.r += 0.5f;
            ownerColor.g += 0.5f;
            ownerColor.b += 0.5f;
        }

        for (int i = 0; i < m_buildingParts.Count; ++i)
        {
            BaseBuildingPart part = m_buildingParts[i];
            part.SetColor(ownerColor);

            if (roofed)
            {
                part.RoofUpgrade();
            }

            int scoreValue = i + 1;
            if (part.m_owner != owner)
            {
                if (i < m_buildingParts.Count - 1)
                {
                    scoreLost   -= scoreValue;
                    scoreGained += scoreValue;
                }
                else
                {
                    scoreGained += scoreValue;
                }
            }

            totalValue  += scoreValue;
            part.m_owner = owner;
        }

        if (roofed)
        {
            scoreGained += totalValue;
        }

        Vector3 pos = m_buildingParts[m_buildingParts.Count - 1].transform.position;

        Main.Instance.ModifyScore(m_owner, scoreLost);
        m_owner = owner;
        Main.Instance.ModifyScore(m_owner, scoreGained);

        VFXManager.Instance.ThrowScoreDoober(pos, m_owner, scoreGained, roofed);
    }
Exemple #3
0
    protected void DropPart()
    {
        if (m_heldPart == null)
        {
            return;
        }

        m_heldPart.Drop();
        m_heldPart = null;
    }
Exemple #4
0
    public void AddBuildingPart(BaseBuildingPart part)
    {
        Vector3 pos = transform.position;

        part.transform.position = pos + Vector3.up * m_buildingParts.Count;
        part.transform.rotation = Utils.GetClosestAlignedRotation(part.transform.rotation);
        m_buildingParts.Add(part);
        part.Reset();
        part.m_currentTile           = this;
        part.m_rigidbody.isKinematic = true;
    }
Exemple #5
0
    protected void ThrowPart()
    {
        if (m_heldPart == null)
        {
            return;
        }

        AudioManager.Instance.PlayOneShot(m_throwClip);
        m_heldPart.Throw(this, transform.forward * m_throwForce);
        m_heldPart = null;
    }
Exemple #6
0
    protected void PlacePart()
    {
        if (m_heldPart == null || m_placementTile == null)
        {
            return;
        }

        AudioManager.Instance.PlayOneShot(m_putDownClip);
        m_heldPart.Place(m_placementTile, m_playerId);
        m_heldPart = null;
    }
Exemple #7
0
 public void RemoveBuildingPart(BaseBuildingPart part, bool shouldBreak = false)
 {
     if (m_buildingParts.Remove(part))
     {
         part.m_owner       = PlayerData.PlayerId.UNASSIGNED;
         part.m_currentTile = null;
         if (shouldBreak)
         {
             part.Break(Vector3.up);
         }
     }
 }
Exemple #8
0
    protected void PickUpPart(BaseBuildingPart pickup)
    {
        if (pickup == null)
        {
            return;
        }

        PlayAnimation(AnimationID.PICK_UP, true);
        m_heldPart = pickup;
        m_heldPart.PickUp(m_holdPoint);
        m_actionDelayTimer = 0.5f;
        AudioManager.Instance.PlayOneShot(m_pickUpClip);
    }
Exemple #9
0
    public void OnPartBreak(BaseBuildingPart part)
    {
        int start = m_buildingParts.IndexOf(part);

        if (start < 0)
        {
            return; // part not found
        }

        int  numFloors   = m_buildingParts.Count;
        bool roofRemoved = part.m_type == BaseBuildingPart.BuildingPartType.Roof;
        int  scoreValue  = start + 1;
        int  scoreLost   = -scoreValue;

        RemoveBuildingPart(part);
        while (start < m_buildingParts.Count)
        {
            scoreValue++;
            scoreLost -= scoreValue;

            part = m_buildingParts[start];
            if (part.m_type == BaseBuildingPart.BuildingPartType.Roof)
            {
                roofRemoved = true;
            }
            RemoveBuildingPart(part, true);
        }

        if (roofRemoved)
        {
            for (int i = numFloors; i > 0; --i)
            {
                scoreLost -= i;
            }
        }

        AudioManager.Instance.PlayExplosionOneShot();

        Main.Instance.ModifyScore(m_owner, scoreLost);
    }
Exemple #10
0
    public void GenerateBuilding(BaseTile tile, int height, bool addRoof = false)
    {
        if (height <= 0)
        {
            return;
        }

        for (int i = 0; i < height; ++i)
        {
            GameObject       storyObj = Instantiate(m_buildingStoryPrefab, m_buildingsContainer);
            BaseBuildingPart story    = storyObj.GetComponent <BaseBuildingPart>();
            tile.AddBuildingPart(story);
        }

        if (addRoof)
        {
            GameObject       roofObj = Instantiate(m_buildingRoofPrefab, m_buildingsContainer);
            BaseBuildingPart roof    = roofObj.GetComponent <BaseBuildingPart>();
            roof.transform.rotation = Utils.GetRandomAlignedRotation();
            tile.AddBuildingPart(roof);
        }
    }
Exemple #11
0
    protected void UpdateDetection(float radius, float range)
    {
        if (m_pickUpCandidate != null)
        {
            m_pickUpCandidate.SetColor(BaseBuildingPart.BROKEN_COLOR);
        }
        m_pickUpCandidate  = null;
        m_placementTile    = null;
        m_placementAllowed = false;

        m_buildingPartsInRange.Clear();
        m_actorsInRange.Clear();

        s_sharedRay       = new Ray(transform.position + Vector3.up * 0.7f, transform.forward);
        s_sharedHitsCount = Physics.SphereCastNonAlloc(s_sharedRay, radius, s_sharedHits, range);

        float bestPartValue = float.MaxValue;

        for (int i = 0; i < s_sharedHitsCount; ++i)
        {
            RaycastHit hit = s_sharedHits[i];
            BaseObject obj = hit.collider.GetComponentInParent <BaseObject>();
            if (obj == null || obj == this)
            {
                continue;
            }

            BaseBuildingPart part = obj as BaseBuildingPart;
            if (part != null && !part.m_isBeingCarried)
            {
                m_buildingPartsInRange.Add(new KeyValuePair <RaycastHit, BaseBuildingPart>(hit, part));
                if (m_heldPart == null && part.m_isBroken)
                {
                    if (hit.distance < bestPartValue)
                    {
                        bestPartValue     = hit.distance;
                        m_pickUpCandidate = part;
                    }
                }
                continue;
            }

            BaseActor actor = obj as BaseActor;
            if (actor != null)
            {
                m_actorsInRange.Add(new KeyValuePair <RaycastHit, BaseActor>(hit, actor));
            }
        }

        if (m_pickUpCandidate != null)
        {
            m_pickUpCandidate.SetColor(Color.green);
        }

        // update placement indicator
        if (m_heldPart != null)
        {
            m_placementTile = LevelGenerator.Instance.GetClosestTile(transform.position + transform.forward);

            if (m_placementTile != null)
            {
                BaseBuildingPart topPart = m_placementTile.GetTopPart();
                if (topPart == null)
                {
                    m_placementAllowed = true;
                    m_placementIndicator.transform.position = m_placementTile.transform.position;
                }
                else
                {
                    m_placementAllowed = topPart.m_type != BaseBuildingPart.BuildingPartType.Roof && topPart.transform.position.y <= transform.position.y + 1.5f;
                    m_placementIndicator.transform.position = topPart.transform.position + Vector3.up;
                }
            }
        }

        m_placementIndicator.gameObject.SetActive(m_placementTile != null);
        if (m_placementIndicator.gameObject.activeSelf)
        {
            m_placementIndicator.SetColor(m_placementAllowed ? PLACEMENT_ALLOWED_COLOR : PLACEMENT_NOT_ALLOWED_COLOR);
        }
    }