<?php /* * The Achievement class that holds one achievement. It is able to load one an the same task an treat is as both, * open and done. */ class AchAchievement extends AchList implements Tieable { ######################### # PHP 5.3 compatible # InDev_trait replaces this in PHP 5.4 protected $dev; function inDev() { return ($this->dev == 1); } function getDev() { return $this->dev; } function setInDev($tf) { if($tf == true) { $this->setDev(1); } else { $this->setDev(0); } $this->update(); } function setDev($d) { $this->dev = $d; } ######################### protected $parent_id; protected $category; #protected $tie_race; #protected $tie_civ; #protected $tie_cult; protected $image; protected $name; protected $template; protected $sticky; function AchAchievement($data,&$parent) { global $DBc,$_USER,$_CONF; parent::__construct(); $this->setParent($parent); // real parent node $this->setID($data['aa_id']); $this->parent_id = $data['aa_parent']; // id of parent $this->category = $data['aa_category']; #$this->tie_race = $data['aa_tie_race']; #$this->tie_civ = $data['aa_tie_civ']; #$this->tie_cult = $data['aa_tie_cult']; $this->image = $data['aa_image']; $this->name = $data['aal_name']; $this->template = $data['aal_template']; $this->dev = $data['aa_dev']; $this->sticky = $data['aa_sticky']; if($this->name == null) { $res = $DBc->sqlQuery("SELECT * FROM ach_achievement_lang WHERE aal_lang='".$_CONF['default_lang']."' AND aal_achievement='".$this->id."'"); $this->name = $res[0]['aal_name']; $this->template = $res[0]['aal_template']; } $res = $DBc->sqlQuery("SELECT * FROM ach_task LEFT JOIN (ach_task_lang) ON (atl_lang='".$_USER->getLang()."' AND atl_task=at_id) LEFT JOIN (ach_player_task) ON (apt_task=at_id AND apt_player='".$_USER->getID()."') WHERE at_achievement='".$this->id."' AND (NOT EXISTS (SELECT * FROM ach_task_tie_align WHERE atta_task=at_id) OR EXISTS (SELECT * FROM ach_task_tie_align WHERE atta_task=at_id AND atta_alignment LIKE '".$parent->getCurrentCult().'|'.$parent->getCurrentCiv()."')) ORDER by at_torder ASC"); $sz = sizeof($res); for($i=0;$i<$sz;$i++) { $tmp = $this->makeChild($res[$i]); if($tmp->isDone()) { $this->addDone($tmp); } else { $this->addOpen($tmp); } } $iter = $this->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); $curr->loadHeritage(); } } function parentDone() { // check if the parent is complete if($this->parent_id == null) { return true; } else { $p = $this->parent->getChildDataByID($this->parent_id); if($p == null) { return true; } return ($p->hasOpen() == false); } } #@override Parentum::makeChild() protected function makeChild($a) { return new AchTask($a,$this); } function getParentID() { return $this->parent_id; } function hasTieRace_open() { #return $this->tie_race; $iter = $this->child_open->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieRace_open() && !$curr->inDev()) { return true; } } return false; } function hasTieAlign_open() { #return $this->tie_civ; $iter = $this->child_open->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieAlign_open() && !$curr->inDev()) { return true; } } return false; } function hasTieRace_done() { #return $this->tie_race; $iter = $this->child_done->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieRace_done() && !$curr->inDev()) { return true; } } return false; } function hasTieAlign_done() { #return $this->tie_civ; $iter = $this->child_done->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieAlign_done() && !$curr->inDev()) { return true; } } return false; } function hasTieRaceDev() { #return $this->tie_race; $iter = $this->nodes->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieRaceDev()) { return true; } } return false; } function hasTieAlignDev() { #return $this->tie_civ; $iter = $this->nodes->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->hasTieAlignDev()) { return true; } } return false; } function isTiedRace_open($r) { #return $this->tie_race; $iter = $this->child_open->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->isTiedRace_open($r)) { return true; } } return false; } function isTiedAlign_open($cult,$civ) { #return $this->tie_civ; $iter = $this->child_open->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->isTiedAlign_open($cult,$civ)) { return true; } } return false; } function isTiedRace_done($r) { #return $this->tie_race; $iter = $this->child_done->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->isTiedRace_done($r)) { return true; } } return false; } function isTiedAlign_done($cult,$civ) { #return $this->tie_civ; $iter = $this->child_done->getIterator(); while($iter->hasNext()) { $curr = $iter->getNext(); if($curr->isTiedAlign_done($cult,$civ)) { return true; } } return false; } function getImage() { return $this->image; } function getName() { return $this->name; } function getValueDone() { // calculate the yubopoints that are already done $val = 0; $iter = $this->getDone(); while($iter->hasNext()) { $curr = $iter->getNext(); $val += $curr->getValue(); } return $val; } function getValueOpen() { // get the yubopoints of the next open task $iter = $this->getOpen(); if($iter->hasNext()) { $curr = $iter->getNext(); return $curr->getValue(); } return 0; } function fillTemplate($insert = array()) { // fill the naming template with given value if($this->template == null) { return implode(";",$insert); } else { $tmp = $this->template; $match = array(); preg_match_all('#\[([0-9]+)\]#', $this->template, $match); foreach($match[0] as $key=>$elem) { $tmp = str_replace("[".$match[1][$key]."]",$insert[$key],$tmp); } return $tmp; } } function getTemplate() { return $this->template; } function getCategory() { return $this->category; } function getSticky() { return $this->sticky; } function isSticky() { return ($this->sticky == 1); } function isHeroic() { // check parent category if it is heroic return $this->parent->isHeroic(); } function isContest() { return $this->parent->isContest(); } } ?>