diff --git a/app/QuesttypeController.inc b/app/QuesttypeController.inc index 603626ac..89913fb5 100644 --- a/app/QuesttypeController.inc +++ b/app/QuesttypeController.inc @@ -265,7 +265,7 @@ // Redirect - $this->redirect($this->linker->link('solved', $sidequest != null ? 6 : 5)); + $this->redirect($this->linker->link('Epilog', $sidequest != null ? 6 : 5, true, array('status'=>'solved'))); } @@ -298,7 +298,7 @@ // Redirect - $this->redirect($this->linker->link('unsolved', $sidequest != null ? 6 : 5)); + $this->redirect($this->linker->link('Prolog', $sidequest != null ? 6 : 5, true, array('status'=>'unsolved'))); } } diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc index 87d800d4..fd64d771 100644 --- a/controllers/QuestsController.inc +++ b/controllers/QuestsController.inc @@ -73,37 +73,30 @@ if(is_null($questtexttypeUrl)) { $questtexttypeUrl = 'Prolog'; } - // Quest solved - if($questtexttypeUrl == 'solved') + $questtexttypes = $this->Questtexts->getQuesttexttypes(); + $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes); + $questtextCount = $this->Questtexts->getQuesttextsCountForQuest($quest['id'], $questtexttypeUrl); + if($questtextCount > 0 && in_array($questtexttypeUrl, $questtexttypes)) { - $questtext = array( - 'type' => 'solved', - 'text' => $quest['right_text'] - ); + $questtextPos = max(intval($questtextPos), 1); + $questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos); + $questtext['count'] = $questtextCount; + $questtext['sidequests'] = $this->Quests->getSidequestsForQuesttext($questtext['id']); } - // Quest unsolved - elseif($questtexttypeUrl == 'unsolved') + + // Quest status + $questStatus = $this->request->getGetParam('status'); + $questStatusText = null; + if(!is_null($questStatus)) { - $questtext = array( - 'type' => 'unsolved', - 'text' => $quest['wrong_text'] - ); - } - // Text - else - { - // Text type - $questtexttypes = $this->Questtexts->getQuesttexttypes(); - $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes); - // Text count - $questtextCount = $this->Questtexts->getQuesttextsCountForQuest($quest['id'], $questtexttypeUrl); - // Get text - if($questtextCount > 0 && in_array($questtexttypeUrl, $questtexttypes)) + switch($questStatus) { - $questtextPos = max(intval($questtextPos), 1); - $questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos); - $questtext['count'] = $questtextCount; - $questtext['sidequests'] = $this->Quests->getSidequestsForQuesttext($questtext['id']); + case 'solved': + $questStatusText = $quest['right_text']; + break; + case 'unsolved': + $questStatusText = $quest['wrong_text']; + break; } } @@ -127,12 +120,21 @@ $task = $this->runAndRenderTask($questtype['classname']); } + // Next Quest + $nextQuests = null; + if($questtexttypeUrl == 'Epilog') { + $nextQuests = $this->Quests->getNextQuests($quest['id']); + } + // Pass data to view $this->set('seminary', $seminary); $this->set('questgroup', $questgroup); $this->set('questtext', $questtext); $this->set('quest', $quest); + $this->set('queststatus', $questStatus); + $this->set('queststatustext', $questStatusText); + $this->set('nextquests', $nextQuests); $this->set('task', $task); $this->set('media', $questmedia); } @@ -173,39 +175,32 @@ if(is_null($sidequesttexttypeUrl)) { $sidequesttexttypeUrl = 'Prolog'; } - // Quest solved - if($sidequesttexttypeUrl == 'solved') + $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)) { - $sidequesttext = array( - 'type' => 'solved', - 'text' => $quest['right_text'] - ); - } - // Quest unsolved - elseif($sidequesttexttypeUrl == 'unsolved') - { - $sidequesttext = array( - 'type' => 'unsolved', - 'text' => $quest['wrong_text'] - ); - } - // Text - else - { - // Text type - $questtexttypes = $this->Questtexts->getQuesttexttypes(); - $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes); - // Text count - $sidequesttextCount = $this->Questtexts->getQuesttextsCountForSidequest($sidequest['id'], $sidequesttexttypeUrl); - // Get text - if($sidequesttextCount > 0 && in_array($sidequesttexttypeUrl, $questtexttypes)) + if(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; - } + $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; } } @@ -220,7 +215,7 @@ // Task $task = null; - if($sidequesttext['type'] == 'Prolog') + if(!is_null($sidequesttext) && $sidequesttext['type'] == 'Prolog') { // Questtype $questtype = $this->Questtypes->getQuesttypeById($sidequest['questtype_id']); @@ -237,6 +232,8 @@ $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/QuestsModel.inc b/models/QuestsModel.inc index d8baed5f..4ac41986 100644 --- a/models/QuestsModel.inc +++ b/models/QuestsModel.inc @@ -154,6 +154,33 @@ } + /** + * Get Quests that follow-up a Quest. + * + * @param int $questId ID of Quest to get next Quests of + * @return array Quests data + */ + 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 quests_previousquests '. + 'LEFT JOIN quests ON quests.id = quests_previousquests.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 = ?', + 'i', + $questId + ); + } + + + /** + * Mark a Quest as solved for a Character. + * + * @param int $questId ID of Quest to mark as solved + * @param int $characterId ID of Character that solved the Quest + */ public function setQuestSolved($questId, $characterId) { $this->db->query( @@ -169,6 +196,12 @@ } + /** + * Mark a Quest as unsolved for a Character. + * + * @param int $questId ID of Quest to mark as unsolved + * @param int $characterId ID of Character that unsolved the Quest + */ public function setQuestUnsolved($questId, $characterId) { $this->db->query( diff --git a/views/html/quests/quest.tpl b/views/html/quests/quest.tpl index bfbe8a9d..2c919a3d 100644 --- a/views/html/quests/quest.tpl +++ b/views/html/quests/quest.tpl @@ -8,14 +8,21 @@ + +
- +

- +

- -

+

+
+ + + +
+

@@ -39,6 +46,18 @@ >
+ + + +
+

+ +
+
diff --git a/views/html/quests/sidequest.tpl b/views/html/quests/sidequest.tpl index 3067b914..191648d1 100644 --- a/views/html/quests/sidequest.tpl +++ b/views/html/quests/sidequest.tpl @@ -10,14 +10,21 @@ + +
- +

- +

- -

+

+
+ + + +
+

@@ -37,6 +44,7 @@ >
+