Exemple #1
0
        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);
                }
            }
        }