PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/braldahim/library/Bral/Competences/Abattrearbre.php

https://github.com/Canop/braldahim
PHP | 287 lines | 214 code | 48 blank | 25 comment | 56 complexity | 34df286e61ab9f25e6aaace2c0d34ca2 MD5 | raw file
  1. <?php
  2. /**
  3. * This file is part of Braldahim, under Gnu Public Licence v3.
  4. * See licence.txt or http://www.gnu.org/licenses/gpl-3.0.html
  5. * Copyright: see http://www.braldahim.com/sources
  6. */
  7. class Bral_Competences_Abattrearbre extends Bral_Competences_Competence {
  8. function prepareCommun() {
  9. Zend_Loader::loadClass("Charrette");
  10. Zend_Loader::loadClass("Bosquet");
  11. Zend_Loader::loadClass("Bral_Util_Quete");
  12. $bosquetTable = new Bosquet();
  13. $bosquets = $bosquetTable->findByCase($this->view->user->x_braldun, $this->view->user->y_braldun, $this->view->user->z_braldun);
  14. $bosquet = null;
  15. $this->view->abattreArbreEnvironnementOk = false;
  16. if ($bosquets != null) {
  17. $bosquet = $bosquets[0];
  18. $this->view->abattreArbreEnvironnementOk = true;
  19. }
  20. $this->view->labanPlein = true;
  21. $poidsRestantLaban = $this->view->user->poids_transportable_braldun - $this->view->user->poids_transporte_braldun;
  22. $nbPossibleDansLabanMaximum = floor($poidsRestantLaban / Bral_Util_Poids::POIDS_RONDIN);
  23. if ($nbPossibleDansLabanMaximum > 0) {
  24. $this->view->labanPlein = false;
  25. }
  26. $this->view->nbPossibleDansLabanMax = $nbPossibleDansLabanMaximum;
  27. $charretteTable = new Charrette();
  28. $nombre = $charretteTable->countByIdBraldun($this->view->user->id_braldun);
  29. $this->view->charettePleine = true;
  30. if ($nombre == 1) {
  31. $this->view->possedeCharrette = true;
  32. $tabPoidsCharrette = Bral_Util_Poids::calculPoidsCharrette($this->view->user->id_braldun);
  33. $nbPossibleDansCharretteMaximum = floor($tabPoidsCharrette["place_restante"] / Bral_Util_Poids::POIDS_RONDIN);
  34. if ($nbPossibleDansCharretteMaximum > 0) {
  35. $this->view->charettePleine = false;
  36. }
  37. $this->view->nbPossibleDansCharretteMax = $nbPossibleDansCharretteMaximum;
  38. } else {
  39. $this->view->possedeCharrette = false;
  40. }
  41. $this->view->bosquetCourant = $bosquet;
  42. }
  43. function prepareFormulaire() {
  44. if ($this->view->assezDePa == false) {
  45. return;
  46. }
  47. }
  48. function prepareResultat() {
  49. // Verification des Pa
  50. if ($this->view->assezDePa == false) {
  51. throw new Zend_Exception(get_class($this) . " Pas assez de PA : " . $this->view->user->pa_braldun);
  52. }
  53. // Verification abattre arbre
  54. if ($this->view->abattreArbreEnvironnementOk == false) {
  55. throw new Zend_Exception(get_class($this) . " Abattre un arbre interdit ");
  56. }
  57. // Verification arrivee
  58. $arrivee = Bral_Util_Controle::getValeurIntVerif($this->request->get("valeur_1"));
  59. if ($arrivee < 1 || $arrivee > 3) {
  60. throw new Zend_Exception(get_class($this) . " Destination impossible ");
  61. }
  62. if ($this->view->charettePleine == true && $arrivee == 1) {
  63. throw new Zend_Exception(get_class($this) . " Charette pleine !");
  64. }
  65. if ($this->view->possedeCharrette == false && $arrivee == 1) {
  66. throw new Zend_Exception(get_class($this) . " Pas de charrette !");
  67. }
  68. if ($this->view->labanPlein == true && $arrivee == 2) {
  69. throw new Zend_Exception(get_class($this) . " Laban plein !");
  70. }
  71. // calcul des jets
  72. $this->calculJets();
  73. if ($this->view->okJet1 === true) {
  74. $this->calculAbattreArbre($arrivee);
  75. }
  76. $this->calculPx();
  77. $this->calculBalanceFaim();
  78. $this->calculPoids();
  79. $this->majBraldun();
  80. }
  81. /*
  82. * Uniquement utilisable en forêt.
  83. * Le Braldûn abat un arbre : il ramasse n rondins (directement dans la charrette).
  84. * Le nombre de rondins ramassés est fonction de la VIGUEUR :
  85. * de 0 à 4 : 1D3 + BM VIG/2
  86. * de 5 à 9 : 2D3 + BM VIG/2
  87. * de 10 à 14 :3D3 + BM VIG/2
  88. * de 15 à 19 : 4D3 + BM VIG/2
  89. * etc ...
  90. */
  91. private function calculAbattreArbre($arrivee) {
  92. Zend_Loader::loadClass('Bral_Util_Commun');
  93. Zend_Loader::loadClass('StatsRecolteurs');
  94. $this->view->effetRune = false;
  95. $nb = floor($this->view->user->vigueur_base_braldun / 5) + 1;
  96. $this->view->nbRondins = Bral_Util_De::getLanceDeSpecifique($nb, 1, 3);
  97. if (Bral_Util_Commun::isRunePortee($this->view->user->id_braldun, "VA")) { // s'il possède une rune VA
  98. $this->view->effetRune = true;
  99. $this->view->nbRondins = ceil($this->view->nbRondins * 1.5);
  100. }
  101. $this->view->nbRondins = $this->view->nbRondins + ($this->view->user->vigueur_bm_braldun + $this->view->user->vigueur_bbdf_braldun) / 2;
  102. $this->view->nbRondins = intval($this->view->nbRondins);
  103. if ($this->view->nbRondins <= 0) {
  104. $this->view->nbRondins = 1;
  105. }
  106. $bosquetTable = new Bosquet();
  107. $where = "id_bosquet=" . $this->view->bosquetCourant["id_bosquet"];
  108. // Destruction du bosquet s'il ne reste plus rien
  109. if ($this->view->bosquetCourant["quantite_restante_bosquet"] - $this->view->nbRondins <= 0) {
  110. $this->view->nbRondins = $this->view->bosquetCourant["quantite_restante_bosquet"];
  111. $bosquetTable->delete($where);
  112. $bosquetDetruit = true;
  113. if ($this->view->bosquetCourant['numero_bosquet'] != null) {
  114. $bosquetDansNumero = $bosquetTable->findByNumero($this->view->bosquetCourant['numero_bosquet']);
  115. if ($bosquetDansNumero == null || count($bosquetDansNumero) == 0) {
  116. // recreation si l'on a supprimé tout le bosquet
  117. $this->recreation($this->view->bosquetCourant['id_fk_type_bosquet_bosquet']);
  118. }
  119. }
  120. } else {
  121. $data = array(
  122. 'quantite_restante_bosquet' => $this->view->bosquetCourant["quantite_restante_bosquet"] - $this->view->nbRondins,
  123. );
  124. $bosquetTable->update($data, $where);
  125. $bosquetDetruit = false;
  126. }
  127. $aTerre = 0;
  128. //Charrette
  129. if ($arrivee == 1) {
  130. Zend_Loader::loadClass("Charrette");
  131. $dansCharrette = $this->view->nbRondins;
  132. if ($dansCharrette > $this->view->nbPossibleDansCharretteMax) {
  133. $dansCharrette = $this->view->nbPossibleDansCharretteMax;
  134. $aTerre = $this->view->nbRondins - $dansCharrette;
  135. }
  136. $charretteTable = new Charrette();
  137. $data = array(
  138. 'quantite_rondin_charrette' => $dansCharrette,
  139. 'id_fk_braldun_charrette' => $this->view->user->id_braldun,
  140. );
  141. $charretteTable->updateCharrette($data);
  142. unset($charretteTable);
  143. Bral_Util_Poids::calculPoidsCharrette($this->view->user->id_braldun, true);
  144. }
  145. //Laban
  146. if ($arrivee == 2) {
  147. Zend_Loader::loadClass("Laban");
  148. $dansLaban = $this->view->nbRondins;
  149. if ($dansLaban > $this->view->nbPossibleDansLabanMax) {
  150. $dansLaban = $this->view->nbPossibleDansLabanMax;
  151. $aTerre = $this->view->nbRondins - $dansLaban;
  152. }
  153. $labanTable = new Laban();
  154. $data = array(
  155. 'quantite_rondin_laban' => $dansLaban,
  156. 'id_fk_braldun_laban' => $this->view->user->id_braldun,
  157. );
  158. $labanTable->insertOrUpdate($data);
  159. unset($labanTable);
  160. }
  161. //sol
  162. if ($arrivee == 3) {
  163. $aTerre = $this->view->nbRondins;
  164. }
  165. if ($aTerre > 0) {
  166. Zend_Loader::loadClass("Element");
  167. $elementTable = new Element();
  168. $data = array(
  169. "quantite_rondin_element" => $aTerre,
  170. "x_element" => $this->view->user->x_braldun,
  171. "y_element" => $this->view->user->y_braldun,
  172. "z_element" => $this->view->user->z_braldun,
  173. );
  174. $elementTable->insertOrUpdate($data);
  175. }
  176. $this->view->nbRondinsATerre = $aTerre;
  177. $this->view->arrivee = $arrivee;
  178. $statsRecolteurs = new StatsRecolteurs();
  179. $moisEnCours = mktime(0, 0, 0, date("m"), 2, date("Y"));
  180. $dataRecolteurs["niveau_braldun_stats_recolteurs"] = $this->view->user->niveau_braldun;
  181. $dataRecolteurs["id_fk_braldun_stats_recolteurs"] = $this->view->user->id_braldun;
  182. $dataRecolteurs["mois_stats_recolteurs"] = date("Y-m-d", $moisEnCours);
  183. $dataRecolteurs["nb_bois_stats_recolteurs"] = $this->view->nbRondins;
  184. $statsRecolteurs->insertOrUpdate($dataRecolteurs);
  185. $this->view->estQueteEvenement = Bral_Util_Quete::etapeCollecter($this->view->user, $this->competence["id_fk_metier_competence"]);
  186. $this->view->bosquetDetruit = $bosquetDetruit;
  187. }
  188. function getListBoxRefresh() {
  189. return $this->constructListBoxRefresh(array("box_vue", "box_competences", "box_laban", "box_charrette"));
  190. }
  191. private function recreation($idTypeBosquet) {
  192. // s'il y a une ville à moins de 25 cases
  193. Zend_Loader::loadClass('Bral_Util_Ville');
  194. $bosquetTable = new Bosquet();
  195. $x = $this->view->user->x_braldun;
  196. $y = $this->view->user->y_braldun;
  197. $delta = 15;
  198. $x = Bral_Util_De::get_de_specifique($x - $delta, $x + $delta);
  199. $y = Bral_Util_De::get_de_specifique($y - $delta, $y + $delta);
  200. $ville = Bral_Util_Ville::trouveVilleProche($x, $y, 25);
  201. if ($ville != null) {
  202. $delta = 20;
  203. $xMin = $ville['x_min_ville'] - $delta;
  204. $yMin = $ville['y_min_ville'] - $delta;
  205. $xMax = $ville['x_max_ville'] + $delta;
  206. $yMax = $ville['y_max_ville'] + $delta;
  207. $nbActuel = $bosquetTable->countVue($xMin, $yMin, $xMax, $yMax, 0);
  208. if ($nbActuel < 50) {
  209. $x = Bral_Util_De::get_de_specifique($xMin, $xMax);
  210. $y = Bral_Util_De::get_de_specifique($yMin, $yMax);
  211. }
  212. }
  213. $quantite = Bral_Util_De::get_de_specifique(5, 15);
  214. $numeroBosquet = null;
  215. $nbCasesAutour = Bral_Util_De::get_de_specifique(2, 9);
  216. for ($j = 0; $j <= $nbCasesAutour; $j++) {
  217. for ($k = 0; $k <= $nbCasesAutour; $k++) {
  218. if ($bosquetTable->countByCase($x + $j, $y + $k, 0) == 0) {
  219. $data = array(
  220. 'id_fk_type_bosquet_bosquet' => $idTypeBosquet,
  221. 'x_bosquet' => $x + $j,
  222. 'y_bosquet' => $y + $k,
  223. 'z_bosquet' => $this->view->user->z_braldun,
  224. 'quantite_restante_bosquet' => $quantite,
  225. 'quantite_max_bosquet' => $quantite,
  226. 'numero_bosquet' => $numeroBosquet,
  227. );
  228. $idBosquet = $bosquetTable->insert($data);
  229. if ($numeroBosquet == null) {
  230. $numeroBosquet = $idBosquet;
  231. $where = 'id_bosquet = ' . $idBosquet;
  232. $data['numero_bosquet'] = $numeroBosquet;
  233. $bosquetTable->update($data, $where);
  234. }
  235. }
  236. }
  237. }
  238. }
  239. }