89 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
| using HarmonyLib;
 | |
| using System;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace MuzikaGromche
 | |
| {
 | |
|     [HarmonyPatch(typeof(RoundManager))]
 | |
|     static class SpawnRatePatch
 | |
|     {
 | |
|         const string JesterEnemyName = "Jester";
 | |
| 
 | |
|         // GetRandomWeightedIndex is not only called from AssignRandomEnemyToVent,
 | |
|         // so in order to differentiate it from other calls, prefix assigns these
 | |
|         // global variables, and postfix cleans them up.
 | |
| 
 | |
|         // If set to null, do not override spawn chances.
 | |
|         // Otherwise, it is an index of Jester in RoundManager.currentLevel.Enemies
 | |
|         static int? EnemyIndex = null;
 | |
|         static float SpawnTime = 0f;
 | |
| 
 | |
|         [HarmonyPatch(nameof(RoundManager.AssignRandomEnemyToVent))]
 | |
|         [HarmonyPrefix]
 | |
|         static void AssignRandomEnemyToVentPrefix(RoundManager __instance, EnemyVent vent, float spawnTime)
 | |
|         {
 | |
|             if (!Config.OverrideSpawnRates.Value)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var index = __instance.currentLevel.Enemies.FindIndex(enemy => enemy.enemyType.enemyName == JesterEnemyName);
 | |
|             if (index == -1)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             EnemyIndex = index;
 | |
|             SpawnTime = spawnTime;
 | |
|         }
 | |
| 
 | |
|         [HarmonyPatch(nameof(RoundManager.AssignRandomEnemyToVent))]
 | |
|         [HarmonyPostfix]
 | |
|         static void AssignRandomEnemyToVentPostfix(RoundManager __instance, EnemyVent vent, float spawnTime)
 | |
|         {
 | |
|             EnemyIndex = null;
 | |
|             SpawnTime = 0f;
 | |
|         }
 | |
| 
 | |
|         [HarmonyPatch(nameof(RoundManager.GetRandomWeightedIndex))]
 | |
|         [HarmonyPrefix]
 | |
|         static void GetRandomWeightedIndexPostfix(RoundManager __instance, int[] weights, System.Random randomSeed)
 | |
|         {
 | |
|             if (EnemyIndex is int index)
 | |
|             {
 | |
|                 if (__instance.EnemyCannotBeSpawned(index))
 | |
|                 {
 | |
|                     return;
 | |
|                 }
 | |
| 
 | |
|                 //    0 ==  6:00 AM
 | |
|                 //   60 ==  7:00 AM
 | |
|                 //  100 ==  7:40 AM (Cycle #1)
 | |
|                 //  120 ==  8:00 AM
 | |
|                 //  180 ==  9:00 AM (Cycle #2)
 | |
|                 //  300 == 11:00 AM (Cycle #3)
 | |
|                 //  420 ==  1:00 PM (Cycle #4)
 | |
|                 //  540 ==  3:00 PM (Cycle #5)
 | |
|                 //  660 ~=  5:00 PM
 | |
|                 //  780 ~=  7:00 PM
 | |
|                 //  900 ~=  9:00 PM
 | |
|                 // 1020 ~= 11:00 PM
 | |
|                 // 1080 == 12:00 AM
 | |
|                 const float minMultiplierTime = 200f; // 9:20 AM
 | |
|                 const float maxMultiplierTime = 500f; // 2:00 PM
 | |
|                 var normalizedMultiplierTime = Mathf.Clamp((SpawnTime - minMultiplierTime) / (maxMultiplierTime - minMultiplierTime), 0f, 1f);
 | |
|                 // Start slowly, then escalate it quickly
 | |
|                 normalizedMultiplierTime = Easing.InCubic.Eval(normalizedMultiplierTime);
 | |
| 
 | |
|                 const float minMultiplier = 1f;
 | |
|                 const float maxMultiplier = 15f;
 | |
|                 var multiplier = Mathf.Lerp(minMultiplier, maxMultiplier, normalizedMultiplierTime);
 | |
| 
 | |
|                 var newWeight = Mathf.FloorToInt(weights[index] * multiplier);
 | |
|                 Debug.Log($"{nameof(MuzikaGromche)} {nameof(SpawnRatePatch)} Overriding spawn weight[{index}] {weights[index]} * {multiplier} => {newWeight} for t={SpawnTime}");
 | |
|                 weights[index] = newWeight;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |