Files
FCP-Tools/1.6/Defs/QuestScriptDefs/FCP_Scripts_SettlementRaidDefense.xml
RickGrymes 443dc7e11c Add terminals, holotapes, radiant quests & traders
Introduce terminal/holotape features, hacking jobs and UI plus extensive radiant quest content and faction/trader support. Adds many new C# systems (holotape storage/comp, terminal hacking, job drivers, quest nodes/parts, gensteps, settlement spawn control, pocket map components) and XML defs (quest scripts for CaravanRescue/ScavengerSupplyRun, mapgen prefab, faction/trader defs for currency exchange, site and research defs). Updates: JobDefs to include holotape/hack jobs, PawnKind apparel season handling and faction requirement metadata, ThingDefs and map/site defs, language word lists, map icons and textures, and various patches (workgiver, mapgen, currency). Removes obsolete VNPE compatibility patch, legacy pawn-rescue-animal script and a few unused defs/assets.
2026-05-31 10:34:25 -05:00

290 lines
20 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<Defs>
<QuestScriptDef>
<defName>FCP_Quest_SettlementRaidDefense</defName>
<rootSelectionWeight>1.0</rootSelectionWeight>
<rootMinPoints>50</rootMinPoints>
<defaultChallengeRating>1</defaultChallengeRating>
<canGiveRoyalFavor>true</canGiveRoyalFavor>
<expireDaysRange>4~8</expireDaysRange>
<questNameRules>
<rulesStrings>
<li>questName->Defending [settlement]</li>
<li>questName->Operation: Protect [settlement]</li>
<li>questName->Wasteland Defense: [settlement]</li>
<li>questName->Settlement Under Siege</li>
<li>questName->The [settlement] Stand</li>
<li>questName->Protecting the Innocent</li>
<li>questName->Raider Threat Elimination</li>
<li>questName->Last Stand at [settlement]</li>
<li>settlement->a wasteland settlement</li>
<li>settlement->a survivor outpost</li>
<li>settlement->a trading post</li>
<li>settlement->a farming community</li>
<li>settlement->a frontier settlement</li>
<li>settlement->a refugee camp</li>
<li>settlement->a scavenger outpost</li>
<li>settlement->a civilian settlement</li>
</rulesStrings>
</questNameRules>
<questDescriptionRules>
<rulesStrings>
<li>questDescription->Emergency transmission from [asker_nameFull], [asker_faction_leaderTitle] of [asker_faction_name]: "We've received urgent intelligence that raiders are planning a coordinated assault on one of our [settlement]s. The settlers there are defenseless - mostly farmers, traders, and families just trying to survive in the wasteland. We need experienced fighters to reach the settlement and help defend it before the attack begins."</li>
<li>questDescription->Priority alert from [asker_nameFull] of [asker_faction_name]: "A notorious raider gang has been spotted moving toward [settlement]. The civilians there have no military training and limited weapons - they're sitting ducks. Intelligence suggests the raiders are after the settlement's food stores and fuel reserves. Time is critical - get there and fortify their defenses before the wasteland vultures arrive."</li>
<li>questDescription->Distress signal from [asker_faction_name]: "[asker_nameFull] here. We've lost contact with [settlement] after reports of raider activity in the area. Our scouts indicate a major assault is imminent - possibly within hours. The settlement houses dozens of innocent survivors who've built something decent in this godforsaken wasteland. They deserve a chance to keep what they've worked so hard to build."</li>
<li>questDescription->Urgent communication from [asker_nameFull], [asker_faction_leaderTitle]: "Raiders have been circling [settlement] like vultures for days, testing their defenses. The settlement's barely armed - they're peaceful folks who've managed to carve out a life in the ruins. Word is the raiders plan to hit them at dawn. These people took us in when we had nothing - now it's our turn to stand by them."</li>
<li>questDescription->Critical mission briefing from [asker_faction_name]: A heavily armed raider warband is converging on [settlement]. The target is strategically important - it sits on a major trade route and has clean water sources. If it falls, it'll embolden every raider gang in the region. [asker_nameFull] is personally requesting assistance: "Help us protect these people. In this wasteland, every functioning settlement is a beacon of hope."</li>
</rulesStrings>
</questDescriptionRules>
<root Class="QuestNode_Sequence">
<nodes>
<li Class="FCP.Core.RadiantQuests.QuestNode_GetFactionFromList">
<storeAs>askerFaction</storeAs>
<factionDefs>
<li MayRequire="Rick.FCP.Wastelanders">FCP_Faction_Hidden_Wastelanders</li>
<li>OutlanderCivil</li>
</factionDefs>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GetLeaderOfFaction">
<storeAs>asker</storeAs>
<factionToUse>$askerFaction</factionToUse>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GetFactionFromList">
<storeAs>enemyFaction</storeAs>
<!--The faction def that will raid-->
<factionDefs>
<li>PirateWaster</li>
</factionDefs>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GetFactionFromList">
<storeAs>settlementFaction</storeAs>
<!--The faction def that will be raided-->
<factionDefs>
<li MayRequire="Rick.FCP.Wastelanders">FCP_Faction_Hidden_Wastelanders</li>
<li>OutlanderCivil</li>
</factionDefs>
</li>
<li Class="QuestNode_SubScript">
<def>Util_RandomizePointsChallengeRating</def>
<parms>
<pointsFactorTwoStar>1.5</pointsFactorTwoStar>
<pointsFactorThreeStar>2</pointsFactorThreeStar>
</parms>
</li>
<li Class="QuestNode_SubScript">
<def>Util_AdjustPointsForDistantFight</def>
</li>
<li Class="QuestNode_GetMap" />
<li Class="QuestNode_GetSiteTile">
<storeAs>siteTile</storeAs>
<preferCloserTiles>true</preferCloserTiles>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GetSitePartDefsByTagsAndFaction">
<factionToUse>$settlementFaction</factionToUse>
<storeAs>sitePartDefs</storeAs>
<storeFactionAs>siteFaction</storeFactionAs>
<sitePartsTags>
<li>
<tag>FCP_Site_SettlementRaidInProgress</tag>
</li>
</sitePartsTags>
</li>
<li Class="QuestNode_GetDefaultSitePartsParams">
<tile>$siteTile</tile>
<faction>$siteFaction</faction>
<sitePartDefs>$sitePartDefs</sitePartDefs>
<storeSitePartsParamsAs>sitePartsParams</storeSitePartsParamsAs>
</li>
<li Class="QuestNode_GetSiteThreatPoints">
<storeAs>sitePoints</storeAs>
<sitePartsParams>$sitePartsParams</sitePartsParams>
</li>
<li Class="QuestNode_SubScript">
<def>Util_GetDefaultRewardValueFromPoints</def>
<parms>
<!-- Use the actual threat points generated (some site parts define a minimum threshold) -->
<points>$sitePoints</points>
</parms>
</li>
<!-- Inflate reward value. Since we're basing the reward value on the threat points generated, we need to do this
even though the threat points was deflated from the input points already. -->
<li Class="QuestNode_Multiply">
<value1>$rewardValue</value1>
<value2>1.75</value2>
<storeAs>rewardValue</storeAs>
</li>
<li Class="QuestNode_SubScript">
<def>Util_GenerateSite</def>
<parms>
<sitePartsParams>$sitePartsParams</sitePartsParams>
</parms>
</li>
<li Class="QuestNode_SpawnWorldObjects">
<worldObjects>$site</worldObjects>
</li>
<li Class="QuestNode_Signal">
<inSignal>site.MapGenerated</inSignal>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_Set">
<name>pointsForSettlers</name>
<value>$($points * 0.5)</value>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GeneratePawns">
<storeAs>settlers</storeAs>
<faction>$siteFaction</faction>
<pawnGroupKind>Peaceful</pawnGroupKind>
<pointsToUse>$pointsForSettlers</pointsToUse>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_GeneratePawns">
<storeAs>raiders</storeAs>
<faction>$enemyFaction</faction>
<pawnGroupKind>Combat</pawnGroupKind>
<pointsToUse>$points</pointsToUse>
</li>
<li Class="FCP.Core.RadiantQuests.QuestNode_SpawnSettlers">
<inSignal>site.MapGenerated</inSignal>
<pawns>$settlers</pawns>
<radius>20</radius>
</li>
<li Class="QuestNode_GetRandomInRangeFloat">
<storeAs>chanceForInstant</storeAs>
<range>0~1</range>
</li>
<li Class="QuestNode_GreaterOrEqual">
<value1>$chanceForInstant</value1>
<!--If value1 >= value2, spawn raid instantly, otherwise with delay-->
<value2>0.75</value2>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="FCP.Core.RadiantQuests.QuestNode_SpawnRaiders">
<inSignal>site.MapGenerated</inSignal>
<spawnOnEdge>false</spawnOnEdge>
<pawns>$raiders</pawns>
<radius>20</radius>
</li>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelSettlerAidRaidInProgress">Raiders attacking settlement!</label>
<text TKey="LetterTextSettlerAidRaidInProgress">The wasteland scum have already begun their assault! The settlement's defenders are fighting for their lives - get in there and help them drive off these raiders!</text>
<letterDef>ThreatBig</letterDef>
<lookTargets>$raiders</lookTargets>
<filterDeadPawnsFromLookTargets>true</filterDeadPawnsFromLookTargets>
</li>
</nodes>
</node>
<elseNode Class="QuestNode_Delay">
<!--1 - 12 hours delay-->
<delayTicks>$(randInt(2500,30000))</delayTicks>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="FCP.Core.RadiantQuests.QuestNode_SpawnRaiders">
<spawnOnEdge>true</spawnOnEdge>
<pawns>$raiders</pawns>
<radius>20</radius>
</li>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelSettlerAidRaidDelayed">Raider assault incoming!</label>
<text TKey="LetterTextSettlerAidRaidDelayed">The raider warband has arrived at the settlement perimeter! Shots fired - the attack has begun!</text>
<letterDef>ThreatBig</letterDef>
<lookTargets>$raiders</lookTargets>
<filterDeadPawnsFromLookTargets>true</filterDeadPawnsFromLookTargets>
</li>
</nodes>
</node>
</elseNode>
</li>
<li Class="QuestNode_Delay">
<delayTicks>60000</delayTicks>
<isQuestTimeout>true</isQuestTimeout>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_AnyPawnAlive">
<pawns>$settlers</pawns>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_GiveRewards">
<parms>
<allowGoodwill>true</allowGoodwill>
<allowRoyalFavor>true</allowRoyalFavor>
<chosenPawnSignal>ChosenPawnForReward</chosenPawnSignal>
</parms>
<addCampLootReward>false</addCampLootReward>
<customLetterLabel TKey="LetterLabelPaymentArrived">Settlement defense successful</customLetterLabel>
<customLetterText TKey="LetterTextPaymentArrived">The raiders have been driven off and the settlement stands! The grateful survivors are pooling together what they can spare as payment for your heroic defense of their home.</customLetterText>
<nodeIfChosenPawnSignalUsed Class="QuestNode_Letter">
<letterDef>ChoosePawn</letterDef>
<label TKey="LetterLabelFavorReceiver">[asker_faction_royalFavorLabel]</label>
<text TKey="LetterTextFavorReceiver">These colonists participated in the victory for the quest [resolvedQuestName]. [asker_definite] wants to know who should receive the [royalFavorReward_amount] [asker_faction_royalFavorLabel] for this service.</text>
<useColonistsOnMap>$site</useColonistsOnMap>
<chosenPawnSignal>ChosenPawnForReward</chosenPawnSignal>
</nodeIfChosenPawnSignalUsed>
</li>
<li Class="QuestNode_End">
<outcome>Success</outcome>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelSettlerAidEndFailure">Settlement overrun</label>
<letterDef>NegativeEvent</letterDef>
<text TKey="LetterTextSettlerAidEndFailure">The raiders have overwhelmed the settlement's defenses. Smoke rises from the ruins as the survivors flee into the wasteland. Your mission has failed.</text>
</li>
<li Class="QuestNode_End">
<outcome>Fail</outcome>
<goodwillChangeAmount>-5</goodwillChangeAmount>
<goodwillChangeFactionOf>$asker</goodwillChangeFactionOf>
<!--<goodwillChangeReason>QuestPawnLost</goodwillChangeReason> Needs to be settlement lost-->
</li>
</nodes>
</node>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_WorldObjectTimeout">
<worldObject>$site</worldObject>
<isQuestTimeout>true</isQuestTimeout>
<delayTicks>$(randInt(12,28)*60000)</delayTicks>
<inSignalDisable>site.MapGenerated</inSignalDisable>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelSettlerAidExpired">Settlement lost to raiders</label>
<text TKey="LetterTextSettlerAidExpired">Without assistance, the settlement fell to the raider assault. Another light in the wasteland has been extinguished. The quest [resolvedQuestName] has failed.</text>
</li>
<li Class="QuestNode_End">
<outcome>Fail</outcome>
<goodwillChangeAmount>-5</goodwillChangeAmount>
<goodwillChangeFactionOf>$asker</goodwillChangeFactionOf>
<!--<goodwillChangeReason>QuestPawnLost</goodwillChangeReason> Needs to be settlement lost-->
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_Signal">
<inSignal>site.Destroyed</inSignal>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelSettlerAidFailedLeft">Settlement abandoned to raiders</label>
<text TKey="LetterTextSettlerAidFailedLeft">By leaving the settlement undefended, you've sealed its fate. The raiders have claimed another victory in the wasteland.</text>
</li>
<li Class="QuestNode_End">
<outcome>Fail</outcome>
<goodwillChangeAmount>-5</goodwillChangeAmount>
<goodwillChangeFactionOf>$asker</goodwillChangeFactionOf>
<!--<goodwillChangeReason>QuestPawnLost</goodwillChangeReason> Needs to be settlement lost-->
</li>
</nodes>
</node>
</li>
</nodes>
</root>
</QuestScriptDef>
</Defs>