Oblivion:Ten Ancestors
Rumpus's work on Ten Ancestors quest: Rumpus — 2022-07-23 2:45 PM Did some looking into the Ten Ancestors quest. It seems pretty airtight without being able to glitch global values. Here are my formatted notes in case anyone wants to do more research without having to start from scratch.
Ayleid Research
Experiments are conducted using Oblivion 1.2.0416 on Steam with OBSE 1.2 installed for the GetBaseObject
command.
Background Information
- Each class of objects has a BaseID, whom all instances share.
- Each object in the world has a RefID, unique to that instance.
- Objects generated at runtime have dynamically allocated RefIDs, prefixed with ‘ff’.
- Apparently BaseIDs can be dynamic too?
- Objects with different BaseIDs do not stack in the inventory.
Script Analysis
- The quest can be started by selling a
MS21AyleidStatue
to a merchant, or by delivering one to Umbacano. - Umbacano accepts any instance of
MS21AyleidStatue
. - When Umbacano gets his grubby mitts on a statue, he transmutes it into a
MS12AyleidStatueUmbacano
. - Any
MS21AyleidStatue
sold to a merchant ends up in Umbacano’s display case. - Quest stages are advanced by the dialogue topic MS21StatueGive
- The global value
UmbacanoCount
is incremented by MS21StatueGive and MS21statuescript. - Giving statues 3-6 set the stage to
UmbacanoCount + 50
. Possible vulnerability. - Fame is added at Quest Stage 60.
- If the last statue is sold instead of given, the quest is advanced to stage 100 and no fame is earned.
Skull of Corruption Duping
Attempting to skull-dupe a MS21AyleidStatue
produced one statue with a BaseID of 0002ab48
and a RefID of ff000828
(the original legit statue), as well as another statue with a dynamic BaseID (ff000823) and a dynamic RefID (ff000827). Umbacano accepted the original statue, but not the duplicated one. Selling the duplicate does not trigger Jollring to deliver the letter and the duplicate does not end up in Umbacano’s display case.
Repeating the process with the legit statue produced a duplicate with a dynamic BaseID of ff000830
and a dynamic RefID of ff000834
. Interestingly, picking up and dropping the duplicates does not reallocate their dynamic BaseIDs. Could this potentially crash the game if repeated long enough to exhaust the FormID address space?
Skull-duping a skull-duplicate with BaseID ff00084c
and dynamic RefID produced a statue with BaseID ff00084c
and a new dynamic RefID.
Attempting to skull-dupe a MS12AyleidStatueUmbacano
produced two statues, both with a BaseID of 000844c4
and the statue’s original RefID. They did not stack in the inventory; when dropping them, dropping the second erased the first from existance. Obviously Umbacano did not accept either one, and there is no legit way to obtain a MS12AyleidStatueUmbacano
before turning in at least one statue so it could not possibly trigger Jollring to deliver the letter. Fencing the duplicates do not cause them to appear in Umbacano’s display case.
TLDR * Skull-duping a legit statue produces a new statue with a dynamic BaseID. * Dynamic BaseID statues are of no use for the quest. * Skull-duping a statue Umbacano already has creates a duplicate with an identical RefID. * Two statues with the same RefIDs cannot exist in the world at the same time, dropping one while the other is on the ground overwrites its existence. * Skull-duping a skull-duplicate produces a new statue with the same dynamic BaseID as the original.
Scroll Duping
Attempting to scroll-dupe a MS21AyleidStatue
produced a single statue with a BaseID of 0002ab48
and a dynamic RefID, the same as just dropping it. The same occured when trying to dupe a stack.
Attempting to scroll-dupe a MS12AyleidStatueUmbacano
produced a single statue with a BaseID of 000844c4
and the statue’s original RefID, the same as just dropping it. The same occured when trying to dupe a stack.
Scroll-duping a duplicate of a MS21AyleidStatue
produced by skull-duping with dynamic BaseID ff00084c
and dynamic RefID of ff000855
produced two statues, each with the original BaseID and a new dynamic RefID (ff000856
and ff000857
). Neither was accepted by Umbacano.
TLDR * You cannot scroll-dupe a legit statue. * You cannot scroll-dupe a statue Umbacano already has. * You can scroll-dupe a duplicate created by skull-duping. * Scroll-duplicates of skull-duplicates stack, but are of no use for the quest.
CS Data
Quest [MS21] The Collector
Stage | Abv. Log Entry | Result Script |
---|---|---|
5 | EMPTY | jollringref.evp
|
10 | I’ve received a note from a man called Umbacano; he’s interested in the Ayleid statue I found and sold. I should find him in the Imperial City and see what he wants. | player.additem ms21umbacanonote 1
|
15 | I’ve spoken to a collector of Ayleid artifacts named Umbacano. He has offered to pay me handsomely for any Ayleid Ancestor statues that I bring him. | NONE |
20 | Umbacano has offered to pay well for any more statues I find. I should look for more of them in Ayleid ruins, and bring them to him. If I can find all ten of the statues, he will pay me a large bonus. | if umbacanoCount == 10 addtopic ms21AnotherTask setstage ms21 100 endif
|
40 | Umbacano’s research has uncovered evidence that some of the Ayleid statues he is looking for may be hidden in these ruins: Moranda, Mackamentain, Wenyandawik, Ninendava, Fanacas. | ShowMap MackamentainMapMarker ShowMap WenyandawikMapMarker ShowMap NinendavaMapMarker ShowMap FanacasMapMarker
|
52 | I have brought Umbacano a second Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
53 | I have brought Umbacano a third Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 10
|
54 | I have brought Umbacano a fourth Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
55 | I have brought Umbacano a fifth Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
56 | I have brought Umbacano a sixth Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
57 | I have brought Umbacano a seventh Ayleid statue. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
58 | I have brought Umbacano a eighth Ayleid statue. Only two more to go. | player.additem gold001 500 umbacanoref.moddisposition player 5
|
59 | I have brought Umbacano a ninth Ayleid statue. If I bring him one more he will pay be a bonus of 5,000 gold. | player.additem gold001 500 umbacanoref.moddisposition player 10
|
60* | I have brought Umbacano all ten of the Ayleid statues. He was very pleased and rewarded me well. | player.additem gold001 5500 umbacanoref.moddisposition player 25 modpcfame 1 setstage ms21 100
|
100* | EMPTY | NONE |
MS21StatueShow
Abrv. Response | Add Topics | Result Script | Conditions |
---|---|---|---|
Ah! One of the Ten Ancestors! Hold it up […] | MS21AyleidStatueTopic UmbacanoTopic | setstage ms21, 15
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 0.00) AND (GetStage MS21 == 0.00) AND (GetIsID Umbacano == 1.00)
|
MS21StatueGive
Abrv. Response | Add Topics | Result Script | Conditions |
---|---|---|---|
You have exceeded my fondest hopes, my […] | MS21AnotherTask | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 60
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 9.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
You are doing very well in your treasure […] | MS21AnotherTask | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 59
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 8.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
I had never thought to see eight of the […] | MS21AnotherTask | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 58
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 7.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
I am impressed. Only three more statues […] | MS21AnotherTask | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 57
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 6.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
Beautiful. Exquisite. You have proven […] | MS21AnotherTask | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 53
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 2.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
Ah, a second Ancestor. Excellent. I had […] | NONE | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 setstage ms21, 52
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 1.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
Well done! Here is your payment as promised. | NONE | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 set ms21.stageVar to umbacanoCount + 50 setstage ms21, ms21.stageVar
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount > 0.00) AND (GetStage MS21 >= 20.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
Wonderful! Remember, I will be happy to […] | NONE | set umbacanoCount to umbacanoCount + 1 player.removeitem ms21ayleidstatue, 1 player.additem gold001 500 setstage ms21 20
|
(GetItemCount MS21AyleidStatue > 0.00) AND (GetGlobalValue UmbacanoCount == 0.00) AND (GetStage MS21 == 15.00) AND (GetStage MS21 < 100.00) AND (GetIsID Umbacano == 1.00)
|
NPCs
Name | BaseID | RefID | Attached Script |
---|---|---|---|
Umbacano | 0002ab4e
|
0002b445
|
UmbacanoScript |
Jollring | 0002ab4c
|
0002b1a6
|
JollringScript |
Item Classes
Name | Editor ID | BaseID | Weight | Attached Script |
---|---|---|---|---|
Ayleid Statue | MS21AyleidStatue | 0002ab48
|
3.0 | MS21statuescript |
Ayleid Statue | MS12AyleidStatueUmbacano | 000844c4
|
0.0 | MS21AyleidStatueUmbacanoScript |
Staff of Worms | MGStaffofWorms | 0004a24e
|
10.0 | NONE |
Skull of Corruption | DASkullCorruption | 00027116
|
10.0 | DASkullofCorruptionStaffScript |
Beguiling Touch | ScrollStandardCharmTouch1Novice | 00084af1
|
0.1 | NONE |
Item Instances
Location Name | Location Editor ID | Base Editor ID | Ref Editor ID | RefID |
---|---|---|---|---|
Culotte | Culotte | MS21AyleidStatue | NONE | 0008440b
|
Fanacas | Fanacas | MS21AyleidStatue | NONE | 00017378
|
Necromancer’s Asylum | Mackamentain03 | MS21AyleidStatue | NONE | 00033e59
|
Moranda Abaspania | Moranda03 | MS21AyleidStatue | NONE | 0005183b
|
Ninendava | Ninendava | MS21AyleidStatue | NONE | 0008440a
|
Vilverin Sel Sancremathi | Vilverin04 | MS21AyleidStatue | NONE | 0008b5fd
|
Welke Edesel | Welke03 | MS21AyleidStatue | NONE | 00093463
|
Wendelbek Sel Aran Mathmedi | Wendelbek03 | MS21AyleidStatue | NONE | 0004c33e
|
Wendir Nagasel | Wendir02 | MS21AyleidStatue | NONE | 00093be1
|
Wenyandawik Edesel | Wenyandawik02 | MS21AyleidStatue | NONE | 0009611b
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue1 | 0002b44b
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue1A | 0000855a
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue2 | 0002b44c
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue3 | 0002b44d
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue4 | 0002b44e
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue5 | 0002b44f
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue6 | 0002b454
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue7 | 0002b453
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue8 | 0002b452
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue9 | 0002b451
|
Umbacano’s Private Quarters | ICTalosPlazaUmbacanoManorUpstairs | MS12AyleidStatueUmbacano | MS21Statue10 | 0002b450
|
MS21Script
scn MS21Script short foundCount ; how many statues has the player found? short sellCount ; how many statues has player sold? short questCount ; how many statues has the player brought to Umbacano? ;short umbacanoCount ; how many statues does Umbacano possess? short umbacanoLastCount ; used to trigger enabling of the statues short startDay short stageVar ; used to set the stage based on umbacanoCount short stolen ; set to 1 if the player steals any of the statues he sold to Umbacano short placeStatues ; set to 1 when it is time to update display case float fQuestDelayTime ; for quest script timing short movestatue1 ; set to 1 when statue1 is moved into its case begin gamemode if placeStatues == 1 if umbacanoLastCount < umbacanoCount set umbacanoLastCount to umbacanoLastCount + 1 ; enable the next statue in Umbacano's house if umbacanoLastCount == 1 ; message "DEBUG: enable statue 1" ms21statue1.enable elseif umbacanoLastCount == 2 ; message "DEBUG: enable statue 2" ms21statue2.enable elseif umbacanoLastCount == 3 ; message "DEBUG: enable statue 3" ms21statue3.enable elseif umbacanoLastCount == 4 ; message "DEBUG: enable statue 4" ms21statue4.enable elseif umbacanoLastCount == 5 ; message "DEBUG: enable statue 5" ms21statue5.enable elseif umbacanoLastCount == 6 ; message "DEBUG: enable statue 6" ms21statue6.enable elseif umbacanoLastCount == 7 ; message "DEBUG: enable statue 7" ms21statue7.enable elseif umbacanoLastCount == 8 ; message "DEBUG: enable statue 8" ms21statue8.enable elseif umbacanoLastCount == 9 ; message "DEBUG: enable statue 9" ms21statue9.enable elseif umbacanoLastCount == 10 ; message "DEBUG: enable statue 10" ms21statue10.enable endif endif if umbacanoLastCount == umbacanoCount ; all statues enabled set placeStatues to 0 set fQuestDelayTime to 10 endif endif end
MS21statuescript
scn MS21statuescript short found ; set to 1 when player first picks up the statue short playerHasMe ; set to 1 when player has this item in inventory short sellDay ; day the statue is sold (to time when it goes to Umbacano) short toUmbacano ; set to 1 after Umbacano owns this statue begin OnSell player set playerHasMe to 0 set sellDay to gameDaysPassed return ; set ms21.sellCount to ms21.sellCount + 1 ; setstage MS21 5 ; move to Umbacano's house (so player can't buy it right back) ; set umbacanoCount to umbacanoCount + 1 ; set ms21.placeStatues to 1 ; set toUmbacano to 1 ; removeMe end begin OnSell ; generic block, we only get here if player wasn't the one selling (i.e. player was buying it) set sellDay to 0 ; reset sellday if player buys it back before exiting barter menu end begin onAdd player ; first time player finds this statue, mark it in ms21 script if found == 0 if getquestrunning ms21 == 0 startquest ms21 endif set found to 1 set ms21.foundCount to ms21.foundCount + 1 if MS21Statue1.getdisabled == 0 && MS21.movestatue1 == 0 && MS21Statue1.stolen == 0 && getstage MS21 >= 20 MS21Statue1.disable set MS21.movestatue1 to 1 MS21Statue1A.enable endif endif set playerHasMe to 1 end begin gamemode ; immediately when player sells it, put it in Umbacano's house if playerHasMe == 0 if toUmbacano == 0 && sellDay > 0 set ms21.sellCount to ms21.sellCount + 1 setstage MS21 5 ; move to Umbacano's house (so player can't buy it right back) set umbacanoCount to umbacanoCount + 1 set ms21.placeStatues to 1 set toUmbacano to 1 removeMe endif endif end
MS21AyleidStatueUmbacanoScript
scn MS21AyleidStatueUmbacanoScript short stolen ; script on the statues in Umbacano's house begin OnAdd player set MS21.stolen to 1 set stolen to 1 end begin OnDrop player set stolen to 1 end
UmbacanoScript
scn UmbacanoScript ; used in MS21, MS22, MS27 short sayCount begin gamemode if getstage ms27 == 80 && getiscurrentpackage MS27UmbacanoToThrone == 1 && getsitting == 3 setstage ms27 85 endif end begin OnPackageStart MS21UmbacanoPlaceStatue1 set MS21.fQuestDelayTime to .1 end begin OnPackageDone MS21UmbacanoPlaceStatue1 set MS21.placeStatues to 1 end begin OnPackageStart MS21UmbacanoPlaceStatues set MS21.fQuestDelayTime to .1 end begin OnPackageDone MS21UmbacanoPlaceStatues set MS21.placeStatues to 1 end begin OnPackageStart MS27WaitAtNenalata additem LL2NPCWeaponBossCombDaggerLvl100 1 end begin OnPackageStart MS27UmbacanoActivateCarvingWall set MS27CarvingWall.timer to Say MS27Voice MS27CarvingWall.activate umbacanoRef 1 end begin OnPackageStart MS27UmbacanoWaitAtCarvingWall if sayCount == 0 SayTo player MS27Voice set sayCount to 1 endif end begin OnPackageStart MS27UmbacanoToThrone if sayCount < 2 Say MS27Voice set sayCount to 2 endif end begin OnDeath if getstage ms27 >= 60 && getstage ms27 < 80 setstage ms27 89 endif if getstage ms27 == 80 ; trigger undead attack so player can escape setstage ms27 84 endif if getstagedone ms27 55 == 1 && getstage MS27 == 85 setstage ms27 95 endif if getstagedone ms27 86 == 1 ; turn off exterior minions when he dies as King Nenalata03Start.disable endif ; complete MS21 setstage MS21 100 end
JollringScript
scn JollringScript ; QUESTS: ; MS21 ; MS22 ; MS27 short escorting ; if 1, jollring will run his escort package short greeting ; if 1, jollring will run his ambush/greet package begin gamemode if escorting == 1 && getiscurrentpackage ICJollringEscortPlayerToUmbacano == 0 evp ; "failsafe" if getiscurrentpackage ICJollringEscortPlayerToUmbacano == 0 set escorting to 0 endif endif end begin onPackageEnd ICJollringEscortPlayerToUmbacano if escorting == 1 umbacanoref.sayto player ms21Special set escorting to 0 endif end begin onPackageEnd ICJollringEscortPlayerOut set escorting to 0 end begin onPackageStart ICJollringSleep set greeting to 1 end