21
[irbot.git] / plugins / jet-plugin.inc.php
blob9043c8dc55cfe90957167c596b9801b36be03fa5
1 <?php
2 /**
3 * This file is part of IrBot, irc robot.
4 * Copyright (C) 2007 Bellière Ludovic
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 class jet implements plugin {
22 private $IRCConn,$formater;
23 private $message;
24 private $commands;
26 public function __construct($main) {
27 $this->IRCConn = bot::GetInstance();
28 $this->formater = text_format::GetInstance();
29 $this->commands = array(
30 'string2dice' => array( // !jet string2dice
31 'accepted_args' => 1,
32 'requier_args' => 1,
33 'help' => 'some help for this method1',
34 'type' => 'private',
36 'caract' => array (
37 'accepted_args' => 3,
38 'requier_args' => 1,
39 'help' => "Jet basé sur une caractéristique.\n".
40 "Argument premier : Valeur de la caractéristique\n".
41 "Argument second : Base du jet, par défaut une base 20 (peut être mis a 100 pour calculer le poid transportable par exemple)\n".
42 "Argument troisième : ".$this->formater->bold('[1|0]')." Spécifie si le jet doit retourner quelque chose d'aléatoire, sinon",
43 'type' => 'private'
48 public function commands_list() {
49 return $this->commands;
52 public function error($msg,$command) {
53 switch ($this->commands[$command]) {
54 case 'private':
55 $this->IRCConn->privmsg($this->message['from'],$msg);
56 break;
58 default:
59 break;
63 public function current_message ($message) {
64 /* gived by irc::parse_get
65 $message = array (
66 'type' => PRIVMSG|NOTICE,
67 'from' => Nick (reply to),
68 'to' => BotName / ChannelName,
69 'message' => The message
72 $this->message = $message;
75 public function string2dice ($str) {
76 $str = strtolower($str);
78 $numbers = array(0,1,2,3,4,5,6,7,8,9);
79 $modifiers = array('+','-','*','/');
81 if ($str == '1d1')
82 return 1;
84 $copy = $str;
85 $i = 0;
86 $len_copy = strlen($copy);
88 $number_of_dice = '';
89 $value_of_dice = '';
90 $modifier = '';
91 $modifier_nature = '';
92 $step = 'first';
93 while ($len_copy > $i) {
94 /**
95 * Si le caractère courant n'est pas un nombre, alors quelques vérifications.
96 * Nous vérifions la partie du dé que nous créons : première (avant le 'd'), deuxième (après le 'd')
97 * et si un modifieur existe ('+','-','*','/').
99 if ($copy[$i] == 'd' || in_array($copy[$i],$modifiers)) {
100 // Nombre de dés a lancer manquant
101 if ($i == 0) {
102 trigger_error('Wrong dice format : "'.$copy.'". Must be [Number]d[Value][Modifier][Number]',E_USER_WARNING);
103 return false;
106 if ($copy[$i] == 'd') {
107 $step = 'second';
108 } elseif (in_array($copy[$i],$modifiers)) {
109 // Valeur du dé manquant
110 if (empty($value_of_dice)) {
111 trigger_error('Wrong dice format : "'.$copy.'". Must be [Number]d[Value][Modifier][Number]',E_USER_WARNING);
112 return false;
114 $step = 'modifier';
115 $modifier_nature = $copy[$i];
116 } else {
117 trigger_error('Unknown caracter \'' . $copy[$i] . '\'.',E_USER_WARNING);
119 } else {
120 if ($step == 'first') {
121 $number_of_dice.= $copy[$i];
124 if ($step == 'second') {
125 $value_of_dice.= $copy[$i];
128 if ($step == 'modifier') {
129 $modifier.= $copy[$i];
133 $i++;
136 $de = self::dice($number_of_dice,$value_of_dice);
137 if ($modifier_nature == '') {
138 $r = $de;
139 } else {
140 $r = eval('return abs(ceil($de'.$modifier_nature.'$modifier));');
143 if (bot::$myBotName == $this->message['to']) {
144 $replyto = $this->message['from'];
145 } else {
146 $replyto = $this->message['to'];
149 $this->IRCConn->privmsg($replyto,$r);
153 * Jet basé sur une caractéristique.
155 * @param int Valeur de la caractéristique
156 * @param int Base du jet, par défaut une base 20 (peut être mis a 100 pour calculer le poid transportable par exemple)
157 * @param boolean Spécifie si le jet doit retourner quelque chose d'aléatoire, sinon
159 public function caract($caract,$base=20,$rand=true) {
160 $caract = intval($caract);
161 $base = intval($base);
163 $de = ($rand) ? self::dice(1,20) : 0 ;
164 $result = floor(($de+$caract) * $base / 20);
165 // (n / 20) * base => la base par défaut est 20
168 if ($rand)
169 $result = $result/2;
171 $this->IRCConn->privmsg($this->message['from'],$result);
172 return $result;
176 * Lance un dé
177 * @param int $number nombre de dé lancé.
178 * @param int $value valeur maximale du dé.
180 private function dice($number,$value) {
181 $number = intval($number);
182 $value = intval($value);
184 // Si la valeur du dé est a 0, on retourne tout de suite 0.
185 if ($value === 0)
186 return 0;
188 $toreturn=0;
189 while ($number>0) {
190 $toreturn+= rand(1,$value);
191 $number-=1;
193 return $toreturn;