diff --git a/controllers/QuestsController.inc b/controllers/QuestsController.inc
index b5df177c..1fcd3f56 100644
--- a/controllers/QuestsController.inc
+++ b/controllers/QuestsController.inc
@@ -24,7 +24,7 @@
*
* @var array
*/
- public $models = array('seminaries', 'questgroups', 'quests', 'questtexts', 'media');
+ public $models = array('seminaries', 'questgroups', 'quests', 'questtexts', 'media', 'questtypes');
/**
* User permissions
*
@@ -51,10 +51,10 @@
* Show a quest and its task.
*
* @throws IdNotFoundException
- * @param string $seminaryUrl URL-Title of a Seminary
- * @param string $questgroupUrl URL-Title of a Questgroup
- * @param string $questUrl URL-Title of a Quest
- * @param string $questtexttypeUrl URL-Title of a Questtexttype
+ * @param string $seminaryUrl URL-Title of Seminary
+ * @param string $questgroupUrl URL-Title of Questgroup
+ * @param string $questUrl URL-Title of Quest
+ * @param string $questtexttypeUrl URL-Title of Questtexttype
* @param int $questtextPos Position of Questtext
*/
public function quest($seminaryUrl, $questgroupUrl, $questUrl, $questtexttypeUrl=null, $questtextPos=1)
@@ -70,15 +70,35 @@
// Get Questtext
$questtext = null;
- $questtexttypes = $this->Questtexts->getQuesttexttypes();
- $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes);
if(is_null($questtexttypeUrl)) {
$questtexttypeUrl = 'Prolog';
}
- $questtextCount = $this->Questtexts->getQuesttextsCountForQuest($quest['id'], $questtexttypeUrl);
- if($questtextCount > 0)
+ // Quest solved
+ if($questtexttypeUrl == 'solved')
{
- if(in_array($questtexttypeUrl, $questtexttypes))
+ $questtext = array(
+ 'type' => 'solved',
+ 'text' => $quest['right_text']
+ );
+ }
+ // Quest unsolved
+ elseif($questtexttypeUrl == 'unsolved')
+ {
+ $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))
{
$questtextPos = max(intval($questtextPos), 1);
$questtext = $this->Questtexts->getQuesttextByUrl($quest['id'], $questtexttypeUrl, $questtextPos);
@@ -87,43 +107,49 @@
}
}
- // Show task only for Prologes
- $showTask = false;
- if($questtext['type'] == 'Prolog') {
- $showTask = true;
- }
-
// Media
$questmedia = null;
- if(!is_null($questtext) && !empty($questtext['questsmedia_id'])) {
+ if(!is_null($questtext) && array_key_exists('questmedia_id', $questtext) && !empty($questtext['questsmedia_id'])) {
$questmedia = $this->Media->getMediaById($questtext['questsmedia_id']);
}
elseif(!is_null($quest['questsmedia_id'])) {
$questmedia = $this->Media->getMediaById($quest['questsmedia_id']);
}
-
+
+ // Task
+ $task = null;
+ if($questtext['type'] == 'Prolog')
+ {
+ // Questtype
+ $questtype = $this->Questtypes->getQuesttypeById($quest['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('quest', $quest);
- $this->set('showtask', $showTask);
+ $this->set('task', $task);
$this->set('media', $questmedia);
}
+
/**
* Action: sidequest.
*
* Show a sidequest and its task.
*
* @throws IdNotFoundException
- * @param string $seminaryUrl URL-Title of a Seminary
- * @param string $questgroupUrl URL-Title of a Questgroup
- * @param string $questUrl URL-Title of a Quest
- * @param string $sidequestUrl URL-Title of a Sidequest
- * @param string $questtexttypeUrl URL-Title of a Questtexttype
- * @param int $questtextPos Position of Questtext
+ * @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)
{
@@ -144,26 +170,43 @@
// Get Sidequesttext
$sidequesttext = null;
- $questtexttypes = $this->Questtexts->getQuesttexttypes();
- $questtexttypes = array_map(function($t) { return $t['url']; }, $questtexttypes);
if(is_null($sidequesttexttypeUrl)) {
$sidequesttexttypeUrl = 'Prolog';
}
- $sidequesttextCount = $this->Questtexts->getQuesttextsCountForSidequest($sidequest['id'], $sidequesttexttypeUrl);
- if($sidequesttextCount > 0)
+ // Quest solved
+ if($sidequesttexttypeUrl == 'solved')
{
- if(in_array($sidequesttexttypeUrl, $questtexttypes))
- {
- $sidequesttextPos = max(intval($sidequesttextPos), 1);
- $sidequesttext = $this->Questtexts->getSidequesttextByUrl($sidequest['id'], $sidequesttexttypeUrl, $sidequesttextPos);
- $sidequesttext['count'] = $sidequesttextCount;
- }
+ $sidequesttext = array(
+ 'type' => 'solved',
+ 'text' => $quest['right_text']
+ );
}
-
- // Show task only for Prologes
- $showTask = false;
- if($sidequesttext['type'] == 'Prolog') {
- $showTask = true;
+ // 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))
+ {
+ $sidequesttextPos = max(intval($sidequesttextPos), 1);
+ $sidequesttext = $this->Questtexts->getSidequesttextByUrl($sidequest['id'], $sidequesttexttypeUrl, $sidequesttextPos);
+ $sidequesttext['count'] = $sidequesttextCount;
+ }
+ }
}
// Media
@@ -175,18 +218,92 @@
$sidequestmedia = $this->Media->getMediaById($sidequest['questsmedia_id']);
}
+ // Task
+ $task = null;
+ if($sidequesttext['type'] == '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('sidequesttext', $sidequesttext);
$this->set('quest', $quest);
- $this->set('questtext', $questtext);
$this->set('sidequest', $sidequest);
- $this->set('showtask', $showTask);
+ $this->set('task', $task);
$this->set('media', $sidequestmedia);
}
+
+
+
+ /**
+ * Load, construct, run and render the Agent for the given
+ * classname of a Questtype and return ist output.
+ *
+ * @param string $questtypeClassname Classname of Questtype to run and render
+ * @return string Rendered output of Questtype-Agent
+ */
+ private function runAndRenderTask($questtypeClassname)
+ {
+ $task = null;
+ $questtypeAgent = null;
+ try {
+ // Load Agent
+ \hhu\z\QuesttypeAgent::load($questtypeClassname);
+ // Construct Agent
+ $questtypeAgent = \hhu\z\QuesttypeAgent::factory($questtypeClassname, $this->request, $this->response);
+
+ // Generate response
+ $response = clone $this->response;
+ $response->clearParams(1);
+ $response->addParams(
+ null,
+ \nre\configs\CoreConfig::$defaults['action']
+ );
+ // Run Agent
+ $questtypeAgent->run($this->request, $response);
+
+ // Render output
+ $task = $questtypeAgent->render();
+
+ }
+ catch(\nre\exceptions\ViewNotFoundException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\nre\exceptions\ActionNotFoundException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeModelNotValidException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeModelNotFoundException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeControllerNotValidException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeControllerNotFoundException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeAgentNotValidException $e) {
+ $task = $e->getMessage();
+ }
+ catch(\hhu\z\exceptions\QuesttypeAgentNotFoundException $e) {
+ $task = $e->getMessage();
+ }
+
+
+ // Return rendered output
+ return $task;
+ }
+
}
?>
diff --git a/models/QuestsModel.inc b/models/QuestsModel.inc
index 0873c6cd..d8baed5f 100644
--- a/models/QuestsModel.inc
+++ b/models/QuestsModel.inc
@@ -64,7 +64,7 @@
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.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 '.
'FROM quests '.
'LEFT JOIN questgroups ON questgroups.id = quests.questgroup_id '.
'LEFT JOIN questgroupshierarchy ON questgroupshierarchy.id = questgroups.questgroupshierarchy_id '.
@@ -94,7 +94,7 @@
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, sidequests.questsmedia_id '.
+ '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 '.
'LEFT JOIN questtexts ON questtexts.id = sidequests.questtext_id '.
'LEFT JOIN quests ON quests.id = questtexts.quest_id '.
@@ -153,6 +153,36 @@
);
}
+
+ public function setQuestSolved($questId, $characterId)
+ {
+ $this->db->query(
+ 'INSERT INTO quests_characters '.
+ '(quest_id, character_id, status) '.
+ 'VALUES '.
+ '(?, ?, ?)',
+ 'iii',
+ $questId,
+ $characterId,
+ 0
+ );
+ }
+
+
+ public function setQuestUnsolved($questId, $characterId)
+ {
+ $this->db->query(
+ 'INSERT INTO quests_characters '.
+ '(quest_id, character_id, status) '.
+ 'VALUES '.
+ '(?, ?, ?)',
+ 'iii',
+ $questId,
+ $characterId,
+ -1
+ );
+ }
+
}
?>
diff --git a/views/html/quests/quest.tpl b/views/html/quests/quest.tpl
index 9a8b7376..bfbe8a9d 100644
--- a/views/html/quests/quest.tpl
+++ b/views/html/quests/quest.tpl
@@ -9,10 +9,16 @@
+
+ =_('solved')?>
+
+ =_('unsolved')?>
+
=$questtext['type']?>
+
=\hhu\z\Utils::t($questtext['text'])?>
-
+
-
+
=$questtext['out_text']?>
+
1) : ?><
=$questtext['pos']?>/=$questtext['count']?>
>
+
-
+
=_('Task')?>
=\hhu\z\Utils::t($quest['task'])?>
+ =$task?>
diff --git a/views/html/quests/sidequest.tpl b/views/html/quests/sidequest.tpl
index 1cb888ce..3067b914 100644
--- a/views/html/quests/sidequest.tpl
+++ b/views/html/quests/sidequest.tpl
@@ -11,11 +11,17 @@
+
+ =_('solved')?>
+
+ =_('unsolved')?>
+
=$sidequesttext['type']?>
+
=\hhu\z\Utils::t($sidequesttext['text'])?>
-
-
+
+
-
+
=_('Task')?>
=\hhu\z\Utils::t($sidequest['task'])?>
+ =$task?>