enderalse/source/scripts/companionshousekeepingscript.psc

1232 lines
38 KiB
Plaintext

Scriptname CompanionsHousekeepingScript extends Quest Conditional
Faction property CompanionsFaction auto
MiscObject property GoldReward auto
int property GoldRewardMinorAmount auto
int property GoldRewardModerateAmount auto
int property GoldRewardMajorAmount auto
; for introductory loop
bool property PlayerWalkedAwayDuringKVScene auto conditional
bool property PlayerWalkedAwayDuringSAScene auto conditional
bool property PlayerIgnoredVilkasOutside auto conditional
bool property PlayerMetKodlak auto conditional
bool property PlayerMetVilkas auto conditional
bool property PlayerMetEorlund auto conditional
bool property PlayerMetAela auto conditional
bool property PlayerMetSkjor auto conditional
bool property PlayerMetFarkas auto conditional
bool property FarkasLastSceneStarted auto conditional
bool property AelaShouldForceGreet auto conditional
bool property EorlundShouldForceGreet auto conditional
bool property FarkasSceneGo auto conditional
Quest property TrainingQuest auto
ReferenceAlias property VilkasSword auto
ReferenceAlias property VilkasQuestSword auto
bool property VilkasHasHisSwordBack auto conditional
bool Property PlayerMetCompanionsAtGiant auto conditional
bool Property PlayerHelpedCompanionsAtGiant auto conditional
; got reward for full joining
bool Property GotWeaponReward auto conditional
bool Property EorlundToldAboutSkyforge auto conditional
; the person following you (mostly for dialogue conditions)
ReferenceAlias Property CurrentFollower auto
; so we can wrangle your followers
DialogueFollowerScript Property FollowerScript auto
GlobalVariable Property PlayerFollowerCount auto
DarkBrotherhood Property DBScript auto
Actor Property CiceroFollower auto
Actor Property DBInitiateFollower1 auto
Actor Property DBInitiateFollower2 auto
; the circle (tm) + kodlak (collect all five)
ReferenceAlias property Skjor auto
ReferenceAlias property Aela auto
ReferenceAlias property Farkas auto
ReferenceAlias property Vilkas auto
ReferenceAlias property Kodlak auto
; other jerks
ReferenceAlias Property Athis auto
ReferenceAlias Property Njada auto
ReferenceAlias Property Ria auto
ReferenceAlias Property Torvar auto
; not technically a companion, but he's still cool
ReferenceAlias Property Eorlund auto
; the faction for trainers to get put into when the player joins
Faction Property TrainerFaction auto
; that guy (or gal) who follows you
ReferenceAlias property TrialObserver auto
; the weapon that we'll give to Vilkas
Weapon property VilkasWeapon auto
; setting up Eorlund to sell you Companions gear
LeveledItem Property CompanionsArmor auto
LeveledItem Property SkyforgeSteelWeapons auto
ObjectReference Property EorlundVendorChest auto
GlobalVariable Property GearChance auto
; naughty naughty
bool property PlayerThievingAndNotPaying auto conditional
int property PlayerThievingThreshold auto conditional
; to shut them up when there are more important things going on
ReferenceAlias Property GenericDialogueSuppressor1 auto
ReferenceAlias Property GenericDialogueSuppressor2 auto
ReferenceAlias Property GenericDialogueSuppressor3 auto
ReferenceAlias Property GenericDialogueSuppressor4 auto
; track whether the player currently has werewolf ability
bool Property PlayerHasBeastBlood = false auto conditional
GlobalVariable Property PlayerIsWerewolf auto
; gets set true when you join (so we can still debug the werewolf transform)
bool Property PlayerIsWerewolfVirgin = false auto conditional
; so Skjor can let you in to the Underforge before you're a werewolf
bool Property TempUnderforgeAccess = false auto conditional
Quest Property WerewolfChangeTrackingQuest auto
Spell Property WerewolfImmunity auto
Spell Property BeastForm auto
; FIX FOR 81462
Spell Property HircinesRingPower auto
; END FIX FOR 81462
Race Property PlayerOriginalRace auto
Race Property ArgonianRace auto
Race Property ArgonianRaceVampire auto
Race Property BretonRace auto
Race Property BretonRaceVampire auto
Race Property DarkElfRace auto
Race Property DarkElfRaceVampire auto
Race Property HighElfRace auto
Race Property HighElfRaceVampire auto
Race Property ImperialRace auto
Race Property ImperialRaceVampire auto
Race Property KhajiitRace auto
Race Property KhajiitRaceVampire auto
Race Property NordRace auto
Race Property NordRaceVampire auto
Race Property OrcRace auto
Race Property OrcRaceVampire auto
Race Property RedguardRace auto
Race Property RedguardRaceVampire auto
Race Property WoodElfRace auto
Race Property WoodElfRaceVampire auto
Shout Property CurrentHowl auto
WordOfPower Property CurrentHowlWord1 auto
WordOfPower Property CurrentHowlWord2 auto
WordOfPower Property CurrentHowlWord3 auto
;;; quest tracking from here down ;;;
int property RadiantQuestsDone auto conditional
int property RadiantQuestsDoneInCurrentSegment auto conditional
ReferenceAlias property RadiantQuestgiver auto
Faction Property CurrentFollowerFaction auto
int Property C04MinLevel auto ; because there are Hagravens involved
CompanionsRadiantQuest Property AelaCurrentQuest auto
CompanionsRadiantQuest Property VilkasCurrentQuest auto
CompanionsRadiantQuest Property FarkasCurrentQuest auto
CompanionsRadiantQuest Property SkjorCurrentQuest auto
CompanionsRadiantQuest Property AelaNextQuest auto
CompanionsRadiantQuest Property VilkasNextQuest auto
CompanionsRadiantQuest Property FarkasNextQuest auto
CompanionsRadiantQuest Property SkjorNextQuest auto
Keyword property AelaRadiantKeyword auto
Keyword property SkjorRadiantKeyword auto
Keyword property VilkasRadiantKeyword auto
Keyword property FarkasRadiantKeyword auto
Keyword property ReconRadiantKeyword auto
bool property RadiantAelaBlock auto conditional
bool property RadiantSkjorBlock auto conditional
bool property RadiantFarkasBlock auto conditional
bool property RadiantVilkasBlock auto conditional
Quest Property RadiantMiscObjQuest auto
bool property StoryQuestIsRunning auto conditional
bool property RadiantQuestAccepted auto conditional
bool property RadiantQuestFinished auto conditional
bool property IsCurrentSilverHandTarget auto conditional
int property LastRadiantQuestDoneIndex auto conditional
bool property AelaInReconMode auto conditional
bool property DoneReconQuestForAela auto conditional
ObjectReference property QuestgiverStandMarker auto conditional
int property RadiantQuestsUntilC01 auto
int property RadiantQuestsUntilC03 auto
int property RadiantQuestsUntilC04 auto
CompanionsStoryQuest property C01 auto
CompanionsStoryQuest property C02 auto
CompanionsStoryQuest property C03 auto
CompanionsStoryQuest property C04 auto
CompanionsStoryQuest property C05 auto
CompanionsStoryQuest property C06 auto
; CR12 persistent tracking
int Property TotemsFound auto conditional
bool Property AelaIsConfused auto conditional
; CR13 persistent tracking
bool Property VilkasHasBeastBlood auto conditional
bool Property FarkasHasBeastBlood auto conditional
;; Radiant Quests
; grunt work
CompanionsRadiantQuest property CR01 auto ; a beast loose in someone's house
CompanionsRadiantQuest property CR02 auto ; beasts in a den near town harassing people
CompanionsRadiantQuest property CR03 auto ; collect pelts
CompanionsRadiantQuest property CR04 auto ; intimidation missions
CompanionsRadiantQuest property CR05 auto ; clear a dungeon
CompanionsRadiantQuest property CR06 auto ; family heirloom
; "real" quests
CompanionsRadiantQuest property CR07 auto ; capture criminals
CompanionsRadiantQuest property CR08 auto ; rescue people
; silver hand quests with Aela
CompanionsRadiantQuest property CR09 auto ; assasinate lieutenants
CompanionsRadiantQuest property CR10 auto ; steal plans
CompanionsRadiantQuest property CR11 auto ; retrieve pieces of blade
CompanionsRadiantQuest property CR12 auto ; wipe out camps
; leader work
CompanionsRadiantQuest property CR13 auto ; curing vilkas/farkas
CompanionsRadiantQuest property CR14 auto ; let a newbie in
CompanionsStoryQuest property CurrentStoryQuest auto
int property FavoriteQuestgiver auto conditional
; 0 --> None (default behavior defined in quest)
; 1 --> Aela
; 3 --> Vilkas
; 2 --> Farkas
; 4 --> Skjor
bool Property AelaIsObserver auto conditional
bool Property FarkasIsObserver auto conditional
int property AelaQuests auto
int property FarkasQuests auto
int property VilkasQuests auto
int property SkjorQuests auto
;; location tracking for reservations
LocationAlias Property DustmansCairn auto
LocationAlias Property GallowsRock auto
LocationAlias Property YsgramorsTomb auto
; Quest Designer needs arrays badly. Quest Designer is about to die.
CompanionsRadiantQuest Function GetRadiantQuestFromIndex(int questIndex)
if (questIndex == 1)
return CR01
elseif (questIndex == 2)
return CR02
elseif (questIndex == 3)
return CR03
elseif (questIndex == 4)
return CR04
elseif (questIndex == 5)
return CR05
elseif (questIndex == 6)
return CR06
elseif (questIndex == 7)
return CR07
elseif (questIndex == 8)
return CR08
elseif (questIndex == 9)
return CR09
elseif (questIndex == 10)
return CR10
elseif (questIndex == 11)
return CR11
elseif (questIndex == 12)
return CR12
elseif (questIndex == 13)
return CR13
elseif (questIndex == 14)
return CR14
else
return None
endif
EndFunction
int Function GetIndexFromRadiantQuest(Quest rQuest)
if (rQuest == CR01)
return 1
elseif (rQuest == CR02)
return 2
elseif (rQuest == CR03)
return 3
elseif (rQuest == CR04)
return 4
elseif (rQuest == CR05)
return 5
elseif (rQuest == CR06)
return 6
elseif (rQuest == CR07)
return 7
elseif (rQuest == CR08)
return 8
elseif (rQuest == CR09)
return 9
elseif (rQuest == CR10)
return 10
elseif (rQuest == CR11)
return 11
elseif (rQuest == CR12)
return 12
elseif (rQuest == CR13)
return 13
elseif (rQuest == CR14)
return 14
else
return 0
endif
EndFunction
Function OnInit()
; PlayerJoin() ; for debugging, usually commented out
EndFunction
Function SetUpCompanions()
; Debug.Trace("C00: Waiting to set up Companions.")
Utility.Wait(60) ; giving other quests the chance to finish their reservations
; (very conservative time buffer, but chargen takes a while,
; so let's be safe)
; Debug.Trace("C00: Setting up Companions...")
RadiantQuestsDone = 0
StoryQuestIsRunning = False
RadiantQuestAccepted = False
RadiantQuestFinished = False
AelaCurrentQuest = None
VilkasCurrentQuest = None
FarkasCurrentQuest = None
SkjorCurrentQuest = None
AelaNextQuest = None
VilkasNextQuest = None
FarkasNextQuest = None
SkjorNextQuest = None
RadiantAelaBlock = False
RadiantFarkasBlock = False
RadiantSkjorBlock = False
RadiantVilkasBlock = False
; do this twice to queue up two quests
CycleRadiantQuests()
; while (\
; (SkjorCurrentQuest == None || !SkjorCurrentQuest.GetStageDone(1)) \
; && (AelaCurrentQuest == None || !AelaCurrentQuest.GetStageDone(1)) \
; && (FarkasCurrentQuest == None || !FarkasCurrentQuest.GetStageDone(1)) \
; && (VilkasCurrentQuest == None || !VilkasCurrentQuest.GetStageDone(1)) \
; )
; ; Debug.Trace("C00: Waiting on RQ cycle...")
; Utility.Wait(0.1)
; endwhile
CycleRadiantQuests()
CurrentStoryQuest = None
; Debug.Trace("C00: Setup done; setting stage 1.")
SetStage(1)
EndFunction
Function PlayerJoin()
; Debug.Trace("C00: Player joined Companions.")
if (Game.GetPlayer().IsInFaction(CompanionsFaction))
return
endif
Game.GetPlayer().AddToFaction(CompanionsFaction)
; start misc pointer for radiant quests
RadiantMiscObjQuest.Start()
; allow trainers
Athis.GetActorReference().AddToFaction(TrainerFaction)
Aela.GetActorReference().AddToFaction(TrainerFaction)
Njada.GetActorReference().AddToFaction(TrainerFaction)
Vilkas.GetActorReference().AddToFaction(TrainerFaction)
Eorlund.GetActorReference().AddToFaction(TrainerFaction)
Farkas.GetActorReference().AddToFaction(TrainerFaction)
; set up the spell tracking so the first time you cast it doesn't count
PlayerIsWerewolfVirgin = true
; get player's race so we have it permanently for werewolf switch back
PlayerOriginalRace = Game.GetPlayer().GetRace()
; Debug.Trace("CSQ: Storing player's race as " + PlayerOriginalRace)
if (PlayerOriginalRace == ArgonianRaceVampire)
; Debug.Trace("CSQ: Player was Argonian Vampire; storing as Argonian.")
PlayerOriginalRace = ArgonianRace
elseif (PlayerOriginalRace == BretonRaceVampire)
; Debug.Trace("CSQ: Player was Breton Vampire; storing as Breton.")
PlayerOriginalRace = BretonRace
elseif (PlayerOriginalRace == DarkElfRaceVampire)
; Debug.Trace("CSQ: Player was Dark Elf Vampire; storing as Dark Elf.")
PlayerOriginalRace = DarkElfRace
elseif (PlayerOriginalRace == HighElfRaceVampire)
; Debug.Trace("CSQ: Player was High Elf Vampire; storing as High Elf.")
PlayerOriginalRace = HighElfRace
elseif (PlayerOriginalRace == ImperialRaceVampire)
; Debug.Trace("CSQ: Player was Imperial Vampire; storing as Imperial.")
PlayerOriginalRace = ImperialRace
elseif (PlayerOriginalRace == KhajiitRaceVampire)
; Debug.Trace("CSQ: Player was Khajiit Vampire; storing as Khajiit.")
PlayerOriginalRace = KhajiitRace
elseif (PlayerOriginalRace == NordRaceVampire)
; Debug.Trace("CSQ: Player was Nord Vampire; storing as Nord.")
PlayerOriginalRace = NordRace
elseif (PlayerOriginalRace == OrcRaceVampire)
; Debug.Trace("CSQ: Player was Orc Vampire; storing as Orc.")
PlayerOriginalRace = OrcRace
elseif (PlayerOriginalRace == RedguardRaceVampire)
; Debug.Trace("CSQ: Player was Redguard Vampire; storing as Redguard.")
PlayerOriginalRace = RedguardRace
elseif (PlayerOriginalRace == WoodElfRaceVampire)
; Debug.Trace("CSQ: Player was Wood Elf Vampire; storing as Wood Elf.")
PlayerOriginalRace = WoodElfRace
endif
; Debug.Trace("CSQ: Storing player's race as " + PlayerOriginalRace)
; achievements YAY
Game.AddAchievement(9)
EndFunction
Function OpenSkyforge()
; set up Eorlund to sell you stuff
GearChance.SetValueInt(0)
; add them right now in case you run up
EorlundVendorChest.AddItem(CompanionsArmor)
EorlundVendorChest.AddItem(SkyforgeSteelWeapons)
EndFunction
; super specialized
Function GiveVilkasBackHisSword()
ObjectReference vs = VilkasSword.GetReference()
; make sure it's been cleared as a quest item
VilkasQuestSword.Clear()
VilkasSword.Clear()
Eorlund.GetReference().RemoveItem(vs)
Vilkas.GetReference().AddItem(VilkasWeapon)
VilkasHasHisSwordBack = True
EndFunction
Function CycleRadiantQuests()
; Debug.Trace("CRQ: Cycling radiant quests...")
; just in case some idjit (i.e. me) unblocked a dead questgiver
if (Aela.GetActorReference().IsDead())
if (AelaCurrentQuest != None)
AelaCurrentQuest.Stop()
AelaCurrentQuest = None
endif
if (AelaNextQuest != None)
AelaNextQuest.Stop()
AelaNextQuest = None
endif
RadiantAelaBlock = True
endif
if (Farkas.GetActorReference().IsDead())
if (FarkasCurrentQuest != None)
FarkasCurrentQuest.Stop()
FarkasCurrentQuest = None
endif
if (FarkasNextQuest != None)
FarkasNextQuest.Stop()
FarkasNextQuest = None
endif
RadiantFarkasBlock = True
endif
if (Vilkas.GetActorReference().IsDead())
if (VilkasCurrentQuest != None)
VilkasCurrentQuest.Stop()
VilkasCurrentQuest = None
endif
if (VilkasNextQuest != None)
VilkasNextQuest.Stop()
VilkasNextQuest = None
endif
RadiantVilkasBlock = True
endif
if (Skjor.GetActorReference().IsDead())
if (SkjorCurrentQuest != None)
SkjorCurrentQuest.Stop()
SkjorCurrentQuest = None
endif
if (SkjorNextQuest != None)
SkjorNextQuest.Stop()
SkjorNextQuest = None
endif
RadiantSkjorBlock = True
endif
; lord, so much duplicated code here... this grew "organically" and is now hideous.
; do not look here for examples of good tidy code.
if (!RadiantAelaBlock)
if (AelaCurrentQuest && AelaNextQuest && !AelaCurrentQuest.IsAccepted)
; current quest not accepted, and we have a good next choice lined up -- swap
AelaCurrentQuest.Stop()
AelaCurrentQuest = AelaNextQuest
AelaNextQuest = None
AelaCurrentQuest.IsActive = True
elseif (AelaCurrentQuest && AelaCurrentQuest.Premature)
; no better option, but we're trying to cycle out a prematurely ended quest,
; so make it happen
AelaCurrentQuest.Stop()
AelaCurrentQuest = AelaNextQuest
AelaNextQuest = None
if (AelaCurrentQuest != None)
AelaCurrentQuest.IsActive = True
else
; hope for the best at the next pick
endif
elseif (!AelaCurrentQuest && AelaNextQuest)
; no current quest for whatever effed up reason, but got something in the
; chamber, so fire.
AelaCurrentQuest = AelaNextQuest
AelaNextQuest = None
AelaCurrentQuest.IsActive = True
elseif (AelaNextQuest && AelaNextQuest != AelaCurrentQuest)
; I don't even know why this is here anymore, but it is.
AelaNextQuest.Stop()
AelaNextQuest = None
elseif (AelaCurrentQuest && AelaCurrentQuest.GetStage() >= 200)
; in case something got stuck someplace, make sure this eventually
; gets cycled out
AelaCurrentQuest.Stop()
if (AelaNextQuest != None)
AelaCurrentQuest = AelaNextQuest
AelaNextQuest = None
AelaCurrentQuest.IsActive = True
else
AelaCurrentQuest = None
endif
endif
PickRadiantQuest(Aela.GetActorReference())
elseif (AelaCurrentQuest && AelaCurrentQuest.GetStage() >= 200)
; even if there's a block, cycle out done quests
AelaCurrentQuest.Stop()
if (AelaNextQuest != None)
AelaCurrentQuest = AelaNextQuest
AelaNextQuest = None
else
AelaCurrentQuest = None
endif
endif
if (!RadiantFarkasBlock)
if (FarkasCurrentQuest && FarkasNextQuest && !FarkasCurrentQuest.IsAccepted)
; current quest not accepted, and we have a good next choice lined up -- swap
FarkasCurrentQuest.Stop()
FarkasCurrentQuest = FarkasNextQuest
FarkasNextQuest = None
FarkasCurrentQuest.IsActive = True
elseif (FarkasCurrentQuest && FarkasCurrentQuest.Premature)
; no better option, but we're trying to cycle out a prematurely ended quest,
; so make it happen
FarkasCurrentQuest.Stop()
FarkasCurrentQuest = FarkasNextQuest
FarkasNextQuest = None
if (FarkasCurrentQuest != None)
FarkasCurrentQuest.IsActive = True
else
; hope for the best at the next pick
endif
elseif (!FarkasCurrentQuest && FarkasNextQuest)
; no current quest for whatever effed up reason, but got something in the
; chamber, so fire.
FarkasCurrentQuest = FarkasNextQuest
FarkasNextQuest = None
FarkasCurrentQuest.IsActive = True
elseif (FarkasNextQuest && FarkasNextQuest != FarkasCurrentQuest)
; I don't even know why this is here anymore, but it is.
FarkasNextQuest.Stop()
FarkasNextQuest = None
elseif (FarkasCurrentQuest && FarkasCurrentQuest.GetStage() >= 200)
; in case something got stuck someplace, make sure this eventually
; gets cycled out
FarkasCurrentQuest.Stop()
if (FarkasNextQuest != None)
FarkasCurrentQuest = FarkasNextQuest
FarkasNextQuest = None
FarkasCurrentQuest.IsActive = True
else
FarkasCurrentQuest = None
endif
endif
PickRadiantQuest(Farkas.GetActorReference())
elseif (FarkasCurrentQuest && FarkasCurrentQuest.GetStage() >= 200)
; even if there's a block, cycle out done quests
FarkasCurrentQuest.Stop()
if (FarkasNextQuest != None)
FarkasCurrentQuest = FarkasNextQuest
FarkasNextQuest = None
else
FarkasCurrentQuest = None
endif
endif
if (!RadiantVilkasBlock)
if (VilkasCurrentQuest && VilkasNextQuest && !VilkasCurrentQuest.IsAccepted)
; current quest not accepted, and we have a good next choice lined up -- swap
VilkasCurrentQuest.Stop()
VilkasCurrentQuest = VilkasNextQuest
VilkasNextQuest = None
VilkasCurrentQuest.IsActive = True
elseif (VilkasCurrentQuest && VilkasCurrentQuest.Premature)
; no better option, but we're trying to cycle out a prematurely ended quest,
; so make it happen
VilkasCurrentQuest.Stop()
VilkasCurrentQuest = VilkasNextQuest
VilkasNextQuest = None
if (VilkasCurrentQuest != None)
VilkasCurrentQuest.IsActive = True
else
; hope for the best at the next pick
endif
elseif (!VilkasCurrentQuest && VilkasNextQuest)
; no current quest for whatever effed up reason, but got something in the
; chamber, so fire.
VilkasCurrentQuest = VilkasNextQuest
VilkasNextQuest = None
VilkasCurrentQuest.IsActive = True
elseif (VilkasNextQuest && VilkasNextQuest != VilkasCurrentQuest)
; I don't even know why this is here anymore, but it is.
VilkasNextQuest.Stop()
VilkasNextQuest = None
elseif (VilkasCurrentQuest && VilkasCurrentQuest.GetStage() >= 200)
; in case something got stuck someplace, make sure this eventually
; gets cycled out
VilkasCurrentQuest.Stop()
if (VilkasNextQuest != None)
VilkasCurrentQuest = VilkasNextQuest
VilkasNextQuest = None
VilkasCurrentQuest.IsActive = True
else
VilkasCurrentQuest = None
endif
endif
PickRadiantQuest(Vilkas.GetActorReference())
elseif (VilkasCurrentQuest && VilkasCurrentQuest.GetStage() >= 200)
; even if there's a block, cycle out done quests
VilkasCurrentQuest.Stop()
if (VilkasNextQuest != None)
VilkasCurrentQuest = VilkasNextQuest
VilkasNextQuest = None
else
VilkasCurrentQuest = None
endif
endif
if (!RadiantSkjorBlock)
if (SkjorCurrentQuest && SkjorNextQuest && !SkjorCurrentQuest.IsAccepted)
; current quest not accepted, and we have a good next choice lined up -- swap
SkjorCurrentQuest.Stop()
SkjorCurrentQuest = SkjorNextQuest
SkjorNextQuest = None
SkjorCurrentQuest.IsActive = True
elseif (SkjorCurrentQuest && SkjorCurrentQuest.Premature)
; no better option, but we're trying to cycle out a prematurely ended quest,
; so make it happen
SkjorCurrentQuest.Stop()
SkjorCurrentQuest = SkjorNextQuest
SkjorNextQuest = None
if (SkjorCurrentQuest != None)
SkjorCurrentQuest.IsActive = True
else
; hope for the best at the next pick
endif
elseif (!SkjorCurrentQuest && SkjorNextQuest)
; no current quest for whatever effed up reason, but got something in the
; chamber, so fire.
SkjorCurrentQuest = SkjorNextQuest
SkjorNextQuest = None
SkjorCurrentQuest.IsActive = True
elseif (SkjorNextQuest && SkjorNextQuest != SkjorCurrentQuest)
; I don't even know why this is here anymore, but it is.
SkjorNextQuest.Stop()
SkjorNextQuest = None
elseif (SkjorCurrentQuest && SkjorCurrentQuest.GetStage() >= 200)
; in case something got stuck someplace, make sure this eventually
; gets cycled out
SkjorCurrentQuest.Stop()
if (SkjorNextQuest != None)
SkjorCurrentQuest = SkjorNextQuest
SkjorNextQuest = None
SkjorCurrentQuest.IsActive = True
else
SkjorCurrentQuest = None
endif
endif
PickRadiantQuest(Skjor.GetActorReference())
elseif (SkjorCurrentQuest && SkjorCurrentQuest.GetStage() >= 200)
; even if there's a block, cycle out done quests
SkjorCurrentQuest.Stop()
if (SkjorNextQuest != None)
SkjorCurrentQuest = SkjorNextQuest
SkjorNextQuest = None
else
SkjorCurrentQuest = None
endif
endif
; 77298: Fixing situation where next quests were flagged premature
; and not cleared out before player was able to get at them.
if (AelaNextQuest != None && AelaNextQuest.Premature == True)
AelaNextQuest.Stop()
AelaNextQuest = None
endif
if (FarkasNextQuest != None && FarkasNextQuest.Premature == True)
FarkasNextQuest.Stop()
FarkasNextQuest = None
endif
if (VilkasNextQuest != None && VilkasNextQuest.Premature == True)
VilkasNextQuest.Stop()
VilkasNextQuest = None
endif
if (SkjorNextQuest != None && SkjorNextQuest.Premature == True)
SkjorNextQuest.Stop()
SkjorNextQuest = None
endif
; END 77298
EndFunction
Function PickRadiantQuest(Actor questgiver)
; Debug.Trace("CRQ: Trying to pick radiant quest for " + questgiver)
if (questgiver.IsDead())
; Debug.Trace("CRQ: Questgiver " + questgiver + " is dead; skipping radiant selection.")
return
endif
if (questgiver == Aela.GetActorReference())
Keyword ark = AelaRadiantKeyword
if ( AelaInReconMode )
ark = ReconRadiantKeyword
endif
ark.SendStoryEvent()
elseif (questgiver == Skjor.GetActorReference())
SkjorRadiantKeyword.SendStoryEvent()
elseif (questgiver == Vilkas.GetActorReference())
VilkasRadiantKeyword.SendStoryEvent()
elseif (questgiver == Farkas.GetActorReference())
FarkasRadiantKeyword.SendStoryEvent()
endif
EndFunction
Function RegisterRadiantQuest(CompanionsRadiantQuest newRadiant)
Actor qg = newRadiant.Questgiver.GetActorReference()
if (qg == None || newRadiant.IsRegistered)
return ; we'll register when the story event comes through
endif
; Debug.Trace("CRQ: Registering radiant quest -- " + newRadiant + " with questgiver -- " + qg)
if (qg == Aela.GetActorReference())
if (AelaCurrentQuest == None)
AelaCurrentQuest = newRadiant
AelaCurrentQuest.IsActive = True
elseif (!AelaCurrentQuest.IsActive)
AelaCurrentQuest.Stop()
AelaCurrentQuest = newRadiant
AelaCurrentQuest.IsActive = True
else
if (AelaNextQuest != None)
AelaNextQuest.Stop()
endif
AelaNextQuest = newRadiant
endif
elseif (qg == Skjor.GetActorReference())
if (SkjorCurrentQuest == None)
SkjorCurrentQuest = newRadiant
SkjorCurrentQuest.IsActive = True
elseif (!SkjorCurrentQuest.IsActive)
SkjorCurrentQuest.Stop()
SkjorCurrentQuest = newRadiant
SkjorCurrentQuest.IsActive = True
else
if (SkjorNextQuest != None)
SkjorNextQuest.Stop()
endif
SkjorNextQuest = newRadiant
endif
elseif (qg == Vilkas.GetActorReference())
if (VilkasCurrentQuest == None)
VilkasCurrentQuest = newRadiant
VilkasCurrentQuest.IsActive = True
elseif (!VilkasCurrentQuest.IsActive)
VilkasCurrentQuest.Stop()
VilkasCurrentQuest = newRadiant
VilkasCurrentQuest.IsActive = True
else
if (VilkasNextQuest != None)
VilkasNextQuest.Stop()
endif
VilkasNextQuest = newRadiant
endif
elseif (qg == Farkas.GetActorReference())
if (FarkasCurrentQuest == None)
FarkasCurrentQuest = newRadiant
FarkasCurrentQuest.IsActive = True
elseif (!FarkasCurrentQuest.IsActive)
FarkasCurrentQuest.Stop()
FarkasCurrentQuest = newRadiant
FarkasCurrentQuest.IsActive = True
else
if (FarkasNextQuest != None)
FarkasNextQuest.Stop()
endif
FarkasNextQuest = newRadiant
endif
endif
newRadiant.IsRegistered = true
EndFunction
Function AcceptRadiantQuest(Actor questgiver, bool comesAlong)
; Debug.Trace("C00: Accepting radiant quest for " + questgiver + " -- comes along? " + comesAlong)
RadiantQuestAccepted = True
RadiantMiscObjQuest.SetObjectiveDisplayed(10, false)
bool reg = true
if (comesAlong)
reg = false
endif
if (questgiver == Aela.GetReference())
if (AelaInReconMode && !DoneReconQuestForAela)
reg = false
endif
endif
if (questgiver.IsInFaction(CurrentFollowerFaction))
reg = false
endif
if (reg)
; Debug.Trace("C00: Registering " + questgiver + " as radiant questgiver.")
RadiantQuestgiver.ForceRefTo(questgiver)
endif
ShutdownRadiantQuests(questgiver)
EndFunction
Function ShutdownRadiantQuests(Actor exception = None)
; Debug.Trace("CRQ: Shutting down radiant quests, excepting " + exception)
if (exception != Aela.GetActorReference())
RadiantAelaBlock = True
if (AelaCurrentQuest != None)
AelaCurrentQuest.IsActive = False
endif
endif
if (exception != Skjor.GetActorReference())
RadiantSkjorBlock = True
if (SkjorCurrentQuest != None)
SkjorCurrentQuest.IsActive = False
endif
endif
if (exception != Vilkas.GetActorReference())
RadiantVilkasBlock = True
if (VilkasCurrentQuest != None)
VilkasCurrentQuest.IsActive = False
endif
endif
if (exception != Farkas.GetActorReference())
RadiantFarkasBlock = True
if (FarkasCurrentQuest != None)
FarkasCurrentQuest.IsActive = False
endif
endif
; Debug.Trace("CRQ: Ensuring shutdown -- " + RadiantAelaBlock + " " + RadiantSkjorBlock + " " + RadiantVilkasBlock + " " + RadiantFarkasBlock)
EndFunction
Function ShutdownRadiantQuestsFor(Actor busy)
; Debug.Trace("CRQ: Shutting down radiant quests for " + busy)
if (busy == Aela.GetActorReference())
RadiantAelaBlock = True
if (AelaCurrentQuest != None)
AelaCurrentQuest.IsActive = False
endif
elseif (busy == Skjor.GetActorReference())
RadiantSkjorBlock = True
if (SkjorCurrentQuest != None)
SkjorCurrentQuest.IsActive = False
endif
elseif (busy == Vilkas.GetActorReference())
RadiantVilkasBlock = True
if (VilkasCurrentQuest != None)
VilkasCurrentQuest.IsActive = False
endif
elseif (busy == Farkas.GetActorReference())
RadiantFarkasBlock = True
if (FarkasCurrentQuest != None)
FarkasCurrentQuest.IsActive = False
endif
endif
; Debug.Trace("CRQ: Ensuring shutdown -- " + RadiantAelaBlock + " " + RadiantSkjorBlock + " " + RadiantVilkasBlock + " " + RadiantFarkasBlock)
EndFunction
Function ReOpenAllRadiantQuests()
; Debug.Trace("CRQ: Reopening radiant quests.")
if (!Aela.GetActorReference().IsDead())
RadiantAelaBlock = False
endif
if (!Skjor.GetActorReference().IsDead())
RadiantSkjorBlock = False
endif
if (!Vilkas.GetActorReference().IsDead())
RadiantVilkasBlock = False
endif
if (!Farkas.GetActorReference().IsDead())
RadiantFarkasBlock = False
endif
if (AelaCurrentQuest != None)
AelaCurrentQuest.IsActive = True
endif
if (SkjorCurrentQuest != None)
SkjorCurrentQuest.IsActive = True
endif
if (VilkasCurrentQuest != None)
VilkasCurrentQuest.IsActive = True
endif
if (FarkasCurrentQuest != None)
FarkasCurrentQuest.IsActive = True
endif
EndFunction
bool __reconKicked = false
; One off to kick Aela's recon radiant quests post C03
Function KickOffReconQuests()
; make sure this only gets called once
if (__reconKicked)
return
endif
; Debug.Trace("CRQ: Starting recon quest sequence.")
; make sure some threaded interloper doesn't mess with us
RadiantAelaBlock = true
; clear out her existing radiant stuff
if (AelaCurrentQuest)
AelaCurrentQuest.Stop()
AelaCurrentQuest = None
endif
if (AelaNextQuest)
AelaNextQuest.Stop()
AelaNextQuest = None
endif
AelaInReconMode = true
bool keepTrying = true
while (keepTrying)
; Debug.Trace("CRQ: Trying to start specific recon quest...")
if (ReconRadiantKeyword.SendStoryEventAndWait())
keepTrying = false
else
; Debug.Trace("CRQ: Failed to start recon quest; trying again.")
Utility.Wait(0.5)
endif
endwhile
ReconRadiantKeyword.SendStoryEvent()
RadiantAelaBlock = false
EndFunction
int function CompleteRadiantQuest(CompanionsRadiantQuest rq)
; Debug.Trace("CRQ: Completing radiant quest: " + rq)
bool success = rq.Succeeded
; store the questgiver for checking later in this function
Actor qg = rq.Questgiver.GetActorReference()
if (success)
; increment questgiver count
if (qg == Aela.GetActorReference())
AelaQuests += 1
elseif (qg == Skjor.GetActorReference())
SkjorQuests += 1
elseif (qg == Vilkas.GetActorReference())
VilkasQuests += 1
elseif (qg == Farkas.GetActorReference())
FarkasQuests += 1
endif
; increment overall radiant quest count
RadiantQuestsDone += 1
RadiantQuestsDoneInCurrentSegment += 1
endif
; pay the player (even if not successful, there might be a midway reward)
Game.GetPlayer().AddItem(GoldReward, rq.RewardAmount)
; Mr. Book: SHUT IT DOWN!
; rq.Stop()
rq.IsAccepted = False ; so it can get cleared with the cycle
ReOpenAllRadiantQuests()
if (rq == CR13 || rq == CR14)
if (qg == Farkas.GetReference())
; Debug.Trace("CRQ CR13|CR14: Blocking Farkas...")
ShutdownRadiantQuestsFor(Farkas.GetActorReference())
else
; Debug.Trace("CRQ CR13|CR14: Blocking Vilkas...")
ShutdownRadiantQuestsFor(Vilkas.GetActorReference())
endif
endif
CycleRadiantQuests()
; update favorite questgiver
FavoriteQuestgiver = 0
int fqgCount = 0
if (AelaQuests > fqgCount)
FavoriteQuestgiver = 1
fqgCount = AelaQuests
endif
if (FarkasQuests > fqgCount)
FavoriteQuestgiver = 2
fqgCount = FarkasQuests
endif
if (VilkasQuests > fqgCount)
FavoriteQuestgiver = 3
fqgCount = VilkasQuests
endif
if (SkjorQuests > fqgCount)
FavoriteQuestgiver = 4
fqgCount = SkjorQuests
endif
; check to see if it's time to start the next story quest
bool startedStory = False
if (C01.GetStage() < 1)
; count
if (RadiantQuestsDoneInCurrentSegment >= RadiantQuestsUntilC01)
StartStoryQuest(C01)
startedStory = True
endif
elseif (C03.GetStage() < 1)
; count
if (RadiantQuestsDoneInCurrentSegment >= RadiantQuestsUntilC03)
StartStoryQuest(C03)
startedStory = True
endif
elseif (C04.GetStage() < 1)
; count, also min level
if ( (RadiantQuestsDoneInCurrentSegment >= RadiantQuestsUntilC04) && (Game.GetPlayer().GetLevel() >= C04MinLevel) )
StartStoryQuest(C04)
startedStory = True
endif
endif
; reset tracking
if (!startedStory)
RadiantMiscObjQuest.SetObjectiveDisplayed(10, true)
endif
RadiantQuestAccepted = False
RadiantQuestFinished = False
RadiantQuestgiver.Clear()
; reset tracking number
if (startedStory)
RadiantQuestsDoneInCurrentSegment = 0
endif
; return total radiant quests done for Companions
return RadiantQuestsDone
endFunction
Actor function GetFavoriteQuestgiver()
; Shane wants arrays.
if (FavoriteQuestgiver == 1)
return Aela.GetActorReference()
elseif (FavoriteQuestgiver == 2)
return Farkas.GetActorReference()
elseif (FavoriteQuestgiver == 3)
return Vilkas.GetActorReference()
elseif (FavoriteQuestgiver == 4)
return Skjor.GetActorReference()
endif
; We haven't done any radiant quests -- this should only happen when
; starting a story quest manually for testing purposes. Randomly pick
; a favorite in that case.
; Lazily odded to only return Aela and Farkas
int randomQGIndex = Utility.RandomInt(1, 4)
if (randomQGIndex == 1)
AelaIsObserver = true
return Aela.GetActorReference()
elseif (randomQGIndex == 2)
FarkasIsObserver = true
return Farkas.GetActorReference()
elseif (randomQGIndex == 3)
AelaIsObserver = true
return Aela.GetActorReference()
elseif (randomQGIndex == 4)
FarkasIsObserver = true
return Farkas.GetActorReference()
endif
; We absolutely should never get to this point in the function;
; it's a bug if we do. Still making sure we return *something*
; just in case, and complaining to the log.
; Debug.Trace("CSQ: ERROR: Somehow got to the bottom of GetFavoriteQuestGiver function (C00).")
return Skjor.GetActorReference()
endFunction
function StartStoryQuest(CompanionsStoryQuest storyToStart)
CurrentStoryQuest = storyToStart
; Debug.Trace("CSQ: Starting story quest: " + CurrentStoryQuest)
storyToStart.SetStage(1)
StoryQuestIsRunning = True
RadiantMiscObjQuest.SetObjectiveDisplayed(10, false)
endFunction
function CompleteStoryQuest(CompanionsStoryQuest storyToEnd)
; Debug.Trace("CSQ: Ending " + storyToEnd)
storyToEnd.Teardown()
storyToEnd.Stop()
while(storyToEnd.IsRunning())
; Debug.Trace("CSQ: Waiting for quest to end: " + storyToEnd)
Utility.Wait(0.5)
endwhile
CurrentStoryQuest = None
StoryQuestIsRunning = False
if ( (storyToEnd != C03) && (storyToEnd != C04) && (storyToEnd != C05) )
RadiantMiscObjQuest.SetObjectiveDisplayed(10, true)
endif
if (storyToEnd == C02)
OpenSkyforge()
endif
endFunction
Function AddHarbingerPerks()
Aela.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Farkas.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Vilkas.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Athis.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Ria.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Njada.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
Torvar.GetActorReference().SetRelationshipRank(Game.GetPlayer(), 2)
EndFunction
Function CurePlayer()
; Debug.Trace("WEREWOLF: Curing the player of lycanthropy.")
; turn you back if you're currently a werewolf
if (WerewolfChangeTrackingQuest.IsRunning() && WerewolfChangeTrackingQuest.GetStage() < 100)
WerewolfChangeTrackingQuest.SetStage(100)
endif
; take away spell and immunity
Game.GetPlayer().RemoveSpell(BeastForm)
Game.GetPlayer().RemoveSpell(WerewolfImmunity)
; FIX FOR 81462
Game.GetPlayer().RemoveSpell(HircinesRingPower)
; END FIX FOR 81462
; you can't get into the Underforge anymore, either
TempUnderforgeAccess = false
PlayerHasBeastBlood = false
; Let everyone know you are no longer a werewolf
Game.GetPlayer().SendLycanthropyStateChanged(false)
EndFunction
Function Shutup(Actor toBeShut)
if (GenericDialogueSuppressor1.GetReference() == None)
GenericDialogueSuppressor1.ForceRefTo(toBeShut)
elseif (GenericDialogueSuppressor2.GetReference() == None)
GenericDialogueSuppressor2.ForceRefTo(toBeShut)
elseif (GenericDialogueSuppressor3.GetReference() == None)
GenericDialogueSuppressor3.ForceRefTo(toBeShut)
elseif (GenericDialogueSuppressor4.GetReference() == None)
GenericDialogueSuppressor4.ForceRefTo(toBeShut)
else
; Debug.Trace("C00: Can't shut anyone else up.")
endif
EndFunction
Function UnShutup(Actor toBeUnShut)
if (GenericDialogueSuppressor1.GetReference() == toBeUnShut)
GenericDialogueSuppressor1.Clear()
elseif (GenericDialogueSuppressor2.GetReference() == toBeUnShut)
GenericDialogueSuppressor2.Clear()
elseif (GenericDialogueSuppressor3.GetReference() == toBeUnShut)
GenericDialogueSuppressor3.Clear()
elseif (GenericDialogueSuppressor4.GetReference() == toBeUnShut)
GenericDialogueSuppressor4.Clear()
else
; Debug.Trace("C00: " + toBeUnShut + " was never shut up.")
endif
EndFunction
Function SwapFollowers()
; Debug.Trace("CSQ: Swapping followers.")
; called when a story quest is assigning you a follower (C01, C03, C05, and C06)
; so that you don't end up with too big of an entourage.
if (PlayerFollowerCount.GetValue() > 0)
FollowerScript.DismissFollower(2)
; Because the Dark Brotherhood does its own jimminess instead of
; using the normal follower system, we have to dismiss manually.
if (DBScript.CiceroFollower == 1)
CiceroFollower.SetPlayerTeammate(false)
DBScript.CiceroFollower = 0
DBScript.CiceroState = 1
CiceroFollower.EvaluatePackage()
endif
if (DBScript.Initiate1Follower == 1)
DBInitiateFollower1.SetPlayerTeammate(false)
DBScript.Initiate1Follower = 0
DBScript.Initiate1State = 1
DBInitiateFollower1.EvaluatePackage()
endif
if (DBScript.Initiate2Follower == 1)
DBInitiateFollower2.SetPlayerTeammate(false)
DBScript.Initiate2Follower = 0
DBScript.Initiate2State = 1
DBInitiateFollower2.EvaluatePackage()
endif
endif
PlayerFollowerCount.SetValue(1)
EndFunction
Function CleanupFollowerState()
PlayerFollowerCount.SetValue(0)
EndFunction