implement Questtype ?Boss-Fight?
This commit is contained in:
parent
95fd1d33cc
commit
cadce33434
5 changed files with 552 additions and 0 deletions
24
questtypes/bossfight/BossfightQuesttypeAgent.inc
Normal file
24
questtypes/bossfight/BossfightQuesttypeAgent.inc
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The Legend of Z
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
|
||||
* @license http://www.gnu.org/licenses/gpl.html
|
||||
* @link https://bitbucket.org/coderkun/the-legend-of-z
|
||||
*/
|
||||
|
||||
namespace hhu\z\questtypes;
|
||||
|
||||
|
||||
/**
|
||||
* QuesttypeAgent for a boss-fight.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class BossfightQuesttypeAgent extends \hhu\z\QuesttypeAgent
|
||||
{
|
||||
}
|
||||
|
||||
?>
|
||||
244
questtypes/bossfight/BossfightQuesttypeController.inc
Normal file
244
questtypes/bossfight/BossfightQuesttypeController.inc
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The Legend of Z
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
|
||||
* @license http://www.gnu.org/licenses/gpl.html
|
||||
* @link https://bitbucket.org/coderkun/the-legend-of-z
|
||||
*/
|
||||
|
||||
namespace hhu\z\questtypes;
|
||||
|
||||
|
||||
/**
|
||||
* Controller of the BossfightQuesttypeAgent for a boss-fight.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class BossfightQuesttypeController extends \hhu\z\QuesttypeController
|
||||
{
|
||||
/**
|
||||
* Required models
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $models = array('media');
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Save the answers of a Character for a Quest.
|
||||
*
|
||||
* @param array $seminary Current Seminary data
|
||||
* @param array $questgroup Current Questgroup data
|
||||
* @param array $quest Current Quest data
|
||||
* @param array $character Current Character data
|
||||
* @param array $answers Character answers for the Quest
|
||||
*/
|
||||
public function saveAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers)
|
||||
{
|
||||
// Prepare session
|
||||
$this->prepareSession($quest['id']);
|
||||
|
||||
// Remove previous answers
|
||||
$this->Bossfight->clearCharacterSubmissions($quest['id'], $character['id']);
|
||||
|
||||
// Save answers
|
||||
foreach($_SESSION['quests'][$quest['id']]['stages'] as &$stage) {
|
||||
$this->Bossfight->setCharacterSubmission($stage['id'], $character['id']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if answers of a Character for a Quest match the correct ones.
|
||||
*
|
||||
* @param array $seminary Current Seminary data
|
||||
* @param array $questgroup Current Questgroup data
|
||||
* @param array $quest Current Quest data
|
||||
* @param array $character Current Character data
|
||||
* @return boolean True/false for a right/wrong answer or null for moderator evaluation
|
||||
*/
|
||||
public function matchAnswersOfCharacter($seminary, $questgroup, $quest, $character, $answers)
|
||||
{
|
||||
// Get Boss-Fight
|
||||
$fight = $this->Bossfight->getBossFight($quest['id']);
|
||||
|
||||
// Prepare session
|
||||
$this->prepareSession($quest['id']);
|
||||
|
||||
// Calculate lives
|
||||
$lives = array(
|
||||
'character' => $fight['lives_character'],
|
||||
'boss' => $fight['lives_boss']
|
||||
);
|
||||
foreach($_SESSION['quests'][$quest['id']]['stages'] as &$stage)
|
||||
{
|
||||
$lives['character'] += $stage['livedrain_character'];
|
||||
$lives['boss'] += $stage['livedrain_boss'];
|
||||
}
|
||||
|
||||
|
||||
return ($lives['boss'] == 0 && $lives['character'] > 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: quest.
|
||||
*
|
||||
* Display a stage with a text and the answers for the following
|
||||
* stages.
|
||||
*
|
||||
* @param array $seminary Current Seminary data
|
||||
* @param array $questgroup Current Questgroup data
|
||||
* @param array $quest Current Quest data
|
||||
* @param array $character Current Character data
|
||||
* @param Exception $exception Character submission exception
|
||||
*/
|
||||
public function quest($seminary, $questgroup, $quest, $character, $exception)
|
||||
{
|
||||
// Get Boss-Fight
|
||||
$fight = $this->Bossfight->getBossFight($quest['id']);
|
||||
if(!is_null($fight['boss_seminarymedia_id'])) {
|
||||
$fight['bossmedia'] = $this->Media->getSeminaryMediaById($fight['boss_seminarymedia_id']);
|
||||
}
|
||||
|
||||
// Prepare session
|
||||
$this->prepareSession($quest['id']);
|
||||
|
||||
// Get Stage
|
||||
if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('submit_stages')))
|
||||
{
|
||||
$stages = $this->request->getPostParam('submit_stages');
|
||||
$stageId = array_keys($stages)[0];
|
||||
$stage = $this->Bossfight->getStageById($stageId);
|
||||
}
|
||||
else
|
||||
{
|
||||
$_SESSION['quests'][$quest['id']]['stages'] = array();
|
||||
$stage = $this->Bossfight->getFirstStage($quest['id']);
|
||||
}
|
||||
|
||||
// Store Stage in session
|
||||
if(count($_SESSION['quests'][$quest['id']]['stages']) == 0 || $_SESSION['quests'][$quest['id']]['stages'][count($_SESSION['quests'][$quest['id']]['stages'])-1]['id'] != $stage['id']) {
|
||||
$_SESSION['quests'][$quest['id']]['stages'][] = $stage;
|
||||
}
|
||||
|
||||
// Calculate lives
|
||||
$lives = array(
|
||||
'character' => $fight['lives_character'],
|
||||
'boss' => $fight['lives_boss']
|
||||
);
|
||||
foreach($_SESSION['quests'][$quest['id']]['stages'] as &$stage)
|
||||
{
|
||||
$lives['character'] += $stage['livedrain_character'];
|
||||
$lives['boss'] += $stage['livedrain_boss'];
|
||||
}
|
||||
|
||||
// Get Child-Stages
|
||||
$childStages = $this->Bossfight->getChildStages($stage['id']);
|
||||
|
||||
// Get answer of Character
|
||||
if($this->request->getGetParam('show-answer') == 'true') {
|
||||
foreach($childStages as &$childStage) {
|
||||
$childStage['answer'] = $this->Bossfight->getCharacterSubmission($childStage['id'], $character['id']);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('fight', $fight);
|
||||
$this->set('stage', $stage);
|
||||
$this->set('lives', $lives);
|
||||
$this->set('childStages', $childStages);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Action: submission.
|
||||
*
|
||||
* Display all stages with the answers the character has
|
||||
* choosen.
|
||||
*
|
||||
* @param array $seminary Current Seminary data
|
||||
* @param array $questgroup Current Questgroup data
|
||||
* @param array $quest Current Quest data
|
||||
* @param array $character Current Character data
|
||||
*/
|
||||
public function submission($seminary, $questgroup, $quest, $character)
|
||||
{
|
||||
// Get Boss-Fight
|
||||
$fight = $this->Bossfight->getBossFight($quest['id']);
|
||||
if(!is_null($fight['boss_seminarymedia_id'])) {
|
||||
$fight['bossmedia'] = $this->Media->getSeminaryMediaById($fight['boss_seminarymedia_id']);
|
||||
}
|
||||
|
||||
// Get stages
|
||||
$stages = array();
|
||||
$stage = $this->Bossfight->getFirstStage($quest['id']);
|
||||
while(!is_null($stage))
|
||||
{
|
||||
$stages[] = $stage;
|
||||
|
||||
$childStages = $this->Bossfight->getChildStages($stage['id']);
|
||||
$stage = null;
|
||||
foreach($childStages as &$childStage)
|
||||
{
|
||||
if($this->Bossfight->getCharacterSubmission($childStage['id'], $character['id']))
|
||||
{
|
||||
$stage = $childStage;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate lives
|
||||
$stages[0]['lives'] = array(
|
||||
'character' => $fight['lives_character'],
|
||||
'boss' => $fight['lives_boss']
|
||||
);
|
||||
for($i=1; $i<count($stages); $i++)
|
||||
{
|
||||
$stages[$i]['lives'] = array(
|
||||
'character' => $stages[$i-1]['lives']['character'] + $stages[$i]['livedrain_character'],
|
||||
'boss' => $stages[$i-1]['lives']['boss'] + $stages[$i]['livedrain_boss'],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Pass data to view
|
||||
$this->set('seminary', $seminary);
|
||||
$this->set('character', $character);
|
||||
$this->set('fight', $fight);
|
||||
$this->set('stages', $stages);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Prepare the session to store stage information in
|
||||
*
|
||||
* @param int $questId ID of Quest
|
||||
*/
|
||||
private function prepareSession($questId)
|
||||
{
|
||||
if(!array_key_exists('quests', $_SESSION)) {
|
||||
$_SESSION['quests'] = array();
|
||||
}
|
||||
if(!array_key_exists($questId, $_SESSION['quests'])) {
|
||||
$_SESSION['quests'][$questId] = array();
|
||||
}
|
||||
if(!array_key_exists('stages', $_SESSION['quests'][$questId])) {
|
||||
$_SESSION['quests'][$questId]['stages'] = array();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
183
questtypes/bossfight/BossfightQuesttypeModel.inc
Normal file
183
questtypes/bossfight/BossfightQuesttypeModel.inc
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The Legend of Z
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
|
||||
* @license http://www.gnu.org/licenses/gpl.html
|
||||
* @link https://bitbucket.org/coderkun/the-legend-of-z
|
||||
*/
|
||||
|
||||
namespace hhu\z\questtypes;
|
||||
|
||||
|
||||
/**
|
||||
* Model of the BossfightQuesttypeAgent for a boss-fight.
|
||||
*
|
||||
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
|
||||
*/
|
||||
class BossfightQuesttypeModel extends \hhu\z\QuesttypeModel
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get a Boss-Fight.
|
||||
*
|
||||
* @throws IdNotFoundException
|
||||
* @param int $questId ID of Quest
|
||||
* @return array Boss-Fight data
|
||||
*/
|
||||
public function getBossFight($questId)
|
||||
{
|
||||
$data = $this->db->query(
|
||||
'SELECT bossname, boss_seminarymedia_id, lives_character, lives_boss '.
|
||||
'FROM questtypes_bossfight '.
|
||||
'WHERE quest_id = ?',
|
||||
'i',
|
||||
$questId
|
||||
);
|
||||
if(empty($data)) {
|
||||
throw new \nre\exceptions\IdNotFoundException($questId);
|
||||
}
|
||||
|
||||
|
||||
return $data[0];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the first Stage to begin the Boss-Fight with.
|
||||
*
|
||||
* @param int $questId ID of Quest
|
||||
* @return array Data of first Stage
|
||||
*/
|
||||
public function getFirstStage($questId)
|
||||
{
|
||||
$data = $this->db->query(
|
||||
'SELECT id, text, question, livedrain_character, livedrain_boss '.
|
||||
'FROM questtypes_bossfight_stages '.
|
||||
'WHERE questtypes_bossfight_quest_id = ? AND parent_stage_id IS NULL',
|
||||
'i',
|
||||
$questId
|
||||
);
|
||||
if(!empty($data)) {
|
||||
return $data[0];
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a Stage by its ID.
|
||||
*
|
||||
* @param int $stageId ID of Stage
|
||||
* @return array Stage data or null
|
||||
*/
|
||||
public function getStageById($stageId)
|
||||
{
|
||||
$data = $this->db->query(
|
||||
'SELECT id, text, question, livedrain_character, livedrain_boss '.
|
||||
'FROM questtypes_bossfight_stages '.
|
||||
'WHERE id = ?',
|
||||
'i',
|
||||
$stageId
|
||||
);
|
||||
if(!empty($data)) {
|
||||
return $data[0];
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the follow-up Stages for a Stage.
|
||||
*
|
||||
* @param int $parentStageId ID of Stage to get follow-up Stages for
|
||||
* @return array List of follow-up Stages
|
||||
*/
|
||||
public function getChildStages($parentStageId)
|
||||
{
|
||||
return $this->db->query(
|
||||
'SELECT id, text, question, livedrain_character, livedrain_boss '.
|
||||
'FROM questtypes_bossfight_stages '.
|
||||
'WHERE parent_stage_id = ?',
|
||||
'i',
|
||||
$parentStageId
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reset all Character submissions of a Boss-Fight.
|
||||
*
|
||||
* @param int $questId ID of Quest
|
||||
* @param int $characterId ID of Character
|
||||
*/
|
||||
public function clearCharacterSubmissions($questId, $characterId)
|
||||
{
|
||||
$this->db->query(
|
||||
'DELETE FROM questtypes_bossfight_stages_characters '.
|
||||
'WHERE questtypes_bossfight_stage_id IN ('.
|
||||
'SELECT id '.
|
||||
'FROM questtypes_bossfight_stages '.
|
||||
'WHERE questtypes_bossfight_quest_id = ?'.
|
||||
') AND character_id = ?',
|
||||
'ii',
|
||||
$questId,
|
||||
$characterId
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save Character’s submitted answer for one Boss-Fight-Stage.
|
||||
*
|
||||
* @param int $regexId ID of list
|
||||
* @param int $characterId ID of Character
|
||||
*/
|
||||
public function setCharacterSubmission($stageId, $characterId)
|
||||
{
|
||||
$this->db->query(
|
||||
'INSERT INTO questtypes_bossfight_stages_characters '.
|
||||
'(questtypes_bossfight_stage_id, character_id) '.
|
||||
'VALUES '.
|
||||
'(?, ?) '.
|
||||
'ON DUPLICATE KEY UPDATE '.
|
||||
'questtypes_bossfight_stage_id = ?',
|
||||
'iii',
|
||||
$stageId, $characterId, $stageId
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get answer of one Boss-Fight-Stage submitted by Character.
|
||||
*
|
||||
* @param int $regexId ID of list
|
||||
* @param int $characterId ID of Character
|
||||
* @return boolean Stage taken
|
||||
*/
|
||||
public function getCharacterSubmission($stageId, $characterId)
|
||||
{
|
||||
$data = $this->db->query(
|
||||
'SELECT questtypes_bossfight_stage_id '.
|
||||
'FROM questtypes_bossfight_stages_characters '.
|
||||
'WHERE questtypes_bossfight_stage_id = ? AND character_id = ? ',
|
||||
'ii',
|
||||
$stageId, $characterId
|
||||
);
|
||||
|
||||
|
||||
return (!empty($data));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
58
questtypes/bossfight/html/quest.tpl
Normal file
58
questtypes/bossfight/html/quest.tpl
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$character['avatar_url']))?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php if(array_key_exists('bossmedia', $fight)) : ?>
|
||||
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$fight['bossmedia']['url']))?>" />
|
||||
<?php endif ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<?=$character['name']?>:
|
||||
<?php if($lives['character'] > 0) : ?>
|
||||
<?php foreach(range(1,$lives['character']) as $i) : ?>
|
||||
♥
|
||||
<?php endforeach ?>
|
||||
<?php else : ?>
|
||||
<?=_('verloren')?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
<td>
|
||||
<?=$fight['bossname']?>:
|
||||
<?php if($lives['boss'] > 0) : ?>
|
||||
<?php foreach(range(1,$lives['boss']) as $i) : ?>
|
||||
♥
|
||||
<?php endforeach ?>
|
||||
<?php else : ?>
|
||||
<?=_('verloren')?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p><?=\hhu\z\Utils::t($stage['text'])?></p>
|
||||
|
||||
<form method="post" action="#task">
|
||||
<input type="hidden" name="stage" value="<?=$stage['id']?>" />
|
||||
<ul>
|
||||
<?php foreach($childStages as &$childStage) : ?>
|
||||
<li>
|
||||
<?php if(array_key_exists('answer', $childStage) && $childStage['answer']) : ?>
|
||||
→
|
||||
<?php endif ?>
|
||||
<input type="submit" name="submit_stages[<?=$childStage['id']?>]" value="<?=$childStage['question']?>" />
|
||||
</li>
|
||||
<?php endforeach?>
|
||||
<?php if($lives['character'] == 0 || $lives['boss'] == 0) : ?>
|
||||
<li>
|
||||
<input type="hidden" name="answers" value="" />
|
||||
<input type="submit" name="submit" value="<?=_('solve')?>" />
|
||||
</li>
|
||||
<?php endif ?>
|
||||
</ul>
|
||||
</form>
|
||||
43
questtypes/bossfight/html/submission.tpl
Normal file
43
questtypes/bossfight/html/submission.tpl
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$character['avatar_url']))?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php if(array_key_exists('bossmedia', $fight)) : ?>
|
||||
<img src="<?=$linker->link(array('media','seminary',$seminary['url'],$fight['bossmedia']['url']))?>" />
|
||||
<?php endif ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php foreach($stages as &$stage) : ?>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<?=$stage['question']?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<?=$character['name']?>:
|
||||
<?php if($stage['lives']['character'] > 0) : ?>
|
||||
<?php foreach(range(1,$stage['lives']['character']) as $i) : ?>
|
||||
♥
|
||||
<?php endforeach ?>
|
||||
<?php else : ?>
|
||||
<?=_('verloren')?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
<td>
|
||||
<?=$fight['bossname']?>:
|
||||
<?php if($stage['lives']['boss'] > 0) : ?>
|
||||
<?php foreach(range(1,$stage['lives']['boss']) as $i) : ?>
|
||||
♥
|
||||
<?php endforeach ?>
|
||||
<?php else : ?>
|
||||
<?=_('verloren')?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach ?>
|
||||
</tbody>
|
||||
</table>
|
||||
Loading…
Add table
Add a link
Reference in a new issue