class QuestTrackingEvent extends Event { var m_journalEntry : weak< JournalQuestObjectiveBase >; var m_objective : weak< QuestItemController >; } class QuestListController extends inkLogicController { private editable var m_CategoryName : inkTextRef; private editable var m_icon : inkImageRef; private editable var m_QuestListRef : inkCompoundRef; private var m_QuestType : gameJournalQuestType; private var m_QuestItems : array< weak< QuestItemController > >; private var m_LastQuestData : weak< QuestDataWrapper >; public function Setup( questType : gameJournalQuestType, const questTypeLocTag : ref< String > ) { m_QuestType = questType; inkTextRef.SetText( m_CategoryName, questTypeLocTag ); } public function CanAddQuest( questData : ref< QuestDataWrapper > ) : Bool { return ( questData.GetType() == m_QuestType || ( questData.GetType() == gameJournalQuestType.MinorQuest && ( m_QuestType == gameJournalQuestType.SideQuest || m_QuestType == gameJournalQuestType.CourierSideQuest ) ) ) && questData.GetStatus() == gameJournalEntryState.Active; } public function AddQuest( questData : ref< QuestDataWrapper >, active : Bool ) { var currButton : weak< QuestItemController >; currButton = ( ( QuestItemController )( SpawnFromLocal( inkCompoundRef.Get( m_QuestListRef ), 'questItem' ).GetControllerByType( 'QuestItemController' ) ) ); currButton.RegisterToCallback( 'OnButtonClick', this, 'OnQuestItemClick' ); currButton.RegisterToCallback( 'OnRelease', this, 'OnButtonRelease' ); m_QuestItems.PushBack( currButton ); currButton.SetQuestData( questData ); if( active ) { currButton.MarkAsActive(); } GetRootWidget().SetVisible( true ); } protected event OnButtonRelease( e : inkPointerEvent ) { var currButton : weak< QuestItemController >; var m_ToTrack : weak< ABaseQuestObjectiveWrapper >; var evt : QuestTrackingEvent; if( e.IsAction( 'disassemble_item' ) ) { currButton = ( ( QuestItemController )( e.GetCurrentTarget().GetController() ) ); if( currButton ) { m_ToTrack = currButton.GetObjectiveData(); evt = new QuestTrackingEvent; evt.m_journalEntry = m_ToTrack.GetQuestObjective(); evt.m_objective = currButton; QueueEvent( evt ); OnQuestItemClick( currButton ); } } } protected event OnQuestItemClick( controller : weak< inkButtonController > ) { var currButton : weak< QuestItemController >; currButton = ( ( QuestItemController )( controller ) ); if( currButton ) { currButton.HideNewIcon(); m_LastQuestData = currButton.GetQuestData(); CallCustomCallback( 'OnActiveQuestChanged' ); } } public function GetLastQuestData() : weak< QuestDataWrapper > { return m_LastQuestData; } public function Clear() { var currButton : weak< QuestItemController >; while( m_QuestItems.Size() > 0 ) { currButton = m_QuestItems.PopBack(); if( currButton ) { currButton.UnregisterFromCallback( 'OnButtonClick', this, 'OnQuestItemClick' ); inkCompoundRef.RemoveChild( m_QuestListRef, currButton.GetRootWidget() ); } } GetRootWidget().SetVisible( false ); } } class QuestItemController extends inkButtonController { private editable var m_QuestTitle : inkTextRef; private editable var m_QuestStatus : inkTextRef; private editable var m_QuestIcon : inkImageRef; private editable var m_TrackedIcon : inkImageRef; private editable var m_NewIcon : inkImageRef; private editable var m_FrameBackground_On : inkImageRef; private editable var m_FrameBackground_Off : inkImageRef; private editable var m_FrameFluff_On : inkImageRef; private editable var m_FrameFluff_Off : inkImageRef; private editable var m_Folder_On : inkImageRef; private editable var m_Folder_Off : inkImageRef; private editable var m_StyleRoot : inkWidgetRef; private var m_ToTrack : weak< ABaseQuestObjectiveWrapper >; private editable var m_DefaultStateName : CName; default m_DefaultStateName = 'Default'; private editable var m_MarkedStateName : CName; default m_MarkedStateName = 'Marked'; protected var m_QuestObjectiveData : ABaseQuestObjectiveWrapper; private var m_QuestData : QuestDataWrapper; protected event OnInitialize() {} public function GetQuestData() : QuestDataWrapper { return m_QuestData; } public function RefreshTrackedStyle( optional force : Bool ) { if( ( m_QuestData.IsTracked() || m_QuestData.IsTrackedInHierarchy() ) || force ) { inkImageRef.SetState( m_QuestIcon, 'Tracked' ); inkTextRef.SetState( m_QuestTitle, 'Tracked' ); inkTextRef.SetState( m_QuestStatus, 'Tracked' ); inkImageRef.SetState( m_FrameBackground_Off, 'Tracked' ); inkImageRef.SetState( m_FrameFluff_Off, 'Tracked' ); inkImageRef.SetState( m_Folder_Off, 'Tracked' ); } else { inkImageRef.SetState( m_QuestIcon, 'Default' ); inkTextRef.SetState( m_QuestTitle, 'Default' ); inkTextRef.SetState( m_QuestStatus, 'Default' ); inkImageRef.SetState( m_FrameBackground_Off, 'Default' ); inkImageRef.SetState( m_FrameFluff_Off, 'Default' ); inkImageRef.SetState( m_Folder_Off, 'Default' ); } } public function SetQuestData( currQuest : ref< QuestDataWrapper > ) { m_QuestData = currQuest; inkImageRef.SetVisible( m_TrackedIcon, false ); inkTextRef.SetText( m_QuestTitle, m_QuestData.GetTitle() ); inkWidgetRef.SetState( m_StyleRoot, m_DefaultStateName ); if( m_QuestData.GetStatus() == gameJournalEntryState.Succeeded ) { inkTextRef.SetText( m_QuestStatus, GetLocalizedText( "UI-Notifications-QuestCompleted" ) ); inkImageRef.SetVisible( m_NewIcon, false ); } else if( m_QuestData.GetStatus() == gameJournalEntryState.Failed ) { inkTextRef.SetText( m_QuestStatus, GetLocalizedText( "UI-Notifications-Failed" ) ); inkImageRef.SetVisible( m_NewIcon, false ); } else { inkTextRef.SetText( m_QuestStatus, ( GetLocalizedText( "UI-Statistic-Level" ) + " " ) + ( ( String )( m_QuestData.GetLevel() ) ) ); inkImageRef.SetVisible( m_NewIcon, m_QuestData.IsNew() ); } inkImageRef.SetVisible( m_FrameBackground_On, false ); inkImageRef.SetVisible( m_FrameFluff_On, false ); inkImageRef.SetVisible( m_Folder_On, false ); RefreshTrackedStyle(); InkImageUtils.RequestSetImage( this, m_QuestIcon, "UIIcon." + ( ( String )( m_QuestData.GetDistrict() ) ) ); } public function MarkAsActive() { if( m_QuestData.IsTracked() || m_QuestData.IsTrackedInHierarchy() ) { inkImageRef.SetState( m_QuestIcon, 'Selected' ); inkTextRef.SetState( m_QuestTitle, 'Selected' ); inkTextRef.SetState( m_QuestStatus, 'Selected' ); inkImageRef.SetState( m_FrameBackground_On, 'Tracked' ); inkImageRef.SetState( m_FrameFluff_On, 'Tracked' ); inkImageRef.SetState( m_Folder_On, 'Tracked' ); } else { inkImageRef.SetState( m_QuestIcon, 'Selected' ); inkTextRef.SetState( m_QuestTitle, 'Selected' ); inkTextRef.SetState( m_QuestStatus, 'Selected' ); inkImageRef.SetState( m_FrameBackground_On, 'Default' ); inkImageRef.SetState( m_FrameFluff_On, 'Default' ); inkImageRef.SetState( m_Folder_On, 'Default' ); } inkImageRef.SetVisible( m_FrameBackground_On, true ); inkImageRef.SetVisible( m_FrameFluff_On, true ); inkImageRef.SetVisible( m_Folder_On, true ); } private function GetQuestStatus() : String { var questStatus : String; questStatus = ""; switch( m_QuestData.GetStatus() ) { case gameJournalEntryState.Succeeded: questStatus = questStatus + "[DONE]"; break; case gameJournalEntryState.Failed: questStatus = questStatus + "[FAILED]"; break; case gameJournalEntryState.Active: questStatus = questStatus + "[ACTIVE]"; break; case gameJournalEntryState.Inactive: questStatus = questStatus + "[INACTIVE]"; break; } return questStatus; } public function HideNewIcon() { inkImageRef.SetVisible( m_NewIcon, false ); } public function GetObjectiveData() : weak< ABaseQuestObjectiveWrapper > { var questObjectives : array< QuestObjectiveWrapper >; var questObjectiveToTrack : QuestObjectiveWrapper; var i : Int32; questObjectives = m_QuestData.GetObjectives(); questObjectiveToTrack = questObjectives[ 0 ]; for( i = 0; i < questObjectives.Size(); i += 1 ) { questObjectiveToTrack = ( ( QuestObjectiveWrapper )( questObjectives[ i ] ) ); if( questObjectives[ i ].GetStatus() == gameJournalEntryState.Active ) { questObjectiveToTrack = questObjectives[ i ]; } } return questObjectiveToTrack; } } class ObjectiveController extends inkButtonController { protected editable var m_ObjectiveLabel : inkTextRef; protected editable var m_ObjectiveStatus : inkTextRef; protected editable var m_QuestIcon : inkImageRef; protected editable var m_TrackedIcon : inkImageRef; protected editable var m_FrameBackground_On : inkImageRef; protected editable var m_FrameBackground_Off : inkImageRef; protected editable var m_FrameFluff_On : inkImageRef; protected editable var m_FrameFluff_Off : inkImageRef; protected editable var m_Folder_On : inkImageRef; protected editable var m_Folder_Off : inkImageRef; protected var m_QuestObjectiveData : ABaseQuestObjectiveWrapper; private var m_ToTrack : weak< ABaseQuestObjectiveWrapper >; protected event OnInitialize() { RegisterToCallback( 'OnButtonClick', this, 'OnObjectiveClicked' ); } public function SetState( val : CName ) { if( val == 'Tracked' ) { inkImageRef.SetVisible( m_TrackedIcon, true ); } else { inkImageRef.SetVisible( m_TrackedIcon, false ); } inkImageRef.SetState( m_QuestIcon, val ); inkTextRef.SetState( m_ObjectiveLabel, val ); inkTextRef.SetState( m_ObjectiveStatus, val ); inkImageRef.SetState( m_FrameBackground_Off, val ); inkImageRef.SetState( m_FrameFluff_Off, val ); inkImageRef.SetState( m_Folder_Off, val ); } private function RefreshTrackedStyle() { if( m_QuestObjectiveData.IsTracked() || m_QuestObjectiveData.IsTrackedInHierarchy() ) { SetState( 'Tracked' ); } else { SetState( 'Default' ); } } public function Setup( data : ABaseQuestObjectiveWrapper, isOptional : Bool ) { m_QuestObjectiveData = data; inkTextRef.SetText( m_ObjectiveLabel, GetLocalizedText( m_QuestObjectiveData.GetDescription() ) + m_QuestObjectiveData.GetCounterText() ); inkTextRef.SetText( m_ObjectiveStatus, GetObjectiveStatus( isOptional ) ); inkImageRef.SetVisible( m_TrackedIcon, m_QuestObjectiveData.IsTracked() || m_QuestObjectiveData.IsTrackedInHierarchy() ); SetEnabled( m_QuestObjectiveData.IsActive() ); GetRootWidget().SetVisible( m_QuestObjectiveData.GetStatus() != gameJournalEntryState.Inactive ); RefreshTrackedStyle(); } public function GetObjectiveData() : weak< ABaseQuestObjectiveWrapper > { return m_QuestObjectiveData; } protected virtual function GetObjectiveStatus( isOptional : Bool ) : String { var questLabel : String; switch( m_QuestObjectiveData.GetStatus() ) { case gameJournalEntryState.Succeeded: questLabel = "[DONE]"; break; case gameJournalEntryState.Failed: questLabel = "[FAILED]"; break; case gameJournalEntryState.Inactive: questLabel = "[INACTIVE]"; default: if( isOptional ) { questLabel = "[OPTIONAL]"; } else { } break; } return questLabel; } protected event OnObjectiveClicked( controller : weak< inkButtonController > ) { var targetObjective : weak< ObjectiveController >; targetObjective = ( ( ObjectiveController )( controller ) ); if( targetObjective ) { m_ToTrack = targetObjective.GetObjectiveData(); CallCustomCallback( 'OnTrackingRequest' ); } } public function GetToTrack() : weak< ABaseQuestObjectiveWrapper > { return m_ToTrack; } }