- Timestamp:
- May 12, 2011, 12:31:23 AM (14 years ago)
- Location:
- code/branches/tutoriallevel3
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/tutoriallevel3
- Property svn:mergeinfo changed
/code/branches/tutoriallevel (added) merged: 7828-7831,7894,8370 /code/branches/tutoriallevel2 (added) merged: 8371,8374,8376-8378,8444-8451
- Property svn:mergeinfo changed
-
code/branches/tutoriallevel3/data/gui/scripts/QuestGUI.lua
r7732 r8453 3 3 local P = createMenuSheet("QuestGUI") 4 4 5 P.rootWindow = nil 6 P.detailsWindows = {} 5 P.questManager = nil -- The QuestManager. 6 P.showActive = true -- Whether the active or finished quest list is displayed. 7 P.currentQuest = nil -- The quest that is currently displayed. 8 P.player = nil -- The player the quests are displayed for. 7 9 P.quests = {} 8 P.hints = {} 9 P.player = nil 10 P.subquests = {} 10 11 11 12 -- design parameters 12 P.indentWidth = 2013 13 P.scrollbarWidth = 13 14 P.buttonHeight = 30 14 P.frameHeigth = 18 15 P.borderSize = 5 15 16 P.titleHeight = 26 16 P.borderWidth = 5 17 18 --TODO: 19 -- Highlight whether we are currently looking at active or finished quests 20 -- Distinguish completed from failed quests 21 22 function P.onLoad() 23 P.questManager = orxonox.QuestManager:getInstance() -- Store the pointer to the QuestManager as an internal variable to allow for faster access, 24 end 17 25 18 26 function P.onShow() 19 20 local questsList = winMgr:getWindow("orxonox/QuestGUI/QuestsList") 21 27 -- Get the player. 22 28 P.player = orxonox.GUIManager:getInstance():getPlayer(P.name) 23 P.rootWindow = P.createQuestGUI() 24 25 questsList:addChildWindow(P.rootWindow) 26 end 27 28 function P.onHide() 29 P.cleanup() 30 end 31 29 30 -- Load the list of quests to be displayed. 31 P.loadQuestsList(P.currentQuest) 32 end 33 34 -- Loads the list of quests, depending on P.showActive, either the active (P.showActive == true) or the finished, i.e. inactive quests are loaded. 35 -- selectQuest is a pointer to a quest that should be selected, if it is nil the first quest is selected. 36 function P.loadQuestsList(selectQuest) 37 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/QuestsList")) 38 P.clearQuestList() 39 40 local selectQuestId = nil 41 if selectQuest ~= nil then 42 selectQuestId = P.questManager:getId(selectQuest) 43 end 44 45 -- Iterate through all root-quests. 46 local numRootQuests = P.questManager:getNumRootQuests(P.player) 47 if numRootQuests > 0 then 48 local i = 0 49 while i <= numRootQuests-1 do 50 local quest = P.questManager:getRootQuest(P.player, i) 51 -- Insert the current quest into the list. 52 local item = P.insertQuest(list, quest) 53 -- If the quest was inserted in the list and is has the same id as the selectQuest (thus it is the same quest) it is selected. 54 if selectQuestId ~= nil and item ~= nil and selectQuestId == P.questManager:getId(quest) then 55 list:setItemSelectState(item, true) 56 end 57 -- Insert all subquests of this rootquest. 58 P.insertSubQuests(list, quest, selectQuestId) 59 i = i+1 60 end 61 -- If there were quests added to the list but there was no selectQuest specified (i.e. selectQuest was nil), the first item is selected. 62 if list:getItemCount() > 0 then 63 if selectQuestId == nil then 64 list:setItemSelectState(list:getListboxItemFromIndex(0), true) -- Select first quest. 65 end 66 -- If there werent any quests added the standard "no quests" message is loaded. 67 else 68 P.loadQuest() 69 end 70 end 71 end 72 73 -- Helper function, recursively inserts all the (active or inactive, depending on P.showActive) subquests of the input quest. 74 -- list is the list into which the subquests should be insterted. 75 -- quest is the quest, whose subquests should be inserted. 76 -- selectQuestId is the id of the quest that should be selected. 77 function P.insertSubQuests(list, quest, selectQuestId) 78 -- Iterate through all sub-quests. 79 local numQuests = P.questManager:getNumSubQuests(quest, P.player) 80 if numQuests > 0 then 81 local i = 0 82 while i <= numQuests-1 do 83 local subquest = P.questManager:getSubQuest(quest, P.player, i) 84 -- Insert the current quest into the list. 85 local item = P.insertQuest(list, subquest) 86 -- If the quest was inserted in the list and is has the same id as the selectQuest (thus it is the same quest) it is selected. 87 if selectQuestId ~= nil and item ~= nil and selectQuestId == P.questManager:getId(subquest) then 88 list:setItemSelectState(item, true) 89 end 90 i = i+1 91 end 92 end 93 end 94 95 -- Helper function, inserts a quest into the list (depending whether active or inactive quests are being shown). Returns nil if the quest was not inserted. 96 -- list is the list into which the quets should be inserted. 97 -- quest is the quest to be inserted. 98 function P.insertQuest(list, quest) 99 if P.showActive == quest:isActive(P.player) then 100 local item = CEGUI.createListboxTextItem(P.questManager:getDescription(quest):getTitle()) 101 item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush") 102 list:addItem(item) 103 table.insert(P.quests, quest) 104 return item 105 end 106 return nil 107 end 108 109 -- Loads the input quest. 110 -- quest the quest to be loaded. 111 function P.loadQuest(quest) 112 113 P.clearQuest() -- Clear the old quest. 114 if quest == nil then -- If quets is nil there is nothing to display. 115 return 116 else 117 local offset = 0 118 119 -- Load title and description 120 local description = P.questManager:getDescription(quest) 121 local titleWindow = winMgr:getWindow("orxonox/QuestGUI/Quest/Title") 122 titleWindow:setText(description:getTitle()) 123 local descriptionWindow = winMgr:getWindow("orxonox/QuestGUI/Quest/Description") 124 descriptionWindow:setText(description:getDescription()) 125 descriptionWindow:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.borderSize), CEGUI.UDim(1, 0))) 126 descriptionWindow:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderSize), CEGUI.UDim(0, P.borderSize))) 127 local height = getStaticTextWindowHeight(descriptionWindow) 128 descriptionWindow:setHeight(CEGUI.UDim(0, height)) 129 offset = offset + height 130 131 -- Load subquests 132 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/Quest/SubquestsList")) 133 local numQuests = P.questManager:getNumSubQuests(quest, P.player) 134 local i = 0 135 while i <= numQuests-1 do 136 local quest = P.questManager:getSubQuest(quest, P.player, i) 137 local item = CEGUI.createListboxTextItem(P.questManager:getDescription(quest):getTitle()) 138 item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush") 139 list:addItem(item) 140 table.insert(P.subquests, quest) 141 i = i+1 142 end 143 height = list:getTotalItemsHeight() 144 if height > 0 then 145 height = height+P.frameHeigth 146 end 147 list:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.borderSize), CEGUI.UDim(0, height))) 148 list:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderSize), CEGUI.UDim(0, offset))) 149 offset = offset + height + P.borderSize 150 151 -- Load hints 152 local hintsWindow = winMgr:getWindow("orxonox/QuestGUI/Quest/Hints") 153 hintsWindow:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderSize), CEGUI.UDim(0, offset))) 154 hintsWindow:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.borderSize), CEGUI.UDim(0, 0))) 155 height = P.titleHeight 156 local numHints = P.questManager:getNumHints(quest, P.player) 157 local i = 0 158 while i <= numHints-1 do 159 local hint = P.questManager:getHints(quest, P.player, i) 160 height = height + P.insertHint(hintsWindow, hint, i, height) 161 i = i+1 162 end 163 if numHints == 0 then 164 height = 0 165 end 166 hintsWindow:setHeight(CEGUI.UDim(0, height)) 167 offset = offset + height 168 169 -- Set the size of the wrapper 170 local window = winMgr:getWindow("orxonox/QuestGUI/Quest/Wrapper") 171 window:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.borderSize-P.scrollbarWidth), CEGUI.UDim(0,offset+P.borderSize))) 172 end 173 174 P.currentQuest = quest 175 end 176 177 -- Clear the currently displayed quest. 178 function P.clearQuest() 179 -- clear title 180 local titleWindow = winMgr:getWindow("orxonox/QuestGUI/Quest/Title") 181 titleWindow:setText("no Quests") 182 183 -- clear description 184 local descriptionWindow = winMgr:getWindow("orxonox/QuestGUI/Quest/Description") 185 descriptionWindow:setText("There is currently no quest that can be displayed.") 186 187 -- clear list fo subquests 188 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/Quest/SubquestsList")) 189 list:resetList() 190 list:setHeight(CEGUI.UDim(0, 0)) 191 P.subquests = {} 192 193 -- clear hints 194 local hints = winMgr:getWindow("orxonox/QuestGUI/Quest/Hints") 195 local numChildren = hints:getChildCount()-2 -- TODO: HACK 196 local i = 0 197 while i < numChildren do 198 local hint = hints:getChild("orxonox/QuestGUI/Quest/Hints/" .. i) 199 if hint ~= nil then 200 hints:removeChildWindow(hint) 201 winMgr:destroyWindow(hint) 202 end 203 i = i+1 204 end 205 hints:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.scrollbarWidth-P.borderSize), CEGUI.UDim(0, 0))) 206 207 P.currentQuest = nil 208 end 209 210 -- Clear the quests list 211 function P.clearQuestList() 212 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/QuestsList")) 213 list:resetList() 214 P.quests = {} 215 end 216 217 -- Select an input quest in the input list. 218 -- list is the list in which the input quest is to be selected. 219 -- quest is the quest to be selected. 220 function P.selectQuest(list, quest) 221 if quest == nil then -- If the input quest is nil, there is nothing to be selected, an error is output and the first quest is selected instead. 222 cout(1, "Error in QuestGUI: selectQuest(), input quest is nil. Selecting first.") 223 list:setItemSelectState(list:getListboxItemFromIndex(0), true) -- Select first 224 return 225 end 226 227 local questId = P.questManager:getId(quest) 228 local found = false 229 local index = 0 230 -- Iterate over all quests currently in the list. 231 for k,v in pairs(P.quests) do 232 -- If the id's are the same we have found the quest. 233 if P.questManager:getId(v) == questId then 234 found = true 235 index = k-1 236 end 237 end 238 239 if found then -- If the quest was found it is selected. 240 list:setItemSelectState(list:getListboxItemFromIndex(index), true) 241 else -- If the quest isn't found an error is output and the first quest is selected instead. 242 cout(1, "Error in QuestGUI: selectQuest(), input quest is not in list. Selecting first.") 243 list:setItemSelectState(list:getListboxItemFromIndex(0), true) -- Select first 244 end 245 end 246 247 -- Helper function, insert the input hint into the input hintsWindow. Returns the height of the newly inserted hint. 248 -- hintsWindow is the window in which the hint is to be inserted. 249 -- hint is the hint to be inserted. 250 -- index is the index of the hint. 251 -- offset is the current offset in the hintsWindow. 252 function P.insertHint(hintsWindow, hint, index, offset) 253 -- Create the window for the hint. 254 local window = winMgr:createWindow("MenuWidgets/StaticText", "orxonox/QuestGUI/Quest/Hints/" .. index) 255 window:setProperty("HorzFormatting", "WordWrapLeftAligned") 256 window:setProperty("VertFormatting", "TopAligned") 257 window:setProperty("FrameEnabled", "false") 258 window:setID(index) 259 hintsWindow:addChildWindow(window) 260 local description = P.questManager:getDescription(hint) 261 window:setText(description:getDescription()) 262 window:setSize(CEGUI.UVector2(CEGUI.UDim(1, -P.borderSize), CEGUI.UDim(1, 0))) 263 local height = getStaticTextWindowHeight(window) 264 window:setHeight(CEGUI.UDim(0, height)) 265 window:setPosition(CEGUI.UVector2(CEGUI.UDim(0, P.borderSize), CEGUI.UDim(0, offset))) 266 return height 267 end 268 269 -- Show the currently active quests in the quests list. 270 function P.showActiveQuestsButton_clicked(e) 271 if P.showActive == false then 272 P.showActive = true 273 P.loadQuestsList() 274 end 275 end 276 277 -- Show the finished (i.e. inactive) quests in the quests list. 278 function P.showFinishedQuestsButton_clicked(e) 279 if P.showActive == true then 280 P.showActive = false 281 P.loadQuestsList() 282 end 283 end 284 285 -- Change to a new quest. 286 function P.changeQuest_clicked(e) 287 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/QuestsList")) 288 local choice = list:getFirstSelectedItem() 289 if choice ~= nil then 290 local index = list:getItemIndex(choice) 291 local quest = P.quests[index+1] 292 if quest ~= nil then 293 P.loadQuest(quest) 294 end 295 end 296 end 297 298 -- Change to a new subquest. 299 function P.changeToSubquest_clicked(e) 300 local list = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/Quest/SubquestsList")) 301 local questsList = CEGUI.toListbox(winMgr:getWindow("orxonox/QuestGUI/QuestsList")) 302 local choice = list:getFirstSelectedItem() 303 if choice ~= nil then 304 local index = list:getItemIndex(choice) 305 local quest = P.subquests[index+1] 306 if quest ~= nil then 307 -- If the P.showActive must be changed to display the quest the quests list also has to be regenerated. 308 if quest:isActive(P.player) == P.showActive then 309 P.selectQuest(questsList, quest) 310 else 311 P.showActive = quest:isActive(P.player) 312 P.loadQuestsList(quest) 313 end 314 else 315 cout(1, "Error in QuestGUI: changeToSubquest(), quest was nil. Ignoring...") 316 end 317 end 318 end 319 320 -- old: 321 --[[ 32 322 function P.createQuestGUI() 33 323 local questManager = orxonox.QuestManager:getInstance() … … 283 573 winMgr:destroyWindow(P.detailsWindows[detailsNr]) 284 574 P.detailsWindows[detailsNr] = nil 285 end 575 end --]] 286 576 287 577 return P
Note: See TracChangeset
for help on using the changeset viewer.