guideui.swf
The Guide UI is Trove's Pathfinder (
$GuideUI, "PATHFINDER"): the in-game compendium that answers where something comes from, displayed whenever the player opens the Guide (collection/achievement/store listing). It shows categorised content tiles (blueprints, activities, purchase options, badges, challenges, personal objectives) with a live search bar, a hide-completed checkbox, and a progress bar for the current guide collection.
Document/main class: GuideUI (extends _kiwi.Core.UIComponent)
SWF-specific classes: 20
Main class: GuideUI
GuideUI is the root document class. It owns two ScrollableTileView instances — categoryView (left column of category buttons) and contentView (right column of content rows) — and maintains a Dictionary-of-Dictionary called categoryMap keyed by category-id string then by entry-id. The game populates it entirely via ExternalInterface callbacks registered in configUI().
On construction it calls addFrameScript(0, frame1, 10, frame11, 20, frame21) for PC / Console / ConsoleLoc platform branching, then __setProp_mainTitle_Scene1_header_0() to set up the timeline window-header component.
Public methods
setMainTitle(title:String) : void— sets themainTitlemovie-clip's.titleproperty.setCollectedLabel(label:String) : void— updates the progress-bar's collected-label text, applying 3-unit letter-spacing.setHideCollectedLabel(label:String) : void— sets the "hide completed" checkbox label.addCategory(id:String, label:String, iconImage:String, isCollected:Boolean) : void— creates aCategoryEntrybutton, adds hover/click listeners, pushes it intocategoryView, creates thecategoryMap[id]slot. First category added auto-dispatches a CLICK to select itself.selectCategory(id:String) : int— deselects the previous category, clearscontentView, repopulates it fromcategoryMap[id], sorts, updates header dividers, callsExternalInterface.call("SelectCategory", id). Returns the category's index.selectCategoryIndex(index:int) : void— programmatically clicks a category by numeric index.addHeader(categoryId:String, activityId:int, title:String, description:String, descriptionEmpty:String, hidden:Boolean) : void— creates or updates aGuideUIHeaderincategoryMap. Every header getssortOrder = 0, so headers always sort to the top of the page.hidden(negated intoshowActivities) changes nothing visible: the setter ignores its value and only re-fits the background.activateContext(categoryId:String, contextId:int, name:String, description:String, sortOrder:int) : void— creates or updates anActivateContextentry; setscurrentMethodso subsequentingredientEntry/animatedEntry/textEntry/updateBlueprintcalls attach to it. A new entry takessortOrderfrom the last argument, but a re-sent one is givencontextIdas itssortOrderinstead.ingredientEntry(iconImage:String, name:String, have:Number, need:Number, rarity:String, tooltip:String, slotData:int) : void— appends anIngredientRowtocurrentMethod.ingredientsStackList.updateBlueprint(textureName:String, scale:Number) : void— appends aBlueprintEntrytocurrentMethod.ingredientsStackList.animatedEntry(textureName:String) : void— appends anAnimatedEntrytocurrentMethod.ingredientsStackList.textEntry(html:String) : void— appends a rawTextFieldtocurrentMethod.ingredientsStackList.purchaseMethodEntry(...12 params) : void—(categoryId, activityId, title, iconImage, name, quantity, twcPrice, twpPrice, description, slotData, productName, tooltip);slotDatabecomes the row slot'sdataand also the block'ssortOrder. Creates or updates aPurchaseMethodEntryincategoryMap, adding aPurchaseRowchild for each product. The entry is keyed by the category id, so a category holds at most one purchase block (the onegetProductCount/buyTWCProductindex into); the engine re-sends the whole product list and rows are de-duplicated byproductName. Does not touchcurrentMethod.resetPurchaseEntry() : void— clears theingredientsStackListof everyPurchaseMethodEntryin the current category.resetActivateContextEntry() : void— clears theingredientsStackListof everyActivateContextin the current category.resetCategories() : void— empties both tile-views and the fullcategoryMap; resetscategoriesarray, then callsselectCategory(""), which firesSelectCategory("")to tell the engine nothing is open.firstCategorySelectedis not reset, so categories added afterwards are not auto-selected.setProgress(current:Number, total:Number) : void— setsguideProgressBar.filling.scaleX.setProgressBarVisibility(visible:Boolean) : void— shows/hides the progress bar BG; also showsGoldProgressBar, hidesBlackProgressBar.focusCategory(index:int, direction:int) : void— highlights the category atindexby togglingbackground.visible; scrollscategoryViewto keep it in view; callsbuttonLegend.gotoAndStop("category").focusContent(index:int, direction:int) : void— pagescontentViewvertically; callsbuttonLegend.gotoAndStop("content").focusProduct(index:int) : void— highlightsPurchaseRow.twcBackground/twpBackgroundfor the focused store item.buyTWCProduct(index:int) : void/buyTWPProduct(index:int) : void— synthesises a CLICK on the TWC or TWPLabelButtonof the focusedPurchaseRow.focusSearchString(state:int) : void— shows/hides the search background and sets stage focus; callsbuttonLegend.gotoAndStop("search").activateSearchInput() : void— callsExternalInterface.call("ActivateSearchInput").disableClickEvents()/enableClickEvents()/disableSearchEvents()/enableSearchEvents()— toggling event listeners for console nav flow.toggleHideCompleted() : void— programmatically fires a CLICK onhideCollectedCheckBox.sizeOfCategory(id:String) : int— count of non-GuideUIHeaderentries in a category.getCategoryId() : String,getCategoryCount() : int,getContentCount() : int,getProductCount() : int,getHeaderIndex() : int— query helpers for game engine. ThegetHeaderIndexcallback is registered togetCategoryId, so the engine gets the category id string under both names; thegetHeaderIndex():intmethod itself is never registered.
Key fields
categoryView : ScrollableTileView— left-panel list ofCategoryEntrybuttons.contentView : ScrollableTileView— right-panel list of content entries.categoryMap : Dictionary—{categoryId → {entryId → MovieClip}}.categories : Array— ordered list of category ID strings (mirrorscategoryViewinsertion order).currentCategory : String— currently selected category ID.currentMethod : ActivateContext— the lastActivateContextcreated or updated byactivateContext, used as the target for child-row insertions.firstCategorySelected : Boolean— prevents auto-selecting the first category more than once.guideProgressBar : MovieClip— containsfilling,progressBarBG,GoldProgressBar,BlackProgressBar,collectedLabelText,currentProgressText.searchGuideUI : MovieClip— wrapssearchText : TextFieldandbackground : MovieClip.hideCollectedCheckBox : _kiwi.Controls.Checkbox— bound toOnHideCompletedExternalInterface call on click; the click first callsdisableClickEvents, leaving the engine to re-enable them._debounceFrames : int/DEBOUNCE_FRAMES : int = 15— search-input debounce counter; firesExternalInterface.call("SetSearchString", ...)after 15 idle frames.FIRST_CATEGORY_OFFSET : Number = 0.55— horizontal centering multiplier applied to the sole visible category button.
Frame scripts / timeline
- frame 0 —
stop()(PC mode; frame labelPC). - frame 10 —
stop()(Console mode; labelConsole, which addsbuttonLegend). - frame 20 —
stop()(ConsoleLoc mode; labelConsoleLoc).
Runtime dependencies & integration
IggyFunctions.inIggyguards allExternalInterface.addCallbackregistrations.- Callbacks registered:
setMainTitle,setCollectedLabel,setHideCollectedLabel,addHeader,selectCategory,addCategory,selectCategoryIndex,focusCategory,focusContent,getHeaderIndex(bound togetCategoryId),getCategoryId,getCategoryCount,getContentCount,getProductCount,sizeOfCategory,updateBlueprint,ingredientEntry,purchaseMethodEntry,resetPurchaseEntry,resetActivateContextEntry,animatedEntry,activateContext,textEntry,setProgress,setProgressText,resetCategories,setProgressBarVisibility,enableClickEvents,disableClickEvents,disableSearchEvents,enableSearchEvents,focusSearchString,activateSearchInput,focusProduct,buyTWCProduct,buyTWPProduct,toggleHideCompleted. - Outbound calls:
ExternalInterface.call("SelectCategory", id),ExternalInterface.call("SetSearchString", text),ExternalInterface.call("ActivateSearchInput"),ExternalInterface.call("OnHideCompleted", checked),ExternalInterface.call("OnBuy", buttonName, productName)(buttonNameis the clicked button's instance name,TWCfor Credits orTWPfor Cubits),ExternalInterface.call("INGREDIENT.POINTER_ENTER", tooltipInfo, x, y, scrollOffsetY),ExternalInterface.call("INGREDIENT.POINTER_LEAVE", slotData). AnIngredientRowslot sends its global centre on hover plus theyofSlot.TooltipOffset, which (with no offset provider set) is the vertical scroll offset of the nearest enclosingScrollableView; the fourth argument was added in the October 2026 build. setupTranslation()called inconfigUI().
Other game-specific classes
Top-level game classes
GuideUIHeader— [Embed symbol140] Content section header with title (txt_name) and description (txt_description/txt_descriptionEmpty). Resizesbackgroundto fit wrapped text.activityId:int,sortOrder:int=0,showEmptytoggles between two description strings. 3-frame platform variant (PC/Console/ConsoleLoc).ActivateContext— [Embed symbol257] A collapsible entry block with a title, description, and aStackList(ingredientsStackList) for child rows (blueprints, ingredient rows, animated previews, text).sortOrderis theactivateContextsort argument when created and theactivityIdwhen re-sent.reset()clears the stack list. 3-frame platform variant.CategoryEntry— [Embed symbol229] ExtendsLabelButton; the clickable icon+label tile incategoryView. CarriescollectedTick,collectedEntryBG, andslotsub-MovieClips managed byGuideUI.PurchaseMethodEntry— top-level class; a marketplace listing entry with aningredientsStackListofPurchaseRowchildren.PurchaseRow— [Embed symbol58] One store product row: item iconSlot, name, description, TWC (LabelButton, Credits) and TWP (LabelButton, Cubits) buy buttons with price labels — the currencies of$CreditsBuy_ButtonLegend"Buy ([img:Currency_TWC])" and$CubitsBuy_ButtonLegend"Buy ([img:Currency_TWP])". FiresExternalInterface.call("OnBuy", buttonName, productName)on click, wherebuttonNameis the button's instance name,TWCorTWP. Rolls over/out fireINGREDIENT.POINTER_ENTER/LEAVE. A price below 0 (the engine sends-1) means the product is not sold in that currency: the button is disabled and its label blanked.IngredientEntry— [Embed symbol133] A crafting-recipe-style ingredient list entry (separate from the store flow): titletxt_questNameand aStackListofIngredientRowchildren. RegistersExternalInterface.addCallback("ADD_INGREDIENT", ...)in itsconfigUI, but nothing on this screen constructs or places one — ingredients arrive throughGuideUI.ingredientEntryasIngredientRows — so that callback is never registered here.BlueprintEntry— [Embed symbol231] Large image preview entry; wraps anObjectPreviewembedded asart, scaled toclampedScale(clamped 150–300).AnimatedEntry— [Embed symbol252] LikeBlueprintEntrybut fixed 745×345 viewport; used for animated texture previews in guide content panels.PreviewContainer— [Embed symbol230] Thin subclass ofObjectPreview; used as an embeddable image container symbol.BadgeEntry— shared with questtracker; see questtracker docs. Embedded here as a reusable badge progress display.ChallengeEntry— shared with questtracker; see questtracker docs.PersonalObjectiveEntry— shared with questtracker; see questtracker docs.
GuideUI_fla timeline symbols (10 classes)
GuideProgressBar_25, newGuideProgressBarBG_26, ButtonLegend_32, AdventureFrameBackground_42, badgeRewardImage_52, CollectedEntryBG_58, slotFrame_61, equipped_63, clock_animation_74, badge_75, searchGuideUI_22, header_background_96 — frame-script-only timeline clips attached to the main timeline, mostly UI decoration.
Asset-wrapper symbols (26 classes)
26 skin/shape classes: CellRenderer_*Skin (7), ComboBox_*Skin (4), ScrollArrow*_*Skin (8), ScrollThumb_*Skin (3), ScrollTrack_skin, ScrollBar_thumbIcon, List_skin, TextInput_*Skin (2), SlotBackground, focusRectSkin, metaIcon0, dummy.
Notable logic
- Debounced search:
onSearchTextChangedstarts a 15-frameENTER_FRAMEcountdown; only after 15 frames without further input does it callExternalInterface.call("SetSearchString", ...)and then disables search events. The game re-enables them once it has processed the search. - Sort-on-invalidate: Content entries carry
sortOrderandsecondarySortOrderintegers.sortContent()is called whenevervalidateSortis true, sorting bysortOrderfirst thensecondarySortOrder, withGuideUIHeaderentries always sorting first within the samesortOrdergroup. After sorting,updateHeader()hides the divider on the first entry and showsshowEmptyon headers with no following content. - Single-visible-category centering: In
draw(), if exactly onecategoryViewitem is visible, itsxis set to(viewportWidth - width) * FIRST_CATEGORY_OFFSET(0.55) to slightly right-of-centre the single item. - Collected category hover: Categories flagged
isCollectedget separateMOUSE_OVER/OUT/CLICKhandlers that drive acollectedEntryBGmovie-clip through up/over/down states; non-collected categories reset all collected frames on click. - Console gating: On console,
IsConsole()gatesbuttonLegendlabel changes and platform-specifichtmlTextrendering.IsNX()is also tested inPurchaseRow.