From 20906f1c42861778d9e01c9f216af90e60cc3a2c Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 28 Mar 2014 21:28:45 +0100 Subject: [PATCH] new structure for optional Questgroups instead of single Quests --- controllers/QuestgroupsController.inc | 39 ++-- .../QuestgroupshierarchypathController.inc | 26 ++- controllers/QuestsController.inc | 85 ++++---- controllers/SeminariesController.inc | 4 +- models/QuestgroupsModel.inc | 181 +++++++++++++----- models/QuestgroupshierarchyModel.inc | 27 ++- models/QuestsModel.inc | 163 ++++++---------- models/QuesttextsModel.inc | 36 +++- views/html/questgroups/questgroup.tpl | 14 +- views/html/questgroupshierarchypath/index.tpl | 16 +- views/html/quests/quest.tpl | 11 +- views/html/quests/submissions.tpl | 5 - 12 files changed, 354 insertions(+), 253 deletions(-) diff --git a/controllers/QuestgroupsController.inc b/controllers/QuestgroupsController.inc index 8657bf89..8a04d0bd 100644 --- a/controllers/QuestgroupsController.inc +++ b/controllers/QuestgroupsController.inc @@ -24,7 +24,7 @@ * * @var array */ - public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'quests'); + public $models = array('seminaries', 'questgroupshierarchy', 'questgroups', 'quests', 'questtexts'); /** * User permissions * @@ -63,7 +63,7 @@ $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); // Get Questgrouphierarchy - $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyById($questgroup['questgroupshierarchy_id']); + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); // Get Character $character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']); @@ -77,21 +77,25 @@ } // Get child Questgroupshierarchy - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroupshierarchy['id']); - foreach($childQuestgroupshierarchy as &$hierarchy) + $childQuestgroupshierarchy = null; + if(!empty($questgroup['hierarchy'])) { - // Get Questgroups - $hierarchy['questgroups'] = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); - - // Get additional data - for($i=0; $iQuestgroupshierarchy->getChildQuestgroupshierarchy($questgroup['hierarchy']['id']); + foreach($childQuestgroupshierarchy as &$hierarchy) { - // Get Character XPs - $hierarchy['questgroups'][$i]['character_xps'] = $this->Questgroups->getAchievedXPsForQuestgroup($hierarchy['questgroups'][$i]['id'], $character['id']); + // Get Questgroups + $hierarchy['questgroups'] = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); - // Check permission of Questgroups - if($i >= 1) { - $hierarchy['questgroups'][$i]['access'] = $this->Questgroups->hasCharacterSolvedQuestgroup($hierarchy['questgroups'][$i-1]['id'], $character['id']); + // Get additional data + for($i=0; $iQuestgroups->getAchievedXPsForQuestgroup($hierarchy['questgroups'][$i]['id'], $character['id']); + + // Check permission of Questgroups + if($i >= 1) { + $hierarchy['questgroups'][$i]['access'] = $this->Questgroups->hasCharacterSolvedQuestgroup($hierarchy['questgroups'][$i-1]['id'], $character['id']); + } } } } @@ -107,7 +111,7 @@ $quests = null; if(count($childQuestgroupshierarchy) == 0) { - $quests = $this->Quests->getMainquestsForQuestgroup($questgroup['id']); + $quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']); foreach($quests as $i => &$quest) { // Set status @@ -118,8 +122,8 @@ $quest['access'] = $this->Quests->hasCharacterSolvedQuest($quests[$i-1]['id'], $character['id']); } - // Attach sidequests - $quests[$i]['sidequests'] = $this->Quests->getSidequestsForQuest($quest['id']); + // Attach related Questgroups + $quest['relatedQuestgroups'] = $this->Questgroups->getRelatedQuestsgroupsOfQuest($quest['id']); } } @@ -127,7 +131,6 @@ // Pass data to view $this->set('seminary', $seminary); $this->set('questgroup', $questgroup); - $this->set('questgroupshierarchy', $questgroupshierarchy); $this->set('childquestgroupshierarchy', $childQuestgroupshierarchy); $this->set('texts', $questgroupTexts); $this->set('quests', $quests); diff --git a/controllers/QuestgroupshierarchypathController.inc b/controllers/QuestgroupshierarchypathController.inc index e746d198..196aa928 100644 --- a/controllers/QuestgroupshierarchypathController.inc +++ b/controllers/QuestgroupshierarchypathController.inc @@ -25,7 +25,7 @@ * * @var array */ - public $models = array('seminaries', 'questgroups', 'questgroupshierarchy'); + public $models = array('seminaries', 'questgroups', 'questgroupshierarchy', 'quests', 'questtexts'); @@ -46,22 +46,28 @@ // Get Questgroup $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); // Get parent Questgrouphierarchy - $parentQuestgroupshierarchy = array(); $currentQuestgroup = $questgroup; + $parentQuestgroupshierarchy = array(); if($showGroup) { - $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyById($currentQuestgroup['questgroupshierarchy_id']); + array_unshift($parentQuestgroupshierarchy, $currentQuestgroup); + } + if(is_null($questgroup['hierarchy'])) + { + $questtext = $this->Questtexts->getRelatedQuesttextForQuestgroup($currentQuestgroup['id']); + $quest = $this->Quests->getQuestById($questtext['quest_id']); + $currentQuestgroup = $this->Questgroups->getQuestgroupById($quest['questgroup_id']); + $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']); + $quest['questgroup'] = $currentQuestgroup; + array_unshift($parentQuestgroupshierarchy, $quest); array_unshift($parentQuestgroupshierarchy, $currentQuestgroup); } - while(!is_null($currentQuestgroup['parent_questgroup_id'])) + while(!empty($currentQuestgroup['hierarchy']) && !is_null($currentQuestgroup['hierarchy']['parent_questgroup_id'])) { - // Get Questgroup - $currentQuestgroup = $this->Questgroups->GetQuestgroupById($currentQuestgroup['parent_questgroup_id']); - - // Get Questgroupshierarchy - $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyById($currentQuestgroup['questgroupshierarchy_id']); - + $currentQuestgroup = $this->Questgroups->GetQuestgroupById($currentQuestgroup['hierarchy']['parent_questgroup_id']); + $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']); array_unshift($parentQuestgroupshierarchy, $currentQuestgroup); } diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 3204bb7c..03caa466 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -88,30 +88,41 @@ else { // Previous Quests - if(count($previousQuests) > 0) + // One previous Quest has to be solved and no other + // following Quests of ones has to be tried + $solved = false; + $tried = false; + foreach($previousQuests as &$previousQuest) { - $solved = false; - foreach($previousQuests as &$previousQuest) + // // Check previous Quest + if($this->Quests->hasCharacterSolvedQuest($previousQuest['id'], $character['id'])) { - if($this->Quests->hasCharacterSolvedQuest($previousQuest['id'], $character['id'])) { - $solved = true; - break; + $solved = true; + + // Check following Quests + $followingQuests = $this->Quests->getNextQuests($previousQuest['id']); + foreach($followingQuests as $followingQuest) + { + // Check following Quest + if($followingQuest['id'] != $quest['id'] && $this->Quests->hasCharacterTriedQuest($followingQuest['id'], $character['id'])) + { + $tried = true; + break; + } } + + break; } - if(!$solved) { - throw new \nre\exceptions\AccessDeniedException(); - } + } + if(!$solved || $tried) { + throw new \nre\exceptions\AccessDeniedException(); } } - // Get (related) Questtext (for Sidequests) - $relatedQuesttext = null; - if(!$quest['is_mainquest']) - { - $relatedQuesttext = $this->Questtexts->getQuesttextForSidequest($quest['id']); - if(!empty($relatedQuesttext)) { - $relatedQuesttext['quest'] = $this->Quests->getQuestById($relatedQuesttext['quest_id']); - } + // Get (related) Questtext + $relatedQuesttext = $this->Questtexts->getRelatedQuesttextForQuestgroup($questgroup['id']); + if(!empty($relatedQuesttext)) { + $relatedQuesttext['quest'] = $this->Quests->getQuestById($relatedQuesttext['quest_id']); } // Get Questtext @@ -128,7 +139,7 @@ try { $questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos); $questtext['count'] = $questtextCount; - $questtext['sidequests'] = $this->Quests->getSidequestsForQuesttext($questtext['id']); + $questtext['relatedQuestsgroups'] = $this->Questgroups->getRelatedQuestsgroupsOfQuesttext($questtext['id']); } catch(\nre\exceptions\IdNotFoundException $e) { if(!($questtexttypeUrl == 'Prolog' || $questtexttypeUrl == 'Epilog' && $questtextPos == 1)) { @@ -181,23 +192,24 @@ $nextQuestgroup = null; if($questtexttypeUrl == 'Epilog' || $solved) { - if($quest['is_mainquest']) - { - // Next Quest - $nextQuests = $this->Quests->getNextQuests($quest['id']); + // Next Quest + $nextQuests = $this->Quests->getNextQuests($quest['id']); - // Next Questgroup - if(empty($nextQuests)) + // Next Questgroup + if(empty($nextQuests)) + { + if(is_null($relatedQuesttext)) { $nextQuestgroup = $this->Questgroups->getNextQuestgroup($questgroup['id']); - $nextQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyById($nextQuestgroup['questgroupshierarchy_id']); + $nextQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($nextQuestgroup['id']); + } + else + { + // Related (Main-) Quest + $nextQuest = $relatedQuesttext['quest']; + $nextQuest['questgroup_url'] = $this->Questgroups->getQuestgroupById($nextQuest['questgroup_id'])['url']; + $nextQuests = array($nextQuest); } - } - else { - // Related (Main-) Quest - $nextQuest = $relatedQuesttext['quest']; - $nextQuest['questgroup_url'] = $questgroup['url']; - $nextQuests = array($nextQuest); } } @@ -237,16 +249,6 @@ // Get Quest $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $questUrl); - // Get (related) Questtext (for Sidequests) - $relatedQuesttext = null; - if(!$quest['is_mainquest']) - { - $relatedQuesttext = $this->Questtexts->getQuesttextForSidequest($quest['id']); - if(!empty($relatedQuesttext)) { - $relatedQuesttext['quest'] = $this->Quests->getQuestById($relatedQuesttext['quest_id']); - } - } - // Media $questmedia = null; if(!is_null($quest['questsmedia_id'])) { @@ -270,7 +272,6 @@ $this->set('seminary', $seminary); $this->set('questgroup', $questgroup); $this->set('quest', $quest); - $this->set('relatedquesttext', $relatedQuesttext); $this->set('media', $questmedia); $this->set('unsolvedsubmissions', $unsolvedSubmissions); $this->set('solvedsubmissions', $solvedSubmissions); diff --git a/controllers/SeminariesController.inc b/controllers/SeminariesController.inc index 86df9068..695baabc 100644 --- a/controllers/SeminariesController.inc +++ b/controllers/SeminariesController.inc @@ -94,14 +94,13 @@ $character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']); // Questgrouphierarchy and Questgroups - $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyForSeminary($seminary['id']); + $questgroupshierarchy = $this->Questgroupshierarchy->getHierarchyOfSeminary($seminary['id']); foreach($questgroupshierarchy as &$hierarchy) { // Get Questgroups $hierarchy['questgroups'] = $this->Questgroups->getQuestgroupsForHierarchy($hierarchy['id']); // Get additional data - //for($i=0; $i &$questgroup) { // Get first Questgroup text @@ -147,7 +146,6 @@ if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create'))) { // Create new seminary - var_dump($this->Auth->getUserId()); $seminaryId = $this->Seminaries->createSeminary( $this->request->getPostParam('title'), $this->Auth->getUserId() diff --git a/models/QuestgroupsModel.inc b/models/QuestgroupsModel.inc index 7f5e466b..f933c3da 100644 --- a/models/QuestgroupsModel.inc +++ b/models/QuestgroupsModel.inc @@ -24,7 +24,7 @@ * * @var array */ - public $models = array('questgroupshierarchy', 'quests'); + public $models = array('questgroupshierarchy', 'quests', 'questtexts'); @@ -54,10 +54,11 @@ if(is_null($parentQuestgroupId)) { $questgroups = $this->db->query( - 'SELECT id, questgroupshierarchy_id, pos, title, url, questgroupspicture_id '. - 'FROM questgroups '. - 'WHERE questgroups.questgroupshierarchy_id = ? AND parent_questgroup_id IS NULL '. - 'ORDER BY questgroups.pos ASC', + 'SELECT questgroups.id, questgroups_questgroupshierarchy.questgroupshierarchy_id, questgroups_questgroupshierarchy.pos, questgroups.title, questgroups.url, questgroups.questgroupspicture_id '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. + 'WHERE questgroups_questgroupshierarchy.questgroupshierarchy_id = ? AND questgroups_questgroupshierarchy.parent_questgroup_id IS NULL '. + 'ORDER BY questgroups_questgroupshierarchy.pos ASC', 'i', $hierarchyId ); @@ -65,10 +66,11 @@ else { $questgroups = $this->db->query( - 'SELECT id, questgroupshierarchy_id, pos, title, url, questgroupspicture_id '. - 'FROM questgroups '. - 'WHERE questgroups.questgroupshierarchy_id = ? AND parent_questgroup_id = ? '. - 'ORDER BY questgroups.pos ASC', + 'SELECT questgroups.id, questgroups_questgroupshierarchy.questgroupshierarchy_id, questgroups_questgroupshierarchy.pos, questgroups.title, questgroups.url, questgroups.questgroupspicture_id '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. + 'WHERE questgroups_questgroupshierarchy.questgroupshierarchy_id = ? AND questgroups_questgroupshierarchy.parent_questgroup_id = ? '. + 'ORDER BY questgroups_questgroupshierarchy.pos ASC', 'ii', $hierarchyId, $parentQuestgroupId ); @@ -97,7 +99,7 @@ public function getQuestgroupById($questgroupId) { $data = $this->db->query( - 'SELECT id, questgroupshierarchy_id, parent_questgroup_id, pos, title, url, questgroupspicture_id '. + 'SELECT id, title, url, questgroupspicture_id '. 'FROM questgroups '. 'WHERE questgroups.id = ?', 'i', @@ -123,10 +125,9 @@ public function getQuestgroupByUrl($seminaryId, $questgroupUrl) { $data = $this->db->query( - 'SELECT questgroups.id, questgroups.questgroupshierarchy_id, questgroups.parent_questgroup_id, questgroups.pos, questgroups.title, questgroups.url, questgroups.questgroupspicture_id '. + 'SELECT id, title, url, questgroupspicture_id '. 'FROM questgroups '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. - 'WHERE questgroupshierarchy.seminary_id = ? AND questgroups.url = ?', + 'WHERE seminary_id = ? AND url = ?', 'is', $seminaryId, $questgroupUrl ); @@ -197,11 +198,14 @@ public function getNextQuestgroup($questgroupId) { $currentQuestgroup = $this->getQuestgroupById($questgroupId); - $nextQuestgroup = $this->_getNextQuestgroup($currentQuestgroup['parent_questgroup_id'], $currentQuestgroup['pos']); - while(is_null($nextQuestgroup) && !is_null($currentQuestgroup['parent_questgroup_id'])) - { - $currentQuestgroup = $this->getQuestgroupById($currentQuestgroup['parent_questgroup_id']); - $nextQuestgroup = $this->_getNextQuestgroup($currentQuestgroup['parent_questgroup_id'], $currentQuestgroup['pos']); + $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']); + if(empty($currentQuestgroup['hierarchy'])) { + return null; + } + + $nextQuestgroup = $this->_getNextQuestgroup($currentQuestgroup['hierarchy']['parent_questgroup_id'], $currentQuestgroup['hierarchy']['questgroup_pos']); + if(is_null($nextQuestgroup) && !is_null($currentQuestgroup['hierarchy']['parent_questgroup_id'])) { + $nextQuestgroup = $this->getNextQuestgroup($currentQuestgroup['hierarchy']['parent_questgroup_id']); } @@ -223,11 +227,14 @@ public function getPreviousQuestgroup($questgroupId) { $currentQuestgroup = $this->getQuestgroupById($questgroupId); - $previousQuestgroup = $this->_getPreviousQuestgroup($currentQuestgroup['parent_questgroup_id'], $currentQuestgroup['pos']); - while(is_null($previousQuestgroup) && !is_null($currentQuestgroup['parent_questgroup_id'])) - { - $currentQuestgroup = $this->getQuestgroupById($currentQuestgroup['parent_questgroup_id']); - $previousQuestgroup = $this->_getPreviousQuestgroup($currentQuestgroup['parent_questgroup_id'], $currentQuestgroup['pos']); + $currentQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($currentQuestgroup['id']); + if(empty($currentQuestgroup['hierarchy'])) { + return null; + } + + $previousQuestgroup = $this->_getPreviousQuestgroup($currentQuestgroup['hierarchy']['parent_questgroup_id'], $currentQuestgroup['hierarchy']['questgroup_pos']); + if(is_null($previousQuestgroup) && !is_null($currentQuestgroup['hierarchy']['parent_questgroup_id'])) { + $previousQuestgroup = $this->getPreviousQuestgroup($currentQuestgroup['hierarchy']['parent_questgroup_id']); } @@ -245,22 +252,74 @@ */ public function hasCharacterSolvedQuestgroup($questgroupId, $characterId) { - $currentQuestgroup = $this->getQuestgroupById($questgroupId); - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($currentQuestgroup['questgroupshierarchy_id']); - $lastChildQuestgroupshierarchy = array_pop($childQuestgroupshierarchy); - while(!is_null($lastChildQuestgroupshierarchy)) - { - $questgroups = $this->getQuestgroupsForHierarchy($lastChildQuestgroupshierarchy['id'], $currentQuestgroup['id']); - $currentQuestgroup = array_pop($questgroups); - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($currentQuestgroup['questgroupshierarchy_id']); - $lastChildQuestgroupshierarchy = array_pop($childQuestgroupshierarchy); + // Get data of Questgroup + $questgroup = $this->getQuestgroupById($questgroupId); + + // Chack all Quests + $quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']); + foreach($quests as &$quest) { + if(!$this->Quests->hasCharacterSolvedQuest($quest['id'], $characterId)) { + return false; + } } - $quests = $this->Quests->getMainquestsForQuestgroup($currentQuestgroup['id']); - $lastQuest = array_pop($quests); + // Check all child Questgroups + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); + if(!empty($questgroup['hierarchy'])) + { + $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroup['hierarchy']['id']); + foreach($childQuestgroupshierarchy as &$hierarchy) + { + // Get Questgroups + $questgroups = $this->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); + foreach($questgroups as &$group) { + if(!$this->hasCharacterSolvedQuestgroup($group['id'], $characterId)) { + return false; + } + } + } + } - return $this->Quests->hasCharacterSolvedQuest($lastQuest['id'], $characterId); + return true; + } + + + /** + * Get all related Questgroups of a Questtext. + * + * @param int $questtextId ID of the questtext + * @return array Sidequests for the questtext + */ + public function getRelatedQuestsgroupsOfQuesttext($questtextId) + { + return $this->db->query( + 'SELECT questgroups.id, questgroups_questtexts.questtext_id, questgroups.title, questgroups.url, questgroups_questtexts.entry_text '. + 'FROM questgroups_questtexts '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questtexts.questgroup_id '. + 'WHERE questgroups_questtexts.questtext_id = ?', + 'i', + $questtextId + ); + } + + + /** + * Get all related Questgroups of a Quest. + * + * @param int $questId ID of the quest + * @return array Sidequests for the quest + */ + public function getRelatedQuestsgroupsOfQuest($questId) + { + $questgroups = array(); + $questtexts = $this->Questtexts->getQuesttextsOfQuest($questId); + foreach($questtexts as &$questtext) { + $questgroups = array_merge($questgroups, $this->getRelatedQuestsgroupsOfQuesttext($questtext['id'])); + } + + + return $questgroups; } @@ -278,20 +337,32 @@ // Current Questgroup $questgroup = $this->getQuestgroupById($questgroupId); + $questgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); // Quests of current Questgroup - $quests = $this->Quests->getMainquestsForQuestgroup($questgroup['id']); - foreach($quests as &$quest) { + $quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']); + foreach($quests as &$quest) + { $xps += $quest['xps']; + + // Related Questgroups + $relatedQuestgroups = $this->getRelatedQuestsgroupsOfQuest($quest['id']); + foreach($relatedQuestgroups as $group) { + $xps += $this->getAchievableXPsForQuestgroup($group['id']); + } } // XPs of child Questgroups - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroup['questgroupshierarchy_id']); - foreach($childQuestgroupshierarchy as &$hierarchy) + $questgroupHierarchy = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); + if(!empty($questgroupHierarchy)) { - $questgroups = $this->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); - foreach($questgroups as &$questgroup) { - $xps += $this->getAchievableXPsForQuestgroup($questgroup['id']); + $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroupHierarchy['id']); + foreach($childQuestgroupshierarchy as &$hierarchy) + { + $questgroups = $this->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); + foreach($questgroups as &$questgroup) { + $xps += $this->getAchievableXPsForQuestgroup($questgroup['id']); + } } } @@ -318,16 +389,26 @@ $questgroup = $this->getQuestgroupById($questgroupId); // Quests of current Questgroup - $quests = $this->Quests->getMainquestsForQuestgroup($questgroup['id']); + $quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']); foreach($quests as &$quest) { if($this->Quests->hasCharacterSolvedQuest($quest['id'], $characterId)) { $xps += $quest['xps']; } + + // Related Questgroups + $relatedQuestgroups = $this->getRelatedQuestsgroupsOfQuest($quest['id']); + foreach($relatedQuestgroups as $group) { + $xps += $this->getAchievedXPsForQuestgroup($group['id'], $characterId); + } } // XPs of child Questgroups - $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroup['questgroupshierarchy_id']); + $questgroupHierarchy = $this->Questgroupshierarchy->getHierarchyForQuestgroup($questgroup['id']); + if(empty($questgroupHierarchy)) { + return $xps; + } + $childQuestgroupshierarchy = $this->Questgroupshierarchy->getChildQuestgroupshierarchy($questgroupHierarchy['id']); foreach($childQuestgroupshierarchy as &$hierarchy) { $questgroups = $this->getQuestgroupsForHierarchy($hierarchy['id'], $questgroup['id']); @@ -357,7 +438,8 @@ { $data = $this->db->query( 'SELECT * '. - 'FROM questgroups '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. 'WHERE parent_questgroup_id = ? AND pos = ? + 1', 'ii', $parentQuestgroupId, $questgroupPos @@ -367,7 +449,8 @@ { $data = $this->db->query( 'SELECT * '. - 'FROM questgroups '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. 'WHERE parent_questgroup_id IS NULL AND pos = ? + 1', 'i', $questgroupPos @@ -395,7 +478,8 @@ { $data = $this->db->query( 'SELECT * '. - 'FROM questgroups '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. 'WHERE parent_questgroup_id = ? AND pos = ? - 1', 'ii', $parentQuestgroupId, $questgroupPos @@ -405,7 +489,8 @@ { $data = $this->db->query( 'SELECT * '. - 'FROM questgroups '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroups ON questgroups.id = questgroups_questgroupshierarchy.questgroup_id '. 'WHERE parent_questgroup_id IS NULL AND pos = ? - 1', 'i', $questgroupPos diff --git a/models/QuestgroupshierarchyModel.inc b/models/QuestgroupshierarchyModel.inc index df676ea4..c1dae116 100644 --- a/models/QuestgroupshierarchyModel.inc +++ b/models/QuestgroupshierarchyModel.inc @@ -65,7 +65,7 @@ * @param int $seminaryId ID of the seminary to get hierarchy for * @return array Toplevel hierarchy */ - public function getHierarchyForSeminary($seminaryId) + public function getHierarchyOfSeminary($seminaryId) { return $this->db->query( 'SELECT id, seminary_id, parent_questgroupshierarchy_id, pos, title_singular, title_plural, url '. @@ -80,6 +80,31 @@ } + /** + * Get the Questgroup-Hierarchy for a Questgroup. + * + * @param int $questgroupId ID of Questgroup + * @return array Hierarchy for Questgroup + */ + public function getHierarchyForQuestgroup($questgroupId) + { + $data = $this->db->query( + 'SELECT questgroups_questgroupshierarchy.parent_questgroup_id, questgroups_questgroupshierarchy.pos AS questgroup_pos, questgroupshierarchy.id, questgroupshierarchy.seminary_id, questgroupshierarchy.parent_questgroupshierarchy_id, questgroupshierarchy.pos, questgroupshierarchy.title_singular, questgroupshierarchy.title_plural, questgroupshierarchy.url '. + 'FROM questgroups_questgroupshierarchy '. + 'INNER JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups_questgroupshierarchy.questgroupshierarchy_id '. + 'WHERE questgroups_questgroupshierarchy.questgroup_id = ?', + 'i', + $questgroupId + ); + if(!empty($data)) { + return $data[0]; + } + + + return null; + } + + /** * Get the child hierarchy entries of a Questgroup hierarchy. * diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index b93edfb1..c09a0e03 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -40,16 +40,36 @@ * @param int $questgroupId ID of a Questgroup * @return array Quests of the given Questgroup */ - public function getMainquestsForQuestgroup($questgroupId) + public function getQuestsForQuestgroup($questgroupId) { - return $this->db->query( + $quests = array(); + + // Get first Quest + $quest = $this->db->query( 'SELECT id, questtype_id, title, url, xps, task '. 'FROM quests '. - 'INNER JOIN mainquests ON mainquests.quest_id = quests.id '. - 'WHERE questgroup_id = ?', + 'LEFT JOIN quests_previousquests ON quests_previousquests.quest_id = quests.id '. + 'WHERE questgroup_id = ? AND quests_previousquests.previous_quest_id IS NULL', 'i', $questgroupId ); + if(empty($quest)) { + return $quests; + } + $quest = $quest[0]; + array_push($quests, $quest); + + // Get next Quests + // TODO Multiple next Quests + while(($nextQuests = $this->getNextQuests($quest['id'])) != null) + { + $quest = $nextQuests[0]; + array_push($quests, $quest); + } + + + // Return Quests + return $quests; } @@ -65,12 +85,10 @@ public function getQuestByUrl($seminaryId, $questgroupId, $questUrl) { $data = $this->db->query( - 'SELECT quests.id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.right_text, quests.wrong_text, quests.questsmedia_id, ('. - 'SELECT count(mainquests.quest_id) FROM mainquests WHERE mainquests.quest_id = quests.id) AS is_mainquest '. + 'SELECT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.right_text, quests.wrong_text, quests.questsmedia_id '. 'FROM quests '. 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. - 'WHERE questgroupshierarchy.seminary_id = ? AND questgroups.id = ? AND quests.url = ?', + 'WHERE questgroups.seminary_id = ? AND questgroups.id = ? AND quests.url = ?', 'iis', $seminaryId, $questgroupId, $questUrl ); @@ -78,8 +96,6 @@ throw new \nre\exceptions\IdNotFoundException($questUrl); } - $data[0]['is_mainquest'] = ($data[0]['is_mainquest'] == 1); - return $data[0]; } @@ -95,11 +111,9 @@ public function getQuestById($questId) { $data = $this->db->query( - 'SELECT quests.id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.right_text, quests.wrong_text, quests.questsmedia_id, ('. - 'SELECT count(mainquests.quest_id) FROM mainquests WHERE mainquests.quest_id = quests.id) AS is_mainquest '. + 'SELECT quests.id, quests.questgroup_id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.right_text, quests.wrong_text, quests.questsmedia_id '. 'FROM quests '. 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. 'WHERE quests.id = ?', 'i', $questId @@ -108,89 +122,11 @@ throw new \nre\exceptions\IdNotFoundException($questId); } - $data[0]['is_mainquest'] = ($data[0]['is_mainquest'] == 1); - return $data[0]; } - /** - * Get a Sidequest and its data by its URL. - * - * @throws IdNotFoundException - * @param int $seminaryId ID of the corresponding Seminary - * @param int $questgroupId ID of the corresponding Questgroup - * @param int $questId ID of the Quest - * @param string $sidequestUrl URL-title of a Sidequest - * @return array Sidequest data - */ - public function getSidequestByUrl($seminaryId, $questgroupId, $questId, $sidequestUrl) - { - $data = $this->db->query( - 'SELECT quests.id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, quests.right_text, quests.wrong_text, quests.questsmedia_id '. - 'FROM quests '. - 'INNER JOIN sidequests ON sidequests.quest_id = quests.id '. - 'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '. - 'LEFT JOIN mainquests ON mainquests.quest_id = questtexts.mainquest_id '. - 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. - 'LEFT JOIN seminaries ON seminaries.id = questgroupshierarchy.seminary_id '. - 'WHERE quests.url = ? AND mainquests.id = ? AND questgroups.id = ? AND seminaries.id = ?', - 'siii', - $sidequestUrl, - $questId, - $questgroupId, - $seminaryId - ); - if(empty($data)) { - throw new \nre\exceptions\IdNotFoundException($sidequestUrl); - } - - - return $data[0]; - } - - - /** - * Get all sidequests for a Quest. - * - * @param int $questId ID of the quest - * @return array Sidequests for the quest - */ - public function getSidequestsForQuest($questId) - { - return $this->db->query( - 'SELECT quests.id, sidequests.questtext_id, quests.title, quests.url, sidequests.entry_text '. - 'FROM quests '. - 'INNER JOIN sidequests ON sidequests.quest_id = quests.id '. - 'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '. - 'WHERE questtexts.quest_id = ?', - 'i', - $questId - ); - } - - - /** - * Get all sidequests for a Questtext. - * - * @param int $questtextId ID of the questtext - * @return array Sidequests for the questtext - */ - public function getSidequestsForQuesttext($questtextId) - { - return $this->db->query( - 'SELECT id, questtext_id, title, url, entry_text '. - 'FROM quests '. - 'INNER JOIN sidequests ON sidequests.quest_id = quests.id '. - 'WHERE questtext_id = ?', - 'i', - $questtextId - ); - } - - /** * Get Quests that follow-up a Quest. * @@ -200,13 +136,11 @@ public function getNextQuests($questId) { return $this->db->query( - 'SELECT quests.id, quests.title, quests.url, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. - 'FROM mainquests_previousmainquests '. - 'LEFT JOIN mainquests ON mainquests.quest_id = mainquests_previousmainquests.mainquest_id '. - 'INNER JOIN quests ON quests.id = mainquests.quest_id '. - 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. - 'WHERE mainquests_previousmainquests.previous_mainquest_id = ?', + 'SELECT quests.id, quests.questtype_id, quests.title, quests.url, quests.xps, quests.task, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. + 'FROM quests_previousquests '. + 'INNER JOIN quests ON quests.id = quests_previousquests.quest_id '. + 'INNER JOIN questgroups ON questgroups.id = quests.questgroup_id '. + 'WHERE quests_previousquests.previous_quest_id = ?', 'i', $questId ); @@ -223,12 +157,10 @@ { return $this->db->query( 'SELECT quests.id, quests.title, quests.url, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. - 'FROM mainquests_previousmainquests '. - 'LEFT JOIN mainquests ON mainquests.quest_id = mainquests_previousmainquests.previous_mainquest_id '. - 'INNER JOIN quests ON quests.id = mainquests.quest_id '. - 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. - 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. - 'WHERE mainquests_previousmainquests.mainquest_id = ?', + 'FROM quests_previousquests '. + 'INNER JOIN quests ON quests.id = quests_previousquests.previous_quest_id '. + 'INNER JOIN questgroups ON questgroups.id = quests.questgroup_id '. + 'WHERE quests_previousquests.quest_id = ?', 'i', $questId ); @@ -277,6 +209,29 @@ } + /** + * Determine if the given Character has tried to solve a Quest. + * + * @param int $questId ID of Quest to check + * @param int $characterId ID of Character to check + * @result boolean Whether Character has tried to solved the Quest or not + */ + public function hasCharacterTriedQuest($questId, $characterId) + { + $count = $this->db->query( + 'SELECT count(id) AS c '. + 'FROM quests_characters '. + 'WHERE quest_id = ? AND character_id = ? AND status IN (-1,0)', + 'ii', + $questId, + $characterId + ); + + + return (!empty($count) && intval($count[0]['c']) > 0); + } + + /** * Determine if the given Character has solved the given Quest. * diff --git a/models/QuesttextsModel.inc b/models/QuesttextsModel.inc index 38a1286d..3a84a9a5 100644 --- a/models/QuesttextsModel.inc +++ b/models/QuesttextsModel.inc @@ -62,6 +62,25 @@ } + /** + * Get all Questtexts for a Quest. + * + * @param int $questId ID of the Quest + * @return array All Questtexts for a Quest + */ + public function getQuesttextsOfQuest($questId) + { + return $this->db->query( + 'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.abort_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. + 'FROM questtexts '. + 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. + 'WHERE questtexts.quest_id = ?', + 'i', + $questId + ); + } + + /** * Get count of Questtexts for a Quest. * @@ -96,24 +115,23 @@ * @param int $sidequestId ID of the Sidequest to get the Questtext for * @param array Questtext data */ - public function getQuesttextForSidequest($sidequestId) + public function getRelatedQuesttextForQuestgroup($questgroupId) { $data = $this->db->query( 'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.quest_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. - 'FROM quests '. - 'INNER JOIN sidequests ON sidequests.quest_id = quests.id '. - 'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '. + 'FROM questgroups_questtexts '. + 'LEFT JOIN questtexts ON questtexts.id = questgroups_questtexts.questtext_id '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. - 'WHERE quests.id = ?', + 'WHERE questgroups_questtexts.questgroup_id = ?', 'i', - $sidequestId + $questgroupId ); - if(empty($data)) { - throw new \nre\exceptions\IdNotFoundException($sidequestId); + if(!empty($data)) { + return $data[0]; } - return $data[0]; + return null; } diff --git a/views/html/questgroups/questgroup.tpl b/views/html/questgroups/questgroup.tpl index 7ec11160..f1c2842b 100644 --- a/views/html/questgroups/questgroup.tpl +++ b/views/html/questgroups/questgroup.tpl @@ -7,11 +7,16 @@ -

:

+ +

:

+ +

+

+ 0) : ?>

@@ -37,6 +42,7 @@ +

@@ -45,11 +51,11 @@
  • class="solved"> - 0) : ?> + 0) : ?>
      - +
    • - +
    diff --git a/views/html/questgroupshierarchypath/index.tpl b/views/html/questgroupshierarchypath/index.tpl index c51e0e8f..7fcf0c60 100644 --- a/views/html/questgroupshierarchypath/index.tpl +++ b/views/html/questgroupshierarchypath/index.tpl @@ -1,7 +1,21 @@ 0) : ?> diff --git a/views/html/quests/quest.tpl b/views/html/quests/quest.tpl index 595194f5..79ee88d3 100644 --- a/views/html/quests/quest.tpl +++ b/views/html/quests/quest.tpl @@ -3,12 +3,7 @@ -

    - -

    -

    -
    @@ -29,8 +24,8 @@
      - -
    • + +
    • @@ -71,7 +66,7 @@
    - : + : Spiel vorbei diff --git a/views/html/quests/submissions.tpl b/views/html/quests/submissions.tpl index d5cea955..b53085d6 100644 --- a/views/html/quests/submissions.tpl +++ b/views/html/quests/submissions.tpl @@ -3,12 +3,7 @@ -

    - -

    -

    -