new structure for optional Questgroups instead of single Quests

This commit is contained in:
coderkun 2014-03-28 21:28:45 +01:00
commit 20906f1c42
12 changed files with 353 additions and 252 deletions

View file

@ -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; $i<count($hierarchy['questgroups']); $i++)
$childQuestgroupshierarchy = $this->Questgroupshierarchy->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; $i<count($hierarchy['questgroups']); $i++)
{
// Get Character XPs
$hierarchy['questgroups'][$i]['character_xps'] = $this->Questgroups->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);

View file

@ -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);
}

View file

@ -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);

View file

@ -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<count($hierarchy['questgroups']); $i++)
foreach($hierarchy['questgroups'] as $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()

View file

@ -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

View file

@ -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.
*

View file

@ -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.
*

View file

@ -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;
}

View file

@ -7,11 +7,16 @@
<?=$questgroupshierarchypath?>
<h3><?=$questgroupshierarchy['title_singular']?> <?=$questgroup['pos']?>: <?=$questgroup['title']?></h3>
<?php if(!is_null($questgroup['hierarchy'])) : ?>
<h3><?=$questgroup['hierarchy']['title_singular']?> <?=$questgroup['hierarchy']['questgroup_pos']?>: <?=$questgroup['title']?></h3>
<?php else : ?>
<h3><?=$questgroup['title']?></h3>
<?php endif ?>
<?php foreach($texts as &$text) : ?>
<p><?=\hhu\z\Utils::t($text['text'])?></p>
<?php endforeach ?>
<?php if(!is_null($childquestgroupshierarchy)) : ?>
<?php foreach($childquestgroupshierarchy as &$hierarchy) : ?>
<?php if(count($hierarchy['questgroups']) > 0) : ?>
<h3><?=$hierarchy['title_plural']?></h3>
@ -37,6 +42,7 @@
</ul>
<?php endif ?>
<?php endforeach ?>
<?php endif ?>
<?php if(isset($quests) && !is_null($quests)) : ?>
<h3><?=_('Quests')?></h3>
@ -45,11 +51,11 @@
<li class="qgtitle">
<?php if(!array_key_exists('access', $quest) || $quest['access']) : ?>
<a href="<?=$linker->link(array('quests','quest',$seminary['url'],$questgroup['url'],$quest['url']))?>" <?php if($quest['solved']) : ?>class="solved"<?php endif ?>><i class="fa <?=($quest['solved']) ? 'fa-check-square-o' : 'fa-share-square-o'?> fa-fw"></i><?=$quest['title']?></a>
<?php if(count($quest['sidequests']) > 0) : ?>
<?php if(count($quest['relatedQuestgroups']) > 0) : ?>
<ul class="gplist">
<?php foreach($quest['sidequests'] as &$sidequest) : ?>
<?php foreach($quest['relatedQuestgroups'] as &$relatedQuestgroup) : ?>
<li class="qgtitle">
<a href="<?=$linker->link(array('quests','quest',$seminary['url'],$questgroup['url'],$sidequest['url']))?>" class="bonus"><i class="fa fa-share-square-o fa-fw"><?=$sidequest['title']?></i></a>
<a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$relatedQuestgroup['url']))?>" class="bonus"><i class="fa fa-share-square-o fa-fw"><?=$relatedQuestgroup['title']?></i></a>
</li>
<?php endforeach ?>
</ul>

View file

@ -1,7 +1,21 @@
<?php if(count($parentquestgroupshierarchy) > 0) : ?>
<ul class="breadcrumbs">
<?php foreach($parentquestgroupshierarchy as &$hierarchy) : ?>
<li><i class="fa fa-chevron-right fa-fw"></i><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$hierarchy['url']))?>"><?=$hierarchy['hierarchy']['title_singular']?> <?=$hierarchy['pos']?>: <?=$hierarchy['title']?></a></li>
<li>
<i class="fa fa-chevron-right fa-fw"></i>
<?php if(array_key_exists('hierarchy', $hierarchy)) : ?>
<a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$hierarchy['url']))?>">
<?php if(!is_null($hierarchy['hierarchy'])) : ?>
<?=$hierarchy['hierarchy']['title_singular']?> <?=$hierarchy['hierarchy']['questgroup_pos']?>:
<?php endif ?>
<?=$hierarchy['title']?>
</a>
<?php else : ?>
<a href="<?=$linker->link(array('quests','quest',$seminary['url'],$hierarchy['questgroup']['url'],$hierarchy['url']))?>">
<?=$hierarchy['title']?>
</a>
<?php endif ?>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>

View file

@ -3,12 +3,7 @@
<?=$questgroupshierarchypath?>
<?=$questgroupspicture?>
<?php if(is_null($relatedquesttext)) : ?>
<h3><?=$quest['title']?></h3>
<?php else : ?>
<h3><a href="<?=$linker->link(array('quest',$seminary['url'],$questgroup['url'],$relatedquesttext['quest']['url'],$relatedquesttext['type_url'],$relatedquesttext['pos']),1)?>"><?=$relatedquesttext['quest']['title']?></a></h3>
<h4><?=$quest['title']?></h4>
<?php endif ?>
<?php if(!is_null($queststatustext)) : ?>
<section>
@ -29,8 +24,8 @@
</div>
<ul>
<?php foreach($questtext['sidequests'] as &$sidequest) : ?>
<li><a href="<?=$linker->link(array('quest',$seminary['url'],$questgroup['url'],$sidequest['url']),1)?>"><?=$sidequest['entry_text']?></a></li>
<?php foreach($questtext['relatedQuestsgroups'] as &$relatedQuestgroup) : ?>
<li><a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$relatedQuestgroup['url']))?>"><?=$relatedQuestgroup['entry_text']?></a></li>
<?php endforeach ?>
<?php if(!empty($questtext['abort_text'])) : ?>
<li><a href="<?=$linker->link(array('quest',$seminary['url'],$questgroup['url'],$relatedquesttext['quest']['url'],$relatedquesttext['type_url'],$relatedquesttext['pos']),1)?>"><?=$questtext['abort_text']?></a></li>
@ -71,7 +66,7 @@
<?php endforeach ?>
</ul>
<?php elseif(!is_null($nextquestgroup)) : ?>
<a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$nextquestgroup['url']))?>"><?=$nextquestgroup['hierarchy']['title_singular']?> <?=$nextquestgroup['pos']?>: <?=$nextquestgroup['title']?></a>
<a href="<?=$linker->link(array('questgroups','questgroup',$seminary['url'],$nextquestgroup['url']))?>"><?=$nextquestgroup['hierarchy']['title_singular']?> <?=$nextquestgroup['hierarchy']['pos']?>: <?=$nextquestgroup['title']?></a>
<?php else : ?>
Spiel vorbei
<?php endif ?>

View file

@ -3,12 +3,7 @@
<?=$questgroupshierarchypath?>
<?=$questgroupspicture?>
<?php if(is_null($relatedquesttext)) : ?>
<h3><?=$quest['title']?></h3>
<?php else : ?>
<h3><a href="<?=$linker->link(array('quest',$seminary['url'],$questgroup['url'],$relatedquesttext['quest']['url'],$relatedquesttext['type_url'],$relatedquesttext['pos']),1)?>"><?=$relatedquesttext['quest']['title']?></a></h3>
<h4><?=$quest['title']?></h4>
<?php endif ?>
<?php if(!is_null($media)) : ?>
<img src="<?=$linker->link(array('media','index',$seminary['url'],$media['url']))?>" />