Tokiwa Battle Royale  GE777
A PHP Battle Royale inspired game
 All Data Structures Namespaces Files Functions Variables Pages
aievent.func.php
Go to the documentation of this file.
1 <?php
2 if(!defined('IN_GAME')) {
3  exit('Access Denied');
4 }
5 
6 function aievent($rate){
8  global $validtime,$killnum;
9 
10  $sanmachat = Array(
11  'showup' => Array('不需要伪装了,上吧。','我是静流,任务开始。'),
12  'selfbuff' => Array('……这个叫做拍BUFF……!','进行自我强化!'),
13  'selfcure' => Array('进行自我回复。','一般人大概是活不下刚才那一下的,但是我不是一般人。','下次再取你的小命!'),
14  'move' => Array('我已抵达[pls],开始执行任务。','目标地点:[pls]。开始搜索。','在[pls]发现触手,进入警戒模式。'),
15  'move2' => Array('非目标范围。回避至[pls]。','暂时回避。已抵达[pls]。','上一地点会误伤无辜,我已回避至[pls]。','不能加害无辜的人……目前我位于[pls]。'),
16  'combat' => Array('……歼灭[plyr]。','[plyr],吃招!','目标:[plyr],抹杀开始!'),
17  'itm' => Array('[itm]位于[plss]。','在[plss]地点发现[itm]。','[itm]存在于[plss]。'),
18  'unfound' => Array('……[unfound]在地图上不存在。欺骗风纪委员是违反校规的。','找不到这个物品啊:[unfound]……要我做一个出来么?'),
19  );
20 
21  //echo "进入AIEVENT";
22  //TESTCASE: IF GOLDEN MINION SURVIVES: DO NOTHING.
23  if(!$gamevars['sanmaact']){//$sanmaact = 0表示静流没放出,需要判断小兵状态,$sanmaact = 1表示静流已放出
24  $checkMinionSurvive = "SELECT * FROM {$tablepre}players WHERE `type` =91 AND `name` = 'AC专业职人'";
25  $ifMinionSurvive = $db->query($checkMinionSurvive);
26  $minionHP = $db->fetch_array($ifMinionSurvive);
27  //echo "成功获得$minionHP";
28  if ($minionHP ['hp'] > 0){
29  //echo "我是黄金小兵,我还活着。";
30  //$db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('0','$now','【AIDEBUG】','$plsinfo','我是黄金小兵,我还活着。')");
31  }else{
32  //echo "我是黄金小兵,我死了!放一只静流。";
33  $cht = $sanmachat['showup']; shuffle($cht); $cht = $cht[0];
34  $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','【SANMA_TK】','','$cht')");
35  include_once GAME_ROOT . './include/system.func.php';
36  addnpc(15, 0, 1);
37  $gamevars['sanmaact'] = 1;
38  save_gameinfo();
39  }
40  }elseif(!$gamevars['sanmadead']){
41 
42  //echo "静流已放出。";
43  $checkSanma = $db->query("SELECT * FROM {$tablepre}players WHERE type = 15 AND name = '【SANMA_TK】'");
44  $sdata = $db->fetch_array($checkSanma);
45  $spid = $sdata['pid'];
46 // $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','SANMA_TK','$splsinfo','……静流已抵达{$splsinfo}并待机。')");
47  if($sdata['hp'] <= 0){//若静流已死则中止循环,更新标签
48  $gamevars['sanmadead'] = 1;
49  save_gameinfo();
50  } elseif($validnum > 1){//AI在激活人数多于x人时才开始运行
51  global $pls,$pid,$name,$rp,$killnum,$state;
52  global $aidata;
53  $updflag = false;
54  $rpqrylimit = round($validnum/2);//静流回避的对象是(RP/游戏时间)的比值平均线以下的玩家
55  if($rpqrylimit <= 1){$rpqrylimit = 1;}
56  $result = $db->query("SELECT pid,name,rp,validtime FROM {$tablepre}players WHERE type = 0 AND hp > 0 ORDER BY (rp / ($now - validtime)) DESC LIMIT $rpqrylimit");
57  $rptopdata = $db->fetch_array($result);
58  $rplist = Array();
59  while($rpr = $db->fetch_array($result)){
60  $rplist['pid'] = $rpr;
61  }
62  $rplist[$rptopdata['pid']] = $rptopdata;
63 
64  if(!$sdata['achievement']){//AI一些信息的储存位置
65  $sdata['achievement'] = Array('chatid' => 0, 'curenum' => 0);
66  }else{
67  $sdata['achievement'] = json_decode($sdata['achievement'],true);
68  }
69  $svars = & $sdata['achievement'];
70  $chatid = & $svars['chatid'];
71  $curenum = & $svars['curenum'];
72  //AI聊天卖萌部分
73 
74 
75  //AI读取聊天记录
76  if(!$chatid){$chatid = 0;}
77  $chatdata = Array();
78  $chatid = (int)$chatid; $chatlimit = (int)$chatlimit;
79  $result = $db->query("SELECT * FROM {$tablepre}chat WHERE cid>$chatid AND send != '【SANMA_TK】' AND type='0' ORDER BY cid DESC LIMIT $chatlimit");//静流自动忽略$chatlimit条以外的聊天记录
80  $nowchatid = 0;
81  while($chat = $db->fetch_array($result)) {
82  $chatdata[] = $chat;
83  $nowchatid = $chat['cid'];
84  }
85  if($nowchatid > $chatid){
86  $chatid = $nowchatid;
87  $updflag = true;
88  }
89  //$keyflag = $yellowflag = false;
90  $checkcdata = Array();
91 
92  if(!empty($chatdata)){
93  foreach($chatdata as $val){
94  if((strpos($val['msg'],'静流')!==false || strpos($val['msg'],'SANMA')!==false) && (strpos($val['msg'],'位置')!==false || strpos($val['msg'],'哪')!==false)){//聊天记录中存在对位置的询问
95  $checkcdata[] = $val;
96  }
97  }
98  }
99  //$ylwdh = $ylwda = $ylwdf = $key1 = $key2 = $key3 = $key4 = $key5 = $key6 = $keymd1 = $keymd2 = false;
100  $prcslist = Array(
101  '草帽' => '《小黄的草帽》', '钓鱼竿' => '《小黄的钓鱼竿》', '行军靴' => '《小黄的行军靴》',
102  '月宫 亚由' => '月宫 亚由的半身像', '神尾 观铃' => '神尾 观铃的半身像', '古河 渚' => '古河 渚的半身像',
103  '天泽 郁末' => '天泽 郁末的半身像', '长森 瑞佳' => '长森 瑞佳的半身像', '枣 铃' => '枣 铃的半身像',
104  '咏叹调' => '四季流转的咏叹调', '覆唱诗' => '旁观轮回的覆唱诗',
105  );
106 
107  $checkitms = Array();
108  if(!empty($checkcdata)){
109  foreach($prcslist as $pkey => $pval){
110  if(strpos($pkey,' ')!==false){//有空格分开判断
111  list($pkey1,$pkey2) = explode(' ',$pkey);
112  foreach($checkcdata as $val){
113  if(strpos($val['msg'],$pkey1)!==false && strpos($val['msg'],$pkey2)!==false){
114  $checkitms[] = $pval;
115  break;
116  }
117  }
118  }else{
119  foreach($checkcdata as $val){
120  if(strpos($val['msg'],$pkey)!==false){
121  $checkitms[] = $pval;
122  break;
123  }
124  }
125  }
126  }
127  }
128  if(!empty($checkitms)){
129  //查询物品位置
130  $qrywhere = '';
131  foreach($checkitms as $val){
132  $qrywhere .= "'".$val."',";
133  }
134  $qrywhere = '('.substr($qrywhere,0,-1).')';
135  $result = $db->query("SELECT * FROM {$tablepre}mapitem WHERE itm IN $qrywhere");
136  $itmdata = array();
137  while($idata = $db->fetch_array($result)){
138  $itmdata[$idata['itm']][] = $idata['pls'];
139  }
140  //物品位置转化成聊天消息
141  $itmchat = array();
142  if(!empty($itmdata)){
143  foreach($itmdata as $itm => $ipls){
144  $cht = $sanmachat['itm']; shuffle($cht); $cht = $cht[0];
145  $cht = str_replace('[itm]',$itm,$cht);
146  $plss = '';
147  $pvallist = Array();
148  foreach($ipls as $pval){
149  if(!in_array($pval,$pvallist)){
150  $plss .= $plsinfo[$pval].',';
151  $pvallist[] = $pval;
152  }
153  }
154  $cht = str_replace('[plss]',substr($plss,0,-1),$cht);
155  $itmchat[] = Array('type' => '2', 'time' => $now, 'send' => '【SANMA_TK】', 'msg' => $cht);
156  }
157  }
158  //未发现物品则卖萌
159  $unfounditms = array_diff($checkitms,array_keys($itmdata));
160  //var_dump($unfounditms);
161  if(!empty($unfounditms)){
162 
163  $unfound = '';
164  foreach($unfounditms as $uval){
165  $unfound .= $uval.',';
166  }
167  $cht = $sanmachat['unfound']; shuffle($cht); $cht = $cht[0];
168  $cht = str_replace('[unfound]',substr($unfound,0,-1),$cht);
169  $itmchat[] = Array('type' => '2', 'time' => $now, 'send' => '【SANMA_TK】', 'msg' => $cht);
170  }
171  if(!empty($itmchat)){
172  $db->multi_insert("{$tablepre}chat",$itmchat);
173  }
174  }
175 
176 
177  //AI实际行动部分
178  if($sdata['hp'] <= $sdata['mhp'] * 0.75){//AI优先补血
179 
180  $curenum ++;
181  if(rand(0,4) < $curenum){//AI被打伤时有概率给自己上BUFF
182  $curenum = 0;
183  $sdata['hp'] = $sdata['mhp'] = round($sdata['mhp']*1.05);//HP上限+5%
184  $sdata['att'] = round($sdata['att']*1.1);//攻防+10%
185  $sdata['def'] = round($sdata['def']*1.1);
186  foreach(array('wp','wk','wg','wc','wd','wf') as $val){
187  $sdata[$val] = round($sdata[$val]*1.1);//全系熟练度+10%
188  }
189  $cht = $sanmachat['selfbuff'];
190  }else{
191  $sdata['hp'] = $sdata['mhp'];
192  $cht = $sanmachat['selfcure'];//其他情况只是一般的回复
193  }
194  $updflag = true;
195  shuffle($cht); $cht = $cht[0];
196  $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','【SANMA_TK】','','{$cht}')");
197 
198  }elseif(rand(0,99) < $rate && in_array($pid,array_keys($rplist)) && $rp >= 50){//如果玩家的RP比值在平均线上,那么静流以玩家为目标$rptopdata['pid'] == $pid &&
199  $mvflg = $cmbtflg = false;
200  //RP/游戏时间比值的判断
201  $myrprate = $rp / ($now - $validtime);
202  $rpratesafe = 0.6;//安全值,暂时设0.6,大致相当于30分钟杀60个兵。
203  $rpratelvl = 0.8;//80%被跟踪
204  $rpratelvl2 = 1.0;//80%被直接切入战斗
205  $mvrate = round(($myrprate - $rpratesafe) / ($rpratelvl - $rpratesafe) * 80);if($mvrate > 80){$mvrate = 80;}elseif($mvrate < 0){$mvrate = 0;}
206  //$log.= '跟踪'.$mvrate;
207  $cmbtrate = round(($myrprate - $rpratelvl) / ($rpratelvl2 - $rpratelvl) * 80);if($cmbtrate > 80){$cmbtrate = 80;}elseif($cmbtrate < 0){$cmbtrate = 0;}
208  //$log.= '战斗'.$cmbtrate;
209 // $mvrplvl = 500;//RP在500以上时最高80%触发静流移动
210 // $cmbtrplvl = 1000;//RP在1000以上时最高80%触发静流攻击(前提是静流跟你在一个地图)
211 // $mvrate = round($rp / $mvrplvl * 80);if($mvrate > 80){$mvrate = 80;}
212 // $cmbtrate = round(($rp - 500) / ($cmbtrplvl - $mvrplvl) * 80);if($cmbtrate > 80){$cmbtrate = 80;}
213  $dice = rand(0,99);
214  if($dice < $mvrate){
215  if($sdata['pls'] != $pls){
216  $mvflg = true;
217  $sdata['pls'] = $pls;//静流移动
218  }
219  if($dice < $cmbtrate && $sdata['pls'] == $pls && $rptopdata['pid'] == $pid && $killnum > 0){//注意:【划掉】这里暗含:静流刚移到此地点时不会立刻攻击【/划掉】有情无用!
220  $cmbtflg = true;
221  }
222  }
223 
224  if($mvflg){
225  //$sdata['pls'] = $pls;//静流移动
226  $sdata['pose'] = 2;$sdata['tactic'] = 3;//静流姿态变为强袭+反击
227  //$sdata['l']
228  $updflag = true;
229  $db->array_update("{$tablepre}players", $sdata, " pid = '$spid'");//先更为敬,虽然其实可以巧妙构筑流程减少这一次更新
230  $splsinfo = $plsinfo[$sdata['pls']];
231  $cht = $sanmachat['move']; shuffle($cht); $cht = $cht[0]; $cht = str_replace('[pls]',$splsinfo,$cht);
232  $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','【SANMA_TK】','','{$cht}')");
233  }
234  if($cmbtflg){
235  if(is_array($sdata['achievement'])){$sdata['achievement'] = json_encode($sdata['achievement']);}
236  $aidata = $sdata;
237  //echo '静流开始对你实施追击。';
238  $sanmams = $name;
239  $cht = $sanmachat['combat']; shuffle($cht); $cht = $cht[0]; $cht = str_replace('[plyr]',$sanmams,$cht);
240  $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','【SANMA_TK】','','{$cht}')");
241  }
242  } elseif(!in_array($pid,array_keys($rplist)) || $rp < 50) {//如果玩家RP位于平均线以下,那么静流会回避玩家
243  //echo '进入躲避判断';
244  $newsflag = false;
245  if($sdata['pls'] == $pls){//静流和玩家位置相同
246  $sdata['pose'] = 0;$sdata['tactic'] = 4;//静流姿态变为普通+躲避
247  if(rand(0,99) < 50){//50%概率移动到别的位置
248  while($sdata['pls'] == $pls){
249  $sdata['pls'] = rand(1,count($plsinfo)-1);
250  }
251  $newsflag = true;
252  }
253  $updflag = true;
254  }
255 
256  if($newsflag){
257  $splsinfo = $plsinfo[$sdata['pls']];
258  $cht = $sanmachat['move2']; shuffle($cht); $cht = $cht[0]; $cht = str_replace('[pls]',$splsinfo,$cht);
259  $db->query("INSERT INTO {$tablepre}chat (type,`time`,send,recv,msg) VALUES ('2','$now','【SANMA_TK】','','{$cht}')");
260  }
261  }
262  if($updflag){//前面所有需要更新的部分一并更新
263  if(is_array($sdata['achievement'])){$sdata['achievement'] = json_encode($sdata['achievement']);}
264  $db->array_update("{$tablepre}players", $sdata, " pid = '$spid'");
265  }
266  }
267  }
268 }
269 ?>
$tablepre
Definition: config.inc.php:58
if(!defined('IN_GAME')) aievent($rate)
Definition: aievent.func.php:6
$validnum
Definition: gameinfo.php:13
$chatdata
Definition: game.php:43
$plsinfo
addnpc($type, $sub, $num, $time=0)
$chatlimit
Definition: system.php:43
$db
Definition: clear.php:32
【生存者数:<?php echo $alivenum?> 人】< input type="button"value="显示全部幸存者"onClick="$('alivemode').value='all';$('gbmode').value='none';postCmd('alive','alive.php');"></p > if($gamblingon &&$gamestate >=20) elseif($gamblingon &&$gamestate<=10)
Definition: 1_alive.tpl.php:18
const GAME_ROOT
Definition: clear.php:6
$log
Definition: botservice.php:34
$now
Definition: clear.php:23
if(!$cuser||!$cpass) $result
Definition: admin.php:25
save_gameinfo()