diff --git a/agents/intermediate/QuestsAgent.inc b/agents/intermediate/QuestsAgent.inc index 8de47e79..c26a2f70 100644 --- a/agents/intermediate/QuestsAgent.inc +++ b/agents/intermediate/QuestsAgent.inc @@ -32,16 +32,6 @@ $this->addSubAgent('Questgroupspicture', 'index', $request->getParam(3), $request->getParam(4), true); } - - /** - * Action: quest. - */ - public function sidequest(\nre\core\Request $request, \nre\core\Response $response) - { - $this->addSubAgent('Questgroupshierarchypath', 'index', $request->getParam(3), $request->getParam(4), true); - $this->addSubAgent('Questgroupspicture', 'index', $request->getParam(3), $request->getParam(4), true); - } - } ?> diff --git a/app/QuesttypeController.inc b/app/QuesttypeController.inc index 31596073..743c5d59 100644 --- a/app/QuesttypeController.inc +++ b/app/QuesttypeController.inc @@ -251,22 +251,11 @@ // Get Quest $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $this->request->getParam(5)); - // Sidequest - $sidequest = null; - if($this->request->getParam(2) == 'sidequest') { - $sidequest = $this->Quests->getSidequestByUrl($seminary['id'], $questgroup['id'], $quest['id'], $this->request->getParam(6)); - } - // Character $character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']); // Set solved - if(is_null($sidequest)) { - $this->Quests->setQuestSolved($quest['id'], $character['id']); - } - else { - $this->Quests->setSidequestSolved($sidequest['id'], $character['id']); - } + $this->Quests->setQuestSolved($quest['id'], $character['id']); // Redirect @@ -289,23 +278,11 @@ // Get Quest $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $this->request->getParam(5)); - // Sidequest - $sidequest = null; - if($this->request->getParam(2) == 'sidequest') { - $sidequest = $this->Quests->getSidequestByUrl($seminary['id'], $questgroup['id'], $quest['id'], $this->request->getParam(6)); - } - // Character $character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']); // Set solved - if(is_null($sidequest)) { - $this->Quests->setQuestUnsolved($quest['id'], $character['id']); - } - else { - $this->Quests->setSidequestUnsolved($sidequest['id'], $character['id']); - } - + $this->Quests->setQuestUnsolved($quest['id'], $character['id']); // Redirect diff --git a/controllers/QuestgroupsController.inc b/controllers/QuestgroupsController.inc index 1e7c2a29..42e19d05 100644 --- a/controllers/QuestgroupsController.inc +++ b/controllers/QuestgroupsController.inc @@ -96,7 +96,7 @@ $quests = null; if(count($childQuestgroupshierarchy) == 0) { - $quests = $this->Quests->getQuestsForQuestgroup($questgroup['id']); + $quests = $this->Quests->getMainquestsForQuestgroup($questgroup['id']); for($i=0; $i 0) { - if($this->Quests->hasCharacterSolvedQuest($previousQuest['id'], $character['id'])) { - $solved = true; - break; + $solved = false; + foreach($previousQuests as &$previousQuest) + { + if($this->Quests->hasCharacterSolvedQuest($previousQuest['id'], $character['id'])) { + $solved = true; + break; + } + } + if(!$solved) { + throw new \nre\exceptions\AccessDeniedException(); } } - if(!$solved) { - 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']); } } @@ -154,14 +167,23 @@ $nextQuestgroup = null; if($questtexttypeUrl == 'Epilog') { - // Next Quest - $nextQuests = $this->Quests->getNextQuests($quest['id']); - - // Next Questgroup - if(empty($nextQuests)) + if($quest['is_mainquest']) { - $nextQuestgroup = $this->Questgroups->getNextQuestgroup($questgroup['id']); - $nextQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyById($nextQuestgroup['questgroupshierarchy_id']); + // Next Quest + $nextQuests = $this->Quests->getNextQuests($quest['id']); + + // Next Questgroup + if(empty($nextQuests)) + { + $nextQuestgroup = $this->Questgroups->getNextQuestgroup($questgroup['id']); + $nextQuestgroup['hierarchy'] = $this->Questgroupshierarchy->getHierarchyById($nextQuestgroup['questgroupshierarchy_id']); + } + } + else { + // Related (Main-) Quest + $nextQuest = $relatedQuesttext['quest']; + $nextQuest['questgroup_url'] = $questgroup['url']; + $nextQuests = array($nextQuest); } } @@ -173,6 +195,7 @@ $this->set('quest', $quest); $this->set('queststatus', $questStatus); $this->set('queststatustext', $questStatusText); + $this->set('relatedquesttext', $relatedQuesttext); $this->set('nextquests', $nextQuests); $this->set('nextquestgroup', $nextQuestgroup); $this->set('task', $task); @@ -180,137 +203,6 @@ } - /** - * Action: sidequest. - * - * Show a sidequest and its task. - * - * @throws IdNotFoundException - * @param string $seminaryUrl URL-Title of Seminary - * @param string $questgroupUrl URL-Title of Questgroup - * @param string $questUrl URL-Title of Quest - * @param string $sidequestUrl URL-Title of Sidequest - * @param string $sidequesttexttypeUrl URL-Title of Sidequesttexttype - * @param int $sidequesttextPos Position of Sidequesttext - */ - public function sidequest($seminaryUrl, $questgroupUrl, $questUrl, $sidequestUrl, $sidequesttexttypeUrl=null, $sidequesttextPos=1) - { - // Get seminary - $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); - - // Get Questgroup - $questgroup = $this->Questgroups->getQuestgroupByUrl($seminary['id'], $questgroupUrl); - - // Get Quest - $quest = $this->Quests->getQuestByUrl($seminary['id'], $questgroup['id'], $questUrl); - - // Get Sidequest - $sidequest = $this->Quests->getSidequestByUrl($seminary['id'], $questgroup['id'], $quest['id'], $sidequestUrl); - - // Get Character - $character = $this->Characters->getCharacterForUserAndSeminary($this->Auth->getUserId(), $seminary['id']); - - // Check permission - $previousQuests = $this->Quests->getPreviousQuests($quest['id']); - if(count($previousQuests) == 0) - { - // Previous Questgroup - $previousQuestgroup = $this->Questgroups->getPreviousQuestgroup($questgroup['id']); - if(!is_null($previousQuestgroup) && !$this->Questgroups->hasCharacterSolvedQuestgroup($previousQuestgroup['id'], $character['id'])) { - throw new \nre\exceptions\AccessDeniedException(); - } - } - else - { - // Previous Quests - if(count($previousQuests) > 0) - { - $solved = false; - foreach($previousQuests as &$previousQuest) - { - if($this->Quests->hasCharacterSolvedQuest($previousQuest['id'], $character['id'])) { - $solved = true; - break; - } - } - if(!$solved) { - throw new \nre\exceptions\AccessDeniedException(); - } - } - } - - // Get Questtext - $questtext = $this->Questtexts->getQuesttextForSidequest($sidequest['id']); - - // Get Sidequesttext - $sidequesttext = null; - if(is_null($sidequesttexttypeUrl)) { - $sidequesttexttypeUrl = 'Prolog'; - } - $questtexttypes = $this->Questtexts->getQuesttexttypes(); - $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes); - $sidequesttextCount = $this->Questtexts->getQuesttextsCountForSidequest($sidequest['id'], $sidequesttexttypeUrl); - if($sidequesttextCount > 0 && in_array($sidequesttexttypeUrl, $questtexttypes)) - { - if(in_array($sidequesttexttypeUrl, $questtexttypes)) - { - $sidequesttextPos = max(intval($sidequesttextPos), 1); - $sidequesttext = $this->Questtexts->getSidequesttextByUrl($sidequest['id'], $sidequesttexttypeUrl, $sidequesttextPos); - $sidequesttext['count'] = $sidequesttextCount; - } - } - - // Sidequest status - $sidequestStatus = $this->request->getGetParam('status'); - $sidequestStatusText = null; - if(!is_null($sidequestStatus)) - { - switch($sidequestStatus) - { - case 'solved': - $sidequestStatusText = $sidequest['right_text']; - break; - case 'unsolved': - $sidequestStatusText = $sidequest['wrong_text']; - break; - } - } - - // Media - $sidequestmedia = null; - if(!is_null($sidequesttext) && !empty($sidequesttext['questsmedia_id'])) { - $sidequestmedia = $this->Media->getMediaById($sidequesttext['questsmedia_id']); - } - elseif(!is_null($sidequest['questsmedia_id'])) { - $sidequestmedia = $this->Media->getMediaById($sidequest['questsmedia_id']); - } - - // Task - $task = null; - if($sidequesttexttypeUrl == 'Prolog') - { - // Questtype - $questtype = $this->Questtypes->getQuesttypeById($sidequest['questtype_id']); - - // Task - $task = $this->runAndRenderTask($questtype['classname']); - } - - - // Pass data to view - $this->set('seminary', $seminary); - $this->set('questgroup', $questgroup); - $this->set('questtext', $questtext); - $this->set('sidequesttext', $sidequesttext); - $this->set('quest', $quest); - $this->set('sidequest', $sidequest); - $this->set('sidequeststatus', $sidequestStatus); - $this->set('sidequeststatustext', $sidequestStatusText); - $this->set('task', $task); - $this->set('media', $sidequestmedia); - } - - /** diff --git a/models/QuestgroupsModel.inc b/models/QuestgroupsModel.inc index 471fef71..088d54c0 100644 --- a/models/QuestgroupsModel.inc +++ b/models/QuestgroupsModel.inc @@ -217,7 +217,7 @@ $lastChildQuestgroupshierarchy = array_pop($childQuestgroupshierarchy); } - $quests = $this->Quests->getQuestsForQuestgroup($currentQuestgroup['id']); + $quests = $this->Quests->getMainquestsForQuestgroup($currentQuestgroup['id']); $lastQuest = array_pop($quests); diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc index e49947f8..09ebc125 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -40,11 +40,12 @@ * @param int $questgroupId ID of a Questgroup * @return array Quests of the given Questgroup */ - public function getQuestsForQuestgroup($questgroupId) + public function getMainquestsForQuestgroup($questgroupId) { return $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 = ?', 'i', $questgroupId @@ -64,7 +65,8 @@ 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 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 '. 'FROM quests '. 'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '. 'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '. @@ -76,6 +78,38 @@ throw new \nre\exceptions\IdNotFoundException($questUrl); } + $data[0]['is_mainquest'] = ($data[0]['is_mainquest'] == 1); + + + return $data[0]; + } + + + /** + * Get a Quest and its data by its ID. + * + * @throws IdNotFoundException + * @param string $questId ID of a Quest + * @return array Quest data + */ + 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 '. + '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 + ); + if(empty($data)) { + throw new \nre\exceptions\IdNotFoundException($questId); + } + + $data[0]['is_mainquest'] = ($data[0]['is_mainquest'] == 1); + return $data[0]; } @@ -94,14 +128,15 @@ public function getSidequestByUrl($seminaryId, $questgroupId, $questId, $sidequestUrl) { $data = $this->db->query( - 'SELECT sidequests.id, sidequests.questtype_id, sidequests.title, sidequests.url, sidequests.xps, sidequests.task, quests.right_text, quests.wrong_text, sidequests.questsmedia_id '. - 'FROM sidequests '. + '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 quests ON quests.id = questtexts.quest_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 sidequests.url = ? AND quests.id = ? AND questgroups.id = ? AND seminaries.id = ?', + 'WHERE quests.url = ? AND mainquests.id = ? AND questgroups.id = ? AND seminaries.id = ?', 'siii', $sidequestUrl, $questId, @@ -126,8 +161,9 @@ public function getSidequestsForQuest($questId) { return $this->db->query( - 'SELECT sidequests.id, sidequests.questtext_id, sidequests.title, sidequests.url, sidequests.entry_text '. - 'FROM sidequests '. + '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', @@ -146,7 +182,8 @@ { return $this->db->query( 'SELECT id, questtext_id, title, url, entry_text '. - 'FROM sidequests '. + 'FROM quests '. + 'INNER JOIN sidequests ON sidequests.quest_id = quests.id '. 'WHERE questtext_id = ?', 'i', $questtextId @@ -164,11 +201,12 @@ { return $this->db->query( 'SELECT quests.id, quests.title, quests.url, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. - 'FROM quests_previousquests '. - 'LEFT JOIN quests ON quests.id = quests_previousquests.quest_id '. + '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 quests_previousquests.previous_quest_id = ?', + 'WHERE mainquests_previousmainquests.previous_mainquest_id = ?', 'i', $questId ); @@ -185,11 +223,12 @@ { return $this->db->query( 'SELECT quests.id, quests.title, quests.url, questgroups.title AS questgroup_title, questgroups.url AS questgroup_url '. - 'FROM quests_previousquests '. - 'LEFT JOIN quests ON quests.id = quests_previousquests.previous_quest_id '. + '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 quests_previousquests.quest_id = ?', + 'WHERE mainquests_previousmainquests.mainquest_id = ?', 'i', $questId ); @@ -217,27 +256,6 @@ } - /** - * Mark a Sidequest as solved for a Character. - * - * @param int $sidequestId ID of Sidequest to mark as solved - * @param int $characterId ID of Character that solved the Sidequest - */ - public function setSidequestSolved($sidequestId, $characterId) - { - $this->db->query( - 'INSERT INTO sidequests_characters '. - '(sidequest_id, character_id, status) '. - 'VALUES '. - '(?, ?, ?)', - 'iii', - $sidequestId, - $characterId, - 0 - ); - } - - /** * Mark a Quest as unsolved for a Character. * @@ -259,27 +277,6 @@ } - /** - * Mark a Sidequest as unsolved for a Character. - * - * @param int $sidequestId ID of Sidequest to mark as unsolved - * @param int $characterId ID of Character that unsolved the Sidequest - */ - public function setSidequestUnsolved($sidequestId, $characterId) - { - $this->db->query( - 'INSERT INTO sidequests_characters '. - '(sidequest_id, character_id, status) '. - 'VALUES '. - '(?, ?, ?)', - 'iii', - $sidequestId, - $characterId, - -1 - ); - } - - /** * Determine if the given Character has solved the given Quest. * diff --git a/models/QuesttextsModel.inc b/models/QuesttextsModel.inc index 5324157f..38a1286d 100644 --- a/models/QuesttextsModel.inc +++ b/models/QuesttextsModel.inc @@ -46,7 +46,7 @@ public function getQuesttextByUrl($questId, $questtexttypeUrl, $pos) { $data = $this->db->query( - 'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexts.out_text, questtexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. + '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 = ? AND questtexttypes.url = ? AND questtexts.pos = ?', @@ -62,34 +62,6 @@ } - /** - * Get a Questtext for a Sidequest by its URL. - * - * @throws IdNotFoundException - * @param int $sidequestId ID of the Sidequest to get text for - * @param string $questtexttypeUrl URL of the Questtexttype - * @param int $pos Position of Questtexttype - * @return array Questtexttype data - */ - public function getSidequesttextByUrl($sidequestId, $questtexttypeUrl, $pos) - { - $data = $this->db->query( - 'SELECT sidequesttexts.id, sidequesttexts.text, sidequesttexts.pos, sidequesttexts.out_text, sidequesttexts.abort_text, sidequesttexts.questsmedia_id, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. - 'FROM sidequesttexts '. - 'LEFT JOIN questtexttypes ON questtexttypes.id = sidequesttexts.questtexttype_id '. - 'WHERE sidequesttexts.sidequest_id = ? AND questtexttypes.url = ? AND sidequesttexts.pos = ?', - 'isi', - $sidequestId, $questtexttypeUrl, $pos - ); - if(empty($data)) { - throw new \nre\exceptions\IdNotFoundException($questtexttypeUrl); - } - - - return $data = $data[0]; - } - - /** * Get count of Questtexts for a Quest. * @@ -117,33 +89,6 @@ } - /** - * Get count of Questtexts for a Sidequest. - * - * @param int $sidequestId ID of the Sidequest - * @param string $questtexttypeUrl URL of the Questtexttype - * @return int Conut of Questtexts for Sideuest - */ - public function getQuesttextsCountForSidequest($questId, $questtexttypUrl) - { - $count = 0; - $data = $this->db->query( - 'SELECT COUNT(sidequesttexts.id) AS c '. - 'FROM sidequesttexts '. - 'LEFT JOIN questtexttypes ON questtexttypes.id = sidequesttexts.questtexttype_id '. - 'WHERE sidequesttexts.sidequest_id = ? AND questtexttypes.url = ?', - 'is', - $questId, $questtexttypUrl - ); - if(!empty($data)) { - $count = $data[0]['c']; - } - - - return $count; - } - - /** * Get corresponding Questtext for a Sidequest. * @@ -154,11 +99,12 @@ public function getQuesttextForSidequest($sidequestId) { $data = $this->db->query( - 'SELECT questtexts.id, questtexts.text, questtexts.pos, questtexttypes.id AS type_id, questtexttypes.type, questtexttypes.url AS type_url '. - 'FROM sidequests '. + '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 '. 'LEFT JOIN questtexttypes ON questtexttypes.id = questtexts.questtexttype_id '. - 'WHERE sidequests.id = ?', + 'WHERE quests.id = ?', 'i', $sidequestId ); diff --git a/views/html/questgroups/questgroup.tpl b/views/html/questgroups/questgroup.tpl index 2e5596d7..d8d2ce42 100644 --- a/views/html/questgroups/questgroup.tpl +++ b/views/html/questgroups/questgroup.tpl @@ -34,9 +34,9 @@
  • + 0) : ?>
    : - 0) : ?> 1) : ?>< @@ -54,7 +57,11 @@ 0) : ?> diff --git a/views/html/quests/sidequest.tpl b/views/html/quests/sidequest.tpl deleted file mode 100644 index 191648d1..00000000 --- a/views/html/quests/sidequest.tpl +++ /dev/null @@ -1,55 +0,0 @@ -

    -

    - - - - -

    -

    -

    .

    - - - - - -
    - -

    - -

    - -

    -
    - - - -
    -

    -

    - - - -
      -
    • -
    • -
    - -
    - - - - - 1) : ?>< - / - > - -
    - - - -
    -

    -

    -

    -
    -