예제 #1
0
        private void AddGardenerInstance(GameDatabase gamedb, AssetDatabase assetdb)
        {
            GardenerInfo gi = new GardenerInfo();

            gi.FleetId = gamedb.InsertFleet(this.PlayerId, 0, 0, 0, "Gardener", FleetType.FL_NORMAL);
            gamedb.InsertShip(gi.FleetId, this.GardenerDesignId, null, (ShipParams)0, new int?(), 0);
            gi.IsGardener = true;
            Vector3 vector3_1 = new Vector3();

            vector3_1.X = (App.GetSafeRandom().CoinToss(50) ? -1f : 1f) * App.GetSafeRandom().NextInclusive(1E-06f, 1f);
            vector3_1.Y = (App.GetSafeRandom().CoinToss(50) ? -1f : 1f) * App.GetSafeRandom().NextInclusive(1E-06f, 1f);
            vector3_1.Z = (App.GetSafeRandom().CoinToss(50) ? -1f : 1f) * App.GetSafeRandom().NextInclusive(1E-06f, 1f);
            double  num       = (double)vector3_1.Normalize();
            Vector3 vector3_2 = vector3_1 * -10f;
            Vector3 toCoords  = vector3_1 * 10f;
            int     missionID = gamedb.InsertMission(gi.FleetId, MissionType.RELOCATION, 0, 0, 0, 0, true, new int?());

            gamedb.InsertWaypoint(missionID, WaypointType.TravelTo, new int?());
            gamedb.InsertMoveOrder(gi.FleetId, 0, vector3_2, 0, toCoords);
            gi.DeepSpaceSystemId  = new int?(gamedb.InsertStarSystem(new int?(), App.Localize("@UI_STARMAP_ENCOUNTER_DEEPSPACE"), new int?(), "Deepspace", vector3_2, false, false, new int?()));
            gi.DeepSpaceOrbitalId = new int?(gamedb.InsertOrbitalObject(new int?(), gi.DeepSpaceSystemId.Value, new OrbitalPath()
            {
                Scale = new Vector2(20000f, Ellipse.CalcSemiMinorAxis(20000f, 0.0f)),
                InitialAngle = 0.0f
            }, "space"));
            gamedb.GetOrbitalTransform(gi.DeepSpaceOrbitalId.Value);
            gamedb.InsertGardenerInfo(gi);
            foreach (PlayerInfo playerInfo in gamedb.GetStandardPlayerInfos().ToList <PlayerInfo>())
            {
                if (gamedb.GetStratModifier <int>(StratModifiers.GrandMenaceWarningTime, playerInfo.ID) > 0)
                {
                    gamedb.InsertTurnEvent(new TurnEvent()
                    {
                        EventType    = TurnEventType.EV_INCOMING_GARDENER,
                        EventMessage = TurnEventMessage.EM_INCOMING_GARDENER,
                        PlayerID     = playerInfo.ID,
                        TurnNumber   = gamedb.GetTurnCount()
                    });
                }
            }
        }
예제 #2
0
        public static List <PlanetInfo> GetGardenerPlanetsFromList(App app, int systemId)
        {
            GardenerInfo      gardenerInfo   = app.GameDatabase.GetGardenerInfos().FirstOrDefault <GardenerInfo>((Func <GardenerInfo, bool>)(x => x.SystemId == systemId));
            List <PlanetInfo> planetInfoList = new List <PlanetInfo>();

            if (gardenerInfo != null)
            {
                foreach (KeyValuePair <int, int> shipOrbit in gardenerInfo.ShipOrbitMap)
                {
                    KeyValuePair <int, int> ship = shipOrbit;
                    if (gardenerInfo.ShipOrbitMap.Where <KeyValuePair <int, int> >((Func <KeyValuePair <int, int>, bool>)(x => x.Value == ship.Value)).Count <KeyValuePair <int, int> >() != 0)
                    {
                        PlanetInfo planetInfo = app.GameDatabase.GetPlanetInfo(ship.Value);
                        if (planetInfo != null && !planetInfoList.Contains(planetInfo))
                        {
                            planetInfoList.Add(planetInfo);
                        }
                    }
                }
            }
            return(planetInfoList);
        }
예제 #3
0
        public void SpawnProteanChaser(GameSession game, GardenerInfo gardener)
        {
            GardenerInfo gi = new GardenerInfo();

            gi.TurnsToWait     = game.AssetDatabase.GlobalGardenerData.CatchUpDelay;
            gi.GardenerFleetId = gardener.FleetId;
            gi.FleetId         = game.GameDatabase.InsertFleet(this.PlayerID, 0, 0, 0, "Protean Follow", FleetType.FL_NORMAL);
            game.GameDatabase.InsertGardenerInfo(gi);
            int            num1        = App.GetSafeRandom().NextInclusive(game.AssetDatabase.GlobalGardenerData.ProteanMobMin, game.AssetDatabase.GlobalGardenerData.ProteanMobMax);
            float          num2        = 250000f;
            float          maxValue    = 2000f;
            List <Vector3> vector3List = new List <Vector3>();

            for (int index = 0; index < num1; ++index)
            {
                int     shipID    = game.GameDatabase.InsertShip(gi.FleetId, this.ProteanDesignId, null, (ShipParams)0, new int?(), 0);
                Vector3 vector3_1 = new Vector3();
                bool    flag      = false;
                while (!flag)
                {
                    flag        = true;
                    vector3_1.Y = 0.0f;
                    vector3_1.X = (App.GetSafeRandom().CoinToss(50) ? -1f : 1f) * App.GetSafeRandom().NextInclusive(0.0f, maxValue);
                    vector3_1.Z = (App.GetSafeRandom().CoinToss(50) ? -1f : 1f) * App.GetSafeRandom().NextInclusive(0.0f, maxValue);
                    foreach (Vector3 vector3_2 in vector3List)
                    {
                        if ((double)(vector3_2 - vector3_1).LengthSquared < (double)num2)
                        {
                            flag = false;
                            break;
                        }
                    }
                }
                vector3List.Add(vector3_1);
                game.GameDatabase.UpdateShipFleetPosition(shipID, new Vector3?(vector3_1));
            }
        }
예제 #4
0
        public static Matrix GetBaseEnemyFleetTrans(
            App app,
            int systemId,
            OrbitalObjectInfo[] objects)
        {
            if (((IEnumerable <OrbitalObjectInfo>)objects).Count <OrbitalObjectInfo>() == 0)
            {
                return(Matrix.Identity);
            }
            GardenerInfo gardenerInfo = app.GameDatabase.GetGardenerInfos().ToList <GardenerInfo>().FirstOrDefault <GardenerInfo>((Func <GardenerInfo, bool>)(x => x.SystemId == systemId));
            float        num1         = 0.0f;
            Matrix       matrix       = Matrix.Identity;

            foreach (OrbitalObjectInfo orbitalObjectInfo in objects)
            {
                OrbitalObjectInfo oo         = orbitalObjectInfo;
                PlanetInfo        planetInfo = app.GameDatabase.GetPlanetInfo(oo.ID);
                if (planetInfo != null && !(planetInfo.Type == "barren") && !(planetInfo.Type == "gaseous"))
                {
                    if (gardenerInfo == null || (gardenerInfo.ShipOrbitMap.Where <KeyValuePair <int, int> >((Func <KeyValuePair <int, int>, bool>)(x => x.Value == oo.ID)).Count <KeyValuePair <int, int> >() != 0 || (double)num1 <= 0.0))
                    {
                        Vector3 position      = app.GameDatabase.GetOrbitalTransform(planetInfo.ID).Position;
                        float   lengthSquared = position.LengthSquared;
                        if ((double)lengthSquared > (double)num1)
                        {
                            num1 = lengthSquared;
                            Vector3 forward = position;
                            double  num2    = (double)forward.Normalize();
                            matrix = Matrix.CreateWorld(Vector3.Zero, forward, Vector3.UnitY);
                            float num3 = StarSystemVars.Instance.SizeToRadius(planetInfo.Size) + 3000f;
                            matrix.Position = position - matrix.Forward * num3;
                        }
                    }
                }
            }
            return(matrix);
        }
예제 #5
0
        public static Matrix GetSpawnTransform(
            App app,
            int databaseId,
            int fleetId,
            int shipIndex,
            int systemId,
            OrbitalObjectInfo[] objects)
        {
            GardenerInfo gardenerInfo = app.GameDatabase.GetGardenerInfos().FirstOrDefault <GardenerInfo>((Func <GardenerInfo, bool>)(x => x.FleetId == fleetId));

            if (gardenerInfo == null)
            {
                return(Matrix.Identity);
            }
            if (gardenerInfo.IsGardener)
            {
                return(Gardeners.GetSpawnMatrixForGardener(app, systemId, objects));
            }
            if (gardenerInfo.GardenerFleetId != 0)
            {
                return(Gardeners.GetSpawnMatrixForProteansWithGardener(app, databaseId, systemId, objects));
            }
            return(Gardeners.GetSpawnMatrixForProteansAtHome(app, databaseId, shipIndex, systemId, objects));
        }
예제 #6
0
        public void HandleGardenerCaptured(
            GameSession game,
            GameDatabase gamedb,
            int playerId,
            int gardenerId)
        {
            GardenerInfo gardenerInfo = gamedb.GetGardenerInfo(gardenerId);

            if (gardenerInfo == null)
            {
                return;
            }
            FleetInfo fleetInfo = gamedb.GetFleetInfo(gardenerInfo.FleetId);

            if (fleetInfo == null)
            {
                return;
            }
            if (gardenerInfo.DeepSpaceSystemId.HasValue)
            {
                foreach (StationInfo stationInfo in game.GameDatabase.GetStationForSystem(gardenerInfo.DeepSpaceSystemId.Value).ToList <StationInfo>())
                {
                    game.GameDatabase.DestroyStation(game, stationInfo.ID, 0);
                }
            }
            fleetInfo.PlayerID = playerId;
            gamedb.UpdateFleetInfo(fleetInfo);
            FleetLocation         fleetLocation   = gamedb.GetFleetLocation(fleetInfo.ID, false);
            List <StarSystemInfo> closestStars    = EncounterTools.GetClosestStars(gamedb, fleetLocation.Coords);
            StarSystemInfo        starSystemInfo1 = (StarSystemInfo)null;

            foreach (StarSystemInfo starSystemInfo2 in closestStars)
            {
                int?systemOwningPlayer = gamedb.GetSystemOwningPlayer(starSystemInfo2.ID);
                if (systemOwningPlayer.HasValue && systemOwningPlayer.Value == playerId)
                {
                    starSystemInfo1 = starSystemInfo2;
                    break;
                }
            }
            if (!(starSystemInfo1 != (StarSystemInfo)null))
            {
                return;
            }
            MissionInfo missionByFleetId = gamedb.GetMissionByFleetID(fleetInfo.ID);

            if (missionByFleetId != null)
            {
                gamedb.RemoveMission(missionByFleetId.ID);
            }
            MoveOrderInfo orderInfoByFleetId = gamedb.GetMoveOrderInfoByFleetID(fleetInfo.ID);

            if (orderInfoByFleetId != null)
            {
                gamedb.RemoveMoveOrder(orderInfoByFleetId.ID);
            }
            int missionID = gamedb.InsertMission(fleetInfo.ID, MissionType.RETURN, starSystemInfo1.ID, 0, 0, 0, false, new int?());

            gamedb.InsertWaypoint(missionID, WaypointType.TravelTo, new int?(starSystemInfo1.ID));
            gamedb.InsertMoveOrder(fleetInfo.ID, 0, fleetLocation.Coords, starSystemInfo1.ID, Vector3.Zero);
            this.SpawnProteanChaser(game, gardenerInfo);
        }
예제 #7
0
        public void UpdateTurn(GameSession game, int id)
        {
            GardenerInfo gi = game.GameDatabase.GetGardenerInfo(id);

            if (gi == null)
            {
                game.GameDatabase.RemoveEncounter(id);
            }
            else if (gi.IsGardener)
            {
                FleetInfo fleetInfo = game.GameDatabase.GetFleetInfo(gi.FleetId);
                if (fleetInfo != null && fleetInfo.PlayerID != this.PlayerID)
                {
                    return;
                }
                if (game.GameDatabase.GetMoveOrderInfoByFleetID(gi.FleetId) == null)
                {
                    if (gi.DeepSpaceSystemId.HasValue)
                    {
                        game.GameDatabase.DestroyStarSystem(game, gi.DeepSpaceSystemId.Value);
                    }
                    if (gi.DeepSpaceOrbitalId.HasValue)
                    {
                        game.GameDatabase.RemoveOrbitalObject(gi.DeepSpaceOrbitalId.Value);
                    }
                    game.GameDatabase.RemoveEncounter(id);
                }
                else
                {
                    FleetLocation fl = game.GameDatabase.GetFleetLocation(fleetInfo.ID, false);
                    if (!gi.DeepSpaceSystemId.HasValue || game.GameDatabase.GetStarSystemInfos().Any <StarSystemInfo>((Func <StarSystemInfo, bool>)(x =>
                    {
                        if (x.ID != gi.DeepSpaceSystemId.Value)
                        {
                            return((double)(game.GameDatabase.GetStarSystemOrigin(x.ID) - fl.Coords).LengthSquared < 9.99999974737875E-05);
                        }
                        return(false);
                    })))
                    {
                        return;
                    }
                    game.GameDatabase.UpdateStarSystemOrigin(gi.DeepSpaceSystemId.Value, fl.Coords);
                }
            }
            else
            {
                if (gi.SystemId != 0 || gi.GardenerFleetId == 0)
                {
                    return;
                }
                FleetInfo gardenerFleet = game.GameDatabase.GetFleetInfo(gi.GardenerFleetId);
                bool      flag          = gardenerFleet == null;
                if (!flag)
                {
                    if (gi.TurnsToWait <= 0)
                    {
                        FleetInfo fleetInfo = game.GameDatabase.GetFleetInfo(gi.FleetId);
                        if (fleetInfo != null)
                        {
                            if (game.GameDatabase.GetMoveOrderInfoByFleetID(gardenerFleet.ID) == null)
                            {
                                if (gardenerFleet.SystemID != fleetInfo.SystemID)
                                {
                                    game.GameDatabase.UpdateFleetLocation(fleetInfo.ID, gardenerFleet.SystemID, new int?());
                                }
                            }
                            else
                            {
                                GardenerInfo gardenerInfo = game.GameDatabase.GetGardenerInfos().FirstOrDefault <GardenerInfo>((Func <GardenerInfo, bool>)(x => x.FleetId == gardenerFleet.ID));
                                if (gardenerInfo != null && gardenerInfo.DeepSpaceSystemId.HasValue)
                                {
                                    game.GameDatabase.UpdateFleetLocation(fleetInfo.ID, gardenerInfo.DeepSpaceSystemId.Value, new int?());
                                }
                                else
                                {
                                    game.GameDatabase.UpdateFleetLocation(fleetInfo.ID, 0, new int?());
                                }
                            }
                        }
                    }
                    else if (game.GameDatabase.GetMoveOrderInfoByFleetID(gardenerFleet.ID) == null)
                    {
                        --gi.TurnsToWait;
                        game.GameDatabase.UpdateGardenerInfo(gi);
                    }
                }
                if (!flag)
                {
                    return;
                }
                game.GameDatabase.RemoveEncounter(id);
            }
        }
예제 #8
0
        private void AddProteanSystemInstance(GameDatabase gamedb, AssetDatabase assetdb, int SystemId)
        {
            GardenerInfo gi = new GardenerInfo();

            gi.SystemId = SystemId;
            List <PlanetInfo> list                = ((IEnumerable <PlanetInfo>)gamedb.GetStarSystemPlanetInfos(SystemId)).ToList <PlanetInfo>();
            int                num1               = 0;
            int                num2               = 0;
            float              num3               = gamedb.GetFactions().Average <FactionInfo>((Func <FactionInfo, float>)(x => x.IdealSuitability));
            Random             safeRandom         = App.GetSafeRandom();
            GardenerGlobalData globalGardenerData = assetdb.GlobalGardenerData;

            foreach (PlanetInfo planet in list)
            {
                if (!gamedb.GetOrbitalObjectInfo(planet.ID).ParentID.HasValue&& planet.Type != "barren" && planet.Type != "gaseous")
                {
                    planet.Biosphere   = safeRandom.Next(globalGardenerData.MinBiosphere, globalGardenerData.MaxBiosphere);
                    planet.Suitability = num3;
                    ++num1;
                    gamedb.UpdatePlanet(planet);
                }
            }
            if (num1 < globalGardenerData.MinPlanets)
            {
                int num4 = globalGardenerData.MinPlanets - num1;
                int num5 = gamedb.GetStarSystemOrbitalObjectInfos(SystemId).Where <OrbitalObjectInfo>((Func <OrbitalObjectInfo, bool>)(x => !x.ParentID.HasValue)).Count <OrbitalObjectInfo>() + 1;
                for (int index = 0; index < num4; ++index)
                {
                    PlanetOrbit planetOrbit = new PlanetOrbit();
                    planetOrbit.OrbitNumber = num5 + index;
                    planetOrbit.Biosphere   = new int?(safeRandom.Next(globalGardenerData.MinBiosphere, globalGardenerData.MaxBiosphere));
                    planetOrbit.Suitability = new float?(num3);
                    PlanetInfo pi = StarSystemHelper.InferPlanetInfo((Kerberos.Sots.Data.StarMapFramework.Orbit)planetOrbit);
                    gamedb.AddPlanetToSystem(SystemId, new int?(), null, pi, new int?(num5 + index));
                }
            }
            List <PlanetInfo> planetInfoList = new List <PlanetInfo>();

            foreach (PlanetInfo planetInfo in list)
            {
                if (planetInfo.Type != "barren" && planetInfo.Type != "gaseous")
                {
                    num2 += (int)planetInfo.Size;
                    planetInfoList.Add(planetInfo);
                }
            }
            int fleetID = gamedb.InsertFleet(this.PlayerId, 0, SystemId, SystemId, "Protean Pod", FleetType.FL_NORMAL);

            gi.FleetId = fleetID;
            gamedb.InsertGardenerInfo(gi);
            int encounterIdAtSystem = gamedb.GetEncounterIDAtSystem(EasterEgg.EE_GARDENERS, gi.SystemId);

            for (int index = 0; index < num2; ++index)
            {
                int shipId = gamedb.InsertShip(fleetID, this._proteanDesignId, null, (ShipParams)0, new int?(), 0);
                int num4   = 0;
                foreach (PlanetInfo planetInfo in planetInfoList)
                {
                    num4 += (int)planetInfo.Size;
                    if (index < num4)
                    {
                        gamedb.InsertProteanShipOrbitMap(encounterIdAtSystem, shipId, planetInfo.ID);
                        break;
                    }
                }
            }
        }
예제 #9
0
        private static Matrix GetSpawnMatrixForProteansAtHome(
            App app,
            int databaseId,
            int shipIndex,
            int systemId,
            OrbitalObjectInfo[] objects)
        {
            if (((IEnumerable <OrbitalObjectInfo>)objects).Count <OrbitalObjectInfo>() == 0)
            {
                return(Matrix.Identity);
            }
            GardenerInfo gardenerInfo = app.GameDatabase.GetGardenerInfos().FirstOrDefault <GardenerInfo>((Func <GardenerInfo, bool>)(x => x.SystemId == systemId));
            int          orbitalId    = 0;

            if (gardenerInfo != null && gardenerInfo.ShipOrbitMap.ContainsKey(databaseId))
            {
                orbitalId = gardenerInfo.ShipOrbitMap[databaseId];
            }
            Matrix matrix = Matrix.Identity;

            if (orbitalId == 0)
            {
                int num1 = 0;
                foreach (OrbitalObjectInfo orbitalObjectInfo in objects)
                {
                    PlanetInfo planetInfo = app.GameDatabase.GetPlanetInfo(orbitalObjectInfo.ID);
                    if (planetInfo != null && !(planetInfo.Type == "barren") && !(planetInfo.Type == "gaseous"))
                    {
                        num1 += (int)planetInfo.Size;
                        if (shipIndex < num1)
                        {
                            int num2 = num1 - shipIndex;
                            matrix = Matrix.CreateRotationYPR(MathHelper.DegreesToRadians(360f / planetInfo.Size * (float)num2), 0.0f, 0.0f);
                            float num3 = StarSystemVars.Instance.SizeToRadius(planetInfo.Size) + 3000f;
                            matrix.Position = app.GameDatabase.GetOrbitalTransform(planetInfo.ID).Position + matrix.Forward * num3;
                            if (gardenerInfo != null)
                            {
                                app.Game.GameDatabase.InsertProteanShipOrbitMap(gardenerInfo.Id, databaseId, planetInfo.ID);
                                break;
                            }
                            break;
                        }
                    }
                }
            }
            else
            {
                PlanetInfo planetInfo = app.GameDatabase.GetPlanetInfo(orbitalId);
                gardenerInfo.ShipOrbitMap.Where <KeyValuePair <int, int> >((Func <KeyValuePair <int, int>, bool>)(x => x.Value == orbitalId)).Count <KeyValuePair <int, int> >();
                int num1 = 0;
                foreach (KeyValuePair <int, int> keyValuePair in gardenerInfo.ShipOrbitMap.Where <KeyValuePair <int, int> >((Func <KeyValuePair <int, int>, bool>)(x => x.Value == orbitalId)))
                {
                    if (keyValuePair.Key != databaseId)
                    {
                        ++num1;
                    }
                    else
                    {
                        break;
                    }
                }
                matrix = Matrix.CreateRotationYPR(MathHelper.DegreesToRadians(360f / planetInfo.Size * (float)num1), 0.0f, 0.0f);
                float num2 = StarSystemVars.Instance.SizeToRadius(planetInfo.Size) + 3000f;
                matrix.Position = app.GameDatabase.GetOrbitalTransform(planetInfo.ID).Position + matrix.Forward * num2;
            }
            return(matrix);
        }