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; }
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]); } } } }