Exemplo n.º 1
0
    void TryStop()
    {
        Debug.Log(eventRef.name + " trying to stop, ending date: " + TimeManager.Date);
        if (OnEventStoping != null)
        {
            OnEventStoping.Invoke(this);
        }

        // See if we are ending ending events
        if (TryStopSubEvents())
        {
            // If so, return;
            occuring = false;
            return;
        }

        // Stop the event itself
        for (int i = 0; i < eventRef.modifers.Length; i++)
        {
            // If this is a family related modifer...
            if (eventRef.modifers[i].propertyType > GameValueType.__Family &&
                eventRef.modifers[i].propertyType < GameValueType.__Animal)
            {
                switch (eventRef.modifers[i].propertyType)
                {
                case GameValueType.FamilyCropConsumption:
                    foreach (var f in members)
                    {
                        f.requiredWheat -= (int)eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyDeath:
                    foreach (var f in members)
                    {
                        f.gone = false;
                    }
                    break;

                case GameValueType.FamilyDyingRate:
                    foreach (var f in members)
                    {
                        f.dyingRate -= eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyHunger:
                    foreach (var f in members)
                    {
                        f.hunger -= (int)eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyMentalHealth:
                    foreach (var f in members)
                    {
                        f.mentalHealth -= (int)eventRef.modifers[i].value_1;
                    }
                    break;
                }
            }
            else
            {
                GameDataManager.GameValues.RemoveModifier(eventRef.modifers[i]);
            }
        }

        // Calculate occuring chance of sub events with occuring method of AtTheEnd_One
        var chanceSum = 0f;
        var chanceNum = 0f;

        for (int i = 0; i < subEvents.Length; i++)
        {
            if (subEvents[i].eventRef.occuringMethod != SubEvent.OccuringMethod.AtTheEnd_One ||
                subEvents[i].isExecuting ||
                !subEvents[i].eventRef.StartingCondition.IsSatisfied())
            {
                continue;
            }
            chanceSum += subEvents[i].eventRef.chance;
        }

        Debug.Log("ChanceSum: " + chanceSum);
        chanceNum = Random.value * chanceSum;
        chanceSum = 0;

        for (int i = 0; i < subEvents.Length; i++)
        {
            if (subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.Chose_Multiple ||
                subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.Chose_One)
            {
                continue;
            }

            if (subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.AtTheEnd_One)
            {
                if (chanceSum >= chanceNum ||
                    subEvents[i].isExecuting ||
                    !subEvents[i].eventRef.StartingCondition.IsSatisfied())
                {
                    continue;
                }

                chanceSum += subEvents[i].eventRef.chance;
                if (chanceSum > chanceNum)
                {
                    Debug.Log("Subevent " + i + " is executing");
                    subEvents[i].Execute();
                    if (OnSubEventOccuring != null)
                    {
                        OnSubEventOccuring.Invoke(this, subEvents[i]);
                    }

                    chanceNum = float.PositiveInfinity;
                }
            }
            else
            if (Random.value < subEvents[i].eventRef.chance &&
                subEvents[i].eventRef.StartingCondition.IsSatisfied())
            {
                subEvents[i].Execute();
                if (OnSubEventOccuring != null)
                {
                    OnSubEventOccuring.Invoke(this, subEvents[i]);
                }
            }
        }

        foreach (var se in subEvents)
        {
            // Update ending date for event occuring checking
            if (se.occurationEndDate > occurationEndDate)
            {
                occurationEndDate = se.occurationEndDate;
            }
        }

        // If ending date updated, return;
        if (!IsReachedEndingDate)
        {
            return;
        }

        // Try stopping sub events once more to clean sub events with 0 duration
        TryStopSubEvents();

        Debug.Log(eventRef.name + " stopped, ending date: " + TimeManager.Date);

        occuring = false;
    }
Exemplo n.º 2
0
    void RunEvent()
    {
        // Invoke occuring event
        if (OnEventOccuring != null)
        {
            OnEventOccuring.Invoke(this);
        }

        // Update occuring data
        occurationStartDate = TimeManager.Date;
        occurationEndDate   = occurationStartDate + eventRef.Duration.RandomBetweenIncluded();
        occuredTimes++;

        // Apply modifiers
        for (int i = 0; i < eventRef.modifers.Length; i++)
        {
            // If this is a family related modifer...
            if (eventRef.modifers[i].propertyType > GameValueType.__Family &&
                eventRef.modifers[i].propertyType < GameValueType.__Animal)
            {
                switch (eventRef.modifers[i].propertyType)
                {
                case GameValueType.FamilyCropConsumption:
                    foreach (var f in members)
                    {
                        f.requiredWheat += (int)eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyDeath:
                    foreach (var f in members)
                    {
                        f.gone = true;
                    }
                    break;

                case GameValueType.FamilyDyingRate:
                    foreach (var f in members)
                    {
                        f.dyingRate += eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyHunger:
                    foreach (var f in members)
                    {
                        f.hunger += (int)eventRef.modifers[i].value_1;
                    }
                    break;

                case GameValueType.FamilyMentalHealth:
                    foreach (var f in members)
                    {
                        f.mentalHealth += (int)eventRef.modifers[i].value_1;
                    }
                    break;
                }
            }
            else
            {
                // If this is a event that has no duration(forever), merge modifiers into the basic game values
                if (eventRef.Duration == Vector2Int.zero)
                {
                    GameDataManager.GameValues.MergeModifier(eventRef.modifers[i]);
                }
                else
                {
                    GameDataManager.GameValues.AddModifier(eventRef.modifers[i]);
                }
            }
        }

        // Calculate occuring chance of sub events with occuring method of chose one
        var chanceSum = 0f;
        var chanceNum = 0f;

        for (int i = 0; i < subEvents.Length; i++)
        {
            if (subEvents[i].eventRef.occuringMethod != SubEvent.OccuringMethod.Chose_One ||
                subEvents[i].isExecuting ||
                !subEvents[i].eventRef.StartingCondition.IsSatisfied())
            {
                continue;
            }
            chanceSum += subEvents[i].eventRef.chance;
        }

        chanceNum = Random.value * chanceSum;
        chanceSum = 0;

        // Going through all the sub events
        for (int i = 0; i < subEvents.Length; i++)
        {
            if (subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.AtTheEnd_One ||
                subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.AtTheEnd_Multiple)
            {
                continue;
            }

            if (subEvents[i].eventRef.occuringMethod == SubEvent.OccuringMethod.Chose_One)
            {
                if (chanceSum >= chanceNum ||
                    !subEvents[i].eventRef.StartingCondition.IsSatisfied())
                {
                    continue;
                }

                chanceSum += subEvents[i].eventRef.chance;
                if (chanceSum >= chanceNum)
                {
                    subEvents[i].Execute();
                    if (OnSubEventOccuring != null)
                    {
                        OnSubEventOccuring.Invoke(this, subEvents[i]);
                    }
                }
            }
            else
            if (Random.value < subEvents[i].eventRef.chance &&
                subEvents[i].eventRef.StartingCondition.IsSatisfied())
            {
                subEvents[i].Execute();
                if (OnSubEventOccuring != null)
                {
                    OnSubEventOccuring.Invoke(this, subEvents[i]);
                }
            }
        }
    }