private void HandleTrigger(Collider col) { if (col.gameObject.tag == "torch" || col.gameObject.tag == "lantern") { if (!torch || col.gameObject.GetComponent <FlameController>().flameLife > torch.flameLife) { torch = col.gameObject.GetComponent <FlameController>(); } if (lit) { torch.flameLife = torch.maxFlameLife; } else if (torch.flameLife > 0.0f) { lit = true; flameEmission.enabled = true; } } else if (col.gameObject.tag == "burns") { if (lit) { col.gameObject.GetComponent <BurnableObjectController>().lit = true; } } else if (col.gameObject.tag == "fireball") { lit = true; flameEmission.enabled = true; } }
public void ResetObject() { GetComponent <Renderer>().enabled = true; gameObject.layer = originalLayer; GetComponent <Renderer>().materials[0].color = startColor; lit = startLit; burnTime = initialBurnTime; if (burnShader != null) { burnShader.SetFloat("_DissolveAmount", 1.0f); } if (torch != null) { torch = null; } flameEmission.enabled = false; ashEmission.enabled = false; foreach (Light light in lights) { light.enabled = false; } }
private void OnTriggerExit(Collider col) { if (col.gameObject.tag == "torch" || col.gameObject.tag == "lantern") { if (torch) { torch = null; } } }
private void OnTriggerStay(Collider col) { if (col.gameObject.tag == "torch" || col.gameObject.tag == "lantern" || col.gameObject.tag == "scepter") { if (!torch) { torch = col.gameObject.GetComponent <FlameController>(); } } }
public double GetFlameIntensity(FlameController flame) { foreach (var activeFlame in _activeFlames) { if (activeFlame.GetPayload(0) == flame) { return(activeFlame.GetVariable <double>("intensity")); } } return(0f); }
//INstantiate flames on neighbour cells. void Explode() { for (int i = 0; i < neighbors.Count; i++) { GameObject flameInstance = Instantiate(FlamePrefab) as GameObject; FlameController flameController = flameInstance.GetComponent <FlameController>(); flameController.SetOriginOfThisFlame(_Xid, _Yid); flameController.SetIDs(neighbors[i].X_ID, neighbors[i].Y_ID); neighbors[i].isThisCellOnFire = true; flameInstance.transform.position = GridManager.instance.GridToWorld(neighbors[i].X_ID, neighbors[i].Y_ID); } }
public void Score(FlameController flame, double intensity, Transform position) { if (Math.Abs(intensity) < 0.1f) { RegainHp(_healthReward); } _score += (intensity + 1) * 10; _levelManager.GameMaster.GetScoreNumberController().SpawnNumber((intensity + 1) * 10, position.position); if (flame != null) { if (_enemiesNearBy.Remove(flame.GetComponentInChildren <Collider>())) { _logFireExtinguished++; } } }
void OnTriggerEnter(Collider col) { if (col.gameObject.tag == "torch") { if (!torch) { torch = col.gameObject; } FlameController flame = torch.GetComponent <FlameController>(); flame.flameLife = flame.maxFlameLife; if (!lit) { LightItUp(); } } }
void OnTriggerEnter(Collider col) { if (col.gameObject.tag == "torch" || col.gameObject.tag == "lantern") { GameObject torch = col.gameObject; FlameController flame = torch.GetComponent <FlameController>(); if (flame.flameLife > 0.0f && !lit) { LightItUp(); Resetter.TriggerCheckpoint(torch); } else if (lit) { flame.flameLife = flame.maxFlameLife; } } }
private void TakeDamage() { double totalDmg = 0; foreach (Collider enemyCollider in _enemiesNearBy) { FlameController enemy = enemyCollider.GetComponentInParent <FlameController>(); totalDmg += _levelManager.FireSystem.GetFlameIntensity(enemy) / Vector3.Distance(enemy.transform.position, transform.position) * Time.deltaTime; } totalDmg = Math.Round(totalDmg * _damageScaling); if (totalDmg > 0.5 && _hitPoints >= 0) { _accumulatedDamage += totalDmg; if (_accumulatedDamage >= _hitPoints) { _hitPoints = 0; } } if (Time.time - _lastTick > _damageTick && _accumulatedDamage > 30 && _hitPoints > 0) { _animation.Play("Damage"); if (DamageAnimation != null) { DamageAnimation(); } _levelManager.GameMaster.GetDamageNumberController().SpawnNumber(_accumulatedDamage, transform.position); _hitPoints -= _accumulatedDamage; _totalDamageTaken += _accumulatedDamage; _logDamage += _accumulatedDamage; _accumulatedDamage = 0; _lastTick = Time.time; } if (_hitPoints > 0 && totalDmg < _recoveryThreshold) { RegainHp(_recoveryRate); } }
public FlameController LowerIntensity(Vector2 coords, double waterStrength, out double outIntensity) { outIntensity = 0f; GridItem cell = _fireGrid.GetGridItem(coords.x, coords.y); FlameController flame = cell.GetPayload(0) as FlameController; // Debug.Log("Clicked on " + flame + " at position " + coords); if (flame != null) { outIntensity = cell.GetVariable <double>("intensity"); cell.SetVariable("intensity", outIntensity - waterStrength ); if (cell.GetVariable <double>("intensity") <= 0) { Debug.Log(_levelManager.Player.GetRemainingHitPoints() / _growthFeedback); if (_activeFlames.Count < _levelManager.Player.GetRemainingHitPoints() / _growthFeedback) { Grow(); } if (Random.Range(0f, 1f) > _spreadFeedback) { Spread(); } _activeFlames.Remove(cell); _flamePool.Remove(flame); cell.SetVariable("intensity", 0d); cell.SetVariable("onfire", false); // Debug.Log( cell.GetVariable<int>( "intensity" ) ); cell.RemovePayload(0); } else { cell.SetPayload(flame, 0); } _fireGrid.UpdateGridItem(coords, cell); } return(flame); }
private void OnParticleCollision(GameObject other) { if (other.GetComponent <FlameController>( )) { var events = new List <ParticleCollisionEvent>(); var waterCount = water.GetCollisionEvents(other, events); try { double intensity = 0; FlameController flame = _levelManager.FireSystem.LowerIntensity( other.transform.position, waterCount, out intensity ); _levelManager.Player.Score(flame, intensity, other.transform); } catch (IndexOutOfRangeException) {} } }
private void ShootFireBall() { _lineRenderer.enabled = false; float ratio = Mathf.Clamp(_currentThrowForce / maxThrowForce, 0.2f, 1); _currentThrowForce = 0.0f; FlameController flame = scepter.GetComponent <FlameController>(); if (flame.flameLife < float.Epsilon) { return; } float fireBallCost = flame.maxFlameLife * scepterMaxFlameCost * ratio; if (flame.flameLife < fireBallCost) { //trouver le ratio qui donne un coût égal à la vie restante ratio = flame.flameLife / (flame.maxFlameLife * scepterMaxFlameCost); //si le ratio est trop petit, aucune fireball n'apparaît if (ratio < 0.2f) { return; } fireBallCost = flame.flameLife; } flame.flameLife -= fireBallCost; Vector3 mousePos = Input.mousePosition; Ray castPoint = Camera.main.ScreenPointToRay(mousePos); RaycastHit hit; Rigidbody fireballClone = Instantiate(fireball, currentlyHeld.transform.position, currentlyHeld.transform.rotation).GetComponent <Rigidbody>(); if (Physics.Raycast(castPoint, out hit, Mathf.Infinity)) { Vector3 toMouse = hit.point - currentlyHeld.transform.position; toMouse.x = 0; // Remove the useless depth component fireballClone.velocity = toMouse.normalized * fireBallBaseSpeed * ratio; } currentScepterDelay = scepterShootDelay; }
private void Throw() { if (!currentlyHeld) { return; } Vector3 mousePos = Input.mousePosition; mousePos.z = -Camera.main.transform.position.z + currentlyHeld.transform.position.z; Vector3 worldPoint = Camera.main.ScreenToWorldPoint(mousePos); if (currentlyHeld == torch) { torch = null; } if (currentlyHeld == lantern) { lantern = null; } currentlyHeld.GetComponent <Rigidbody>().isKinematic = false; guide.GetChild(0).parent = null; Vector3 toMouse = worldPoint - currentlyHeld.transform.position; toMouse.z = 0; // Remove the useless depth component currentlyHeld.GetComponent <Rigidbody>().AddForce(toMouse.normalized * _currentThrowForce, ForceMode.Impulse); currentlyHeld.GetComponent <Rigidbody>().AddTorque(Vector3.Cross(new Vector3(0, 1, 0), (toMouse.normalized * _currentThrowForce)), ForceMode.Impulse); AudioSource sfx = currentlyHeld.GetComponent <AudioSource>(); FlameController flame = currentlyHeld.GetComponent <FlameController>(); if (sfx && flame && flame.flameLife > 0.0f) { sfx.Play(); } currentlyHeld = null; _currentThrowForce = 0.0f; _lineRenderer.enabled = false; }
/// <summary> /// /// </summary> private void Spread() { int spreadCount = 0; _edgeFlames = new List <GridItem>(); foreach (var item in _activeFlames) { bool add = false; foreach (var neighbour in item.GetNeighbours(_spreadDistance)) { if (!neighbour.GetVariable <bool>("onfire")) { add = true; } } if (add) { _edgeFlames.Add(item); } //limiting the number of flames we're even gonna look at for speed sake if (_edgeFlames.Count >= _spreadLimit * 2) { break; } } //shuffle those suckers int next = _edgeFlames.Count; while (next > 1) { next--; int k = Random.Range(0, next + 1); GridItem f = _edgeFlames[k]; _edgeFlames[k] = _edgeFlames[next]; _edgeFlames[next] = f; } _edgeFlames.Reverse(); foreach (GridItem edgeItem in _edgeFlames) { if (edgeItem.GetVariable <double>("intensity") < _spreadIntensity) { continue; } List <GridItem> emptyNeighbours = new List <GridItem>(); foreach (GridItem n in edgeItem.GetNeighbours(_spreadDistance)) { if (!n.GetVariable <bool>("onfire") && n.GetVariable <bool>("flammable") && HasLineOfSight(n, edgeItem)) { emptyNeighbours.Add(n); } } foreach (GridItem neighbour in emptyNeighbours) { if (Random.value < 1 - _spreadChance) { continue; } if (spreadCount >= _spreadLimit) { break; } FlameController newFlame = _flamePool.Spawn() as FlameController; if (!newFlame) { // _levelManager.GameMaster.OnDeath( ); return; } ; spreadCount++; newFlame.GetComponent <Collider>().enabled = false; var center = _fireGrid.GetPosition(neighbour._gridCoords); var position = new Vector3( center.x, _verticalOffset, center.y ); // Debug.Log("Setting new flame to " + neighbour._gridCoords); // Debug.Log("To position" + position); newFlame.transform.position = position; newFlame.GetComponent <Collider>().enabled = true; neighbour.SetPayload(newFlame, 0); neighbour.SetVariable("intensity", 1d); neighbour.SetVariable("onfire", true); neighbour.SetVariable("verticalOffset", _verticalOffset); _fireGrid.UpdateGridItem(neighbour._gridCoords, neighbour); //TODO check if neighbour is actually an edge flame _activeFlames.Add(neighbour); } } }
private void OnTriggerExit(Collider col) { torch = null; }
public void Initialize() { _edgeFlames = new List <GridItem>(); _activeFlames = new List <GridItem>(); _flamePrefab = Resources.Load <FlameController>("Prefabs/Flame"); Vector3 floorSize = gameObject.transform.localScale; float height = floorSize.z; float width = floorSize.x; Vector3 itemSize = new Vector3(width / _columns, 1.1f, height / _rows); _flamePrefab.transform.localScale = itemSize; _flamePool = GameMaster.InstantiatePool(_firePoolSize, _flamePrefab, "FlamePool"); _fireGrid = new GridController(_rows, _columns, _payloadDepth, gameObject); _fireGrid.InitVariable("intensity", 0d, item => { var g = new Gradient(); var gColor = new GradientColorKey[4]; gColor[0].color = Color.white; gColor[0].time = 0f; gColor[1].color = Color.gray; gColor[1].time = 0.25f; gColor[2].color = Color.yellow; gColor[2].time = 0.5f; gColor[3].color = Color.red; gColor[3].time = 1f; var gAlpha = new GradientAlphaKey[1]; gAlpha[0].alpha = 1f; gAlpha[0].time = 0f; g.SetKeys(gColor, gAlpha); var main = item.GetPayload <FlameController>(0) .GetComponent <ParticleSystem>().main; main.startColor = g.Evaluate( (float)(item.GetVariable <double>("intensity") / (_maxFlameIntensity)) ); }); _fireGrid.InitVariable <bool>("flammable", item => { Vector3 pos = _fireGrid.GetPosition(item._gridCoords); var posLeft = new Vector3( pos.x + _fireGrid._itemWidth / 2, 0.2f, pos.y ); var posDown = new Vector3( pos.x, 0.2f, pos.y + _fireGrid._itemHeight / 2 ); var rayLeft = new Ray(posLeft, Vector3.left); var rayDown = new Ray(posDown, Vector3.back); Debug.DrawRay(rayLeft.origin, rayLeft.direction * _fireGrid._itemWidth, Color.white, 30000); Debug.DrawRay(rayDown.origin, rayDown.direction * _fireGrid._itemHeight, Color.white, 30000); var flammable = !(Physics.Raycast(rayDown, _fireGrid._itemHeight) || Physics.Raycast(rayLeft, _fireGrid._itemWidth)); return(flammable); }); _fireGrid.InitVariable("onfire", false); foreach (Vector2 coords in _startingFlames) { FlameController flame = _flamePool.Spawn() as FlameController; if (!flame) { throw new Exception("Can't start a fire! Someone bring more matches!!"); } var gridCoords = _fireGrid.GetPosition(coords); flame.transform.position = new Vector3( gridCoords.x, _verticalOffset, gridCoords.y ); var cell = _fireGrid.GetGridItem(coords.x, coords.y); cell.SetPayload(flame, 0); cell.SetVariable("intensity", _startIntensity); cell.SetVariable("onfire", true); _activeFlames.Add(cell); _edgeFlames.Add(cell); _fireGrid.UpdateGridItem(cell._gridCoords, cell); } _tick = Time.time; var orgSpreadChange = _spreadChance; _spreadChance = 1f; for (int i = 0; i < _prewarm; i++) { Spread(); Grow(); } _spreadChance = orgSpreadChange; _levelManager.GameMaster.ResetUi(); initialized = true; }