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);
 }
Exemple #6
0
 //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);
     }
 }
Exemple #7
0
 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;
         }
     }
 }
Exemple #10
0
    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);
    }
Exemple #12
0
    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) {}
        }
    }
Exemple #13
0
    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;
    }
Exemple #14
0
    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;
    }