Tokiwa Battle Royale  GE777
A PHP Battle Royale inspired game
 All Data Structures Namespaces Files Functions Variables Pages
system.func.php
Go to the documentation of this file.
1 <?php
2 
3 if(!defined('IN_GAME')) {
4  exit('Access Denied');
5 }
6 
7 function rs_game($mode = 0) {
9 // $stime=getmicrotime();
10  $dir = GAME_ROOT.'./gamedata/';
11  $sqldir = GAME_ROOT.'./gamedata/sql/';
12  if ($mode & 1) {
13  //重设玩家互动信息、聊天记录、地图道具、地图陷阱、进行状况
14  $sql = file_get_contents("{$sqldir}reset.sql");
15  $sql = str_replace("\r", "\n", str_replace(' bra_', ' '.$tablepre, $sql));
16 
17  $db->queries($sql);
18 
19  //重设游戏进行状况的时间
20  if($fp = fopen("{$dir}newsinfo.php", 'wb')) {
21  global $checkstr;
22  fwrite($fp, $checkstr);
23  fclose($fp);
24  } else {
25  gexit('Can not write to cache files, please check directory ./gamedata/ and ./gamedata/cache/ .', __file__, __line__);
26  }
27 
28  //清空战斗信息
30  $hdamage = 0;
31  $hplayer = '';
32  $noisetime = 0;
33  $noisepls = 0;
34  $noiseid = 0;
35  $noiseid2 = 0;
36  $noisemode = '';
38 
39  //修改反挂机间隔
40  $afktime = $starttime;
41  //重设连斗判断死亡数
42  $combonum = $deathlimit;
43  //重设游戏剧情开关
44  $gamevars = 0;
45  save_gameinfo();
46 
47 
48 
49  }
50  if ($mode & 2) {
51  //echo " - 禁区初始化 - ";
53  list($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime($starttime);
54  $areatime = (ceil(($starttime + $areahour*60)/600))*600;//$areahour已改为按分钟计算,ceil是为了让禁区分钟为10的倍数
55  $plsnum = sizeof($plsinfo);
56  $arealist = range(1,$plsnum-1);
57  shuffle($arealist);
58  array_unshift($arealist,0);
59  $areanum = 0;
60  $weather = rand(0,9);
61  $hack = 0;
62  movehtm($areatime);
63  }
64  if ($mode & 4) {
65  //echo " - 角色数据库初始化 - ";
67  $sql = file_get_contents("{$sqldir}players.sql");
68  $sql = str_replace("\r", "\n", str_replace(' bra_', ' '.$tablepre, $sql));
69  $db->queries($sql);
70  //runquery($sql);
71  $validnum = $alivenum = $deathnum = 0;
72  }
73  if ($mode & 8) {
74  //echo " - NPC初始化 - ";
75  $db->query("DELETE FROM {$tablepre}players WHERE type>0 ");
76  include_once config('npc',$gamecfg);
77  //$typenum = sizeof($typeinfo);
78  $plsnum = sizeof($plsinfo);
79  $npcqry = '';
80 
81  //for($i = 1; $i < $typenum; $i++) {
82  foreach ($npcinfo as $i => $npcs){
83  if(!empty($npcs)) {
84  if (sizeof($npcs['sub'])>$npcs['num'])shuffle($npcs['sub']);
85  for($j = 1; $j <= $npcs['num']; $j++) {
86  $npc = array_merge($npcinit,$npcs);
87  //$npc = $npcinfo[$i];
88  $npc['type'] = $i;
89  $npc['endtime'] = $now;
90  $npc['sNo'] = $j;
91 
92  //if(($npc['mode'] == 1)&&($npc['num'] <= $npc['sub'])){
93  // $npc = array_merge($npc,$npc[$j]);
94  //} elseif($npc['mode'] == 2) {
95  // $k = rand(1,$npc['sub']);
96  // $npc = array_merge($npc,$npc[$k]);
97  //} else {
98  // $npc = array_merge($npc,$npc[1]);
99  //}
100 
101 
102  $subnum = sizeof($npc['sub']);
103  $sub = $j % $subnum;
104  $npc = array_merge($npc,$npc['sub'][$sub]);
105  $npc['hp'] = $npc['mhp'];
106  $npc['sp'] = $npc['msp'];
107  $npc['exp'] = round(2*$npc['lvl']*$GLOBALS['baseexp']);
108  foreach(Array('p','k','g','c','d','f') as $val){
109  if(!$npc['w'.$val]){
110  $npc['w'.$val] = $npc['skill'];
111  }
112  }
113  //$npc['wp'] = $npc['wk'] = $npc['wg'] = $npc['wc'] = $npc['wd'] = $npc['wf'] = $npc['skill'];
114  if($npc['gd'] == 'r'){$npc['gd'] = rand(0,1) ? 'm':'f';}
115  do{$rpls=rand(1,$plsnum-1);}while ($rpls==34);
116  if($npc['pls'] == 99){$npc['pls'] = $rpls; }
117  $npc['state'] = 0;
118  $npcqry .= "('".$npc['name']."','".$npc['pass']."','".$npc['type']."','".$npc['endtime']."','".$npc['gd']."','".$npc['sNo']."','".$npc['icon']."','".$npc['club']."','".$npc['rp']."','".$npc['hp']."','".$npc['mhp']."','".$npc['sp']."','".$npc['msp']."','".$npc['att']."','".$npc['def']."','".$npc['pls']."','".$npc['lvl']."','".$npc['exp']."','".$npc['money']."','".$npc['bid']."','".$npc['inf']."','".$npc['rage']."','".$npc['pose']."','".$npc['tactic']."','".$npc['killnum']."','".$npc['state']."','".$npc['wp']."','".$npc['wk']."','".$npc['wg']."','".$npc['wc']."','".$npc['wd']."','".$npc['wf']."','".$npc['teamID']."','".$npc['teamPass']."','".$npc['wep']."','".$npc['wepk']."','".$npc['wepe']."','".$npc['weps']."','".$npc['arb']."','".$npc['arbk']."','".$npc['arbe']."','".$npc['arbs']."','".$npc['arh']."','".$npc['arhk']."','".$npc['arhe']."','".$npc['arhs']."','".$npc['ara']."','".$npc['arak']."','".$npc['arae']."','".$npc['aras']."','".$npc['arf']."','".$npc['arfk']."','".$npc['arfe']."','".$npc['arfs']."','".$npc['art']."','".$npc['artk']."','".$npc['arte']."','".$npc['arts']."','".$npc['itm0']."','".$npc['itmk0']."','".$npc['itme0']."','".$npc['itms0']."','".$npc['itm1']."','".$npc['itmk1']."','".$npc['itme1']."','".$npc['itms1']."','".$npc['itm2']."','".$npc['itmk2']."','".$npc['itme2']."','".$npc['itms2']."','".$npc['itm3']."','".$npc['itmk3']."','".$npc['itme3']."','".$npc['itms3']."','".$npc['itm4']."','".$npc['itmk4']."','".$npc['itme4']."','".$npc['itms4']."','".$npc['itm5']."','".$npc['itmk5']."','".$npc['itme5']."','".$npc['itms5']."','".$npc['itm6']."','".$npc['itmk6']."','".$npc['itme6']."','".$npc['itms6']."','".$npc['wepsk']."','".$npc['arbsk']."','".$npc['arhsk']."','".$npc['arask']."','".$npc['arfsk']."','".$npc['artsk']."','".$npc['itmsk0']."','".$npc['itmsk1']."','".$npc['itmsk2']."','".$npc['itmsk3']."','".$npc['itmsk4']."','".$npc['itmsk5']."','".$npc['itmsk6']."','".$npc['skills']."'),";
119  //$db->query("INSERT INTO {$tablepre}players (name,pass,type,endtime,gd,sNo,icon,club,hp,mhp,sp,msp,att,def,pls,lvl,`exp`,money,bid,inf,rage,pose,tactic,killnum,state,wp,wk,wg,wc,wd,wf,teamID,teamPass,wep,wepk,wepe,weps,arb,arbk,arbe,arbs,arh,arhk,arhe,arhs,ara,arak,arae,aras,arf,arfk,arfe,arfs,art,artk,arte,arts,itm0,itmk0,itme0,itms0,itm1,itmk1,itme1,itms1,itm2,itmk2,itme2,itms2,itm3,itmk3,itme3,itms3,itm4,itmk4,itme4,itms4,itm5,itmk5,itme5,itms5,wepsk,arbsk,arhsk,arask,arfsk,artsk,itmsk0,itmsk1,itmsk2,itmsk3,itmsk4,itmsk5) VALUES ('".$npc['name']."','".$npc['pass']."','".$npc['type']."','".$npc['endtime']."','".$npc['gd']."','".$npc['sNo']."','".$npc['icon']."','".$npc['club']."','".$npc['hp']."','".$npc['mhp']."','".$npc['sp']."','".$npc['msp']."','".$npc['att']."','".$npc['def']."','".$npc['pls']."','".$npc['lvl']."','".$npc['exp']."','".$npc['money']."','".$npc['bid']."','".$npc['inf']."','".$npc['rage']."','".$npc['pose']."','".$npc['tactic']."','".$npc['killnum']."','".$npc['death']."','".$npc['wp']."','".$npc['wk']."','".$npc['wg']."','".$npc['wc']."','".$npc['wd']."','".$npc['wf']."','".$npc['teamID']."','".$npc['teamPass']."','".$npc['wep']."','".$npc['wepk']."','".$npc['wepe']."','".$npc['weps']."','".$npc['arb']."','".$npc['arbk']."','".$npc['arbe']."','".$npc['arbs']."','".$npc['arh']."','".$npc['arhk']."','".$npc['arhe']."','".$npc['arhs']."','".$npc['ara']."','".$npc['arak']."','".$npc['arae']."','".$npc['aras']."','".$npc['arf']."','".$npc['arfk']."','".$npc['arfe']."','".$npc['arfs']."','".$npc['art']."','".$npc['artk']."','".$npc['arte']."','".$npc['arts']."','".$npc['itm0']."','".$npc['itmk0']."','".$npc['itme0']."','".$npc['itms0']."','".$npc['itm1']."','".$npc['itmk1']."','".$npc['itme1']."','".$npc['itms1']."','".$npc['itm2']."','".$npc['itmk2']."','".$npc['itme2']."','".$npc['itms2']."','".$npc['itm3']."','".$npc['itmk3']."','".$npc['itme3']."','".$npc['itms3']."','".$npc['itm4']."','".$npc['itmk4']."','".$npc['itme4']."','".$npc['itms4']."','".$npc['itm5']."','".$npc['itmk5']."','".$npc['itme5']."','".$npc['itms5']."','".$npc['wepsk']."','".$npc['arbsk']."','".$npc['arhsk']."','".$npc['arask']."','".$npc['arfsk']."','".$npc['artsk']."','".$npc['itmsk0']."','".$npc['itmsk1']."','".$npc['itmsk2']."','".$npc['itmsk3']."','".$npc['itmsk4']."','".$npc['itmsk5']."')");
120  unset($npc);
121  }
122  }
123  }
124  if(!empty($npcqry)){
125  $npcqry = "INSERT INTO {$tablepre}players (name,pass,type,endtime,gd,sNo,icon,club,rp,hp,mhp,sp,msp,att,def,pls,lvl,`exp`,money,bid,inf,rage,pose,tactic,killnum,state,wp,wk,wg,wc,wd,wf,teamID,teamPass,wep,wepk,wepe,weps,arb,arbk,arbe,arbs,arh,arhk,arhe,arhs,ara,arak,arae,aras,arf,arfk,arfe,arfs,art,artk,arte,arts,itm0,itmk0,itme0,itms0,itm1,itmk1,itme1,itms1,itm2,itmk2,itme2,itms2,itm3,itmk3,itme3,itms3,itm4,itmk4,itme4,itms4,itm5,itmk5,itme5,itms5,itm6,itmk6,itme6,itms6,wepsk,arbsk,arhsk,arask,arfsk,artsk,itmsk0,itmsk1,itmsk2,itmsk3,itmsk4,itmsk5,itmsk6,skills) VALUES ".substr($npcqry, 0, -1);
126  $db->query($npcqry);
127  unset($npcqry);
128  }
129  }
130  if ($mode & 16) {
131  //echo " - 地图道具/陷阱初始化 - ";
132  //感谢 Martin1994 提供地图道具数据库化的源代码
133  $plsnum = sizeof($plsinfo);
134  $iqry = $tqry = '';
135 // if($gamestate == 0){
136 // global $checkstr;
137 // dir_clear("{$dir}mapitem/");
138 // for($i = 0;$i < $plsnum; $i++){
139 // $mapfile = GAME_ROOT."./gamedata/mapitem/{$i}mapitem.php";
140 // writeover($mapfile,$checkstr);
141 // }
142 // }
143  $file = config('mapitem',$gamecfg);
144  $itemlist = openfile($file);
145  $in = sizeof($itemlist);
146  $an = $areanum ? ceil($areanum/$areaadd) : 0;
147  //$mapitem = array();
148  //$ifqry = $iqry = 'INSERT INTO '.$tablepre.'mapitem (itm,itmk,itme,itms,itmsk,map) VALUES ';
149  for($i = 1; $i < $in; $i++) {
150  if(!empty($itemlist[$i]) && strpos($itemlist[$i],',')!==false){
151  list($iarea,$imap,$inum,$iname,$ikind,$ieff,$ista,$iskind) = explode(',',$itemlist[$i]);
152  if(($iarea == $an)||($iarea == 99)) {
153  for($j = $inum; $j>0; $j--) {
154  if($imap == 99) {
155  $rmap = rand(1,$plsnum-1);
156  while ($rmap==34){$rmap = rand(1,$plsnum-1);}
157  if(strpos($ikind ,'TO')===0){
158  $tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap'),";
159  }else{
160  $iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap'),";
161  }
162  //$iqry[$rmap] .= "('$iname', '$ikind','$ieff','$ista','$iskind'),";
163  //$db->query("INSERT INTO {$tablepre}{$rmap}mapitem (itm,itmk,itme,itms,itmsk) VALUES ('$iname', '$ikind','$ieff','$ista','$iskind')");
164  }else{
165  if(strpos($ikind ,'TO')===0){
166  $tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap'),";
167  }else{
168  $iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap'),";
169  }
170  //$db->query("INSERT INTO {$tablepre}{$imap}mapitem (itm,itmk,itme,itms,itmsk) VALUES ('$iname', '$ikind','$ieff','$ista','$iskind')");
171  }
172 
173  //if($imap == 99) {
174  // $imap = rand(1,$plsnum-1);
175  //$mapitem[$rmap] .= "$iname,$ikind,$ieff,$ista,$iskind,\n";
176  //} else {
177  //$mapitem[$imap] .= "$iname,$ikind,$ieff,$ista,$iskind,\n";
178  //}
179  }
180  }
181  }
182  }
183  if(!empty($iqry)){
184  $iqry = "INSERT INTO {$tablepre}mapitem (itm,itmk,itme,itms,itmsk,pls) VALUES ".substr($iqry, 0, -1);
185  $db->query($iqry);
186  }
187  if(!empty($tqry)){
188  $tqry = "INSERT INTO {$tablepre}maptrap (itm,itmk,itme,itms,itmsk,pls) VALUES ".substr($tqry, 0, -1);
189  $db->query($tqry);
190  }
191 // for($imap = 0;$imap<$plsnum;$imap++){
192 // if(!empty($iqry[$imap])){
193 // $iqry[$imap] = "INSERT INTO {$tablepre}{$imap}mapitem (itm,itmk,itme,itms,itmsk) VALUES ".substr($iqry[$imap], 0, -1);
194 // $db->query($iqry[$imap]);
195 // }
196 // }
197 // if($ifqry != $iqry){//判定是否有数据写入
198 // $iqry = substr($iqry, 0, -1);//去除尾部多余的逗号
199 // $db->query($iqry);
200 // }
201 // foreach($mapitem as $map => $itemdata) {
202 // $mapfile = GAME_ROOT."./gamedata/mapitem/{$map}mapitem.php";
203 // writeover($mapfile,$itemdata,'ab');
204 // }
205 
206  unset($itemlist);unset($iqry);
207  //unset($mapitem);
208 
209  }
210  if ($mode & 32) {
211  //echo " - 商店初始化 - ";
212  $sql = file_get_contents("{$sqldir}shopitem.sql");
213  $sql = str_replace("\r", "\n", str_replace(' bra_', ' '.$tablepre, $sql));
214  $db->queries($sql);
215  //runquery($sql);
216 
217  $file = config('shopitem',$gamecfg);
218  $shoplist = openfile($file);
219  $qry = '';
220  foreach($shoplist as $lst){
221  if(!empty($lst) && strpos($lst,',')!==false){
222  list($kind,$num,$price,$area,$item,$itmk,$itme,$itms,$itmsk)=explode(',',$lst);
223  if($kind != 0){
224  $qry .= "('$kind','$num','$price','$area','$item','$itmk','$itme','$itms','$itmsk'),";
225  }
226  }
227  }
228  if(!empty($qry)){
229  $qry = "INSERT INTO {$tablepre}shopitem (kind,num,price,area,item,itmk,itme,itms,itmsk) VALUES ".substr($qry, 0, -1);
230  }
231  $db->query($qry);
232 
233  }
234 }
235 
236 function rs_sttime() {
237  //echo " - 游戏开始时间初始化 - ";
239 
240  list($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime($now);
241  $month++;
242  $year += 1900;
243 
244  if($startmode == 1) {
245  if($hour >= $starthour){ $nextday = $day+1;}
246  else{$nextday = $day;}
247  $nexthour = $starthour;
248  $starttime = mktime($nexthour,$startmin,0,$month,$nextday,$year);
249  } elseif($startmode == 2) {
250  $starthour = $starthour> 0 ? $starthour : 1;
251  $startmin = $startmin> 0 ? $startmin : 1;
252  $nexthour = $hour + $starthour;
253  $starttime = mktime($nexthour,$startmin,0,$month,$day,$year);
254  } elseif($startmode == 3) {
255  $starthour = $starthour> 0 ? $starthour : 1;
256  $nextmin = $min + $starthour;
257  $nexthour = $hour;
258 // if($nextmin % 60 >= 40){//回避速1禁
259 // $nextmin+=20;
260 // }
261  if($nextmin % 60 == 0){
262  $nextmin +=1;
263  }
264  $starttime = mktime($nexthour,$nextmin,0,$month,$day,$year);
265  } else {
266  $starttime = 0;
267  }
268 
269  return;
270 }
271 
272 
273 function add_once_area($atime) {
274  //实际上GAMEOVER的判断是在common.inc.php里
276 
277  if (($gamestate > 10)&&($now > $atime)) {
278  $plsnum = sizeof($plsinfo) - 1;
279  if(($areanum >= $arealimit*$areaadd)&&($validnum<=0)) {//无人参加GAMEOVER不是因为这里,这里只是保险。
280  gameover($atime,'end4');
281  return;
282  } elseif(($areanum + $areaadd) >= $plsnum) {
283  $areaaddlist = array_slice($arealist,$areanum+1);
284  $areanum = $plsnum;
285  $weather = rand(0,9);
286  //addnews($atime,'addarea',$areaaddlist,$weather);
287  addnews($atime, 'addarea',$areaaddlist,$weather);
288  storyputchat($now,'areaadd');
289  systemputchat($atime,'areaadd',$areaaddlist);
290  $query = $db->query("SELECT * FROM {$tablepre}players WHERE type=0 AND hp>0");
291  while($sub = $db->fetch_array($query)) {
292  $pid = $sub['pid'];
293  $hp = 0;
294  $state = 11;
295  $deathpls = $sub['pls'];
296  $bid = 0;
297  $endtime = $atime;
298  $db->query("UPDATE {$tablepre}players SET hp='$hp', bid='$bid', state='$state', endtime='$endtime' WHERE pid=$pid");
299  addnews($endtime,"death$state",$sub['name'],$sub['type'],$deathpls);
300  }
301  $db->free_result($query);
302  $alivenum = 0;
303  $dquery = $db->query("SELECT pid FROM {$tablepre}players WHERE hp<=0");
304  $deathnum = $db->num_rows($dquery);
305  $db->free_result($dquery);
306  gameover($atime,'end1');
307  return;
308  } else {
309  $weather = rand(0,9);
310  if($hack > 0){$hack--;}
311  $areaaddlist = array_slice($arealist,$areanum+1,$areaadd);
312  $areanum += $areaadd;
313  movehtm();
314  //addnews($atime,'addarea',$areaaddlist,$weather);
315  addnews($atime, 'addarea',$areaaddlist,$weather);
316  storyputchat($now,'areaadd');
317  systemputchat($atime,'areaadd',$areaaddlist);
318  $str_arealist = implode(',',array_slice($arealist,0,$areanum+1));
319  $query = $db->query("SELECT * FROM {$tablepre}players WHERE pls IN ($str_arealist) AND hp>0");
320  while($sub = $db->fetch_array($query)) {
321  $pid = $sub['pid'];
322  if(!$sub['type']) {
323  if(($gamestate >= 40)||(!$areaesc&&($sub['tactic']!=4))) {
324  $hp = 0;
325  $state = 11;
326  $deathpls = $sub['pls'];
327  $bid = 0;
328  $endtime = $atime;
329  $db->query("UPDATE {$tablepre}players SET hp='$hp', bid='$bid', state='$state', endtime='$endtime' WHERE pid=$pid");
330  addnews($endtime,"death$state",$sub['name'],$sub['type'],$deathpls);
331  $deathnum++;
332  } else {
333  do{$pls = $arealist[rand($areanum+1,$plsnum)];}while ($pls==34);
334  $db->query("UPDATE {$tablepre}players SET pls='$pls' WHERE pid=$pid ");
335  }
336  } elseif($sub['type'] != 1 && $sub['type'] != 7 && $sub['type'] != 9 && $sub['type'] != 13 && $sub['type'] != 20 && $sub['type'] != 21 && $sub['type'] != 88 && $sub['type'] != 22) {
337  do{$pls = $arealist[rand($areanum+1,$plsnum)];}while ($pls==34);
338  $db->query("UPDATE {$tablepre}players SET pls='$pls' WHERE pid=$pid");
339  }
340  }
341  $alivenum = $db->result($db->query("SELECT COUNT(*) FROM {$tablepre}players WHERE hp>0 AND type=0"), 0);
342  if(($alivenum == 1)&&($gamestate >= 30)) {
343  gameover($atime);
344  return;
345  } elseif(($alivenum <= 0)&&($gamestate >= 30)) {
346  gameover($atime,'end1');
347  return $atime;
348  } else {
349  rs_game(16+32);
350  //$areatime += $areahour*3600;
351  //addarea($areatime);
352  return;
353  }
354  }
355  } else {
356  return;
357  }
358 }
359 
360 function areawarn(){
361  global $now,$arealist,$areanum,$areaadd,$areawarn;
362  $areaaddlist = array_slice($arealist,$areanum+1,$areaadd);
363  $areawarn = 1;
364  storyputchat($now,'areawarn');
365  systemputchat($now,'areawarn',$areaaddlist);
366  return;
367 }
368 
369 function duel($time = 0,$keyitm = ''){
370  global $now,$gamestate,$name,$nick;
371  if($gamestate < 30){
372  return 30;
373  } elseif($gamestate >= 50) {
374  return 51;
375  } else{
376  $time = $time == 0 ? $now : $time;
377  $gamestate = 50;
378  save_gameinfo();
379  addnews($time,'duelkey',$nick.' '.$name,$keyitm);
380  addnews($time,'duel');
381  systemputchat($time,'duel');
382  return 50;
383  }
384 
385 }
386 //------游戏结束------
387 //模式:0保留:程序故障;1:全部死亡;2:最后幸存;3:禁区解除;4:无人参加;5:核爆全灭;6:GM中止
388 function gameover($time = 0, $mode = '', $winname = '') {
390  if($gamestate < 10){return;}
391  if((!$mode)||(($mode==2)&&(!$winname))) {//在没提供游戏结束模式的情况下,自行判断模式
392  if($validnum <= 0) {//无激活者情况下,全部死亡
393  $alivenum = 0;
394  $winmode = 4;
395  $winner = '';
396 
397  } else {//判断谁是最后幸存者
398  $result = $db->query("SELECT * FROM {$tablepre}players WHERE hp>0 AND type=0");
399  $alivenum = $db->num_rows($result);
400  if(!$alivenum) {//全部死亡
401  $winmode = 1;
402  $winner = '';
403  } elseif($alivenum == 1) {//最后幸存
404  $winmode = 2;
405  $wdata = $db->fetch_array($result);
406  $winner = $wdata['name'];
407  $db->query("UPDATE {$tablepre}players SET state='5' where pid='{$wdata['pid']}'");
408  } else {//不满足游戏结束条件,返回
409  save_gameinfo();
410  return;
411  }
412  }
413  } else {//提供了游戏结束模式的情况下
414  $winmode = substr($mode,3,1);
415  $winner = $winname;
416  }
417  $time = $time ? $time : $now;
418  $result = $db->query("SELECT gid FROM {$tablepre}winners ORDER BY gid DESC LIMIT 1");//判断当前游戏局数是否正确,以优胜列表为准
419  if($db->num_rows($result)&&($gamenum <= $db->result($result, 0))) {
420  $gamenum = $db->result($result, 0) + 1;
421  }
422  if($winmode == 4){//无人参加;不需要记录任何资料
423  $getime = $time;
424  $db->query("INSERT INTO {$tablepre}winners (gid,wmode,vnum,getime) VALUES ('$gamenum','$winmode','$validnum','$getime')");
425  } elseif(($winmode == 0)||($winmode == 1)||($winmode == 6)){//程序故障、全部死亡、GM中止,不需要记录优胜者资料
426  $gstime = $starttime;
427  $getime = $time;
428  $gtime = $time - $starttime;
429  $result = $db->query("SELECT name,killnum FROM {$tablepre}players WHERE type=0 order by killnum desc, lvl desc limit 1");
430  $hk = $db->fetch_array($result);
431  $hkill = $hk['killnum'];
432  $hkp = $hk['name'];
433  $db->query("INSERT INTO {$tablepre}winners (gid,wmode,vnum,gtime,gstime,getime,hdmg,hdp,hkill,hkp) VALUES ('$gamenum','$winmode','$validnum','$gtime','$gstime','$getime','$hdamage','$hplayer','$hkill','$hkp')");
434  } else {//最后幸存、锁定解除、核爆全灭,需要记录优胜者资料
435  $result = $db->query("SELECT * FROM {$tablepre}players WHERE name='$winner' AND type=0");
436  $pdata = $db->fetch_array($result);
437  $result2 = $db->query("SELECT motto FROM {$tablepre}users WHERE username='$winner'");
438  $pdata['motto'] = $db->result($result2, 0);
439  $result3 = $db->query("SELECT name,killnum FROM {$tablepre}players WHERE type=0 order by killnum desc, lvl desc limit 1");
440  $hk = $db->fetch_array($result3);
441  $pdata['hkill'] = $hk['killnum'];
442  $pdata['hkp'] = $hk['name'];
443  $pdata['wmode'] = $winmode;
444  $pdata['vnum'] = $validnum;
445  $pdata['gtime'] = $time - $starttime;
446  $pdata['gstime'] = $starttime;
447  $pdata['getime'] = $time;
448  $pdata['hdmg'] = $hdamage;
449  $pdata['hdp'] = $hplayer;
450  $db->query("INSERT INTO {$tablepre}winners (gid,name,pass,type,endtime,gd,sNo,icon,club,hp,mhp,sp,msp,att,def,pls,lvl,`exp`,money,bid,inf,rage,pose,tactic,killnum,killnum2,state,wp,wk,wg,wc,wd,wf,teamID,teamPass,wep,wepk,wepe,weps,arb,arbk,arbe,arbs,arh,arhk,arhe,arhs,ara,arak,arae,aras,arf,arfk,arfe,arfs,art,artk,arte,arts,itm0,itmk0,itme0,itms0,itm1,itmk1,itme1,itms1,itm2,itmk2,itme2,itms2,itm3,itmk3,itme3,itms3,itm4,itmk4,itme4,itms4,itm5,itmk5,itme5,itms5,itm6,itmk6,itme6,itms6,motto,wmode,vnum,gtime,gstime,getime,hdmg,hdp,hkill,hkp,wepsk,arbsk,arhsk,arask,arfsk,artsk,itmsk0,itmsk1,itmsk2,itmsk3,itmsk4,itmsk5,itmsk6) VALUES ('".$gamenum."','".$pdata['name']."','".$pdata['pass']."','".$pdata['type']."','".$pdata['endtime']."','".$pdata['gd']."','".$pdata['sNo']."','".$pdata['icon']."','".$pdata['club']."','".$pdata['hp']."','".$pdata['mhp']."','".$pdata['sp']."','".$pdata['msp']."','".$pdata['att']."','".$pdata['def']."','".$pdata['pls']."','".$pdata['lvl']."','".$pdata['exp']."','".$pdata['money']."','".$pdata['bid']."','".$pdata['inf']."','".$pdata['rage']."','".$pdata['pose']."','".$pdata['tactic']."','".$pdata['killnum']."','".$pdata['killnum2']."','".$pdata['state']."','".$pdata['wp']."','".$pdata['wk']."','".$pdata['wg']."','".$pdata['wc']."','".$pdata['wd']."','".$pdata['wf']."','".$pdata['teamID']."','".$pdata['teamPass']."','".$pdata['wep']."','".$pdata['wepk']."','".$pdata['wepe']."','".$pdata['weps']."','".$pdata['arb']."','".$pdata['arbk']."','".$pdata['arbe']."','".$pdata['arbs']."','".$pdata['arh']."','".$pdata['arhk']."','".$pdata['arhe']."','".$pdata['arhs']."','".$pdata['ara']."','".$pdata['arak']."','".$pdata['arae']."','".$pdata['aras']."','".$pdata['arf']."','".$pdata['arfk']."','".$pdata['arfe']."','".$pdata['arfs']."','".$pdata['art']."','".$pdata['artk']."','".$pdata['arte']."','".$pdata['arts']."','".$pdata['itm0']."','".$pdata['itmk0']."','".$pdata['itme0']."','".$pdata['itms0']."','".$pdata['itm1']."','".$pdata['itmk1']."','".$pdata['itme1']."','".$pdata['itms1']."','".$pdata['itm2']."','".$pdata['itmk2']."','".$pdata['itme2']."','".$pdata['itms2']."','".$pdata['itm3']."','".$pdata['itmk3']."','".$pdata['itme3']."','".$pdata['itms3']."','".$pdata['itm4']."','".$pdata['itmk4']."','".$pdata['itme4']."','".$pdata['itms4']."','".$pdata['itm5']."','".$pdata['itmk5']."','".$pdata['itme5']."','".$pdata['itms5']."','".$pdata['itm6']."','".$pdata['itmk6']."','".$pdata['itme6']."','".$pdata['itms6']."','".$pdata['motto']."','".$pdata['wmode']."','".$pdata['vnum']."','".$pdata['gtime']."','".$pdata['gstime']."','".$pdata['getime']."','".$pdata['hdmg']."','".$pdata['hdp']."','".$pdata['hkill']."','".$pdata['hkp']."','".$pdata['wepsk']."','".$pdata['arbsk']."','".$pdata['arhsk']."','".$pdata['arask']."','".$pdata['arfsk']."','".$pdata['artsk']."','".$pdata['itmsk0']."','".$pdata['itmsk1']."','".$pdata['itmsk2']."','".$pdata['itmsk3']."','".$pdata['itmsk4']."','".$pdata['itmsk5']."','".$pdata['itmsk6']."')");
451  }
452 
453  //检查成就
454  include_once GAME_ROOT.'./include/game/achievement.func.php';
455  check_end_achievement($winner,$winmode);
456 
457 
458  rs_sttime();//重置游戏开始时间和当前游戏状态
459  $gamestate = 0;
460  save_gameinfo();
461  //echo '**游戏结束**';
462  //$gamestate = 0;
463  //addnews($time, "end$winmode" , $winner);
464  addnews($time, "end$winmode",$winner);
465  //addnews($time, 'gameover',$gamenum);
466  addnews($time, 'gameover' ,$gamenum);
467  systemputchat($time,'gameover');
468  include_once './include/news.func.php';
469  $newsinfo = nparse_news(0,65535);
470  writeover(GAME_ROOT."./gamedata/bak/{$gamenum}_newsinfo.html",$newsinfo,'wb+');
471  //writeover(GAME_ROOT."./gamedata/bak/{$gamenum}_newsinfo.php",readover(GAME_ROOT.'./gamedata/newsinfo.php'),'wb+');
472  //rs_sttime();
473  //save_gameinfo();
474  set_credits();
475  return;
476 }
477 
478 function movehtm($atime = 0) {
480 
481  $movehtm = GAME_ROOT.TPLDIR.'/move.htm';
482  $movedata = '<option value="main">■ 移动 ■<br />';
483 
484  foreach($plsinfo as $key => $value) {
485  if(array_search($key,$arealist) > $areanum || $hack){
486  $movedata .= "<option value=\"$key\"><!--{if \$pls == $key}--><--现在位置--><!--{else}-->$value($xyinfo[$key])<!--{/if}--><br />";
487  }
488  }
489  writeover($movehtm,$movedata);
490 
491  $areahtm = GAME_ROOT.TPLDIR.'/areainfo.htm';
492  $areadata = '<span class="evergreen"><b>现在的禁区是:</b></span>';
493  for($i=0;$i<=$areanum;$i++){
494  $areadata .= '&nbsp;'.$plsinfo[$arealist[$i]];
495  }
496  $areadata .= '<br><span class="evergreen"><b>下回的禁区是:</b></span>';
497 
498  if(!$atime){
499  global $areatime;
500  $atime = $areatime;
501  }
502  if($areanum < count($plsinfo)) {
503  $at= getdate($atime);
504  $nexthour = $at['hours'];$nextmin = $at['minutes'];
505  while($nextmin >= 60){
506  $nexthour +=1;$nextmin -= 60;
507  }
508  if($nexthour >= 24){$nexthour-=24;}
509  $areadata .= "<b>{$nexthour}时{$nextmin}分:</b> ";
510  for($i=1;$i<=$areaadd;$i++) {
511  $areadata .= '&nbsp;'.$plsinfo[$arealist[$areanum+$i]].'&nbsp;';
512  }
513  }
514  if($areanum+$areaadd < count($plsinfo)) {
515  $at2= getdate($atime + $areahour*60);
516  $nexthour2 = $at2['hours'];$nextmin2 = $at2['minutes'];
517  while($nextmin2 >= 60){
518  $nexthour2 +=1;$nextmin2 -= 60;
519  }
520  if($nexthour2 >= 24){$nexthour2-=24;}
521  $areadata .= ";<b>{$nexthour2}时{$nextmin2}分:</b> ";
522  for($i=1;$i<=$areaadd;$i++) {
523  $areadata .= '&nbsp;'.$plsinfo[$arealist[$areanum+$areaadd+$i]].'&nbsp;';
524  }
525  }
526  if($areanum+$areaadd*2 < count($plsinfo)) {
527  $at3= getdate($atime + $areahour*120);
528  $nexthour3 = $at3['hours'];$nextmin3 = $at3['minutes'];
529  while($nextmin3 >= 60){
530  $nexthour3 +=1;$nextmin3 -= 60;
531  }
532  if($nexthour3 >= 24){$nexthour3-=24;}
533  $areadata .= ";<b>{$nexthour3}时{$nextmin3}分:</b> ";
534  for($i=1;$i<=$areaadd;$i++) {
535  $areadata .= '&nbsp;'.$plsinfo[$arealist[$areanum+$areaadd*2+$i]].'&nbsp;';
536  }
537  }
538  writeover($areahtm,$areadata);
539  return;
540 }
541 
542 function addnpc($type,$sub,$num,$time = 0) {
544  $time = $time == 0 ? $now : $time;
545  $plsnum = sizeof($plsinfo);
546  if(empty($anpcinfo) || empty($npcinit)){
547  include_once config('addnpc',$gamecfg);
548  }
549  $npc=array_merge($npcinit,$anpcinfo[$type]);
550  //$npcwordlist = Array();
551  if(!$npc){
552  //echo 'no npc.';
553  return;
554  } else {
555  for($i=0;$i< $num;$i++){
556  $npc = array_merge($npc,$npc['sub'][$sub]);
557  $npc['type'] = $type;
558  $npc['endtime'] = $time;
559  $npc['exp'] = round(($npc['lvl']*2+1)*$GLOBALS['baseexp']);
560  $npc['sNo'] = $i;
561  $npc['hp'] = $npc['mhp'];
562  $npc['sp'] = $npc['msp'];
563  if(!isset($npc['state'])){$npc['state'] = 0;}
564  foreach(Array('p','k','g','c','d','f') as $val){
565  if(!$npc['w'.$val]){
566  $npc['w'.$val] = $npc['skill'];
567  }
568  }
569  //$npc['wp'] = $npc['wk'] = $npc['wg'] = $npc['wc'] = $npc['wd'] = $npc['wf'] = $npc['skill'];
570  if($npc['gd'] == 'r'){$npc['gd'] = rand(0,1) ? 'm':'f';}
571  if($npc['pls'] == 99){
572  $areaarr = array_slice($arealist,$areanum+1);
573  if(empty($areaarr)){
574  $npc['pls'] = 0;
575  }else{
576  shuffle($areaarr);
577  $npc['pls'] = $areaarr[0];
578  }
579  //$npc['pls'] = rand(1,$plsnum-1);
580  }
581  $db->query("INSERT INTO {$tablepre}players (name,pass,type,endtime,gd,sNo,icon,club,hp,mhp,sp,msp,att,def,pls,lvl,`exp`,money,bid,inf,rage,pose,tactic,killnum,state,wp,wk,wg,wc,wd,wf,teamID,teamPass,wep,wepk,wepe,weps,arb,arbk,arbe,arbs,arh,arhk,arhe,arhs,ara,arak,arae,aras,arf,arfk,arfe,arfs,art,artk,arte,arts,itm0,itmk0,itme0,itms0,itm1,itmk1,itme1,itms1,itm2,itmk2,itme2,itms2,itm3,itmk3,itme3,itms3,itm4,itmk4,itme4,itms4,itm5,itmk5,itme5,itms5,itm6,itmk6,itme6,itms6,wepsk,arbsk,arhsk,arask,arfsk,artsk,itmsk0,itmsk1,itmsk2,itmsk3,itmsk4,itmsk5,itmsk6) VALUES ('".$npc['name']."','".$npc['pass']."','".$npc['type']."','".$npc['endtime']."','".$npc['gd']."','".$npc['sNo']."','".$npc['icon']."','".$npc['club']."','".$npc['hp']."','".$npc['mhp']."','".$npc['sp']."','".$npc['msp']."','".$npc['att']."','".$npc['def']."','".$npc['pls']."','".$npc['lvl']."','".$npc['exp']."','".$npc['money']."','".$npc['bid']."','".$npc['inf']."','".$npc['rage']."','".$npc['pose']."','".$npc['tactic']."','".$npc['killnum']."','".$npc['state']."','".$npc['wp']."','".$npc['wk']."','".$npc['wg']."','".$npc['wc']."','".$npc['wd']."','".$npc['wf']."','".$npc['teamID']."','".$npc['teamPass']."','".$npc['wep']."','".$npc['wepk']."','".$npc['wepe']."','".$npc['weps']."','".$npc['arb']."','".$npc['arbk']."','".$npc['arbe']."','".$npc['arbs']."','".$npc['arh']."','".$npc['arhk']."','".$npc['arhe']."','".$npc['arhs']."','".$npc['ara']."','".$npc['arak']."','".$npc['arae']."','".$npc['aras']."','".$npc['arf']."','".$npc['arfk']."','".$npc['arfe']."','".$npc['arfs']."','".$npc['art']."','".$npc['artk']."','".$npc['arte']."','".$npc['arts']."','".$npc['itm0']."','".$npc['itmk0']."','".$npc['itme0']."','".$npc['itms0']."','".$npc['itm1']."','".$npc['itmk1']."','".$npc['itme1']."','".$npc['itms1']."','".$npc['itm2']."','".$npc['itmk2']."','".$npc['itme2']."','".$npc['itms2']."','".$npc['itm3']."','".$npc['itmk3']."','".$npc['itme3']."','".$npc['itms3']."','".$npc['itm4']."','".$npc['itmk4']."','".$npc['itme4']."','".$npc['itms4']."','".$npc['itm5']."','".$npc['itmk5']."','".$npc['itme5']."','".$npc['itms5']."','".$npc['itm6']."','".$npc['itmk6']."','".$npc['itme6']."','".$npc['itms6']."','".$npc['wepsk']."','".$npc['arbsk']."','".$npc['arhsk']."','".$npc['arask']."','".$npc['arfsk']."','".$npc['artsk']."','".$npc['itmsk0']."','".$npc['itmsk1']."','".$npc['itmsk2']."','".$npc['itmsk3']."','".$npc['itmsk4']."','".$npc['itmsk5']."','".$npc['itmsk6']."')");
582  $newsname=$typeinfo[$type].' '.$npc['name'];
583  //$npcwordlist[] = $typeinfo[$type].' '.$npc['name'];
584  addnews($now, 'addnpc', $newsname);
585  }
586  }
587  if($num > $npc['num']){
588  //if($num > 1){
589  $newsname=$typeinfo[$type];
590  addnews($time, 'addnpcs', $newsname,$i);
591  }else{
592 // for($i=0;$i< $num;$i++){
593 // addnews($time, 'addnpc', $npcwordlist[$i]);
594 // }
595  //$newsname=$typeinfo[$type].' '.$npc['name'];
596  //addnews($time, 'addnpc', $newsname);
597  }
598 
599  return $sub;
600 }
601 
602 function evonpc($type,$name){
604  if(!$type || !$name){return false;}
605  if(empty($enpcinfo)){
606  include_once config('evonpc',$gamecfg);
607  }
608  if(!isset($enpcinfo[$type])){return false;}
609  $result = $db->query("SELECT * FROM {$tablepre}players WHERE type = '$type' AND name = '$name'");
610  $num = $db->num_rows($result);
611  if(!$num){return false;}
612  if(!isset($enpcinfo[$type][$name])){return false;}
613  $npc=$enpcinfo[$type][$name];
614  $npc['hp'] = $npc['mhp'];
615  $npc['sp'] = $npc['msp'];
616  $npc['exp'] = round(($npc['lvl']*2+1)*$GLOBALS['baseexp']);
617  if(!isset($npc['state'])){$npc['state'] = 0;}
618  $npc['wp'] = $npc['wk'] = $npc['wg'] = $npc['wc'] = $npc['wd'] = $npc['wf'] = $npc['skill'];
619  unset($npc['skill']);
620  $qry = '';
621  foreach($npc as $key => $val){
622  $qry .= "$key = '{$val}',";
623  }
624  if(!empty($qry)){
625  $qry = substr($qry,0,-1);
626  $db->query( "UPDATE {$tablepre}players SET $qry WHERE type = '$type' AND name = '$name'" );
627  }
628 
629  return $npc;
630 }
631 
632 function antiAFK($timelimit = 0){
634  if(empty($timelimit)){
635  $timelimit = $antiAFKertime;
636  }
637  $timelimit *= 60;
638  $deadline=$now-$timelimit;
639  $result = $db->query("SELECT * FROM {$tablepre}players WHERE type=0 AND endtime < '$deadline' AND hp>'0' AND state<'10'");
640  while($al = $db->fetch_array($result)) {
641  $afkerlist[$al['pid']]=Array('name' => $al['name'] ,'pls' => $al['pls']);
642  }
643 
644  if(empty($afkerlist)){return;}
645  foreach($afkerlist as $kid => $kcontent){
646  $db->query("UPDATE {$tablepre}players SET hp='0',state='32' WHERE pid='$kid' AND type='0' AND hp>'0' AND state<'10'");
647  if($db->affected_rows()){
648  addnews($now,'death32',$kcontent['name'],'',$kcontent['pls']);
649  $alivenum--;
650  $deathnum++;
651 
652 
653  }
654  }
655  save_gameinfo();
656  return;
657 }
658 
659 function set_credits(){
661  $clist = $creditlist = $updatelist = Array();
662  $result = $db->query("SELECT * FROM {$tablepre}users RIGHT JOIN {$tablepre}players ON {$tablepre}players.name={$tablepre}users.username WHERE {$tablepre}players.type='0'");
663  while($data = $db->fetch_array($result)){
664  $clist[$data['name']] = $data;
665  }
666  foreach($clist as $key => $val){
667  $credits = get_credit_up($val,$winner,$winmode) + $val['credits'];
668  $credits2 = $val['credits2'] + 10;
669  $validgames = $val['validgames'] + 1;
670  $wingames = $key == $winner ? $val['wingames'] + 1 : $val['wingames'];
671  $updatelist[$key] = Array(
672  'username' => $key,
673  'credits' => $credits,
674  'credits2' => $credits2,
675  'wingames' => $wingames,
676  'validgames' => $validgames,
677  );
678  }
679  $db->multi_update("{$tablepre}users", $updatelist,'username');
680  if($gamblingon){//赌注系统开启
681  $updatelist2 = get_gambling_result($clist,$winner,$winmode);
682  if($updatelist2){//必须分两次,因为涉及字段不同
683  $db->multi_update("{$tablepre}users", $updatelist2,'username');
684  }
685  }
686  //var_dump($updatelist);
687 
688 
689  //$db->multi_update("{$tablepre}users", $updatelist2, 'username');
690  //$db->multi_update("{$tablepre}users", $updatelist2, 'username');
691 // $result = $db->query("SELECT * FROM {$tablepre}players WHERE type='0'");
692 // $list = $creditlist = $updatelist = Array();
693 // while($data = $db->fetch_array($result)){
694 // $list[$data['name']]['players'] = $data;
695 // }
696 // $result = $db->query("SELECT * FROM {$tablepre}users WHERE lastgame='$gamenum'");
697 // while($data = $db->fetch_array($result)){
698 // $list[$data['username']]['users'] = $data;
699 // }
700 // foreach($list as $key => $val){
701 // if(isset($val['players']) && isset($val['users'])){
702 // $credits = get_credit_up($val['players'],$winner,$winmode) + $val['users']['credits'];
703 // $validgames = $val['users']['validgames'] + 1;
704 // $wingames = $key == $winner ? $val['users']['wingames'] + 1 : $val['users']['wingames'];
705 // $updatelist[] = Array('username' => $key, 'credits' => $credits, 'wingames' => $wingames, 'validgames' => $validgames);
706 // if(!empty($obtain)){
707 // $udghkey[] = $key;
708 // if($pdata['name'] == $key){
709 // $pdata['gainhonour'] = $obtain;
710 // }else{
711 // $udghlist[] = Array('name' => $key, 'gainhonour' => $obtain);
712 // }
713 // }
714 // }
715 // }
716 // $db->multi_update("{$tablepre}users", $updatelist, 'username');
717 // if(!empty($udghkey)){
718 // $udghkey = implode(',',$udghkey);
719 // $db->multi_update("{$tablepre}players", $upghlist, 'name', "name IN ($udghkey)");
720 // }
721  //更新成就
722  //$result = $db->query("SELECT * FROM {$tablepre}players WHERE {$tablepre}players.type='0'");
723  //while($data = $db->fetch_array($result))
724  //{
725  // $dlist[$data['name']] = $data['achievement'];
726  //}
727  //include_once GAME_ROOT.'./include/game/achievement.func.php';
728  //foreach($dlist as $key => $val)
729  //{
730  //$v=$val;
731  //normalize_achievement($v,$c1,$c2);
732  //$res = $db->query("SELECT * FROM {$tablepre}users WHERE username='".$key."'" );
733  //$data=$db->fetch_array($res);
734  //$c1+=$data['credits']; $c2+=$data['credits2'];
735  //$db->query("UPDATE {$tablepre}users SET achievement='$v' WHERE username='".$key."'" );
736  //$db->query("UPDATE {$tablepre}users SET credits='$c1' WHERE username='".$key."'" );
737  //$db->query("UPDATE {$tablepre}users SET credits2='$c2' WHERE username='".$key."'" );
738  //}
739  return;
740 }
741 
742 function get_credit_up($data,$winner = '',$winmode = 0){
743  if($data['name'] == $winner){//获胜
744  if($winmode == 2){$up = 200;}//最后幸存+200
745  elseif($winmode == 3){$up = 500;}//解禁+500
746  elseif($winmode == 5){$up = 100;}//核爆+100
747  elseif($winmode == 7){$up = 10000;}//幻境解离+10000
748  else{$up = 50;}//其他胜利方式+50(暂时没有这种胜利方式)
749  }
750  elseif($data['hp']>0){$up = 25;}//存活但不是获胜者+25
751  else{$up = 10;}//死亡+5
752  if($data['killnum']){
753  $up += $data['killnum'] * 2;//杀一玩家/NPC加2
754  }
755  if($data['lvl']){
756  $up += round($data['lvl'] /2);//等级每2级加1
757  }
758 // $skill = $data['wp'] + $data['wk'] + $data['wg'] + $data['wc'] + $data['wd'] + $data['wf'];
759 // $maxskill = ;
760  $skill = array ($data['wp'] , $data['wk'] , $data['wg'] , $data['wc'] , $data['wd'] , $data['wf']);
761  rsort ( $skill );
762  $maxskill = $skill[0];
763  $up += round($maxskill / 25);//熟练度最高的系每25点熟练加1
764  $up += round($data['money']/500);//每500点金钱加1
765 // foreach(Array('wp','wk','wg','wc','wd','wf') as $val){
766 // $skill = $data[$val];
767 // $up += round($skill / 100);//每100点熟练加1
768 // }
769  return $up;
770 }
771 
772 function get_gambling_result($clist, $winner='',$winmode=''){
774  $gblog = '';
775  $gbfile = GAME_ROOT.TPLDIR.'/lastgb.htm';
776  if(!in_array($winmode,Array(2,3,5,7))){//无人获胜,全部赌注被冴冴吃掉
777  $gblog .= '无人获胜,全部切糕被冴冴吃掉!';
778  $updatelist = false;
779  }else{
780  $result = $db->query("SELECT * FROM {$tablepre}gambling WHERE 1");
781  if(!$db->num_rows($result)){
782  $gblog .= '无人下注!';
783  $updatelist = false;
784  }else{
785  $bwlist = $updatelist = Array();
786  $bpool = $bwsum = $bwsum2 = 0;
787  while($bdata = $db->fetch_array($result)){
788  if($bdata['bname'] == $winner){
789  $bwlist[$bdata['uname']] = $bdata;//此处只记录赌赢者的资料
790  $bwsum += $bdata['wager'];//赌赢者本金数目
791  $bwsum2 += $bdata['wager'] * $bdata['odds'];//赌赢者总系数
792  }
793  $bpool += $bdata['wager'];//奖池记录所有玩家的赌注总额
794  }
795 
796  //(所有入场玩家战斗力总和÷1000)×(每名玩家APM达到则1.0—1.1之间的随机数)×(连斗时间从10—0.1递减)=每局基础奖金——飞雪大魔王
797 
798  $creditsum = $apmnum = 0;
799  foreach($clist as $cdata){
800  $creditsum += $cdata['credits'];
801  $apm = $cdata['deathtime'] > $cdata['validtime'] ? $cdata['cmdnum'] / ($cdata['deathtime'] - $cdata['validtime']) : $cdata['cmdnum'] / ($now - $cdata['validtime']);
802  if($apm >= 1){$apmnum ++;}
803  }
804 
805  $avrcredit = $creditsum / $validnum;//平均战斗力
806  if($avrcredit > 10000){$creditodds = 1.25;}//平均战斗力超过10000则系数为1.25,否则系数减少,平均战斗力为4000时为1.1;
807  else{$creditodds = round((1 + $avrcredit / 40000)*1000)/1000;}
808  $apmodds = round(pow(1.02,$apmnum)*1000)/1000;//每有一名玩家达到60APM则乘以1.02
809  $timeodds = 1.2 - $areanum/$areaadd * 0.1;//游戏结束时为0禁则系数为1.2,否则每禁系数减少0.1,不会低于0.8
810  if($timeodds < 0.8){$timeodds = 0.8;}
811 
812 
813 
814 // $result3 = $db->query("SELECT cmdnum FROM {$tablepre}players WHERE type=0 ORDER BY cmdnum DESC LIMIT 10");
815 // while($cdata = $db->fetch_array($result3)){
816 // $cmdsum += $cdata['cmdnum'];
817 // }
818 // if($cmdsum <= 10000){$cmdodds = 1;}
819 // elseif($cmdsum >= 30000){$cmdodds = 1.25;}
820 // else{$cmdodds = 1+($cmdsum-10000)*0.0000125;}
821 
822  //$dmgprizeodds = 100 + round(pow($hdamage,0.5)) * 2;
823  $obpool = $bpool;
824  $bpool = round($bpool * $creditodds * $apmodds * $timeodds);
825  $gblog = '奖池:'.$obpool.' * '.$creditodds.' * '.$apmodds.' * '.$timeodds.' = '.$bpool.'<br>';
826  if($bwlist){
827  $bnlist = array_keys($bwlist);
828  $bnstr = "('".implode("','",$bnlist)."')";
829  $result2 = $db->query("SELECT uid,username,credits2 FROM {$tablepre}users WHERE username IN $bnstr");
830  while($udata = $db->fetch_array($result2)){
831  $bwlist[$udata['username']]['credits2'] = $udata['credits2'];
832  }
833  if($bwsum >= $bpool){//奖池与本金相等,则大家拿回本金
834  $gblog .= '奖池少于本金,系统资助判断正确者取回本金。';
835  foreach($bwlist as $key => $val){
836  $bwlist[$val['uname']]['crup'] = 0;
837  $bwlist[$val['uname']]['crrst'] = $val['wager'];
838  $credits2 = $val['credits2'] + $val['wager'];
839  $updatelist[$key] = Array('username' => $key, 'credits2' => $credits2);
840  }
841  }else{//奖池大于本金,则大家拿回本金基础上,获胜者分得10%,其他人分掉额外的90%;
842  $ext = $bpool - $bwsum;
843  foreach($bwlist as $key => $val){
844  $crup = ceil($ext * 0.9 * $val['wager'] * $val['odds'] / $bwsum2);
845  $bwlist[$val['uname']]['crup'] = $crup;
846  $bwlist[$val['uname']]['crrst'] = $val['wager'] + $crup;
847  $credits2 = $val['credits2'] + $val['wager'] + $crup;
848  $updatelist[$key] = Array('username' => $key, 'credits2' => $credits2);
849  }
850  $wcrup = ceil($ext * 0.1);
851  $bwlist[] = Array('uname' => '获胜者', 'wager' => '', 'bname' => '', 'odds' => '', 'crup' => $wcrup, 'crrst' => $wcrup);
852  if(is_array($updatelist) && isset($updatelist[$winner]['credits2'])){
853  $updatelist[$winner]['credits2'] += $wcrup;
854  }else{
855  $result3 = $db->query("SELECT uid,username,credits2 FROM {$tablepre}users WHERE username='$winner'");
856  $wdata = $db->fetch_array($result3);
857  $updatelist[$winner] = Array('username' => $winner, 'credits2' => $wdata['credits2'] + $wcrup);
858  }
859  }
860 // foreach($bwlist as $key => $val){//不保证本金,只瓜分奖池90%的奖励
861 // $crup = $val['wager'] + round($bpool * 0.9 * $val['wager'] * $val['odds'] / $bwsum2);
862 // $bwlist[$val['uname']]['crup'] = $crup;
863 // $credits2 = $val['credits2'] + $crup;
864 // $updatelist[$key] = Array('username' => $key, 'credits2' => $credits2);
865 // }
866 
867  }else{
868  $gblog .= '无判断正确者,奖池的20%归获胜者。';
869  $wcrup = ceil($bpool * 0.2);
870  $bwlist[] = Array('uname' => '获胜者', 'wager' => '', 'bname' => '', 'odds' => '', 'crup' => $wcrup, 'crrst' => $wcrup);
871  if(is_array($updatelist) && isset($updatelist[$winner]['credits2'])){
872  $updatelist[$winner]['credits2'] += $wcrup;
873  }else{
874  $result3 = $db->query("SELECT uid,username,credits2 FROM {$tablepre}users WHERE username='$winner'");
875  $wdata = $db->fetch_array($result3);
876  $updatelist[$winner] = Array('username' => $winner, 'credits2' => $wdata['credits2'] + $wcrup);
877  }
878  }
879  }
880  }
881  ob_start();
882  include template('gbresult');
883  $gbresult = ob_get_contents();
884  ob_end_clean();
885  writeover($gbfile,$gbresult);
886  return $updatelist;
887 }
888 ?>
duel($time=0, $keyitm= '')
$hplayer
Definition: combatinfo.php:6
$tablepre
Definition: config.inc.php:58
$anpcinfo
Definition: addnpc_1.php:24
$credits
Definition: login.php:116
systemputchat($time, $type, $msg= '')
$noisetime
Definition: combatinfo.php:7
$noiseid2
Definition: combatinfo.php:10
$sqldir
Definition: mapitemmng.php:9
writeover($filename, $data, $method="rb+", $iflock=1, $check=1, $chmod=1)
$gamecfg
Definition: system.php:22
$areanum
Definition: gameinfo.php:9
if(!defined('IN_GAME')) $hdamage
Definition: combatinfo.php:5
$validnum
Definition: gameinfo.php:13
if(!defined('IN_GAME')) nparse_news($start=0, $range=0)
Definition: news.func.php:8
$noiseid
Definition: combatinfo.php:9
$startmode
Definition: system.php:16
$arealimit
Definition: gamecfg_1.php:11
$winner
Definition: gameinfo.php:7
$dir
Definition: chmod.php:2
$plsinfo
$xyinfo
$noisepls
Definition: combatinfo.php:8
$npcinit
Definition: addnpc_1.php:3
areawarn()
$areaesc
Definition: gamecfg_1.php:13
addnpc($type, $sub, $num, $time=0)
$winmode
Definition: gameinfo.php:6
$i
Definition: botservice.php:267
$endtime
Definition: botservice.php:321
gameover($time=0, $mode= '', $winname= '')
$noisemode
Definition: combatinfo.php:11
addnews($t=0, $n= '', $a='', $b='', $c= '', $d= '', $e= '')
$antiAFKertime
Definition: gamecfg_1.php:24
set_credits()
movehtm($atime=0)
$db
Definition: clear.php:32
check_end_achievement($w, $m)
$deathnum
Definition: gameinfo.php:15
【生存者数:<?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
$log
Definition: botservice.php:34
const GAME_ROOT
Definition: clear.php:6
add_once_area($atime)
$weather
Definition: gameinfo.php:11
if(!$db->num_rows($result)) $pdata
Definition: botservice.php:18
$alivenum
Definition: gameinfo.php:14
$now
Definition: clear.php:23
if(!defined('IN_GAME')) rs_game($mode=0)
Definition: system.func.php:7
rs_sttime()
openfile($filename)
antiAFK($timelimit=0)
$hack
Definition: gameinfo.php:12
$arealist
Definition: gameinfo.php:8
$checkstr
Definition: system.php:6
$gamestate
Definition: gameinfo.php:4
config($file= '', $cfg=1)
$starthour
Definition: system.php:18
$startmin
Definition: system.php:20
$deathlimit
Definition: gamecfg_1.php:48
$gamenum
Definition: gameinfo.php:3
evonpc($type, $name)
gexit($message= '', $file= '', $line=0)
Definition: global.func.php:30
$areahour
Definition: gamecfg_1.php:5
$typeinfo
Definition: resources_1.php:58
$npcinfo
Definition: npc_1.php:24
storyputchat($time, $type)
if(!$db->num_rows($result)) $udata
Definition: admin.php:27
$areatime
Definition: gameinfo.php:10
$starttime
Definition: gameinfo.php:5
save_combatinfo()
$areaarr
$enpcinfo
Definition: evonpc_1.php:3
if(!$cuser||!$cpass) $result
Definition: admin.php:25
$wingames
Definition: valid.php:15
$areaadd
Definition: gamecfg_1.php:7
save_gameinfo()
get_gambling_result($clist, $winner='', $winmode='')
$gamblingon
Definition: gamecfg_1.php:41
get_credit_up($data, $winner= '', $winmode=0)