1232 lines
38 KiB
Plaintext
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
|