Beispiel #1
0
        // после похорон траур не проходит. вместо этого добавляем небольшой компенсационный бафф за похороны
        // также лечит меланхолию
        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);
        }
Beispiel #2
0
        // добавляем в могилу необходимые компоненты

        /*
         * [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);
        }