tinyquestofferui.swf
The Tiny Quest offer: title, level, difficulty stars and duration, up to seven ally/item slot pairs, synergy filter buttons, required items, rewards, XP and Flux cost (ticket price plus low-level fee), and Embark / Insta-Complete / Get Voucher Instead buttons.
Document/main class: TinyQuestOfferUI (extends _kiwi.Core.UIComponent) — no top-level embed; header title key $TinyQuestUI
SWF-specific classes: 20 (+ 7 TinyQuestOfferUI_fla timeline symbols)
Main class: TinyQuestOfferUI
TinyQuestOfferUI is the root component for the Tiny Quest offer panel. On construction it binds three frame scripts (frames 0, 10, 20) then calls configUI() via the UIComponent lifecycle. All data enters through ExternalInterface callbacks registered during configUI(); the class never pulls data itself. Console support is detected via IsConsole() — if true, an ENTER_FRAME listener waits for onTargetFrame() before showing the button legend overlay.
Public methods
setQuestTitleName(name:String) : *— assignsnametotinyQuestHeader.questIDText.questName.questIDTextis aQuestTitleclip, so the setter takes HTML and auto-shrinks the font (25 pt downwards) until the title fits two lines, then re-centres it vertically againstbackgroundA.setQuestIcon(icon:String) : *— setstinyQuestHeader.slot.iconImage; hides the slot frame border.setQuestLevel(level:int) : *— storesquestDifficultyLeveland updatestinyQuestHeader.questLevelText.setQuestDesc(desc:String) : *— storesquestDescfor the info popup tooltip.setDifficultyStar(index:int) : void— clampsindexto 1–3 and navigatestinyQuestHeader.questDifficultyIconto frame"1star","3star"or"5star". Before the October 2026 build it clamped to 0–2 and looked upindex - 1, so"5star"was never reachable and0selected no frame.setDuration(seconds:Number) : void— formats asHH:MM:SSand writes totinyQuestHeader.durationText.setXpReward(xp:int) : void— formats withFormatNumber()and writes toxpHeader.xpText.setCost(flux:int) : void— formats and writes tocostTotal.costText.setBaseCost(flux:int) : void— writes totinyQuestCost.baseFee, the TICKET PRICE line.setAllyCost(flux:int) : void— writes totinyQuestCost.alliesFee, the LOW-LEVEL FEE line (the surcharge for allies below the quest's level); colors it orange (16487452=0xFB941C) when> 0, white otherwise.setAcceptButtonText(text:String) : void— assigns the text toacceptBtn.labelunchanged.setConsumeButtonText(text:String) : void— prefixes two spaces and assigns toconsumeBtn.label.setAcceptAndCompleteButtonText(count:int) : void— sets numeric label onacceptAndCompleteBtn.acceptAndCompleteText.setAcceptButtonVisible(visible:Boolean) : *— enables/disablesacceptBtn; togglesacceptBtnTooltipvisibility inversely. The engine sendsfalsefor every reason the quest cannot be embarked (all active quest slots in use, not enough flux, missing required items) and never says which; nothing else the offer receives reports how many quests are already running.setAcceptAndCompleteButtonEnable(enabled:Boolean) : *— enables/disablesacceptAndCompleteBtn; togglesacceptAndCompleteBtnTooltipinversely.setSlotNumber(gearCount:int, itemCount:int) : void— createsmax(gearCount, itemCount)pairs ofPetSlotinstances (pet mode + item mode) laid out along two linear paths defined byStart1/End1andStart2/End2position anchors. Places aHatoverlay on the first gear slot. Pushes intogearSlotArrayanditemSlotArray.setSlotBlueprint(slotIndex:int, imagePath:String) : void— setsforceIconImageon the gear or item slot; togglesBGIconControllervisibility and manages the cross indicator.slotIndexis zero-based: belowgearSlotArray.lengthit names an ally slot, anditemOffset + nnames item slotn. The item's cross shows when an item is set but its paired ally slot is empty.setPetSlotFrame(slotIndex:int, frameIndex:int) : void— drives the slot border to one of["default","synergy","underlevel","required","underlvlSynergy"]frame labels (what the quest wants from that slot). Same zero-based index assetSlotBlueprint, so item slots get frames of their own.setTagButtons(count:int) : void— createscountStatFilterObjfilter buttons laid out right to left fromTagFilterPosition, one button width plus 8 px apart.setTargetTagButtonsStat(btnIdx:int, tagInt:int, textureName:String, title:String, desc:String) : void— populates a stat-type filter button, recordsbuttonId, and hides the button's blue (active) skin. Title and description arrive already translated. The textures are theui/tiny_quests/tinyquest_icon_tq_stat_*set (18 stats) and, for the tag setter below,tinyquest_icon_tq_tag_flying/tinyquest_icon_tq_tag_underwaterbreathing.setTargetTagButtonsTag(btnIdx:int, tagStr:String, textureName:String, title:String, desc:String) : void— populates a tag-string filter button. Both setters now assigntagInt = btnIdx; neither uses the old-1sentinel, so the engine distinguishes stat from tag filters by whethertagStris set.applyFilter(btnIndex:int) : void— programmatically dispatches aCLICKon the specified tag button.selectSlot(slotIndex:int) : void— programmatically dispatches aCLICKon a pet or item slot.goToNextPetSlot(slotIndex:int) : void— console only; forwards straight toExternalInterface.call("SLOT.ACTIVATE", slotIndex)so the engine can advance the highlighted slot.onSelectionActivated(slotIndex:int) : void— console only; routes an activated selection to eitherSLOT.PET.ACTIVATE(index withingearSlotArray) orSLOT.ITEM.ACTIVATE(index minusitemOffset, withinitemSlotArray). Index0is ignored.focusSlot(slotIndex:int) : void— console only: highlights the target slot and triggers the accept-button tooltip viaExternalInterface.focusToggleFilter(filterIndex:int) : void— console only: shows the highlight only on the indicated tag button.clearFocus() : void— hides all slot and tag-button highlights.clearRewards() : *— removes and destroys allRewardObjectchildren.addReward(iconPath:String, count:int) : *— creates aRewardObject, positions it relative torewardPosition, setsslot.datatorewardArray.length + 1 + rewardOffset (16). The client works the reward out from the assigned allies and items, so every change to the line-up is followed byclearRewardsand a fresh set ofaddRewardcalls.clearRequired() : *— removes and destroys allRequiredObjectchildren; hidestqRequired.addRequired(iconPath:String, itemName:String, have:int, need:int) : *— creates aRequiredObject, positions it relative torequiredPosition, colors thehavedigits ofamountHavered whenhave < need, max 4 items.requiredItemNameandamountHaveare single fields, so they show whicheveraddRequiredcame last.setRequiredText(text:String) : void— sets the label insidetqRequired.requiredText.getPetSlotCount() : int— returnsgearSlotArray.length.getItemSlotCount() : int— returnsitemSlotArray.length.getFilterButtonCount() : int— returnstagButtons.length.dispatchStartQuest() : void— callsExternalInterface.call("onQuestAccept").dispatchInstaCompleteQuest() : void— callsExternalInterface.call("onQuestAcceptAndComplete").dispatchConsumeQuest() : void— callsExternalInterface.call("onQuestConsume").tQDescVisible(show:Boolean) : void— toggles the info popup; mirrorsonInfoRollOvertoggle logic for console use.expHighlightVisible(show:*) : void— shows/hidesxpHeader.highlightand callsOnXpHeaderTooltiporOnHideTooltip.costHighlightVisible(show:*) : void— shows/hidescostTotal.highlightand callsOnCostTooltiporOnHideTooltip.FormatNumber(n:int) : String— formats an integer with comma-thousands separators.durationFormatter(n:int) : String— zero-pads a single integer to two digits.
Key fields
m_header : WindowHeaderSmall— window title bar; title key"$TinyQuestUI", enabled=false (non-interactive header).tinyQuestHeader : MovieClip— sub-clip containingquestIDText(aQuestTitle),questLevelText,durationText,slot(quest icon),questDifficultyIcon,infoBtn, andinfoPopup(anInfoPopup).tinyQuestRewards : MovieClip— stage instance holding the reward strip; positioned on the timeline and not manipulated by the document class.xpHeader : MovieClip— XP display area withxpText,qubeslyXpIcon(tooltip trigger),highlight.costTotal : MovieClip— Flux cost display withcostText,iconFlux(tooltip trigger),highlight.tinyQuestCost : MovieClip— cost breakdown withbaseFeeandalliesFeetext fields, labelled by the static fieldsbaseFeeText($TinyQuestUI_CostBaseFee, "TICKET PRICE") andalliesFeeText($TinyQuestUI_CostLevelPenalty, "LOW-LEVEL FEE").acceptBtn : LabelButton— primary accept (Embark) button; starts disabled.consumeBtn : LabelButton— consume-quest button, labelled "Get Voucher Instead" in English viasetConsumeButtonText: it skips the quest for a voucher ($TinyQuestUI_QuestConsumed: "Tiny Quest skipped! You received {0} x {1} instead!"). The only action button with no rollover tooltip.acceptAndCompleteBtn : MovieClip— insta-complete button; starts disabled; has nestedacceptAndCompleteText.acceptBtnTooltip / acceptAndCompleteBtnTooltip : MovieClip— invisible hit areas that show tooltips when the corresponding button is disabled.buttonLegend : MovieClip— console button-legend overlay, initially hidden untilonTargetFrame()returns true.TagFilterPosition : MovieClip— positional anchor for tag filter buttons.rewardPosition / requiredPosition : MovieClip— positional anchors for dynamically placed reward/required items.Start1/End1/Start2/End2 : MovieClip— linear interpolation endpoints defining two rows of up to 4 + 3 slots.gearSlotArray : Array— holdsPetSlotinstances in pet mode.itemSlotArray : Array— holdsPetSlotinstances in item mode.tagButtons : Array— holdsStatFilterObjfilter buttons.rewardArray / requiredArray : Array— holdRewardObject/RequiredObjectinstances (max 4 each).questDesc : String— cached quest description HTML for the info popup.questDifficultyLevel : int— cached numeric difficulty level.slotSize_large : int = 77— slot pixel size used insetSlotSize()calls.slotSize_mid : int = 65— smaller slot size; declared but not currently referenced.itemOffset : int = 7— data ID offset separating pet slots (1–7) from item slots (8–14).rewardOffset : int = 16— data ID offset for reward slots.requiredOffset : int = 21— data ID offset for required slots.itemPositionOffset_X / itemPositionOffset_Y : int = 35— pixel offset applied to each item slot; the paired gear slot is placed back at the un-offset position, so the two slots sit diagonally staggered rather than overlapping.buttonId : int = -1— index of the tag button most recently populated bysetTargetTagButtonsStat, stored astagButtons.length + btnIdx._showSwitchScreensButtonLegend : Boolean = false— reserved flag for the console screen-switch legend; not currently read.
Frame scripts / timeline
- Frame 0 (
frame1, labelPC):stop()— rests on default frame. - Frame 10 (
frame11, labelConsole):stop()— the console layout. - Frame 20 (
frame21, labelConsoleLoc):stop(), then navigatesbuttonLegendto label"ConsoleLoc"— activates console button layout. (buttonLegend_40itself has a single label,offer.)
Stage 918×750, 24 fps, 30 frames.
Runtime dependencies & integration
ExternalInterface.addCallback— 44 callbacks registered; game engine drives all data population.ExternalInterface.calloutbound:"onQuestAccept","onQuestConsume","onQuestAcceptAndComplete"— button action results."ToggleFilter"(tagInt, tagStr, isActive)— stat/tag filter toggle."OnFilterBtnEnter"(title, desc, x, y)— tag button hover tooltip."OnHideTooltip"— tooltip dismissal."OnXpHeaderTooltip"(x, y),"OnCostTooltip"(x, y)— icon hover tooltips."onQuestAcceptRollOver"(x, y),"onQuestAcceptAndCompleteRollOver"(x, y)— accept button tooltips."SLOT.ACTIVATE"(id),"SLOT.PET.ACTIVATE"(id),"SLOT.ITEM.ACTIVATE"(id)— console slot activation."OnDropIntoWindow"— drag-and-drop result: forwards arguments 3–5 of theDRAGHOST.DROPcallback, then thenameof the first allyPetSlotunder the drop point, then the callback's last argument. The slots are created withaddChild, so that name is the instance name Flash assigned. Nothing is sent when the drop misses every ally slot.
SlotDragDropHelper.registerDropCallback(onDrop)— registered only in Iggy context; hit-tests gear slots on drop.IsConsole()/IggyFunctions.inIggy— platform guards throughout.- Translate key:
"$TinyQuestUI"(window header). Static timeline text carries$TinyQuestUI_Cost,$TinyQuestUI_CostBaseFee,$TinyQuestUI_CostLevelPenalty,$TinyQuestUI_Required,$TinyQuestUI_Rewards,$TinyQuestUI_LVL, and the console legend's$TinyQuestUI_QuestEmbark,$TinyQuestUI_ButtonLegendConsume,$TinyQuestUI_ButtonLegendInstaComplete,$Select_ButtonLegend. - Two index schemes: the slot
dataids (see Notable logic) are whatonSlotEnter,onSlotLeave,onSelectionActivatedand the outboundSLOT.*calls use;setSlotBlueprint,setPetSlotFrame,focusSlotandselectSlottake a zero-based index instead (allyn, oritemOffset + nfor itemn).
Other game-specific classes
PetSlot— Embedssymbol89; paired slot container with aslot_large(slot),SlotIconController(BGIconController), and acrossMovieClip (hidden by default). Used for both pet (head icon) and item (bag icon) modes —setSlotNumberinstantiates it twice per row.ItemSlot— Embedssymbol92; structurally identical twin ofPetSlot(slot,BGIconController,cross). Exported for linkage but never instantiated by the document class, which still usesPetSlotin item mode.SlotIconController— Embedssymbol51; switches betweenhead(pet) andbag(item) sub-clips viaPetMode(),ItemMode(),Hide(),Show().StatFilterObj— Embedssymbol19; toggle filter button carrying twoLabelButtonskins —button(grey, shown when inactive) andbtnBlue(shown when active) — plus anObjectPreviewimage,highlightclip, and string/int tag metadata (tagStr,tagInt,tagTitle,tagDesc,isActive).FixVisibility()swaps which skin is visible. Both skins are configured astogglebuttons with empty labels and tooltips.QuestTitle— Embedssymbol121; the quest-name plate (txt_questName,backgroundA). ItsquestNamesetter accepts HTML and steps the point size down from 25 until the text fits within two lines and the original field height, then vertically centres it.InfoPopup— Embedssymbol116; the quest-description tooltip. A three-slice background (bgStart/bgBody/bgEnd) plustextField;FixSize()growsbgBodyto the measured text height and pushesbgEndbelow it.RewardObject— Embedssymbol42; reward slot container with aSlotandCountTextfield.RequiredObject— Embedssymbol44; required-item slot container with aSlotandCountTextfield.slot_large— Embedssymbol87; concreteSlotsubclass used insidePetSlotandItemSlot.btnGreen— Embedssymbol102; greenLabelButtonskin with 4 stop-frames (up/over/down/disabled at frames 10/20/30/40).BtnEmbark— Embedssymbol147;LabelButtonskin for the quest Embark action, same 4-stop-frame layout.btnVoucher— Embedssymbol149;LabelButtonskin for the voucher action, same 4-stop-frame layout.btnStat— Embedssymbol13; the inactive (grey)LabelButtonskin behindStatFilterObj.button; 5 stop-frames at 10/20/30/40/50.btnStatBlue— Embedssymbol17; the active (blue) counterpart behindStatFilterObj.btnBlue; same 5-stop-frame layout.btnAutoAcceptComplete— Embedssymbol135;BaseButtonskin for the insta-complete button, 4-stop-frame layout.Hat— Embedssymbol105; hat overlay placed on the first gear slot. It marks the slot the Golden Thread tutorial quest points players to: select "the HAT-WEARING, EMPTY ALLY SLOT" to assign an ally ($Quest_GoldenThread_expertise_tinyquest_02_Description).art— Embedssymbol33; plainArtClipbackground/panel art asset.- Asset wrappers (2 bitmap classes):
dummy(52×52 placeholder PNG),rarity_frame_normal_large_over_png(76×76 slot hover overlay).
TinyQuestOfferUI_fla package (timeline symbol classes)
buttonLegend_40— Embedssymbol244; console button legend clip with sub-clipsconsoleButtonConsume,consoleButtonEmbark,primaryAction,consoleButtonInstaComplete; stops on frame 1.slotFrameLarge_49— Embedssymbol66; large slot border with the 5 state labelssetPetSlotFrameuses —default(dark disc, grey ring),synergy(green),underlevel(orange),required(gold ring),underlvlSynergy(orange disc, green ring) — plus a sixth label,console, which is the only frame carrying thehighlightCirclesub-clip.slotFrame_27— Embedssymbol26; smaller slot frame with 3 stop-frames.quest_difficulty_icon_23— Embedssymbol227; 6-state difficulty icon (6 stop-frames × 10 frames each), driven bygotoAndStop("1star"/"3star"/"5star").btnInfo2_39— Embedssymbol234; info-button skin with 4 stop-frames (up/over/down/disabled).equipped_52— Embedssymbol70; 2-frame equipped indicator (frame 1 = hidden, frame 2 = shown).qualityPips_56— Embedssymbol85; quality pip indicator; stops on frame 1.
Notable logic
- Slot data ID scheme: gear slots use IDs
1..gearCount, item slotsitemOffset+1..itemOffset+count(offset 7), reward slots start atrewardOffset+1(17), required slots atrequiredOffset+1(22). That makes allies 1–7, items 8–14, rewards 17–20 and required 22–25, with 0 meaning no slot. The engine uses these IDs to refer back to specific slots viaonSlotEnter/onSlotLeave, which decode them by range and mark the slotselected.onSlotLeavecasts thePetSlotwrappers toSlot, which yieldsnull, so it never clears anything. - Dual-row slot layout:
setSlotNumberdistributes up to 4 slots on theStart1→End1segment then switches toStart2→End2for a second run, using linear interpolation with a divisor of 3 (first row) or 2 (second row). Each row places an item slot at the interpolated point plusitemPositionOffset_X/Y(35, 35) and its paired gear slot back at the un-offset point, so the pet and item slots sit diagonally staggered. The two segments end at seven pairs (4 + 3); an eighth ally would also take ID 8, the first item slot's. - Tag filter skin swap: the active state of a
StatFilterObjis now a skin swap, not a filter —FixVisibility()hides the greybtnStatskin and shows the bluebtnStatBlueone (plus thehighlightclip). The old inner-glow treatment is gone; only a vestigialfilters = []clear remains on deactivation. On console, both skins are stepped between the"up"and"down"frame labels in lockstep. - Low-level fee coloring:
alliesFee(LOW-LEVEL FEE) is colored orange (16487452=0xFB941C) when the fee is positive, white when zero or negative. ThesetTextFormatrange ends atalliesFee.toString().length, the length of the TextField object's own string form rather than of its text. - Console button legend: the
buttonLegendclip stays hidden untilonTargetFrame()signals readiness via theENTER_FRAMEloop, then the listener is removed. On frame 20 the legend is positioned to"ConsoleLoc". - Button labels:
setAcceptButtonTextassigns its text unchanged (no prefix); onlysetConsumeButtonTextpads its label, with two leading spaces.