questtracker.swf
The Quest Tracker is Trove's heads-up objective overlay, shown persistently during gameplay to display the current adventure's dungeons, the Golden Thread personal objective, the hourly challenge, badge progress, Delve depth/timer information, and transient event notifications. Entries are stacked vertically in a
StackListand updated in real-time by the game engine.
Document/main class: QuestTracker (extends _kiwi.Core.UIComponent)
SWF-specific classes: 13
Main class: QuestTracker
QuestTracker is the root document class. It owns a single StackList (questsStackList, item spacing 12 px) and a Dictionary (entries) keyed by entry-type sentinel strings. The game sends all data via ExternalInterface callbacks. On console, the tracker starts hidden (visible = false) and waits for onTargetFrame() before showing and calling setupTranslation().
A perspective projection is applied to the root on ADDED_TO_STAGE: fieldOfView = 36.656964, projectionCenter = new Point(275, 200).
Sentinel constants (entry type keys)
| Constant | Value |
|---|---|
GOLDEN_ID |
"_POBJECTIVE_" |
BADGE_ID |
"_BADGE_" |
CHALLENGE_ID |
"_CHALLENGE_" |
ALERT_ID |
"_ALERT_" |
NOTIFICATION_ID |
"_NOTIFICATION_" |
DELVE_ID |
"_DELVE_" |
ALERT_TIMER (public static) |
"_ALERT_TIMER_" |
Public methods (all also registered as ExternalInterface callbacks)
updateBadge(badgeId, displayName, taskDesc, badgeImage, goal, current)— creates or updates the singleBadgeEntry; setsbadgeId,badgeImage, and task progress viasetTaskProgress(taskDesc, goal, current). Goal comes before current here, unlike every other progress pair on this screen; a goal of0shows the task as plaintaskTextwith no progress bar.removeBadge()— removes theBadgeEntryfrom the stack viaremoveQuest(BADGE_ID).updateQuest(questId, difficulty, name, progress, failed)— creates or updates aQuestEntry;complete = progress >= 1. One row per dungeon on the player's current adventure, keyed by the engine's quest id — the only entry type that can appear more than once (every other type sits under a fixed sentinel key).removeQuest(questId)— removes the entry stored under the given key from bothentriesandquestsStackList. Any key works, quest id or sentinel:removeBadge,removeChallenge,removeGoldenThreadObjectiveandonAlertTimerall route through it (removeNotificationandremoveDelveInforemove their entries directly).updateGoldenThreadObjective(name, desc, current, goal, rewardImage, rewardName, rewardQty, bonusQty, topIcon, bottomIcon, showTimer)— creates or updates thePersonalObjectiveEntry;nameis the title shown intxt_questName(the entry itself is always keyedGOLDEN_ID); manages dual-icon display (ifbottomIconis non-empty, shows it astopIconImageandtopIconasbottomIconImage); callssetTimerVisibility.updateGoldenThreadObjectiveWithTimer(name, timerVisible, timerMs, desc, current, goal, rewardImage, rewardName, rewardQty, bonusQty, topIcon, bottomIcon)— variant that also callssetTimer(timerMs, timerVisible)on the entry;timerMsis the time remaining in milliseconds (shown with hours).setGoldenThreadComplete()— setsPersonalObjectiveEntry.progress = goalto mark it done.removeGoldenThreadObjective()— delegates toremoveQuest(GOLDEN_ID).updateChallenge(challengeName, description, level, current, goal, rewardName, rewardQty, rewardImage, bonusName, timerMs, dailyBonusName, dailyBonusQty, dailyBonusComplete, alertType)— on first creation, ifalertType != ""also creates anAlertEntrykeyedALERT_ID; creates theChallengeEntry; sets all fields andsetTimer(timerMs).bonusNameis the class-bonus line (txt_bonus, under the description);timerMsis the time left in milliseconds.removeChallenge()— delegates toremoveQuest(CHALLENGE_ID).onAlertTimer(event:DataEvent)— handler forALERT_TIMERevents fromAlertEntry; callsremoveQuest(ALERT_ID).addNotification(text)— creates anEventHighlight, adds it to the stack, starts aIggyTweenbouncing it in from x=-20 to x=10 (Bounce.easeOut, 2 sec). On tween finish callshideNotification.hideNotification()— fades theEventHighlightout (alpha 1→0, 1 secIggyTween); on finish callsremoveNotification.removeNotification()— removesEventHighlightfrom the stack.addDelveInfo(questName, title, depth)— creates theDelveEntryon the first call (later calls only updatetitle,depthandquestName) and moves it to index 0 viaquestsStackList.swapChildrenAt(0, numChildren-1).updateDelveInfo(requirementIndex, description, status)— callsDelveEntry.setRequirement.updateDelveTime(timeLeftMs, warning)— setsDelveEntry.timerandDelveEntry.warning. The value is the floor's time left in milliseconds (it feedsTimeUtil.localizeTime, whose unit table is in ms); it counts down and goes negative once the floor is over its time. No callback reports a floor's total time: the first value sent for a floor is its full allowance. The engine sends it repeatedly, many times per second.removeDelveInfo()— removes theDelveEntryfrom the stack.resizeDelveInfo(newSize)— trimsDelveEntry.m_requirementstonewSizeelements.clearDeltaliths()— clears theDelveEntry'srewardImageContainerchildren. The engine sends it on every delve floor.addDeltalith(textureName)— appends anObjectPreview(32,32)toDelveEntry.rewardImageContainer, 33 px after the previous one. The argument is the deltalith's texture name, e.g.questreward.placeable/deco/delve/deltalith_death_boon.unlocked.0.
Key fields
questsStackList : StackList— the single vertical container, placed on the root timeline at (11, 5) on the 350 × 400 stage; item spacing 12 px.entries : Dictionary— maps sentinel strings to their live entry instances.notificationTween : IggyTween— holds the current bounce-in / fade-out tween for theEventHighlight.
Frame scripts / timeline
- frame 0 (label
PC) —stop()(PC mode). - frame 10 (label
Console) —stop()(Console mode; tracker already made visible viaonEnterFrameloop at this point).
Runtime dependencies & integration
- All
ExternalInterface.addCallbackcalls are guarded byIggyFunctions.inIggy. - Callbacks registered:
updateBadge,removeBadge,updateQuest,removeQuest,updateGoldenThreadObjective,removeGoldenThreadObjective,updateChallenge,removeChallenge,setGoldenThreadComplete,addNotification,addDelveInfo,updateDelveInfo,updateDelveTime,removeDelveInfo,resizeDelveInfo,clearDeltaliths,addDeltalith,updateGoldenThreadObjectiveWithTimer. IggyTweenused for notification slide-in (Bounce.easeOut) and fade-out animations.fl.transitions.easing.Bounceimported directly for the notification tween.draw()override: whenInvalidationType.DATAis pending, callsquestsStackList.RefreshLayout().__setPerspectiveProjection_listener onADDED_TO_STAGEsets a fixed perspective projection onroot.- On console (
IsConsole()): starts invisible, usesENTER_FRAMEloop checkingonTargetFrame()before showing and callingsetupTranslation(). - In editor (
!inIggy): populates example entries for layout preview. - No outbound calls from the SWF's own classes: none of them uses
ExternalInterface.call. The only outbound traffic is the shared framework's — eachObjectPreviewcallsUIComponent.CheckTextureExistsfor its texture (and registersobjectPreviewReady), andUIComponentmakes its platform queries. - The tracker reports no size; the engine places it. It is stacked directly under
starbar.swf, at whatever height the star bar reports throughNOTIFY_RESIZED, with both hung off the same right edge — so this 350 px stage starts 24 px inside the star bar's 374 px strip. The engine's box for the tracker is 350 px wide regardless of the SWF's declared stage, and drawing past it is not clipped. - The 18 callbacks are the whole engine contract; no public field is engine-written.
sortOrder/secondarySortOrder,badgeRank,displayTypeandisCompleteare never read in this SWF (StackListkeeps arrival order and has no sort), andactivityIdonly by the track/remove button handlers, whose buttons this SWF does not place. The entry classes share their names withactivitytrackerui.swf, which does sort onsortOrderand useactivityId/badgeRank.
Other game-specific classes
QuestEntry— [Embed symbol18] Single adventure-dungeon row:txt_questName:TextField,questDifficultyIcon:MovieClip(frames:"1star","2star","3star","5star","complete","failed";difficulty0–3 picks the first four, clamped), focus background.sortOrder=51. Background height auto-fits to text height.ChallengeEntry— [Embed symbol95] Hourly challenge row with name, description, level badge, progress ("current/goal"), countdowntimer:CountdownTimer, clock animation, reward image (ObjectPreview 32×32), reward quantity/name, class-bonus text (txt_bonus), daily-bonus section, and daily-bonus-complete tick.sortOrder=11. When timer < 60 s remaining, showsclockAnim.$Challenges_TimeUpshown when expired. 3-frame platform variant.PersonalObjectiveEntry— [Embed symbol46] Golden Thread (personal objective) row:txt_questName,txt_description,txt_progress(shown only whengoal > 1), reward preview (ObjectPreview 32×32), dual icon previews (top/bottom, 64×64),CountdownTimer,objectiveCompletedMC. SupportstrackBtn:LabelButton(dispatchesTRACK_ACTIVITYDataEvent) andremoveBtn:BaseButton(dispatchesREMOVE_ACTIVITY). Translates button labels$ActivityTrackerTrackButton/$ActivityTrackerTrackedButton. This SWF's symbol46 places neither button (nortxt_source) and nothing here listens for the events; they are used by the same class inactivitytrackerui.swf.sortOrder=1. 3-frame platform variant.BadgeEntry— [Embed symbol109] Badge progress row: 64×64 badge image,BadgeProgressBaror plaintaskText, reward carousel (rewardsCarrouselMC with up to 5 reward slotsreward00…reward04, left/right arrow buttons). DispatchesREWARD_ROLLOVER/REWARD_ROLLOUTDataEvents with position data for tooltip placement. In this SWF the carousel is inert: symbol109 has norewardsCarrouselchild and nothing callsaddReward.KiwiTextUtil.resizeFontapplied to name and task text.sortOrder=1.AlertEntry— [Embed symbol168] Transient challenge-alert pop-up: title$HourlyChallengeTitle("Hourly Challenge") over the challenge name. Plays a"tweenIn"animation on construction, then a"tweenOut"after the timer (DEFAULT_TIMER=7000 msorRAMPAGE_TIMER=10000 ms, polled every 500 ms). On timer complete dispatchesQuestTracker.ALERT_TIMERevent. Height is fixed at 71.iconContainerframes byalertTypestring; falls back to"default"if the label does not exist (its labels arenew,default,rampage). Itsiconchild is sent to thealertTypeframe too:quest,rampage,minigameportal,pvp,monster,amberine,lazul,th'lan,gabbro.DelveEntry— [Embed symbol61] Delve dungeon-run tracker: title, depth, timed counter (timerFieldturns red whenwarning=true, is hidden at 0, and shows negative time as-before the absolute value), requirement list (descFieldwith per-requirement colour coding by status: 0 white=normal, 1 grey=met, 2 red=failed;completeFieldshows once every requirement is met), and arewardImageContainerof DeltalithObjectPreviewimages.TimeUtil.localizeTimeused for timer display. 3-frame platform variant.EventHighlight— [Embed symbol50] Transient notification banner:content:MovieClipwrapstxt_descriptionandbackground. Description auto-sizes; background height fits text. Animated in/out byIggyTweeninQuestTracker.SimpleProgressBar— No embed; base progress-bar component. MasksfillingMaskMCwidth proportionally tocurrentValue / maxValue.BadgeProgressBar— [Embed symbol106] ExtendsSimpleProgressBar; addsprogressText:TextField(shows"current/maxValue") andtaskText:TextField. OverridesmaxValue/currentValuesetters to updateprogressText.
QuestTracker_fla timeline symbols (8 classes)
AlertIconGrp_4— icon group MC for the alert entry (AlertEntry.iconContainer); framesnew,default,rampage.new_timer_bar_5— animated timer bar symbol, onAlertIconGrp_4'snewframe.alertIconsImageGrp_11— alert icon image group (iconContainer.icon), one frame per alert type.default_timer_bar_18— default timer bar style, onAlertIconGrp_4'sdefaultframe.rampage_timer_bar_20— rampage-specific timer bar style, onAlertIconGrp_4'srampageframe.clock_animation_34— ticking clock animation used inChallengeEntry.badge_35— animated badge level indicator forChallengeEntry(gotoAndStop(level+1)).quest_difficulty_icon_45— difficulty star icon used inQuestEntry.
Asset-wrapper symbols (1 class)
image — bare image/bitmap container symbol.
Notable logic
- Delve always at top: When
addDelveInfocreates aDelveEntry, it immediately swaps it to position 0 inquestsStackListso the Delve tracker always appears above all other entries.StackList.swapChildrenAtexchanges the two entries, so whatever was first moves to the bottom; everything else keeps arrival order. - Dual-icon logic in Golden Thread: Both update callbacks end with two texture names. With only the first set, it is the top icon and there is no bottom icon; with both set, the second is the top icon and the first sits under it.
- Deltalith names: The prefab path inside an
addDeltalithtexture name also keys that deltalith's in-world sign text —placeable/deco/delve/deltalith_death_boongives$prefabs_placeable_deco_delve_deltalith_death_boon_interactable_sign_title("Death Boon") and the matching_sign_contentkey;prefabs_placeable_deco_delve.binfabholds 77 such pairs. The stock tracker shows only the 32×32 icon, with no name or tooltip. - Alert auto-dismiss:
AlertEntryis self-timing — it starts its ownTimerin the constructor and firesQuestTracker.ALERT_TIMERwhen done.QuestTracker.onAlertTimerthen callsremoveQuest(ALERT_ID)to clean it up. - Notification tween chain:
addNotification→ bounce-inIggyTween→motionFinishCallback = hideNotification→ fade-outIggyTween→motionFinishCallback = removeNotification. No explicit timer; the animation drives the lifecycle. - Perspective projection: The 3D perspective projection applied to
root(fieldOfView=36.656964,projectionCenter=(275,200)) suggests the tracker may use 3D transforms or depth effects on some entry animations. - Console show-defer: On console the entire tracker is hidden until
onTargetFrame()returns true (i.e. the SWF has reached the target platform frame), at which point it becomes visible and callssetupTranslation(). This prevents a flash of unstyled content before the console-specific fonts/layout are loaded. - Challenge + Alert pairing: On the first call to
updateChallenge, ifalertType != "", anAlertEntryis created alongside theChallengeEntryto show a pop-up announcement. Subsequent calls update the existingChallengeEntrywithout creating a new alert.