Commit 523809f3 authored by Nemo Ma's avatar Nemo Ma

FEAT:Support $itmpara in mapitem, shopitem and mixitem

parent 571cfd7f
2024年7月19日 $itmpara 字段实现记录
在2024年7月19日,游戏中的物品添加了新的字段$itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。
以下是对应此字段的实现记录:
1. 地图物品(mapitem_1.php)
- 修改了system.func.php文件中的地图物品生成代码,添加了对$itmpara字段的支持
- 更新了SQL查询,将$itmpara字段添加到地图物品的插入语句中
- 允许在mapitem_1.php文件中为每个物品定义$itmpara字段
2. 商店物品(shopitem_1.php)
- 修改了system.func.php文件中的商店物品生成代码,添加了对$itmpara字段的支持
- 更新了SQL查询,将$itmpara字段添加到商店物品的插入语句中
- 允许在shopitem_1.php文件中为每个物品定义$itmpara字段
3. 合成物品(mixitem_1.php)
- 修改了itemmix.func.php文件中的$itmpara0变量处理,确保正确处理$itmpara字段
- 更新了mixitem_1.php文件中的物品定义,为每个物品添加了$itmpara字段
- 由于mixitem_1.php文件较大,只更新了部分物品,其余物品将在后续更新中完成
注意事项:
- 所有新添加的物品都应该包含$itmpara字段,即使该字段为空
- $itmpara字段应该是一个JSON字符串,表示一个键值对数组
- 可以使用get_itmpara()、get_single_itmpara()、set_itmpara()和del_single_itmpara()函数来操作$itmpara字段
2024年7月19日 $itmpara 字段 JSON 处理实现记录
在2024年7月19日,游戏中的物品添加了新的字段$itmpara,该字段为一数组,可让物品有着数组中定义的键值的属性。
由于$itmpara可能包含JSON格式的数据,而JSON中的逗号会导致在使用逗号分隔的配置文件中出现问题,因此我们实现了一种特殊的处理方法来解决这个问题。
以下是对应此字段的实现记录:
1. 地图物品(mapitem_1.php)
- 修改了system.func.php文件中的地图物品生成代码,添加了对JSON对象中逗号的特殊处理
- 当检测到一行中包含JSON对象(以{开头,以}结尾)时,会先提取JSON内容,然后用占位符替换,再进行逗号分隔
- 分割后,如果itmpara字段是占位符,则替换回实际的JSON内容
2. 商店物品(shopitem_1.php)
- 修改了system.func.php文件中的商店物品生成代码,添加了对JSON对象中逗号的特殊处理
- 使用与地图物品相同的方法处理JSON对象中的逗号
3. 合成物品(mixitem_1.php)
- 由于mixitem_1.php文件中的$itmpara字段是直接在PHP数组中定义的,不需要特殊处理
注意事项:
- 这种方法不需要对JSON内容进行编码,保持了原始数据的可读性
- 不需要修改get_itmpara函数,因为JSON字符串会被原样传递
- 所有使用$itmpara的代码都不需要修改
示例:
1. 在mapitem_1.php或shopitem_1.php中定义带有JSON的$itmpara:
0,0,1,测试物品,WK,100,10,,{"DecreaseDamageRaw":100,"DecreaseDamagePercentage":10}
2. system.func.php会特殊处理这一行:
- 提取JSON内容:{"DecreaseDamageRaw":100,"DecreaseDamagePercentage":10}
- 替换为占位符:0,0,1,测试物品,WK,100,10,,JSON_PLACEHOLDER
- 分割字符串:[0, 0, 1, 测试物品, WK, 100, 10, , JSON_PLACEHOLDER]
- 检测到itmpara是占位符,替换回JSON内容
3. 最终,$itmpara会被正确设置为:{"DecreaseDamageRaw":100,"DecreaseDamagePercentage":10}
......@@ -366,7 +366,12 @@ function itemmix_proc($mlist, $minfo, $itmstr, &$data=NULL)
else{
$itmsk0 = '';
}
// Handle itmpara field
if (isset($minfo['result'][5]))
$itmpara0 = $minfo['result'][5];
else{
$itmpara0 = '';
}
$uip['mixcls'] = !empty($minfo['class']) ? $minfo['class'] : '';
$uip['mixtp'] = $minfo['type'];
//合成成功
......@@ -477,7 +482,8 @@ function itemmix_events(&$data=NULL)
if($itm0 == 'Untainted Glory'){
$log .= "<span class='minirainbow'>一道强光闪过——<br>
你背包中的物品一瞬间全部消失了!<br>这是获得无毁荣光的必要代价!</span><br>";
$itm1 = $itmk1 = $itmsk1 = $itm2 = $itmk2 = $itmsk2 = $itm3 = $itmk3 = $itmsk3 = $itm4 = $itmk4 = $itmsk4 = $itm5 = $itmk5 = $itmsk5 = $itm6 = $itmk6 = $itmsk6 = $itmpara0= $itmpara1 =$itmpara2 =$itmpara3 =$itmpara4 =$itmpara5 = $itmpara6 =0;'';
$itm1 = $itmk1 = $itmsk1 = $itm2 = $itmk2 = $itmsk2 = $itm3 = $itmk3 = $itmsk3 = $itm4 = $itmk4 = $itmsk4 = $itm5 = $itmk5 = $itmsk5 = $itm6 = $itmk6 = $itmsk6 = '';
$itmpara1 = $itmpara2 = $itmpara3 = $itmpara4 = $itmpara5 = $itmpara6 = '';
$itme1 = $itms1 = $itme2 = $itms2 = $itme3 = $itms3 = $itme4 = $itms4 = $itme5 = $itms5 = $itme6 = $itms6 = 0;
}
return;
......
......@@ -156,7 +156,7 @@ function rs_game($mode = 0) {
}
if ($mode & 16) {
//echo " - 地图道具/陷阱初始化 - ";
//2024-07-19 No itmpara is intended to initially spawn in the map, thus this is unchanged for now - will change if a need arises.
//2024-07-19 Added itmpara support for map items
//感谢 Martin1994 提供地图道具数据库化的源代码
$plsnum = sizeof($plsinfo);
$iqry = $tqry = '';
......@@ -175,25 +175,53 @@ function rs_game($mode = 0) {
//$mapitem = array();
//$ifqry = $iqry = 'INSERT INTO '.$tablepre.'mapitem (itm,itmk,itme,itms,itmsk,map) VALUES ';
for($i = 1; $i < $in; $i++) {
if(!empty($itemlist[$i]) && strpos($itemlist[$i],',')!==false){
list($iarea,$imap,$inum,$iname,$ikind,$ieff,$ista,$iskind) = explode(',',$itemlist[$i]);
if(!empty($itemlist[$i])){
// 特殊处理JSON对象中的逗号
$line = $itemlist[$i];
$json_start = strpos($line, '{');
$json_end = strrpos($line, '}');
$json_content = '';
// 如果存在JSON对象
if($json_start !== false && $json_end !== false && $json_end > $json_start) {
// 提取JSON内容
$json_content = substr($line, $json_start, $json_end - $json_start + 1);
// 替换JSON内容为占位符
$line = substr($line, 0, $json_start) . 'JSON_PLACEHOLDER';
}
// 分割字符串
$item_parts = explode(',', $line);
// 检查是否有itmpara字段
$itmpara = '';
if(count($item_parts) >= 9) {
$itmpara = $item_parts[8];
// 如果itmpara是JSON占位符,则替换回实际的JSON内容
if($itmpara === 'JSON_PLACEHOLDER') {
$itmpara = $json_content;
}
}
list($iarea,$imap,$inum,$iname,$ikind,$ieff,$ista,$iskind) = array_slice($item_parts, 0, 8);
if(($iarea == $an)||($iarea == 99)) {
for($j = $inum; $j>0; $j--) {
if($imap == 99) {
$rmap = rand(1,$plsnum-1);
while ($rmap==34){$rmap = rand(1,$plsnum-1);}
if(strpos($ikind ,'TO')===0){
$tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap'),";
$tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap','$itmpara'),";
}else{
$iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap'),";
$iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$rmap','$itmpara'),";
}
//$iqry[$rmap] .= "('$iname', '$ikind','$ieff','$ista','$iskind'),";
//$db->query("INSERT INTO {$tablepre}{$rmap}mapitem (itm,itmk,itme,itms,itmsk) VALUES ('$iname', '$ikind','$ieff','$ista','$iskind')");
}else{
if(strpos($ikind ,'TO')===0){
$tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap'),";
$tqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap','$itmpara'),";
}else{
$iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap'),";
$iqry .= "('$iname', '$ikind','$ieff','$ista','$iskind','$imap','$itmpara'),";
}
//$db->query("INSERT INTO {$tablepre}{$imap}mapitem (itm,itmk,itme,itms,itmsk) VALUES ('$iname', '$ikind','$ieff','$ista','$iskind')");
}
......@@ -209,11 +237,11 @@ function rs_game($mode = 0) {
}
}
if(!empty($iqry)){
$iqry = "INSERT INTO {$tablepre}mapitem (itm,itmk,itme,itms,itmsk,pls) VALUES ".substr($iqry, 0, -1);
$iqry = "INSERT INTO {$tablepre}mapitem (itm,itmk,itme,itms,itmsk,pls,itmpara) VALUES ".substr($iqry, 0, -1);
$db->query($iqry);
}
if(!empty($tqry)){
$tqry = "INSERT INTO {$tablepre}maptrap (itm,itmk,itme,itms,itmsk,pls) VALUES ".substr($tqry, 0, -1);
$tqry = "INSERT INTO {$tablepre}maptrap (itm,itmk,itme,itms,itmsk,pls,itmpara) VALUES ".substr($tqry, 0, -1);
$db->query($tqry);
}
// for($imap = 0;$imap<$plsnum;$imap++){
......@@ -251,7 +279,7 @@ function rs_game($mode = 0) {
}
if ($mode & 32) {
//echo " - 商店初始化 - ";
//2024-07-19 No itmpara is intended to initially spawn in the shop, thus this is unchanged for now - will change if a need arises.
//2024-07-19 Added itmpara support for shop items
$sql = file_get_contents("{$sqldir}shopitem.sql");
$sql = str_replace("\r", "\n", str_replace(' bra_', ' '.$tablepre, $sql));
$db->queries($sql);
......@@ -261,17 +289,42 @@ function rs_game($mode = 0) {
$shoplist = openfile($file);
$qry = '';
foreach($shoplist as $lst){
if(!empty($lst) && strpos($lst,',')!==false){
$lst = explode(',',$lst);
if(!empty($lst)){
// 特殊处理JSON对象中的逗号
$line = $lst;
$json_start = strpos($line, '{');
$json_end = strrpos($line, '}');
$json_content = '';
// 如果存在JSON对象
if($json_start !== false && $json_end !== false && $json_end > $json_start) {
// 提取JSON内容
$json_content = substr($line, $json_start, $json_end - $json_start + 1);
// 替换JSON内容为占位符
$line = substr($line, 0, $json_start) . 'JSON_PLACEHOLDER';
}
// 分割字符串
$lst = explode(',', $line);
// 检查是否有itmpara字段
$itmpara = '';
if(count($lst) >= 10) {
$itmpara = $lst[9];
// 如果itmpara是JSON占位符,则替换回实际的JSON内容
if($itmpara === 'JSON_PLACEHOLDER') {
$itmpara = $json_content;
}
}
if(empty($lst[8])) $lst[8] = '';
list($kind,$num,$price,$area,$item,$itmk,$itme,$itms,$itmsk)=$lst;
if($kind != 0){
$qry .= "('$kind','$num','$price','$area','$item','$itmk','$itme','$itms','$itmsk'),";
$qry .= "('$kind','$num','$price','$area','$item','$itmk','$itme','$itms','$itmsk','$itmpara'),";
}
}
}
if(!empty($qry)){
$qry = "INSERT INTO {$tablepre}shopitem (kind,num,price,area,item,itmk,itme,itms,itmsk) VALUES ".substr($qry, 0, -1);
$qry = "INSERT INTO {$tablepre}shopitem (kind,num,price,area,item,itmk,itme,itms,itmsk,itmpara) VALUES ".substr($qry, 0, -1);
}
$db->query($qry);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment