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); } } }
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); }
protected void DropPart() { if (m_heldPart == null) { return; } m_heldPart.Drop(); m_heldPart = null; }
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; }
protected void ThrowPart() { if (m_heldPart == null) { return; } AudioManager.Instance.PlayOneShot(m_throwClip); m_heldPart.Throw(this, transform.forward * m_throwForce); m_heldPart = null; }
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; }
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); } } }
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); }
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); }
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); } }
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); } }