public void RandomizeEnemies(Process game) { availableSpawnPlanes = new List <SpawnPlane>(spawnPlanes); availableSpawnPlanes.ForEach(x => x.ResetCurrEnemies()); for (int i = 0; i < roomObjects.Count; i++) { double rarity = (double)(Config.GetInstance().r.Next(0, 100) / 100.0); List <SpawnPlane> availableSpawnPlanesUpdated; if (roomObjects[i] is Enemy enemy) { availableSpawnPlanesUpdated = availableSpawnPlanes.Where(x => x.IsEnemyAllowed(enemy.enemyType, rarity)).ToList(); } else { availableSpawnPlanesUpdated = availableSpawnPlanes.Where(x => x.IsAllowed(rarity)).ToList(); } if (availableSpawnPlanesUpdated.Count == 0) { continue; } int selectedPlaneIndex = Config.GetInstance().r.Next(0, availableSpawnPlanesUpdated.Count); // can add enemies to that plane? if (availableSpawnPlanesUpdated[selectedPlaneIndex].CanAddEnemies()) { roomObjects[i].SetMemoryPos(game, availableSpawnPlanesUpdated[selectedPlaneIndex].GetRandomSpawnData()); availableSpawnPlanesUpdated[selectedPlaneIndex].EnemyAdded(roomObjects[i].Pos); } // can't add anymore enemies? remove plane from available list if (!availableSpawnPlanesUpdated[selectedPlaneIndex].CanAddEnemies()) { int indexToRemove = GetSameSpawnPlaneIndex(availableSpawnPlanes, availableSpawnPlanesUpdated[selectedPlaneIndex]); if (indexToRemove > -1) { availableSpawnPlanes.RemoveAt(indexToRemove); } } } // Need to modify cp? find parent and change if (AttachedCPData != null) { // Full CP details or partial data? if (AttachedCPData is CPData cpdata) { MapCore.ModifyCP(cpdata.CP_Pointer, cpdata.SpawnPos, cpdata.SpawnAngle, GameHook.game); } else if (AttachedCPData is Tuple <Vector3f, Angle> data) { var dp = roomObjects.OfType <Enemy>()?.Last()?.GetObjectDP(); List <int> offsets = new List <int>(dp.GetOffsets()); offsets[offsets.Count - 1] = 0x5D0; offsets.Add(0x280); offsets.Add(0x248); offsets.Add(0x1D0); DeepPointer parentDP = new DeepPointer(dp.GetBase(), offsets); IntPtr parentPtr; parentDP.DerefOffsets(game, out parentPtr); // pos game.WriteValue(parentPtr, data.Item1.X); game.WriteValue(parentPtr + 4, data.Item1.Y); game.WriteValue(parentPtr + 8, data.Item1.Z); // angle game.WriteValue(parentPtr - 8, data.Item2.angleSin); game.WriteValue(parentPtr - 4, data.Item2.angleCos); } } }