예제 #1
0
 public override bool ResolveLocation(MissionInProgress missionInProgress)
 {
     if (ResolveGenericLocation(missionInProgress))
     {
         return(base.ResolveLocation(missionInProgress));
     }
     return(false);
 }
예제 #2
0
        public override void ResolveLinks(MissionInProgress missionInProgress)
        {
            if (generateSecondaryDefinition)
            {
                LookUpSecondaryDefinitionOrSelectItem(missionInProgress);
            }

            base.ResolveLinks(missionInProgress);
        }
예제 #3
0
        protected void TryCopyDefinitionFromPrimaryLinkedTarget(MissionInProgress missionInProgress)
        {
            var primaryLinkedTarget = GetSourceTargetForPrimaryAndSolve(missionInProgress);

            if (ValidPrimaryLinkSet)
            {
                primaryLinkedTarget?.myTarget.CopyMyPrimaryDefinitionToTarget(this);
            }
        }
예제 #4
0
        public override void ResolveLinks(MissionInProgress missionInProgress)
        {
            if (!ValidDefinitionSet)
            {
                LookupPrimaryDefinitionOrSetFromPools(missionInProgress);
            }

            base.ResolveLinks(missionInProgress);
        }
예제 #5
0
        private void LookUpSecondaryDefinition(MissionInProgress missionInProgress)
        {
            var secondaryLinkedTarget = GetSourceTargetForSecondaryAndSolve(missionInProgress);

            if (ValidSecondaryLinkSet)
            {
                secondaryLinkedTarget?.myTarget.CopyMySecondaryDefinitionToTarget(this);
            }
        }
예제 #6
0
        public override bool ResolveLocation(MissionInProgress missionInProgress)
        {
            if (ResolveMissionStructureLocations(missionInProgress, Type))
            {
                return(base.ResolveLocation(missionInProgress));
            }

            return(false);
        }
예제 #7
0
        protected void LookUpPrimaryDefinitionOrSelectPlantMineralDefinition(MissionInProgress missionInProgress)
        {
            TryCopyDefinitionFromPrimaryLinkedTarget(missionInProgress);

            if (!ValidDefinitionSet)
            {
                SetDefinitionAsPlantMineralFromPool(missionInProgress);
            }
        }
예제 #8
0
 private void AdvanceBonusInGang(List <Character> charactersToSpread, MissionInProgress missionInProgress)
 {
     foreach (var character in charactersToSpread)
     {
         var missionBonus = MissionAdministrator.GetOrAddMissionBonus(character, missionInProgress.myMission.missionCategory, missionInProgress.MissionLevel, missionInProgress.myLocation.Agent);
         missionBonus.AdvanceBonus();
         MissionAdministrator.SetMissionBonus(missionBonus);
     }
 }
예제 #9
0
        protected void LookupPrimaryDefinitionOrSetFromPools(MissionInProgress missionInProgress)
        {
            TryCopyDefinitionFromPrimaryLinkedTarget(missionInProgress);

            if (!ValidDefinitionSet)
            {
                SetPrimaryDefinitionFromItemPools(missionInProgress);
            }
        }
예제 #10
0
        /// <summary>
        /// Sets the definition as one of the source items of a research - the item to researh
        /// </summary>
        /// <param name="missionInProgress"></param>
        /// <param name="usePrimaryLink"></param>
        protected bool TryGetResearchableItemFromResearchTarget(MissionInProgress missionInProgress, bool usePrimaryLink = true)
        {
            MissionTargetInProgress linkedTarget;

            if (usePrimaryLink)
            {
                if (!ValidPrimaryLinkSet)
                {
                    return(false);
                }

                linkedTarget = GetSourceTargetForPrimaryAndSolve(missionInProgress);
            }
            else
            {
                if (!ValidSecondaryLinkSet)
                {
                    return(false);
                }

                linkedTarget = GetSourceTargetForSecondaryAndSolve(missionInProgress);
            }

            if (linkedTarget?.TargetType == MissionTargetType.research)
            {
                if (!linkedTarget.myTarget.ValidDefinitionSet)
                {
                    Logger.Error("no valid cprg definition is set for " + linkedTarget.myTarget);
                    throw new PerpetuumException(ErrorCodes.ConsistencyError);
                }

                //this target is created to aid the research. It must spawn an original item
                //and there must be a way to get the decoder as well along the mission

                //cannot use selected definition exceptions
                var itemDefinition = ProductionDataAccess.GetResultingDefinitionFromCalibrationDefinition(linkedTarget.myTarget.Definition);

                missionInProgress.AddToSelectedItems(itemDefinition);

                //as a side effect it may happen that previous targets choose this definition. dont be surprised!

                //possible workaround
                // position the spawn targets as the last/first items, so they will find the item amongst the choosen ones
                // according to research targets in mission

                definition = itemDefinition;
                quantity   = 1;

                Log("researchable item resolved:" + PrimaryEntityDefault.Name + " from " + linkedTarget.myTarget);

                return(true);
            }

            return(false);
        }
예제 #11
0
        protected override void ProcessMyQuantity(MissionInProgress missionInProgress)
        {
            if (!ValidQuantitySet)
            {
                TryCopyQuantityFromPrimaryLink(missionInProgress);
            }

            CheckPrimaryQuantityAndThrow();

            base.ProcessMyQuantity(missionInProgress);
        }
예제 #12
0
        private void SetPrimaryDefinitionFromItemPools(MissionInProgress missionInProgress)
        {
            var categorFlags = CategoryFlags.cf_generic_random_items;

            if (ValidPrimaryCategorySet)
            {
                categorFlags = PrimaryCategoryFlags;
            }

            definition = GetCombinedDefinitionFromPools(missionInProgress, categorFlags);
        }
예제 #13
0
        protected void SetSecondaryDefinitionFromMissionItemsPool(MissionInProgress missionInProgress)
        {
            var categoryFlags = CategoryFlags.cf_generic_random_items;

            if (ValidSecondaryCategorySet)
            {
                categoryFlags = SecondaryCategoryFlags;
            }

            secondaryDefinition = GetCombinedDefinitionFromPools(missionInProgress, categoryFlags);
        }
예제 #14
0
 private List <MissionTarget> GetPossibleMissionSpots(MissionInProgress missionInProgress, double rangeExtension)
 {
     return(missionDataCache.GetAllMissionTargets.Where(t =>
                                                        (t.Type == MissionTargetType.rnd_point || t.Type == MissionTargetType.find_artifact || t.Type == MissionTargetType.pop_npc) &&
                                                        t.ValidPositionSet &&
                                                        t.ValidZoneSet &&
                                                        missionInProgress.myLocation.ZoneConfig.Id == t.ZoneId &&
                                                        missionInProgress.SearchOrigin.IsInRangeOf2D(t.targetPosition, t.FindRadius + rangeExtension) &&
                                                        missionDataCache.IsTargetSelectionValid(missionInProgress.myLocation.Zone, missionInProgress.SearchOrigin, t.targetPosition)
                                                        ).ToList());
 }
예제 #15
0
        protected void ScaleNpcAmount(MissionInProgress missionInProgress)
        {
            var preValue           = quantity;
            var level              = missionInProgress.ScaleMissionLevel;
            var gangMemberCountMax = missionInProgress.GangMemberCountMaximized;

            var randomAmount = GetRandomNpcAmountByLevel(missionInProgress.MissionLevel);

            quantity = (Quantity + gangMemberCountMax + randomAmount).Clamp(0, int.MaxValue);

            Log("npc amount scaled " + preValue + " -> " + quantity + " Gm:" + gangMemberCountMax + " lvl:" + level + " randAmount:" + randomAmount);
        }
예제 #16
0
 protected void TryScaleByTypeOrCopyPrimaryQuantity(MissionInProgress missionInProgress)
 {
     if (ValidQuantitySet)
     {
         //quantity manually set, try scaling it by type
         ScalePrimaryQuantityByType(missionInProgress);
     }
     else
     {
         TryCopyQuantityFromPrimaryLink(missionInProgress);
     }
 }
예제 #17
0
        public override void ResolveLinks(MissionInProgress missionInProgress)
        {
            TryCopyDefinitionFromPrimaryLinkedTarget(missionInProgress);

            if (!ValidDefinitionSet)
            {
                Log("the primary link must be set on " + this + " missionId:" + MissionId);
                throw new PerpetuumException(ErrorCodes.ConsistencyError);
            }

            base.ResolveLinks(missionInProgress);
        }
예제 #18
0
        public override void ResolveLinks(MissionInProgress missionInProgress)
        {
            //primary definition is ignored here
            //deal with secondary, which is the 'gathered intel'

            if (generateSecondaryDefinition)
            {
                //teh intel document
                SetSecondaryDefinitionFromMissionItemsPool(missionInProgress);
            }

            base.ResolveLinks(missionInProgress);
        }
예제 #19
0
        protected void LookUpPrimaryDefinitionOrSelectNpcDefinition(MissionInProgress missionInProgress)
        {
            TryCopyDefinitionFromPrimaryLinkedTarget(missionInProgress);

            if (!ValidDefinitionSet && !useQuantityOnly)
            {
                //this is a rare case, but it can handle it
                //practically here we suppress the diversity and we only spawn a certain type N times

                //can be aided later with extra npcs above these fixed ones as optional targets
                SetDefinitionAsNpcFromPool(missionInProgress);
            }
        }
예제 #20
0
        private bool ProcessQuantityOrSkip(MissionInProgress missionInProgress)
        {
            //links already processed?
            if (!CheckIfLinksAreScaled(missionInProgress))
            {
                return(false);
            }

            //call the type related functions
            ProcessMyQuantity(missionInProgress);

            return(true);
        }
예제 #21
0
 private List <MissionTarget> GetPossibleStructureTargets(MissionInProgress missionInProgress, MissionTargetType targetType, double rangeExtension)
 {
     return(missionDataCache.GetAllMissionTargets
            .Where(t => t.Type == targetType &&
                   t.ValidFindRadiusSet &&
                   t.ValidMissionStructureEidSet &&
                   t.ValidPositionSet &&
                   t.ValidZoneSet &&
                   t.ZoneId == missionInProgress.myLocation.ZoneConfig.Id &&
                   missionInProgress.SearchOrigin.IsInRangeOf2D(t.targetPosition, t.FindRadius + rangeExtension) &&
                   missionDataCache.IsTargetSelectionValid(missionInProgress.myLocation.Zone, missionInProgress.SearchOrigin, t.targetPosition)
                   ).ToList());
 }
예제 #22
0
        protected override void ProcessMyQuantity(MissionInProgress missionInProgress)
        {
            ScaleArtifactRange(missionInProgress);

            if (FindArtifactSpawnsNpcs)
            {
                ProcessPrimaryQuantityAsNpc(missionInProgress);
            }

            ProcessSecondaryQuantity(missionInProgress);

            base.ProcessMyQuantity(missionInProgress);
        }
예제 #23
0
        private void ScaleArtifactRange(MissionInProgress missionInProgress)
        {
            var level           = missionInProgress.ScaleMissionLevel;
            var gangMemberCount = missionInProgress.GangMemberCountMaximized;

            var rawRange = _artifactRanges[level];

            var range = rawRange + rawRange * gangMemberCount * missionDataCache.ScaleArtifactLevelFractionForGangMember;

            TargetPositionRange = (int)(range.Clamp(0, double.MaxValue));

            Log("range scaled. " + TargetPositionRange + " G:" + gangMemberCount + " lvl:" + level);
        }
예제 #24
0
        protected override void ProcessMyQuantity(MissionInProgress missionInProgress)
        {
            TryScaleByTypeOrCopyPrimaryQuantity(missionInProgress);

            if (generateSecondaryDefinition)
            {
                secondaryQuantity = 1;
            }

            CheckPrimaryQuantityAndThrow();

            base.ProcessMyQuantity(missionInProgress);
        }
예제 #25
0
        protected MissionTargetInProgress GetSourceTargetForPrimaryAndSolve(MissionInProgress missionInProgress)
        {
            var definitionSourceTarget = GetSourceTargetForPrimaryDefinition(missionInProgress);

            if (definitionSourceTarget != null)
            {
                if (!definitionSourceTarget.myTarget.IsResolved)
                {
                    definitionSourceTarget.myTarget.ResolveLinks(missionInProgress);
                }
            }

            return(definitionSourceTarget);
        }
예제 #26
0
        public override void ResolveLinks(MissionInProgress missionInProgress)
        {
            //ez persze csak extra, de lehet, talan kelleni fog
            //tulajodonkeppen sosem lesz a presence hasznalva
            if (!ValidPresenceSet)
            {
                //ha nincs beallitva neki fixen presence, akkor
                //link resolve, if link set
                //generate definition from pool
                LookUpPrimaryDefinitionOrSelectNpcDefinition(missionInProgress);
            }

            base.ResolveLinks(missionInProgress);
        }
예제 #27
0
        protected void TryCopyQuantityFromPrimaryLink(MissionInProgress missionInProgress)
        {
            //process primary link

            var preValue = quantity;

            var primary = GetSourceTargetForPrimaryAndSolve(missionInProgress);

            if (ValidPrimaryLinkSet && primary != null)
            {
                // primary link is used

                if (!primary.myTarget.IsScaled)
                {
                    Log("primary target not scaled yet. " + primary.TargetType);
                    return;
                }

                if (targetSecondaryAsMyPrimary)
                {
                    //using the linked target's secondary quantity
                    if (primary.myTarget.ValidSecondaryQuantitySet)
                    {
                        quantity = primary.myTarget.SecondaryQuantity;

                        Log("setting priQty from primary link's secQty. " + preValue + " -> " + quantity + "   from:" + primary.myTarget);
                    }
                    else
                    {
                        Logger.Error("the linked target's secondary quantity is not set. current:" + this + "   linked as primary to   " + primary.myTarget);
                        throw new PerpetuumException(ErrorCodes.ConsistencyError);
                    }
                }
                else
                {
                    //default case : using the target's primary quantity
                    if (primary.myTarget.ValidQuantitySet)
                    {
                        quantity = primary.myTarget.Quantity;

                        Log("setting priQty from primary link's priQty. " + preValue + " -> " + quantity + "    from:" + primary.myTarget);
                    }
                    else
                    {
                        Logger.Error("the linked target's primary quantity is not set. current:" + this + "   linked as primary to   " + primary.myTarget);
                        throw new PerpetuumException(ErrorCodes.ConsistencyError);
                    }
                }
            }
        }
예제 #28
0
        /// <summary>
        /// This function makes sure that the resulting target is solved,
        /// technically: when we are working with a target we can be sure that it is solved.
        /// </summary>
        /// <param name="missionInProgress"></param>
        /// <returns></returns>
        private MissionTargetInProgress GetSourceTargetForSecondaryAndSolve(MissionInProgress missionInProgress)
        {
            //get secondary target via mission in progress
            var secondaryDefinitionSourceTarget = GetSourceTargetForSecondaryDefinition(missionInProgress);

            if (secondaryDefinitionSourceTarget != null)
            {
                if (!secondaryDefinitionSourceTarget.myTarget.IsResolved)
                {
                    secondaryDefinitionSourceTarget.myTarget.ResolveLinks(missionInProgress);
                }
            }

            return(secondaryDefinitionSourceTarget);
        }
예제 #29
0
        private MissionTarget SearchForPossibleSpots(MissionInProgress missionInProgress)
        {
            var foundTargets = SearchForMinimalAmountOfSpots(missionInProgress, missionInProgress.SelectedTargets);

            if (foundTargets.Count == 0)
            {
                Log("no possible location targets to select from. " + this + " " + missionInProgress);
                return(null);
            }

            var selectedTarget = foundTargets.RandomElement();

            missionInProgress.AddToSelectedTargets(selectedTarget);
            return(selectedTarget);
        }
예제 #30
0
        protected MissionTarget SelectRandomMissionStructure(MissionInProgress missionInProgress, MissionTargetType targetType)
        {
            var structures = SearchForMinimalAmountOfStructures(missionInProgress, targetType, missionInProgress.SelectedTargets);

            if (structures.Count == 0)
            {
                Log("no possible structure targets to select from. " + targetType + " " + this + " " + missionInProgress);
                return(null);
            }

            var selectedTarget = structures.RandomElement();

            missionInProgress.AddToSelectedTargets(selectedTarget);
            return(selectedTarget);
        }