// после похорон траур не проходит. вместо этого добавляем небольшой компенсационный бафф за похороны // также лечит меланхолию public static void MournChore_OnCompleted(this MournChore.States states, MournChore.StatesInstance smi) { Effects effects = states.mourner.Get <Effects>(smi); Effect effectMourning = Db.Get().effects.Get(MOURNING); EffectInstance effectInstanceMourning = effects.Get(effectMourning); if (effectInstanceMourning != null) { EffectInstance effectInstanceFunereal = effects.Add(FUNERAL, true); if (effectInstanceMourning.timeRemaining < effectMourning.duration) { effectInstanceFunereal.timeRemaining = effectInstanceMourning.timeRemaining; } } effects.Remove(MELANCHOLY); }
// добавляем в могилу необходимые компоненты /* * [HarmonyPatch(typeof(GraveConfig), "ConfigureBuildingTemplate")] * static class GraveConfig_ConfigureBuildingTemplate * { * static void Postfix(GameObject go) * { * go.AddOrGet<MinionStorage>(); * } * } */ /* * MournChore */ // другой алгоритм поиска могилы - ищем с наибольшим временем захоронения, но пропуская часть, на основе приблизительной оценки общего количества еще не оплаканных смертей // todo: метод неточный, поэтому нужно предотвратить начало оплакивания если есть непохороненые трупы. блиин, пока труп несут - он не учитывается. арргх!!! // для лечения меланхолии - ищем случайную непустую могилу public static Grave FindGraveToMournAt(this MournChore.StatesInstance smi) { Grave result = null; ListPool <Grave, MournChore> .PooledList graves = ListPool <Grave, MournChore> .Allocate(Components.Graves.Items.FindAll(grave => grave.burialTime > 0)); if (graves.Count > 0) { EffectInstance effectInstance = smi.sm.mourner.Get(smi)?.GetComponent <Effects>()?.Get(MOURNING); if (effectInstance != null) { int numdeath = Mathf.FloorToInt(effectInstance.timeRemaining / effectInstance.effect.duration); numdeath = Mathf.Clamp(numdeath, 0, graves.Count - 1); result = graves.OrderByDescending(grave => grave.burialTime).ElementAt(numdeath); } else { int index = UnityEngine.Random.Range(0, graves.Count); result = graves[index]; } } graves.Recycle(); return(result); }