1
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1627 lines
65 KiB

Scriptname CWCampaignScript extends Quest Conditional
;#POINTER TO GLOBAL SHOW DEBUG TRACES
GlobalVariable property debugOn auto conditional ;0 = unset, 1 = set - show warnings
{Pointer to Global CWDebugOn, used to toggle campaign start message}
int property initCampaign auto conditional hidden ;0 = unset, 1 = running through initialization quest stages, -1 = finished
int property costPatrol auto conditional hidden
int property ownerPatrol1 auto conditional hidden
int property ownerPatrol2 auto conditional hidden
int property ownerPatrol3 auto conditional hidden
int property ownerPatrol4 auto conditional hidden
int property ownerPatrol5 auto conditional hidden
;What type each each offered mission? Used to flavor initial dialog when Field Officer is offering player missions
int property Mission1Type auto conditional hidden
int property Mission2Type auto conditional hidden
int property Mission3Type auto conditional hidden
;0 = un/reset
;100 = Tutorial / Ambush
;1 = attack settlement
;2 = sabotage resource
;3 = intercept courier
;4 = rescue soldier from fort prison
;5 = assassinate enemy field co
;6 = turn coats
;7 = blackmail steward
;8 - recruit a giant
;9 = steal plans
;10 - recruit a warrior ally
;11 - recruit orc ally
;200 - Fort Siege
;N = TBD
;*** Below is for debugging what is changing the properties in script -- note, this will break conditions functions, but I'm leaving it here for future reference.
;int __Mission1Type
;int property Mission1Type
; int function get()
; return __Mission1Type
; endFunction
; function set(int value)
; ; debug.tracestack("CWCampaignScript Mission1Type being set to: " + value)
; __Mission1Type = value
; endFunction
;endProperty
;int __Mission2Type
;int property Mission2Type
; int function get()
; return __Mission2Type
; endFunction
; function set(int value)
; ; debug.tracestack("CWCampaignScript Mission2Type being set to: " + value)
; __Mission2Type = value
; endFunction
;endProperty
int Property ResolutionMissionType Auto Conditional Hidden
;1 = Attack Minor Hold Capital
;2 = Defend Minor Hold Capital
;3 = Attack Major Hold Capital
;4 = Defend Major Hold Capital
int property acceptedHooks auto conditional hidden ;0 = un/reset, 1 = player has heard the opening mission hooks (unlocks mission topics)
int property acceptedMission auto conditional hidden ;0 = un/reset, 1 = player has accepted a mission (suppresses other mission topics)
int Property acceptedTutorialHooks Auto Conditional Hidden ;0 = un/reset, 1 = player has heard the opening mission hooks (unlocks mission topics)
int property resolutionPhase auto conditional hidden ; N = at what CWCampaignPhase are we considered to be in the "resolution" phase, meaning the final mission (which can also resolve offscreen if player is absent)
;Reminder: GLOBAL CWCampaignPhase is the current phase
int property resolveOffscreen auto conditional hidden ;0 = un/reset, 1 = waiting for CW to resolve offscreen and set this quest's stage 255 to stop it
int Property currentAttackDelta auto Conditional Hidden
int attackDeltaMissionBonus ; this variable holds bonus attack delta points earned by completing certain CWMission quests -- see Add/SetAttackDeltaMissionBonus()
;"timer" variables
float property acceptDays auto conditional hidden ;(set in stage 1) How many days we allow the player to accept a mission before advancing the phase without him
float property nextPhaseDay auto conditional hidden ;At start of each phase, GameDaysPassed + acceptDays, after which we advance the phase
float property missionDays auto conditional hidden ;(set in stage 1) How many days we allow the player to complete an accepted mission before we consider it a failure
int property failedMission auto conditional hidden ;0 = unset, -N = player got dialog about failing mission, N = player just failed a mission of the numeric Mission type and should get dialogue about it (see comment under property "Mission1Type" above
int property completedMission auto conditional hidden ;0 = unset, -N player got dialog about completing mission, N = player just completed a mission of the numeric Mission type and should get dialgoue about it (see comment under property "Mission1Type" above
int Property MissionAcceptancePollWait auto Hidden ;How long to wait between ticks to poll for MissionAcceptance (see PollForMissionAcceptance())
int Property AttackDeltaBonusForKillingCapitalGarrison auto hidden ;how many points to add to the AttackDelta if the player killed all the guards in the capital location
Float Property AttackDeltaGarrisonValueModifierForDestroyingResource auto Hidden ;A multiplier to a garrison's cost when turning that garrison into a CurrentAttackDelta points... when the player destroys a resource, the garrison should contribute less to the attack delta. This is the multiplier that reflects that. Set in OnInit()
;## Quests ##
Quest Property CW Auto
{Pointer to CW Quest}
Quest Property CWMission00 Auto
Quest Property CWSiege Auto
{Pointer to CWSiegeScript on CWSiege}
;## Aliases ##
;Pointers to CWCampaign Aliases:
ReferenceAlias Property CampaignStartMarker auto
ReferenceAlias property Rikke Auto
ReferenceAlias property Galmar Auto
ReferenceAlias property GenericFieldCOImperial Auto
ReferenceAlias property GenericFieldCOSons Auto
ReferenceAlias property FieldCO Auto ;Actual field officer for player's faction (Rikke, or Galmar)
ReferenceAlias property EnemyFieldCO Auto ;Actual field officer for player's enemy (Generic Field Commander Imperial / Sons)
LocationAlias Property Hold Auto
LocationAlias Property Garrison1 Auto
LocationAlias Property Garrison2 Auto
LocationAlias Property Garrison3 Auto
LocationAlias Property Garrison4 Auto
ReferenceAlias Property Garrison1ResourceObject Auto
ReferenceAlias Property Garrison2ResourceObject Auto
ReferenceAlias Property Garrison3ResourceObject Auto
ReferenceAlias Property Garrison4ResourceObject Auto
LocationAlias Property Fort Auto
LocationAlias Property GarrisonDefenderOnly1 Auto
LocationAlias Property GarrisonDefenderOnly2 Auto
LocationAlias Property GarrisonDefenderOnly3 Auto
LocationAlias Property GarrisonDefenderOnly4 Auto
LocationAlias Property GarrisonDefenderOnly5 Auto
LocationAlias Property GarrisonDefenderOnly6 Auto
ReferenceAlias Property GarrisonDefenderOnly1ResourceObject Auto
ReferenceAlias Property GarrisonDefenderOnly2ResourceObject Auto
ReferenceAlias Property GarrisonDefenderOnly3ResourceObject Auto
ReferenceAlias Property GarrisonDefenderOnly4ResourceObject Auto
LocationAlias Property Capital Auto
LocationAlias Property CapitalHQ Auto
LocationAlias Property CampImperial Auto
LocationAlias Property CampSons Auto
LocationAlias Property FieldHQ Auto
LocationAlias Property EnemyFieldHQ Auto
ReferenceAlias Property CampEnableImperial Auto
ReferenceAlias Property CampEnableSons Auto
ReferenceAlias Property CampImperialLocationCenterMarker Auto
ReferenceAlias Property CampSonsLocationCenterMarker Auto
ReferenceAlias Property CapitalHQMarker Auto
LocationAlias Property Patrols Auto
ReferenceAlias Property PatrolsDefaultEnableImperial Auto
ReferenceAlias Property PatrolsDefaultEnableSons Auto
ReferenceAlias Property PatrolsEnableImperial1 Auto
ReferenceAlias Property PatrolsEnableImperial2 Auto
ReferenceAlias Property PatrolsEnableImperial3 Auto
ReferenceAlias Property PatrolsEnableImperial4 Auto
ReferenceAlias Property PatrolsEnableImperial5 Auto
ReferenceAlias Property PatrolsEnableSons1 Auto
ReferenceAlias Property PatrolsEnableSons2 Auto
ReferenceAlias Property PatrolsEnableSons3 Auto
ReferenceAlias Property PatrolsEnableSons4 Auto
ReferenceAlias Property PatrolsEnableSons5 Auto
;# EXTERNAL aliases:
;CWCampaignObj Aliases:
ReferenceAlias Property CWCampaignObjFieldCO Auto
ReferenceAlias Property CWCampaignObjFactionLeader Auto
ReferenceAlias Property CWCampaignObjCampaignStartMarker Auto
LocationAlias Property CWCampaignObjCampaignHold Auto
;## Globals ##
GlobalVariable Property GameDaysPassed Auto
GlobalVariable Property CWCampaignPhase Auto
GlobalVariable Property ResourceDestroyedAtStage Auto
GlobalVariable Property CWDebugSkipPurchase Auto ;if == 1, skips purchaing garrisons
;## Keywords ##
Keyword Property CWOwner Auto
Keyword Property CWCost Auto
Keyword Property CWPurchasedByAttacker Auto
Keyword Property CWMissionStart Auto
Keyword Property CWResolution01Start Auto ;attack settlement capital resolution mission
Keyword Property CWResolution02Start Auto ;defend settlement capital resolution mission
Keyword Property CWMissionTutorialStart Auto
Keyword Property CWSiegeStart Auto ;used to start siege attack and defend quests for cities
Keyword Property LocTypeCity Auto
Keyword Property LocTypeHabitation Auto
;## Location Ref Types ##
LocationRefType Property CWSoldier Auto
LocationRefType Property CWPatrolDefault Auto
LocationRefType Property CWPatrol1 Auto
LocationRefType Property CWPatrol2 Auto
LocationRefType Property CWPatrol3 Auto
LocationRefType Property CWPatrol4 Auto
LocationRefType Property CWPatrol5 Auto
;## Object References ##
ObjectReference Property CWMission1Ref Auto ;Passed in to SendStoryEvent when generating mission quests as a way to identify which mission #
ObjectReference Property CWMission2Ref Auto ;Passed in to SendStoryEvent when generating mission quests as a way to identify which mission #
ObjectReference Property CWMission3Ref Auto ;Passed in to SendStoryEvent when generating mission quests as a way to identify which mission #
;## Activators ##
;*** !! *** !! *** !! these are now just forms, and will be set with Game.GetForm(HEX ID) function rather than being pointed at in the editor. As soon as we get Activator objects in Papyrus, this need to change to point directly at the activators
Form Property ResourceObjectFarm auto ;*** !!! TEMPORARILY SET IN OnInit() event using GetForm().... REMOVE THAT FROM THE OnInit() event
Form Property ResourceObjectMill auto ;*** !!! TEMPORARILY SET IN OnInit() event using GetForm().... REMOVE THAT FROM THE OnInit() event
Form Property ResourceObjectMine auto ;*** !!! TEMPORARILY SET IN OnInit() event using GetForm().... REMOVE THAT FROM THE OnInit() event
;## Scripts ##
;These will be assigned in the OnInit() block
CWScript Property CWs Auto hidden
;# SetOwner() Location Variables -- these should be arrays, consider converting when we get arrays implemented in the language
;Variables for holding locations that are purchased so we can pass them all to CWScript SetOwner()
Location PurchasedLocationImperial1
Location PurchasedLocationImperial2
Location PurchasedLocationImperial3
Location PurchasedLocationImperial4
Location PurchasedLocationImperial5
Location PurchasedLocationImperial6
Location PurchasedLocationImperial7
Location PurchasedLocationImperial8
Location PurchasedLocationImperial9
Location PurchasedLocationImperial10
Location PurchasedLocationImperial11
Location PurchasedLocationImperial12
Location PurchasedLocationImperial13
Location PurchasedLocationImperial14
Location PurchasedLocationImperial15
Location PurchasedLocationImperial16
Location PurchasedLocationImperial17
Location PurchasedLocationImperial18
Location PurchasedLocationImperial19
Location PurchasedLocationImperial20
Location PurchasedLocationSons1
Location PurchasedLocationSons2
Location PurchasedLocationSons3
Location PurchasedLocationSons4
Location PurchasedLocationSons5
Location PurchasedLocationSons6
Location PurchasedLocationSons7
Location PurchasedLocationSons8
Location PurchasedLocationSons9
Location PurchasedLocationSons10
Location PurchasedLocationSons11
Location PurchasedLocationSons12
Location PurchasedLocationSons13
Location PurchasedLocationSons14
Location PurchasedLocationSons15
Location PurchasedLocationSons16
Location PurchasedLocationSons17
Location PurchasedLocationSons18
Location PurchasedLocationSons19
Location PurchasedLocationSons20
Location PurchasedLocationBothFactions1
Location PurchasedLocationBothFactions2
Location PurchasedLocationBothFactions3
Location PurchasedLocationBothFactions4
Location PurchasedLocationBothFactions5
Location PurchasedLocationBothFactions6
Location PurchasedLocationBothFactions7
Location PurchasedLocationBothFactions8
Event OnInit()
CWs = CW as CWScript
; CWScript.Log("CWCampaignScript", " OnInit() setting default property values.", 0, True, True)
AcceptDays = 5
MissionDays = 2
ResolutionPhase = 4
MissionAcceptancePollWait = 5 ;wait this many seconds inside the while loop in PollForMissionAcceptance() function
AttackDeltaBonusForKillingCapitalGarrison = 2
AttackDeltaGarrisonValueModifierForDestroyingResource = 0.50 ;destroying the resource object at a garrison halves it value
;*** !!! *** !!! TEMPORARY HACK UNTIL WE GET ACTIVATORS IN AS OBJECT TYPES -- these should be set in editor
ResourceObjectFarm = Game.GetForm(0X0001DA07) ;**** !!!! **** !!!!! THIS IS TEMPORARY WORK AROUND UNTIL WE GET ACTIVATOR OBJECTS IN PAPYRUS -- when that happens this property will be set in the editor in the CWCampaign quest
ResourceObjectMill = Game.GetForm(0X0001DA0C) ;**** !!!! **** !!!!! THIS IS TEMPORARY WORK AROUND UNTIL WE GET ACTIVATOR OBJECTS IN PAPYRUS -- when that happens this property will be set in the editor in the CWCampaign quest
ResourceObjectMine = Game.GetForm(0X0001DA0D) ;**** !!!! **** !!!!! THIS IS TEMPORARY WORK AROUND UNTIL WE GET ACTIVATOR OBJECTS IN PAPYRUS -- when that happens this property will be set in the editor in the CWCampaign quest
;*** !!! *** !!!
EndEvent
Function ResetCampaign()
; CWScript.Log("CWCampaignScript", " ResetCampaign() resetting property values.")
Mission1Type = 0
Mission2Type = 0
Mission3Type = 0
acceptedHooks = 0
acceptedMission = 0
completedMission = 0
failedMission = 0
ownerPatrol1 = 0
ownerPatrol2 = 0
ownerPatrol3 = 0
ownerPatrol4 = 0
ownerPatrol5 = 0
unsetPurchasedLocations()
attackDeltaMissionBonus = 0
nextPhaseDay = GameDaysPassed.value + acceptDays ;init value (note this is immediately updated again in stage 150, that's fine.)
CWCampaignPhase.value = 0 ;reset global (note this is immediately incremented to 1 by stage 150)
resolveOffscreen = 0 ;reset variable
EndFunction
Function PurchaseGarrisons()
{Depending on the CW.PurchaseDelta assign various garrisons and patrols to the attacker and defender.}
;If PurchaseDelta is > 0 it means the attackers have the advantage and can purchase additional garrisons and patrols, if the PurchaseDelta < 0 it means the defenders have the advantage and have all the garrisons and can purchase additional patrols
; CWScript.Log("CWCampaignScript", " PurchaseGarrisons() begining to purchase garrisons. Starting PurchaseDelta = " + CWs.PurchaseDelta)
if CWDebugSkipPurchase.value == 1
; CWScript.Log("CWCampaignScript", ": CWDebugSkipPurchase == 1, we are skipping call to PurchaseGarrison()", 1)
return
EndIf
unsetPurchasedLocations() ;### used with CallSetOwnerForPurchasedLocations() -- this would be easier if we had arrays
;## 4-16-2010 -- jduvall
;NOTE: Purchasing used to happen before resetting the defender only, camps, and patrols... I don't think there was any particular reason to do this, and since things go a little faster if the defender only stuff goes first because it includes the capital which takes the longest to process, I am now putting it first through the SetOwner() switchboard, it'll process its stuff while other garrisons are also being processed
;Hopefully this doesn't break anythingm if it does just but the "reset" stuff back below the "Purchased" stuff
;## -----------------------------
;"Purchased" THINGS THAT DON'T GET PURCHASED WITH ATTACK DELTA -- everything gets put in PurchasedLocationXXXn variables simulating an array -- see CallSetOwnerForPurchasedLocations()
;Reset the defender only garrisons
ResetDefenderOnlyGarrisons()
;Reset the camps
ResetCamps()
;reset the shared Patrols location
ResetPatrols()
;PURCHASE GARRISONS AND PATROLS -- everything gets put in PurchasedLocationXXXn variables simulating an array -- see CallSetOwnerForPurchasedLocations()
;Attempt to purchase garrisons
PurchaseGarrisonLocationAlias(Garrison1)
PurchaseGarrisonLocationAlias(Garrison2)
PurchaseGarrisonLocationAlias(Garrison3)
PurchaseGarrisonLocationAlias(Garrison4)
PurchaseGarrisonLocationAlias(Fort)
;Purchase additional patrols if there is any AttackDelta left: see EnablePatrols() call below
ownerPatrol1 = PurchasePatrolAndReturnNewOwner(1)
ownerPatrol2 = PurchasePatrolAndReturnNewOwner(2)
ownerPatrol3 = PurchasePatrolAndReturnNewOwner(3)
ownerPatrol4 = PurchasePatrolAndReturnNewOwner(4)
ownerPatrol5 = PurchasePatrolAndReturnNewOwner(5)
;ENABLE THE PURCHASED PATROLS -- not these don't get passed into to SetOwner() via a PurchasedLocationXXXn variable, because these patrols are just turned on/off by toggling xmarkers, see the EnablePatrols() function below.
;Enable patrols that have been purchased by enabling the proper enable markers
EnablePatrols()
CallSetOwnerForPurchasedLocations() ;### Calls CWs.SetOwner() for each of the purchased locations -- this would be easier if we had arrays
EndFunction
Function PurchaseGarrisonLocationAlias(LocationAlias GarrisonAlias)
{Calls PurchaseGarrisonLocation() with the location of the supplied alias, if the alias isn't empty}
Location Loc = GarrisonAlias.Getlocation()
If Loc != None
PurchaseGarrisonLocation(Loc)
EndIf
EndFunction
Function PurchaseGarrisonLocation(Location GarrisonLocation)
{If attacker has enough attack points (ie a large enough positive value in CW.PurchaseDelta) award the garrison ownership to attacker and subtract Purchase Delta, otherwise award to the defender.}
int cost = GarrisonLocation.GetKeywordData(CWCost) as int
int newOwner ;1 = Imperials, 2 = Sons -- will correspond to Attacker and Defender property on CWScript attached to CW quest
If CWs.PurchaseDelta >= Cost ;award to attacker
newOwner = CWs.Attacker
CWs.PurchaseDelta = (CWs.PurchaseDelta - cost)
GarrisonLocation.SetKeywordData(CWPurchasedByAttacker, 1)
; CWScript.Log("CWCampaignScript", " PurchaseGarrison() purchasing " + GarrisonLocation + " for attacker(" + CWs.FactionName(newOwner) + ") and flagged for reset")
Else ;award to defender
newOwner = CWs.Defender
; CWScript.Log("CWCampaignScript", " PurchaseGarrison() purchasing " + GarrisonLocation + " for defender(" + CWs.FactionName(newOwner) + ") and flagged for reset")
GarrisonLocation.SetKeywordData(CWPurchasedByAttacker, 0)
;There is no cost for the defender to purchase a garrison... he owns it by default
EndIf
SetPurchasedLocation(GarrisonLocation, NewOwner)
EndFunction
Function unsetPurchasedLocations()
PurchasedLocationImperial1 = None
PurchasedLocationImperial2 = None
PurchasedLocationImperial3 = None
PurchasedLocationImperial4 = None
PurchasedLocationImperial5 = None
PurchasedLocationImperial6 = None
PurchasedLocationImperial7 = None
PurchasedLocationImperial8 = None
PurchasedLocationImperial9 = None
PurchasedLocationImperial10 = None
PurchasedLocationImperial11 = None
PurchasedLocationImperial12 = None
PurchasedLocationImperial13 = None
PurchasedLocationImperial14 = None
PurchasedLocationImperial15 = None
PurchasedLocationImperial16 = None
PurchasedLocationImperial17 = None
PurchasedLocationImperial18 = None
PurchasedLocationImperial19 = None
PurchasedLocationImperial20 = None
PurchasedLocationSons1 = None
PurchasedLocationSons2 = None
PurchasedLocationSons3 = None
PurchasedLocationSons4 = None
PurchasedLocationSons5 = None
PurchasedLocationSons6 = None
PurchasedLocationSons7 = None
PurchasedLocationSons8 = None
PurchasedLocationSons9 = None
PurchasedLocationSons10 = None
PurchasedLocationSons11 = None
PurchasedLocationSons12 = None
PurchasedLocationSons13 = None
PurchasedLocationSons14 = None
PurchasedLocationSons15 = None
PurchasedLocationSons16 = None
PurchasedLocationSons17 = None
PurchasedLocationSons18 = None
PurchasedLocationSons19 = None
PurchasedLocationSons20 = None
PurchasedLocationBothFactions1 = None
PurchasedLocationBothFactions2 = None
PurchasedLocationBothFactions3 = None
PurchasedLocationBothFactions4 = None
PurchasedLocationBothFactions5 = None
PurchasedLocationBothFactions6 = None
PurchasedLocationBothFactions7 = None
PurchasedLocationBothFactions8 = None
EndFunction
Function SetPurchasedLocation(Location LocationThatWasPurchased, int OwningFaction)
; CWScript.Log("CWCampaignScript", " SetPurchasedLocation() LocationThatWasPurchased: " + LocationThatWasPurchased + ", OwningFaction:(" + OwningFaction + ")")
if owningFaction == CWs.iImperials
if !PurchasedLocationImperial1
PurchasedLocationImperial1 = LocationThatWasPurchased
elseif !PurchasedLocationImperial2
PurchasedLocationImperial2 = LocationThatWasPurchased
elseif !PurchasedLocationImperial3
PurchasedLocationImperial3 = LocationThatWasPurchased
elseif !PurchasedLocationImperial4
PurchasedLocationImperial4 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial5
PurchasedLocationImperial5 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial6
PurchasedLocationImperial6 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial7
PurchasedLocationImperial7 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial8
PurchasedLocationImperial8 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial9
PurchasedLocationImperial9 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial10
PurchasedLocationImperial10 = LocationThatWasPurchased
Elseif !PurchasedLocationImperial11
PurchasedLocationImperial11 = LocationThatWasPurchased
elseif !PurchasedLocationImperial12
PurchasedLocationImperial12 = LocationThatWasPurchased
elseif !PurchasedLocationImperial13
PurchasedLocationImperial13 = LocationThatWasPurchased
elseif !PurchasedLocationImperial14
PurchasedLocationImperial14 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial15
PurchasedLocationImperial15 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial16
PurchasedLocationImperial16 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial17
PurchasedLocationImperial17 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial18
PurchasedLocationImperial18 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial19
PurchasedLocationImperial19 = LocationThatWasPurchased
ElseIf !PurchasedLocationImperial20
PurchasedLocationImperial20 = LocationThatWasPurchased
Else
; CWScript.Log("CWCampaignScript", " ERROR!!! SetPurchasedLocation() ran out of PurchaseLocationXXXn variables. LocationThatWasPurchased: " + LocationThatWasPurchased + ", OwningFaction: " + OwningFaction, 2 )
EndIf
elseif owningFaction == CWs.iSons
if !PurchasedLocationSons1
PurchasedLocationSons1 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons2
PurchasedLocationSons2 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons3
PurchasedLocationSons3 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons4
PurchasedLocationSons4 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons5
PurchasedLocationSons5 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons6
PurchasedLocationSons6 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons7
PurchasedLocationSons7 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons8
PurchasedLocationSons8 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons9
PurchasedLocationSons9 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons10
PurchasedLocationSons10 = LocationThatWasPurchased
Elseif !PurchasedLocationSons11
PurchasedLocationSons11 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons12
PurchasedLocationSons12 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons13
PurchasedLocationSons13 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons14
PurchasedLocationSons14 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons15
PurchasedLocationSons15 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons16
PurchasedLocationSons16 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons17
PurchasedLocationSons17 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons18
PurchasedLocationSons18 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons19
PurchasedLocationSons19 = LocationThatWasPurchased
ElseIf !PurchasedLocationSons20
PurchasedLocationSons20 = LocationThatWasPurchased
Else
; CWScript.Log("CWCampaignScript", " ERROR!!! SetPurchasedLocation() ran out of PurchaseLocationXXXn variables. LocationThatWasPurchased: " + LocationThatWasPurchased + ", OwningFaction: " + OwningFaction, 2 )
EndIf
ElseIf owningFaction == CWs.iBothFactions
if !PurchasedLocationBothFactions1
PurchasedLocationBothFactions1 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions2
PurchasedLocationBothFactions2 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions3
PurchasedLocationBothFactions3 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions4
PurchasedLocationBothFactions4 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions5
PurchasedLocationBothFactions5 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions6
PurchasedLocationBothFactions6 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions7
PurchasedLocationBothFactions7 = LocationThatWasPurchased
ElseIf !PurchasedLocationBothFactions8
PurchasedLocationBothFactions8 = LocationThatWasPurchased
Else
; CWScript.Log("CWCampaignScript", " ERROR!!! SetPurchasedLocation() ran out of PurchaseLocationXXXn variables. LocationThatWasPurchased: " + LocationThatWasPurchased + ", OwningFaction: " + OwningFaction, 2 )
EndIf
Else
; CWScript.Log("CWCampaignScript", " ERROR!!! SetPurchasedLocation() Recieved an unexpected value for OwningFaction. Expected 1, 2 or 3, got:" + OwningFaction, 2 )
EndIf
EndFunction
Function CallSetOwnerForPurchasedLocations()
;SetOwner() takes a max of 8 locations, so we call it until we are done with all the locations in our "arrays"
;setOwner for Imperial garrisons
if PurchasedLocationImperial1
CWs.setOwner(PurchasedLocationImperial1, CWs.iImperials, PurchasedLocationImperial2, PurchasedLocationImperial3, PurchasedLocationImperial4, PurchasedLocationImperial5, PurchasedLocationImperial6, PurchasedLocationImperial7, PurchasedLocationImperial8)
EndIf
if PurchasedLocationImperial9
CWs.setOwner(PurchasedLocationImperial9, CWs.iImperials, PurchasedLocationImperial10, PurchasedLocationImperial11, PurchasedLocationImperial12, PurchasedLocationImperial13, PurchasedLocationImperial14, PurchasedLocationImperial15, PurchasedLocationImperial16)
EndIf
if PurchasedLocationImperial17
CWs.setOwner(PurchasedLocationImperial17, CWs.iImperials, PurchasedLocationImperial18, PurchasedLocationImperial19, PurchasedLocationImperial20)
EndIf
;setOwner for Sons garrisons
if PurchasedLocationSons1
CWs.setOwner(PurchasedLocationSons1, CWs.iSons, PurchasedLocationSons2, PurchasedLocationSons3, PurchasedLocationSons4, PurchasedLocationSons5, PurchasedLocationSons6, PurchasedLocationSons7, PurchasedLocationSons8)
EndIf
if PurchasedLocationSons9
CWs.setOwner(PurchasedLocationSons9, CWs.iSons, PurchasedLocationSons10, PurchasedLocationSons11, PurchasedLocationSons12, PurchasedLocationSons13, PurchasedLocationSons14, PurchasedLocationSons15, PurchasedLocationSons16)
EndIf
if PurchasedLocationSons17
CWs.setOwner(PurchasedLocationSons17, CWs.iSons, PurchasedLocationSons18, PurchasedLocationSons19, PurchasedLocationSons20)
EndIf
;setOwner for garrisons owned by both (the one patrol location)
if PurchasedLocationBothFactions1
CWs.setOwner(PurchasedLocationBothFactions1, CWs.iBothFactions, PurchasedLocationBothFactions2, PurchasedLocationBothFactions3, PurchasedLocationBothFactions4, PurchasedLocationBothFactions5, PurchasedLocationBothFactions6, PurchasedLocationBothFactions7, PurchasedLocationBothFactions8)
EndIf
EndFunction
Function ResetDefenderOnlyGarrisons()
; CWScript.Log("CWCampaignScript", " ResetDefenderOnlyGarrisons() 'purchasing' aliases Captial & GarrisonDefenderOnly1-6 (if not empty)")
ResetDefenderOnlyGarrison(1)
ResetDefenderOnlyGarrison(2)
ResetDefenderOnlyGarrison(3)
ResetDefenderOnlyGarrison(4)
ResetDefenderOnlyGarrison(5)
ResetDefenderOnlyGarrison(6)
; CWScript.Log("CWCampaignScript", " ResetDefenderOnlyGarrisons() calling SetPurchasedLocation() for Capital" + Capital.GetLocation() + " to be owned by defender(" + CWs.FactionName(CWs.Defender) + ").")
SetPurchasedLocation(Capital.GetLocation(), CWs.Defender)
EndFunction
Function ResetDefenderOnlyGarrison(Int GarrisonToReset)
{Calls ReturnLocationForDefenderOnlyGarrison and (if not None) sets the CWOwner keyword data on the location to be -Defender.}
Location Garrison = ReturnLocationForDefenderOnlyGarrison(GarrisonToReset)
if Garrison != None
; CWScript.Log("CWCampaignScript", " ResetDefenderOnlyGarrisons() calling SetPurchasedLocation() for GarrisonDefenderOnly" + GarrisonToReset + " to be owned by defender(" + CWs.FactionName(CWs.Defender) + ").")
SetPurchasedLocation(Garrison, CWs.Defender)
Else
;Do nothing
EndIf
EndFunction
location Function ReturnLocationForDefenderOnlyGarrison(int GarrisonToGet)
{Refturns the Location of the GarrisonDefenderOnlyX location alias corresponding to the supplied Int}
if GarrisonToGet == 1
return GarrisonDefenderOnly1.Getlocation()
elseif GarrisonToGet == 2
return GarrisonDefenderOnly2.Getlocation()
elseif GarrisonToGet == 3
return GarrisonDefenderOnly3.Getlocation()
elseif GarrisonToGet == 4
return GarrisonDefenderOnly4.Getlocation()
elseif GarrisonToGet == 5
return GarrisonDefenderOnly5.Getlocation()
elseif GarrisonToGet == 6
return GarrisonDefenderOnly6.Getlocation()
else
EndIf
EndFunction
Function ResetCamps()
{Sets keyword data CWOwner on CampImperial and CampSons location aliases to cause them to reset}
if CWs.iImperials == CWs.Attacker
; CWScript.Log("CWCampaignScript", " ResetCamps() calling SetPurchasedLocation() for CampImperial locaion alias.")
SetPurchasedLocation(CampImperial.GetLocation(), CWs.iImperials)
; CWScript.Log("CWCampaignScript", " ResetCamps() disabling CampEnableSons.")
CampEnableSons.GetReference().disable()
Else ;Sons are attacking
; CWScript.Log("CWCampaignScript", " ResetCamps() calling SetPurchasedLocation() CampSons locaion alias.")
SetPurchasedLocation(CampSons.GetLocation(), CWs.iSons)
; CWScript.Log("CWCampaignScript", " ResetCamps() disabling CampEnableImperial.")
CampEnableImperial.GetReference().disable()
endif
EndFunction
int Function PurchasePatrolAndReturnNewOwner(int WhichPatrolToPurchase)
{Returns an int corresponding to faction that should own. If there is enough remaining positive or negative points in PurchaseDelta, purchase a patrol for the attacker (if positive) or defender (if negative)}
int cost = CWs.iCostPatrol
int newOwner ;1 = Imperials, 2 = Sons -- will correspond to Attacker and Defender property on CWScript attached to CW quest
If CWs.PurchaseDelta >= Cost ;award to attacker, decrease the PurchaseDelta toward 0
newOwner = CWs.Attacker
CWs.PurchaseDelta = (CWs.PurchaseDelta - cost)
; CWScript.Log("CWCampaignScript", " PurchasePatrolAndReturnNewOwner() purchasing Patrol" + WhichPatrolToPurchase + " for Attacker (" + CWs.FactionName(NewOwner) + ") New PurchaseDelta =" + CWs.PurchaseDelta)
Elseif -(CWs.PurchaseDelta) <= -(Cost) ;award to defender, increase the PurchaseDelta toward 0
newOwner = CWs.Defender
CWs.PurchaseDelta = (CWs.PurchaseDelta + cost)
; CWScript.Log("CWCampaignScript", " PurchasePatrolAndReturnNewOwner() purchasing Patrol" + WhichPatrolToPurchase + " for Defender (" + CWs.FactionName(NewOwner) + ") New PurchaseDelta =" + CWs.PurchaseDelta)
Else ;award to no one
newOwner = 0
; CWScript.Log("CWCampaignScript", " PurchasePatrolAndReturnNewOwner() not purchasing Patrol" + WhichPatrolToPurchase + " for anyone. Not enough PurchaseDelta: " + CWs.PurchaseDelta)
EndIf
return newOwner
EndFunction
Function ResetPatrols()
; CWScript.Log("CWCampaignScript", " ResetPatrols() calling SetPurchasedLocation(" + Patrols.GetLocation() + ") with owner = 3 (both factions own patrols location).")
SetPurchasedLocation(Patrols.GetLocation(), CWs.iBothFactions) ;this causes the garrison to reset/change hands, lives in CWScript
EndFunction
Function EnablePatrols()
EnableDefaultPatrols()
EnablePatrol(1)
EnablePatrol(2)
EnablePatrol(3)
EnablePatrol(4)
EnablePatrol(5)
EndFunction
Function EnableDefaultPatrols()
PatrolsDefaultEnableImperial.GetReference().Enable()
PatrolsDefaultEnableSons.GetReference().Enable()
; CWScript.Log("CWCampaignScript", " EnableDefaultPatrols() enabling ReferenceAliases PatrolsDefaultEnableImperial and PatrolsDefaultEnableSons.")
EndFunction
Function EnablePatrol(int WhichPatrolToEnable)
{Calls GetEnableMarkerForPatrol() for patrol supplied as an Int, and then enables it.}
ObjectReference EnableMarker
EnableMarker = GetEnableMarkerForPatrol(WhichPatrolToEnable)
If EnableMarker != None
EnableMarker.Enable()
; CWScript.Log("CWCampaignScript", " EnablePatrol() enabling " + EnableMarker)
Else
; CWScript.Log("CWCampaignScript", " EnablePatrol() not enabling the patrol #" + WhichPatrolToEnable + " for either faction. Which should mean that neither own it.")
EndIf
EndFunction
ObjectReference Function GetEnableMarkerForPatrol(int WhichPatrol)
{Returns the ObjectReference for patrol supplied as an Int}
if WhichPatrol == 1
if OwnerPatrol1 == CWs.iImperials
return PatrolsEnableImperial1.GetReference()
elseif OwnerPatrol1 == CWs.iSons
return PatrolsEnableSons1.GetReference()
else
return None
endif
elseif WhichPatrol == 2
if OwnerPatrol2 == CWs.iImperials
return PatrolsEnableImperial2.GetReference()
elseif OwnerPatrol2 == CWs.iSons
return PatrolsEnableSons2.GetReference()
else
return None
endif
elseif WhichPatrol == 3
if OwnerPatrol3 == CWs.iImperials
return PatrolsEnableImperial3.GetReference()
elseif OwnerPatrol3 == CWs.iSons
return PatrolsEnableSons3.GetReference()
else
return None
endif
elseif WhichPatrol == 4
if OwnerPatrol4 == CWs.iImperials
return PatrolsEnableImperial4.GetReference()
elseif OwnerPatrol4 == CWs.iSons
return PatrolsEnableSons4.GetReference()
else
return None
endif
elseif WhichPatrol == 5
if OwnerPatrol5 == CWs.iImperials
return PatrolsEnableImperial5.GetReference()
elseif OwnerPatrol5 == CWs.iSons
return PatrolsEnableSons5.GetReference()
else
return None
endif
Else
; CWScript.Log("CWCampaignScript", " GetEnableMarkerForPatrol() expected an Int 1-5, instead got " + WhichPatrol)
return None
EndIf
EndFunction
Function SetCWCampaignFieldCOAliases()
{Forces named field COs into FieldCO and generic enemy field COs into EnemyFieldCO, enables the EnemyFieldCO and disables the other non-used generic field CO}
if CWs.playerAllegiance == CWs.iImperials
if CWs.playerInvolved == 0
; CWScript.Log("CWCampaignScript", " SetCWCampaignFieldCOAliases() Player Allegience == 1 and PlayerInvolved == 0, so we are Forcing GenericFieldCOImperial into FieldCo, GenericFieldCOSons into EnemyFieldCO, and enabling them both.")
FieldCO.ForceRefTo(GenericFieldCOImperial.GetReference())
EnemyFieldCO.ForceRefTo(GenericFieldCOSons.GetReference())
GenericFieldCOImperial.GetReference().Enable()
EnemyFieldCO.GetReference().Enable()
Elseif CWs.playerInvolved == 1
; CWScript.Log("CWCampaignScript", " SetCWCampaignFieldCOAliases() is Forcing Rikke into FieldCo, GenericFieldCOSons into EnemyFieldCO, enabling EnemyFieldCO, and disabling GenericFieldCOImperial.")
FieldCO.ForceRefTo(Rikke.GetReference())
EnemyFieldCO.ForceRefTo(GenericFieldCOSons.GetReference())
EnemyFieldCO.GetReference().Enable()
GenericFieldCOImperial.GetReference().Disable()
Else
; CWScript.Log("CWCampaignScript", "WARNING: SetCWCampaignFieldCOAliases() expected 0 or 1 for CWScript PlayerInvolved, instead found:" + CWs.playerInvolved, 2)
EndIf
Elseif CWs.playerAllegiance == CWs.iSons
if CWs.playerInvolved == 0
; CWScript.Log("CWCampaignScript", " SetCWCampaignFieldCOAliases() playerAllegiance == 2 and PlayerInvolved == 0, so we are Forcing GenericFieldCOSons into FieldCo, GenericFieldCOImperial into EnemyFieldCO, and enabling them both.")
FieldCO.ForceRefTo(GenericFieldCOSons.GetReference())
EnemyFieldCO.ForceRefTo(GenericFieldCOImperial.GetReference())
GenericFieldCOImperial.GetReference().Enable()
EnemyFieldCO.GetReference().Enable()
Elseif CWs.playerInvolved == 1
; CWScript.Log("CWCampaignScript", " SetCWCampaignFieldCOAliases() is Forcing Galmar into FieldCo, GenericFieldCOImperial into EnemyFieldCO, enabling EnemyFieldCO, and disabling GenericFieldCOSons.")
FieldCO.ForceRefTo(Galmar.GetReference())
EnemyFieldCO.ForceRefTo(GenericFieldCOImperial.GetReference())
EnemyFieldCO.GetReference().Enable()
GenericFieldCOSons.GetReference().Disable()
Else
; CWScript.Log("CWCampaignScript", "WARNING: SetCWCampaignFieldCOAliases() expected 0 or 1 for CWScript PlayerInvolved, instead found:" + CWs.playerInvolved, 2)
EndIf
Else
; CWScript.Log("CWCampaignScript", "WARNING: SetCWCampaignFieldCOAliases expected playerAllegience to be 1 or 2, got " + CWs.playerAllegiance, 2)
EndIf
EndFunction
Function AdvanceCampaignPhase(int OptionalPhaseToSetTo = -1)
{Called when needing to advance the campaign to the next phase, and start new missions}
;* The reason for this weird if / while loop below...
;Phases advance 'automatically': mission accept timers and mission fail timers expire setting mission quest stages that call AdvanceCampaignPhase() and then shut down.
;However, this function is also called in dialogue with the FactionLeader the first time the player is joining a campaign to reset the campaign to the first phase (via passing a "1" in for the optional param)
;It's possible that while in dialogue, the campaign phase could advance automatically and the resolution happens off screen, in the middle of the FactionLeader telling us to go meet the field officer - that'd be really weird.
;We don't want him to say go join this campaign, and then immediately it fails.
;So this while loop prevents the campaign from advancing at least until after the player leaves the town with the FactionLeader in it, since the player realizes this is a dynamic system, he'll hopefully forgive that weirdness if the campaign ends soon after leaving.
;If the campaign is starting fresh (ie the CWCampaignPhase is 0) we don't care if the player is standing right in front of the FactionLeader, otherwise we'd never get start the campaign if the player hangs out in the same town with FactionLeader
;* See rationale for this above
if CWCampaignPhase.value != 0 && OptionalPhaseToSetTo == -1 ;ie the default call, not when it's called in dialogue with the faction leader the first time the player is joining a campaign in the civil war
while CWs.AliasFactionLeader.GetReference().getCurrentLocation().IsSameLocation(Game.GetPlayer().getCurrentLocation(), LocTypeHabitation)
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() WAITING -PLAYER NEARBY: in a while loop wait until after player and Faction leader aren't in the same LocTypeHabitation location.", 1)
;*** !!! *** IF WE EVER GET A WAIT MENU, THEN WE NEED TO NOT CARE IF THE PLAYER IS IN THE SAME LOCATION IF HE IS ALSO WAITING
utility.wait(10)
EndWhile
EndIf
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() running.")
if OptionalPhaseToSetTo > 0
CWCampaignPhase.value = OptionalPhaseToSetTo
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() forced CWCampaignPhase global to " + CWCampaignPhase.value )
Else
;Increment the phase
CWCampaignPhase.value += 1
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() incremented CWCampaignPhase global to " + CWCampaignPhase.value )
EndIf
if CWs.debugStartingCampaignPhase != 0 && CWCampaignPhase.value < CWs.debugStartingCampaignPhase
CWCampaignPhase.value = CWs.debugStartingCampaignPhase
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() forcing CWCampaignPhase to debugStartingCampaignPhase " + CWCampaignPhase.value )
EndIf
if DebugOn.value == 1
debug.Notification("CWCampaignPhase: " + CWCampaignPhase.value)
EndIf
;Increment the NextPhaseDay
NextPhaseDay = GameDaysPassed.value + AcceptDays
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() set CWCampaignPhase NextPhaseDay to " + NextPhaseDay + " ( = GameDaysPassed(" + GameDaysPassed.value + ") AcceptDays(" + AcceptDays + ")." )
;Reset Mission tracking properties
Mission1Type = 0
Mission2Type = 0
Mission3Type = 0
AcceptedHooks = 0
AcceptedMission = 0
;set current attack delta
SetCurrentAttackDelta()
;Start missions:
StartMissions()
if DebugOn.value == 1
debug.MessageBox("CWCampaignScript: Ready to start campaign.")
EndIf
EndFunction
Function StartResolutionMission()
{Starts the proper resolution mission, checking if the Capital is a city or not, and whether the player should be attacking or defending.}
;start an Attack the Capital Settlement resolution quest
;createEvent CWResolution01Start zBogusLocation FieldCO CampaignStartMarker
;start a Defend the Capital Settlement resolution quest
;createEvent CWResolution02Start zBogusLocation FieldCO CampaignStartMarker
If Capital.GetLocation().HasKeyword(LocTypeCity) && CWs.debugTreatCityCapitalsAsTowns == 0 ;capital is a city (note the debugTreatCityCapitalsAsTowns)
CWSiegeStart.SendStoryEvent(Capital.GetLocation()) ;the story manager handles checking the location, the player's allegiance and who is attacking to start the quests
; if Capital.GetLocation() == CWs.WhiterunLocation ;ADD || OTHER CITY HERE
; ; CWScript.Log("CWCampaignScript", " StartResolutionMission() starting attack on Whiterun.")
; CWSiegeStart.SendStoryEvent(Capital.GetLocation()) ;the story manager handles checking the location, the player's allegiance and who is attacking to start the quests
;
; Else ;SOME OTHER NOT YET IMPLEMENTED CITY
; ; CWScript.Log("CWCampaignScript", " StartResolutionMission() needs to start an Attack on a Capital CITY. Will RESOLVE OFFSCREEN.")
; debug.MessageBox("CWCampaignScript StartResolutionMission() needs to start an Attack on a Capital CITY. RESOLVE OFFSCREEN.")
; CWs.ResolveOffscreen(GetCurrentAttackDelta())
;
; EndIf
Else ;capital is not a city
if CWs.playerAllegiance == CWs.Attacker
;start an Attack the Capital Settlement resolution quest
; CWScript.Log("CWCampaignScript", " StartResolutionMission() starting Resolution01 for " + Capital.Getlocation())
CWResolution01Start.SendStoryEvent(Capital.Getlocation(), FieldCO.GetReference(), CampaignStartMarker.GetReference())
Else
;start an Defend the Capital Settlement resolution quest
; CWScript.Log("CWCampaignScript", " StartResolutionMission() starting Resolution02 for " + Capital.Getlocation())
CWResolution02Start.SendStoryEvent(Capital.Getlocation(), FieldCO.GetReference(), CampaignStartMarker.GetReference())
EndIf
EndIf
EndFunction
function setCurrentAttackDelta()
CurrentAttackDelta = GetCurrentAttackDelta()
EndFunction
int Function GetCurrentAttackDelta()
{Returns the current Attack Delta based on situation affected by players actions on the ground. Garrisons don't provide points if all the soldiers are dead, or half points if a resource object is destroyed, plus any misc modifiers for doing special missions.}
float myCurrentAttackDelta
; CWScript.Log("CWCampaignScript", " GetmyCurrentAttackDelta() is running.")
;Get points for capital garrison
myCurrentAttackDelta += GetAttackDeltaPointsForCapital(Capital.GetLocation())
;Get points for garrisons and their resource objects --- Detailed note about resource objects: A garrison may have more than one resource object in it... we are only testing against the one that filled the alias. Effectively this means the player must get lucky, or destroy all of the resources to get the bonus. This shouldn't matter greatly.
myCurrentAttackDelta += GetAttackDeltaPointsForDefenderOnlyGarrison(GarrisonDefenderOnly1.GetLocation(), GarrisonDefenderOnly1ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForDefenderOnlyGarrison(GarrisonDefenderOnly2.GetLocation(), GarrisonDefenderOnly2ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForDefenderOnlyGarrison(GarrisonDefenderOnly3.GetLocation(), GarrisonDefenderOnly3ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForDefenderOnlyGarrison(GarrisonDefenderOnly4.GetLocation(), GarrisonDefenderOnly4ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForGarrison(Garrison1.GetLocation(), Garrison1ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForGarrison(Garrison2.GetLocation(), Garrison2ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForGarrison(Garrison3.GetLocation(), Garrison3ResourceObject.GetReference())
myCurrentAttackDelta += GetAttackDeltaPointsForGarrison(Garrison4.GetLocation(), Garrison4ResourceObject.GetReference())
;Get points for Patrols
myCurrentAttackDelta += GetAttackDeltaPointsForPatrols()
;Get points for mission bonueses
myCurrentAttackDelta += GetAttackDeltaMissionBonus()
; CWScript.Log("CWCampaignScript", " GetmyCurrentAttackDelta() is returning myCurrentAttackDelta " + myCurrentAttackDelta + " rounded as int (" + (myCurrentAttackDelta as int) + ") compared to original campaign AttackDelta of " + CWs.AttackDelta)
return myCurrentAttackDelta as int
EndFunction
int Function GetAttackDeltaPointsForCapital(Location CapitalLocation)
{Returns the CurrentAttackDelta points contributed by the capital.}
;Note:
;Since the defender gets the capital garrison for free, in otherwords it's not purchased at the start of the campaign, the defender gets no benefit if the guards are alive.
;However, if the player killed all the guards there, then we want to give the attacker some bonus points so the player can feel like his actions have had an effect
If CapitalLocation.GetRefTypeAliveCount(CWSoldier) == 0
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForCapital() is returning " + AttackDeltaBonusForKillingCapitalGarrison + " points for the CurrentAttackDelta because all the soldiers in the garrison are dead.")
return AttackDeltaBonusForKillingCapitalGarrison ;set in OnInit()
else
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForCapital() is returning 0 points for the CurrentAttackDelta because the garrison is intact:" + CapitalLocation )
return 0 ;There are soldiers alive in the capital, so the attacker is awarded no points
EndIf
EndFunction
float Function GetAttackDeltaPointsForDefenderOnlyGarrison(Location Garrison, ObjectReference ResourceObject)
{Returns the CurrentAttackDelta points contributed by the Garrison and it's ResourceObject.}
;Note:
;Since the defender gets the garrison for free, in otherwords it's not purchased at the start of the campaign, the defender gets no benefit if the guards are alive.
;However, if the player killed all the guards there, or destroyed a resourceObject there, then we want to give the attacker some bonus points so the player can feel like his actions have had an effect
int BaseGarrisonValue
float GarrisonValue
If Garrison == None
return 0
EndIf
BaseGarrisonValue = Garrison.GetKeywordData(CWCost) as Int
GarrisonValue = BaseGarrisonValue
if BaseGarrisonValue == CWs.iCostNonContestable
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForDefenderOnlyGarrison() is returning 0 points for the CurrentAttackDelta because Garrison(" + Garrison + ") is Non-Contestable, ie has a CWCost value of:" + BaseGarrisonValue )
return 0
ElseIf Garrison.GetRefTypeAliveCount(CWSoldier) == 0
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForDefenderOnlyGarrison() is returning " + BaseGarrisonValue + " points for the CurrentAttackDelta because all the soldiers are dead in Garrison(" + Garrison + ")")
return BaseGarrisonValue
;*** !!! THIS IS SIMILAR BUT NOT IDENTICAL TO ELSEIF IN GetAttackDeltaPointsForGarrison() BELOW
ElseIf (ResourceObject as ResourceObjectScript).IsSabotaged()
GarrisonValue *= AttackDeltaGarrisonValueModifierForDestroyingResource
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForDefenderOnlyGarrison() is returning " + GarrisonValue + " points for the CurrentAttackDelta because the resource object is destroyed in the Garrison(" + Garrison + ")")
return GarrisonValue
Else
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForDefenderOnlyGarrison() is returning 0 points for the CurrentAttackDelta because the garrison is intact:" + Garrison + ")")
return 0
EndIf
EndFunction
float Function GetAttackDeltaPointsForGarrison(Location Garrison, ObjectReference ResourceObject)
{Returns the CurrentAttackDelta points contributed by the Garrison and it's ResourceObject.}
;Note:
;Whoever owns the Garrison gets points for it based on if the resource object is destroyed or not, and if the guards there are alive or not.s so the player can feel like his actions have had an effect
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison(Garrison[" + Garrison + "], ResourceObject[" + ResourceObject + "])")
int BaseGarrisonValue
float GarrisonValue
If Garrison == None
return 0
EndIf
BaseGarrisonValue = Garrison.GetKeywordData(CWCost) as Int
GarrisonValue = BaseGarrisonValue
if BaseGarrisonValue == CWs.iCostNonContestable ;Note this shouldn't be the case unless an error has occured setting the cost in the first place, only defender only garrisons should have a CWCost == iCostNonContestable
; CWScript.Log("CWCampaignScript", "WARNING: GetAttackDeltaPointsForGarrison() is returning 0 points for the CurrentAttackDelta because Garrison(" + Garrison + ") UNEXPECTEDLY is Non-Contestable, ie has a CWCost value of:" + BaseGarrisonValue, 2)
return 0
ElseIf Garrison.GetRefTypeAliveCount(CWSoldier) == 0
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison() is returning 0 points for the CurrentAttackDelta because all the soldiers are dead in Garrison(" + Garrison + ")")
return 0
;*** !!! THIS IS SIMILAR BUT NOT IDENTICAL TO ELSEIF IN GetAttackDeltaPointsForDefenderOnlyGarrison() ABOVE
ElseIf (ResourceObject as ResourceObjectScript).IsSabotaged()
GarrisonValue *= AttackDeltaGarrisonValueModifierForDestroyingResource
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison() is returning " + GarrisonValue + " points for the CurrentAttackDelta because the resource object is destroyed in the Garrison(" + Garrison + ")")
;DON'T RETURN, to give chance to process the attacker/defender below
EndIf
if Math.ABS(Garrison.GetKeywordData(CWOwner) as Int) == CWs.Attacker
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison() is returning " + GarrisonValue + " points for the CurrentAttackDelta (ie positive value for the Attacker). Garrison:" + Garrison)
return GarrisonValue
Else ;owned by Defender
;only award points if the Defender won it back from the Attacker who purchased it
if Garrison.GetKeywordData(CWPurchasedByAttacker) as Int == 1
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison() is returning " + -(GarrisonValue) + " points for the CurrentAttackDelta (ie negative value for the Defender) because he won it back from the Attacker who purchased it. Garrison:" + Garrison)
return -(GarrisonValue) ;Negative value means in the defender's favor
Else
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForGarrison() is returning 0 points for the CurrentAttackDelta because it is owned by the Defender who did not have to purchase it. Garrison:" + Garrison)
return 0
EndIf
EndIf
EndFunction
int Function GetAttackDeltaPointsForPatrols()
{Returns the sum of the CurrentAttackDelta points contributed by the Patrols for both sides.}
;If the patrol is owned, the owner get's points for it if the patrol isn't dead.
int PatrolValue = CWs.iCostPatrol
int PatrolsAttackDeltaPoints = 0
Location PatrolsLoc = Patrols.GetLocation()
int Attacker = CWs.Attacker
int Defender = CWs.Defender
if PatrolsLoc.GetRefTypeAliveCount(CWPatrol1) >= 1
if OwnerPatrol1 == Attacker
PatrolsAttackDeltaPoints += PatrolValue
Elseif OwnerPatrol1 == Defender ;must be explictly owned
PatrolsAttackDeltaPoints += -(PatrolValue) ;negative value means in the defender's favor
EndIf
EndIf
if PatrolsLoc.GetRefTypeAliveCount(CWPatrol2) >= 1
if OwnerPatrol2 == Attacker
PatrolsAttackDeltaPoints += PatrolValue
Elseif OwnerPatrol1 == Defender ;must be explictly owned
PatrolsAttackDeltaPoints += -(PatrolValue) ;negative value means in the defender's favor
EndIf
EndIf
if PatrolsLoc.GetRefTypeAliveCount(CWPatrol3) >= 1
if OwnerPatrol3 == Attacker
PatrolsAttackDeltaPoints += PatrolValue
Elseif OwnerPatrol1 == Defender ;must be explictly owned
PatrolsAttackDeltaPoints += -(PatrolValue) ;negative value means in the defender's favor
EndIf
EndIf
if PatrolsLoc.GetRefTypeAliveCount(CWPatrol4) >= 1
if OwnerPatrol4 == Attacker
PatrolsAttackDeltaPoints += PatrolValue
Elseif OwnerPatrol1 == Defender ;must be explictly owned
PatrolsAttackDeltaPoints += -(PatrolValue) ;negative value means in the defender's favor
EndIf
EndIf
if PatrolsLoc.GetRefTypeAliveCount(CWPatrol5) >= 1
if OwnerPatrol5 == Attacker
PatrolsAttackDeltaPoints += PatrolValue
Elseif OwnerPatrol1 == Defender ;must be explictly owned
PatrolsAttackDeltaPoints += -(PatrolValue) ;negative value means in the defender's favor
EndIf
EndIf
; CWScript.Log("CWCampaignScript", " GetAttackDeltaPointsForPatrols() is returning " + (PatrolsAttackDeltaPoints) + " points for the patrols. If positive it means the Attacker has more living patrols, if negative it means the defender has more living patrols.).")
return PatrolsAttackDeltaPoints
EndFunction
function addAttackDeltaMissionBonus(int valueToAdd)
attackDeltaMissionBonus += valueToAdd
; CWScript.Log("CWCampaignScript", " addAttackDeltaMissionBonus() adding " + valueToAdd + " making AttackDeltaMissionBonus = " + attackDeltaMissionBonus)
EndFunction
function subtractAttackDeltaMissionBonus(int valueToSubtract)
attackDeltaMissionBonus += valueToSubtract
; CWScript.Log("CWCampaignScript", " asubtractAttackDeltaMissionBonus() subtracting " + valueToSubtract + " making AttackDeltaMissionBonus = " + attackDeltaMissionBonus)
EndFunction
int Function getAttackDeltaMissionBonus()
; CWScript.Log("CWCampaignScript", " getAttackDeltaMissionBonus() returning AttackDeltaMissionBonus: " + attackDeltaMissionBonus)
return attackDeltaMissionBonus
EndFunction
int Function GetCountFarms(ReferenceAlias ResourceObject1, ReferenceAlias ResourceObject2, ReferenceAlias ResourceObject3)
{Called by CWMissions. Returns the number of farm resource objects.}
int count
If ResourceObject1.GetReference() != None && GetResourceType(ResourceObject1) == 1
count += 1
endif
If ResourceObject2.GetReference() != None && GetResourceType(ResourceObject2) == 1
count += 1
endif
If ResourceObject3.GetReference() != None && GetResourceType(ResourceObject3) == 1
count += 1
endif
return count
EndFunction
int Function GetCountMills(ReferenceAlias ResourceObject1, ReferenceAlias ResourceObject2, ReferenceAlias ResourceObject3)
{Called by CWMissions. Returns the number of mill resource objects.}
int count
If ResourceObject1.GetReference() != None && GetResourceType(ResourceObject1) == 2
count += 1
endif
If ResourceObject2.GetReference() != None && GetResourceType(ResourceObject2) == 2
count += 1
endif
If ResourceObject3.GetReference() != None && GetResourceType(ResourceObject3) == 2
count += 1
endif
return count
EndFunction
int Function GetCountMines(ReferenceAlias ResourceObject1, ReferenceAlias ResourceObject2, ReferenceAlias ResourceObject3)
{Called by CWMissions. Returns the number of mine resource objects.}
int count
If ResourceObject1.GetReference() != None && GetResourceType(ResourceObject1) == 3
count += 1
endif
If ResourceObject2.GetReference() != None && GetResourceType(ResourceObject2) == 3
count += 1
endif
If ResourceObject3.GetReference() != None && GetResourceType(ResourceObject3) == 3
count += 1
endif
return count
EndFunction
int function GetResourceType(ReferenceAlias ResourceObject)
{Returns an int signifying the resource type: 1 = Farm object, 2 = Mill object, 3 = Mine object}
ResourceObjectScript ResourceObjectS = ResourceObject.GetReference() as ResourceObjectScript
int type = ResourceObjectS.GetResourceType()
if type < 1 || type > 3
; CWScript.Log("CWCampaignScript", " GetResourceType() doesn't know what type to return for ResourceObject, will return 4")
type = 4
EndIf
; CWScript.Log("CWCampaignScript", " GetResourceType(" + ResourceObject +") which is objectReference[" + ResourceObject.GetReference() + "]returning type =" + type)
return type
EndFunction
function ForceFieldHQAliases()
{Forces The capitalHQ, or camp location into the FieldHQ and EnemyFieldHQ aliases based on the player's faction and the attacking faction.}
int playerAllegiance = CWs.PlayerAllegiance
int Attacker = CWs.Attacker
int ownerContestedHold = CWs.ownerContestedHold
int iImperials = CWs.iImperials
int iSons = CWs.iSons
If PlayerAllegiance == ownerContestedHold
FieldHQ.ForceLocationTo(CapitalHQ.GetLocation())
;make the enemy camp as the EnemyFieldHQ
If playerAllegiance == iImperials ;enemy is Sons
EnemyFieldHQ.ForceLocationTo(CampSons.GetLocation())
Elseif playerAllegiance == iSons ;enemy is Imperials
EnemyFieldHQ.ForceLocationTo(CampImperial.GetLocation())
Else ;unexpected allegiance
; CWScript.Log("CWCampaignScript", "ERROR: ForceFieldHQAliases() expected playerAllegiance to be 1 or 2, instead found " + playerAllegiance, 2)
EndIf
Else ;player's faction is not the owner of the contested hold, so make his camp the fieldHQ and the capital the EnemyFieldHQ
EnemyFieldHQ.ForceLocationTo(CapitalHQ.GetLocation())
;make the player's faction camp as the FieldHQ
If playerAllegiance == iImperials ;player is Sons
FieldHQ.ForceLocationTo(CampImperial.GetLocation())
Elseif playerAllegiance == iSons ;player is Imperials
FieldHQ.ForceLocationTo(CampSons.GetLocation())
Else ;unexpected allegiance
; CWScript.Log("CWCampaignScript", "ERROR: ForceFieldHQAliases() expected playerAllegiance to be 1 or 2, instead found " + playerAllegiance, 2)
EndIf
EndIf
; CWScript.Log("CWCampaignScript", " ForceFieldHQAliases(): PlayerAllegiance ==" + PlayerAllegiance + ", ownerContestedHold ==" + ownerContestedHold + ", Attacker ==" + Attacker)
; CWScript.Log("CWCampaignScript", " ForceFieldHQAliases(): Set FieldHQ to " + FieldHQ.GetLocation() + ", Set EnemyFieldHQ to " + EnemyFieldHQ.GetLocation())
EndFunction
Function PlayerJoinsActiveCampaign()
{When player get's involved in a civil war campaign for the first time, we need to roll it back to the begining.}
; CWScript.Log("CWCampaignScript", " PlayerJoinsActiveCampaign() will Call ForceFieldHQAliases(), SetCWCampaignFieldCOAliases, UpdateCWCampaignObjAliases, and AdvanceCampaignPhase(1) ")
ForceFieldHQAliases()
SetCWCampaignFieldCOAliases()
UpdateCWCampaignObjAliases()
AdvanceCampaignPhase(1) ;forces the campaign to "start over" with phase 1
startTutorialMission()
EndFunction
function UpdateCWCampaignObjAliases()
{Forces the aliases in CWCampaignObj quest to have the current references/locations of the related aliases in CWCampaign}
; CWScript.Log("CWCampaignScript", " UpdateCWCampaignObjAliases() forcing CWCampaignObj aliases to match. ")
CWCampaignObjFieldCO.ForceRefTo(FieldCO.GetReference())
CWCampaignObjFactionLeader.ForceRefTo(CWs.AliasFactionLeader.GetReference())
CWCampaignObjCampaignStartMarker.ForceRefTo(CampaignStartMarker.GetReference())
CWCampaignObjCampaignHold.ForceLocationTo(Hold.GetLocation())
EndFunction
Function startTutorialMission()
int tutorial = CWs.TutorialMissionComplete
; CWScript.Log("CWCampaignScript", " StartTutorialMission()")
CWMissionTutorialStart.SendStoryEvent(Hold.Getlocation(), CampaignStartMarker.GetReference(), CWMission1Ref)
EndFunction
Function stopTutorialMission()
int secondsWaiting = 0
;This is called by "CWScript FinishCampaign()"
;In the event that a campaign finishes before the player runs the mission, we need to be sure to completely stop the tutorial mission before the campaign wraps up, so when the next campaign starts we can start the tutorial mission properly.
; CWScript.Log("CWCampaignScript", " stopTutorialMission() stopping CWMission00")
CWMission00.stop()
while CWMission00.IsStopped() == False
Utility.wait(5)
secondsWaiting += 5
; CWScript.Log("CWCampaignScript", " stopTutorialMission() waiting for CWMission00 to stop. Seconds spent waiting:" + secondsWaiting, 1)
EndWhile
EndFunction
;Used by CWCampaignFieldCOScript - see Stage 0 in CWCampaign
ObjectReference Function GetAttackerFieldHQCenterMarker()
ObjectReference CenterMarkerRef
if CWs.Attacker == CWs.iImperials
CenterMarkerRef = CampImperialLocationCenterMarker.GetReference()
elseif CWs.Attacker == CWs.iSons
CenterMarkerRef = CampSonsLocationCenterMarker.GetReference()
Else
; CWScript.Log("CWCampaignScript", " WARNING: GetAttackerFieldHQCenterMarker() expected CWs.Attacker to be 1 or 2, instead found " + CWs.Attacker, 2, 1, 1)
CenterMarkerRef = none
EndIf
; CWScript.Log("CWCampaignScript", " GetAttackerFieldHQCenterMarker() returning " + CenterMarkerRef)
return CenterMarkerRef
EndFunction
ObjectReference function GetCapitalHQMarker()
ObjectReference markerRef = CapitalHQMarker.GetReference()
; CWScript.Log("CWCampaignScript", " GetCapitalHQMarker() returning " + MarkerRef)
Return MarkerRef
EndFunction
ObjectReference function GetFieldHQMarker()
; CWScript.Log("CWCampaignScript", " GetFieldHQCenterMarker()")
ObjectReference MarkerRef
if CWs.PlayerAllegiance == CWs.Attacker
MarkerRef = GetAttackerFieldHQCenterMarker()
Else
MarkerRef = GetCapitalHQMarker()
EndIf
; CWScript.Log("CWCampaignScript", " GetFieldHQMarker() is returning " + MarkerRef)
Return MarkerRef
EndFunction
ObjectReference function GetEnemyFieldHQMarker()
; CWScript.Log("CWCampaignScript", " GetEnemyFieldHQMarker()")
ObjectReference MarkerRef
if CWs.PlayerAllegiance == CWs.Attacker
MarkerRef = GetCapitalHQMarker() ;since player is attacking then the enemy is defending and has the captial hq
Else
MarkerRef = GetAttackerFieldHQCenterMarker() ;since player is defending then the enemy is attacking
EndIf
; CWScript.Log("CWCampaignScript", " GetEnemyFieldHQMarker() is returning " + MarkerRef)
Return MarkerRef
EndFunction
;*******************************************************************************************************************
;*** OBSOLETE FUNCTIONS BELOW ***
;*******************************************************************************************************************
Function StartMissions()
If CWCampaignPhase.value < ResolutionPhase ;then start normal missions
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() CWCampaignPhase(" + CWCampaignPhase.value + ") < ResolutionPhase(" + ResolutionPhase + "). Starting Missions.")
CWMissionStart.SendStoryEvent(Hold.Getlocation(), CampaignStartMarker.GetReference(), CWMission1Ref)
CWMissionStart.SendStoryEvent(Hold.Getlocation(), CampaignStartMarker.GetReference(), CWMission2Ref)
;we used to offer three missiosn, now we are only offering two at a time
;CWMissionStart.SendStoryEvent(Hold.Getlocation(), CampaignStartMarker.GetReference(), CWMission3Ref)
((Self as Quest) as CWCampaignPollForMissionAcceptScript).StartPolling()
ElseIf CWCampaignPhase.value == ResolutionPhase ;then start the resolution Quest
if CWs.TutorialMissionComplete == 0
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() CWCampaignPhase(" + CWCampaignPhase.value + ") == ResolutionPhase(" + ResolutionPhase + "). Tutorial mission not completed, resolving offscreen.")
CWs.ResolveOffscreen(GetCurrentAttackDelta())
Else
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() CWCampaignPhase(" + CWCampaignPhase.value + ") == ResolutionPhase(" + ResolutionPhase + "). Starting Resolution Mission.")
StartResolutionMission()
((Self as Quest) as CWCampaignPollForMissionAcceptScript).StartPolling()
EndIf
Else ; We are trying to advance into a phase after the resolution phase, which means we should resolve the resolution mission off screen
; CWScript.Log("CWCampaignScript", " AdvanceCampaignPhase() CWCampaignPhase(" + CWCampaignPhase.value + ") > ResolutionPhase(" + ResolutionPhase + "). Resolving Resolution Mission OFFSCREEN.")
((Self as Quest) as CWCampaignPollForMissionAcceptScript).StopPolling()
CWs.ResolveOffscreen(GetCurrentAttackDelta())
EndIf
EndFunction