Commit 1f79a0dc authored by satsuki8's avatar satsuki8

bugfix; add clubskill '妙手'

parent 1af78b7a
......@@ -27,6 +27,12 @@
"key" => "cstick",
"title" => "抡起尸体!"
);
}
if ($pickpocket_flag) {
$list[] = array(
"key" => "pickpocket",
"title" => "置入物品"
);
}
if ($loot_depot_flag) {
$list[] = array(
......
......@@ -329,7 +329,7 @@ if($hp > 0){
}
$mode = 'command';
}
//码语行人吃饭
//码语行人吃饭
} elseif ($sp_cmd == 'sp_consume_trait') {
$position = 0;
if ($club == 21) {
......@@ -374,10 +374,19 @@ if($hp > 0){
calcskills($skarr);
$p12[1]=1; $p12[2]=2;
$mode='sp_skpts';
//妙手技能
}elseif($sp_cmd == 'sp_pickpocket_selected'){
if (!isset($choice)) {
$mode = 'command';
} else {
$choice = (int)($choice);
include_once GAME_ROOT . './include/game/revclubskills_extra.func.php';
skill_tl_pickpocket_act($choice);
}
$mode = 'command';
}else{
$mode = $sp_cmd;
}
}
} elseif($command == 'team') {
include_once GAME_ROOT.'./include/game/team.func.php';
if($teamcmd == 'teamquit') {
......
......@@ -27,7 +27,7 @@ $club_skillslist = Array
//18 => Array('s_hp','s_ad','f_heal'), #'天赋异禀',
19 => Array('s_hp','s_ad','f_heal','c19_nirvana','c19_reincarn','c19_purity','c19_crystal','c19_redeem','c19_dispel','c19_woesea'), #'晶莹剔透', //晶莹剔透、决死结界合并为晶莹剔透
20 => Array('s_hp','s_ad','f_heal','c20_fertile','c20_windfall','c20_lighting','c20_zombie','c20_sparkle','c20_lotus'), #'元素大师', #商店购买社团卡
21 => Array('s_hp','s_ad','f_heal','c21_stormedge','c21_creation','c21_sacrifice','c21_discovery','c21_blaster'), #'码语行人', #商店购买社团卡
21 => Array('s_hp','s_ad','f_heal','c21_stormedge','c21_creation','c21_discovery','c21_sacrifice','c21_blaster'), #'码语行人', #商店购买社团卡
22 => Array('s_hp','s_ad','f_heal'), #'偶像大师', #暂定名,「除错大师」头衔奖励
98 => Array('s_hp','s_ad','f_heal'), #'换装迷宫',
99 => Array('s_hp','s_ad','f_heal'), #'第一形态'
......@@ -2190,9 +2190,9 @@ $cskills = Array
可以通过消耗代码片段来降低该系数,<br>
降低量:<span class="yellow">[:consume_rate:]%</span>×<span class="yellow">消耗代码片段效耐和的平方根</span>',
'vars' => Array(
'burn_rate' => 0.02,
'burn_rate' => 0.03,
'consume_rate' => 0.3,
'gain_rate' => 0.01
'gain_rate' => 0.005
),
'pvars' => Array('skillpara|c21_stormedge-ms', 'skillpara|c21_stormedge-consumpt'),
),
......@@ -2221,31 +2221,6 @@ $cskills = Array
'lvl' => '[:lvl:] >= 5',
),
),
'c21_sacrifice' => Array
(
'name' => '燃血',
'tags' => Array('switch'),
'desc' => '技能开启后,在提取代码片段时,<br>
可以支付等量的生命值代替不足的体力,<br>
若生命值不足,<span class="yellow">[:death_obbs:]%</span>概率会立即死亡,若幸存则会剩余<span class="yellow">1</span>点生命值<br>
[^skill-active^]',
'input' => '切换',
'log' => '<span class="yellow">切换了「燃血」的状态。</span>',
'events' => Array('active|c21_sacrifice'),
'vars' => Array(
'death_obbs' => 50 //入乡随俗
),
'svars' => Array(
'active' => 0,
),
'pvars' => Array('skill-active'),
'lockdesc' => Array(
'lvl' => '9级时解锁',
),
'unlock' => Array(
'lvl' => '[:lvl:] >= 9',
),
),
'c21_discovery' => Array
(
'name' => '涌血',
......@@ -2263,16 +2238,41 @@ $cskills = Array
'rank' => 1
),
'vars' => Array(
'spcost' => 20,
'hpcost' => 30,
'spcost' => 15,
'hpcost' => 20,
'task' => 7
),
'pvars' => Array('skillpara|c21_discovery-frag', 'skillpara|c21_discovery-count', 'skillpara|c21_discovery-rank'),
'lockdesc' => Array(
'lvl' => '15级时解锁',
'lvl' => '9级时解锁',
),
'unlock' => Array(
'lvl' => '[:lvl:] >= 15',
'lvl' => '[:lvl:] >= 9',
),
),
'c21_sacrifice' => Array
(
'name' => '燃血',
'tags' => Array('switch'),
'desc' => '技能开启后,在提取代码片段时,<br>
可以支付等量的生命值代替不足的体力,<br>
若生命值不足,<span class="yellow">[:death_obbs:]%</span>概率会立即死亡,若幸存则会剩余<span class="yellow">1</span>点生命值<br>
[^skill-active^]',
'input' => '切换',
'log' => '<span class="yellow">切换了「燃血」的状态。</span>',
'events' => Array('active|c21_sacrifice'),
'vars' => Array(
'death_obbs' => 50 //入乡随俗
),
'svars' => Array(
'active' => 0,
),
'pvars' => Array('skill-active'),
'lockdesc' => Array(
'lvl' => '16级时解锁',
),
'unlock' => Array(
'lvl' => '[:lvl:] >= 16',
),
),
'c21_blaster' => Array
......@@ -2280,7 +2280,7 @@ $cskills = Array
'name' => '爆血',
'tags' => Array('battle'),
'desc' => '消耗<span class="yellow">[:ragecost:]</span>点怒气,引爆身上的全部代码片段,<br>
对手和自己造成等同于这些片段上的异常状态,<br>
敌人和自己造成等同于这些片段上的异常状态,<br>
并附加由这些片段的效果和与耐久和决定的最终伤害。<br>
你每因此受到<span class="yellow">[:dmgrate:]</span>点伤害,就随机造成敌人一处受伤。',
'bdesc' => "引爆身上的全部代码片段,根据片段的属性对双方造成额外伤害和效果;消耗<span class='red'>[:ragecost:]</span>怒气</span>",
......@@ -2319,6 +2319,19 @@ $cskills = Array
'notype' => Array(88,92),//不能用来抡的NPC
),
),
'tl_pickpocket' => Array
(
'name' => '妙手',
'tags' => Array('battle','passive'),
'desc' => '消耗<span class="yellow">[:ragecost:]</span>点怒气,获得敌人随机数量的金钱,<br>
至多<span class="yellow">[:picklimit:]%</span>,但本次攻击不造成伤害,且射程与持灵系武器相同;<br>
发现尸体时,可消耗<span class="yellow">[:ragecost:]</span>点怒气,将一个物品置入尸体的持有物品中',
'bdesc' => '偷取敌人随机数量(至多<span class="yellow">[:picklimit:]%</span>)的金钱;消耗<span class="red">[:ragecost:]</span>怒气</span>',
'vars' => Array(
'picklimit' => 10,
'ragecost' => 30,
),
),
'inf_dizzy' => Array
(
'name' => '眩晕',
......
......@@ -112,6 +112,7 @@
10,3,300,0,《爆系指南》,VD,30,1,,
10,3,300,0,《灵系指南》,VF,30,1,,
10,10,1444,0,《黑暗兵法·素材复用之卷》,VS,1,1,tl_cstick,
10,3,777,0,《COC7规则书·偷天换日之卷》,VS,1,1,tl_pickpocket,
10,10,3800,0,《小黄的收服特训》,X,1,1,,
10,10,7000,0,《寻星流奥义书》,VK,300,1,,
10,10,5500,0,《小黄的常磐之力》,VC,300,1,,
......
......@@ -82,6 +82,10 @@ function findcorpse(&$w_pdata)
$cstick_flag = 0;
if(!check_skill_unlock('tl_cstick',$pdata) && !check_skill_cost('tl_cstick',$pdata)) $cstick_flag = in_array($w_type,get_skillvars('tl_cstick','notype')) ? 0 : 1;
// 初始化妙手数据
$pickpocket_flag = 0;
if(!check_skill_unlock('tl_pickpocket',$pdata) && !check_skill_cost('tl_pickpocket',$pdata)) $pickpocket_flag = 1;
// 保存发现过女主尸体的记录
if($w_pdata['type'] == 14) $clbpara['achvars']['corpse_n14'] += 1;
......
......@@ -324,26 +324,13 @@
if (mb_strlen($itmn_result) > 29 - $len_ori_name) {
$itmn_result = mb_substr($itmn_result, 0, 29 - $len_ori_name);
}
$itmc2 = $itmn_result. '🥚' . $itmc2;
$itmkc2 = $itmkc1 . $itmkc2;
$itmec2 = (int)$itmec1 + (int)$itmec2;
$itmec2 = (int)($itmec2 * $namefrag_total_rate);
//当任意一个itms为∞
if ($itmsc1 == '∞' || $itmsc2 == '∞') {
$itmsc2 = '∞';
}
else {
$itmsc2 = (int)$itmsc1 + (int)$itmsc2 - 1;
}
$itmskc2 = $itmskc1 . $itmskc2;
//清空itm1
destory_single_item($pdata, $choice1);
$itmkc2 = str_replace('🥚', '', $itmkc2);
return;
//删除重复字段
$itmn_result = namefrag_unique($itmn_result);
$itmc2 = $itmn_result. '🥚' . $itmc2;
}
$itmkc2 = $itmkc1 . $itmkc2;
$itmec2 = (int)$itmec1 + (int)$itmec2;
$itmec2 = (int)($itmec2 * $namefrag_total_rate);
//当任意一个itms为∞
if ($itmsc1 == '∞' || $itmsc2 == '∞') {
$itmsc2 = '∞';
......@@ -359,6 +346,7 @@
$itmskc2 = implode(array_unique(str_split($itmskc2)));
//去除itm2属性里的🥚
$itmkc2 = str_replace('🥚', '', $itmkc2);
return;
}
# 生成随机的字段表
......@@ -442,6 +430,36 @@
return $namefrag_total_rate;
}
# 删除道具名中的重复字段
function namefrag_unique($itm)
{
include GAME_ROOT.'./gamedata/club21cfg.php';
global $gamevars;
//合并所有等级的字段
$merged_fragment_list = array_merge($gamevars['name_fragment_list'][0], $gamevars['name_fragment_list'][1], $gamevars['name_fragment_list'][2], $gamevars['name_fragment_list'][3]);
//将存在的字段加入到代码片段名中
$namefrags = array();
$len_itm = mb_strlen($itm);
$pointer = 0;
while ($pointer < $len_itm) {
$found = false;
foreach ($merged_fragment_list as $fragment) {
$len_frag = mb_strlen($fragment);
if (mb_substr($itm, $pointer, $len_frag) === $fragment) {
$namefrags[] = $fragment;
$pointer += $len_frag;
$found = true;
break;
}
}
if (!$found) {
$pointer++;
}
}
$frags_unique = implode(array_unique($namefrags));
return $frags_unique;
}
# 消耗代码片段
function consume_trait($item_position)
{
......
......@@ -1387,6 +1387,15 @@ function getcorpse($item,&$data=NULL)
$mode = 'command';
return;
}
if($item == 'pickpocket')
{
//用视野保存一下,可以吗?
check_add_searchmemory($edata['pid'],'corpse',$edata['name'],$data);
$log = '';
$mode = 'sp_pickpocket';
return;
}
if($item == 'loot_depot')
{
......
......@@ -16,6 +16,13 @@ namespace revattr
$sk_rn = get_skillvars('c4_sniper','rangegain');
$range += $sk_rn;
}
#「妙手」效果判定:
if(isset($pa['bskill_tl_pickpocket']))
{
//射程与灵系相同
$range = 1;
}
return $range;
}
......
......@@ -339,6 +339,16 @@ namespace revattr
$key = array_search('r',$pa['ex_keys']);
unset($pa['ex_keys'][$key]);
}
# 「妙手」效果判定:
if(isset($pa['bskill_tl_pickpocket']))
{
global $exdmgname;
foreach (array_keys($exdmgname) as $ex)
{
$key = array_search($ex,$pa['ex_keys']);
unset($pa['ex_keys'][$key]);
}
}
# 「天义」效果判定:
if(isset($pa['skill_c6_justice']) && (empty($pa['ex_keys']) || !in_array('N',$pa['ex_keys']))) $pa['ex_keys'][] = 'N';
return;
......@@ -1105,6 +1115,12 @@ namespace revattr
$dmg_p[]= $p;
$log.="<span class='yellow'>「解构」使{$pa['nm']}造成的物理伤害提高了{$sk_p}%!</span><br>";
}
#「妙手」判定:
if(isset($pa['bskill_tl_pickpocket']))
{
$dmg_p[]= 0;
$log.="<span class='yellow'>「妙手」使{$pa['nm']}的本次攻击几乎没有造成任何伤害!</span><br>";
}
#「宗师」判定:
if(isset($pa['skill_c13_master']) && $pa['wep_kind'] != 'N')
{
......@@ -1899,25 +1915,26 @@ namespace revattr
extract($data,EXTR_REFS);
//引爆身上的全部代码片段,并记录效耐和与属性
$log .= "引爆了身上所有的代码片段!<br>";
$log .= "{$pa['nm']}引爆了身上所有的代码片段!<br>";
foreach (array(1, 2, 3, 4, 5, 6) as $item_position)
{
if (mb_strpos(${'itmk' . $item_position}, '🥚') === 0)
if (mb_strpos(${'itmk' . $item_position}, '🥚') === 0)
{
$itme = &${'itme' . $item_position};
$itms = &${'itms' . $item_position};
$itmsk = &${'itmsk' . $item_position};
$esum += $itme;
$esum += $itme;
if ($itms === '∞') $ssum += 120;
else $ssum += (int)$itms;
$sk_tot .= $itmsk;
destory_single_item($pdata, $item_position);
destory_single_item($pdata, $item_position);
}
}
}
//对双方造成等同于这些片段上的异常状态
global $ex_inf, $exdmginf;
$ex_inf_arr = '';
for ($i = 0; $i < mb_strlen($sk_tot); $i++) {
for ($i = 0; $i < mb_strlen($sk_tot); $i++)
{
if ((isset($ex_inf[$sk_tot[$i]])) && (mb_strpos($ex_inf_arr, $ex_inf[$sk_tot[$i]]) === false)) {
$ex_inf_arr .= $ex_inf[$sk_tot[$i]];
get_inf_rev($pa,$ex_inf[$sk_tot[$i]]);
......@@ -1958,7 +1975,6 @@ namespace revattr
else
{
foreach ($rand_hurt_key as $key) {
/* echo $hurts[$key]; */
get_inf_rev($pd, $hurts[$key]);
$log .= "<span class=\"yellow\">爆炸的代码片段使{$pd['nm']}{$exdmginf[$hurts[$key]]}了!</span><br>";
}
......
......@@ -299,8 +299,7 @@
}
$log .= "消耗体力" . $sp_cost . "点,制造了该代码片段。<br>";
$sp = $sp - $sp_cost;
// 此处应有重新取名
$itm0 = "属性的代码片段";
$itm0 = "数据结成的属性代码片段";
$itmk0 = '🥚';
$itme0 = 0;
$itms0 = 1;
......@@ -331,7 +330,7 @@
$mhp -= $hpcost;
if ($sp > $msp) $sp = $msp;
if ($hp > $mhp) $hp = $mhp;
/* 随机抽选一个片段; */
// 随机抽取一个当前技能等级的字段
$rand_key = array_rand($gamevars['name_fragment_list'][$rank]);
$new_frag = $gamevars['name_fragment_list'][$rank][$rand_key];
$log .= "发现了字段<span class='yellow'>「" . $new_frag . "」</span>。<br>";
......@@ -718,5 +717,80 @@
}
return;
}
# 妙手给尸体/塞东西
function skill_tl_pickpocket_act($itmn)
{
global $log,$pdata,$cskills,$db,$tablepre;
$lock = check_skill_unlock('tl_pickpocket',$pdata);
$id = (end($pdata['clbpara']['smeo']))[0];
$result = $db->query("SELECT * FROM {$tablepre}players WHERE pid = '$id'");
$edata = $db->fetch_array($result);
if(!$edata)
{
$log .= "就当你刚拿出道具的时候,却发现先前看到的尸体已经不见了。这是怎么做到的?<br>";
$action = ''; $bid = 0;
$mode = 'command';
return;
}
if(!$lock)
{
# 扣除怒气
$pdata['rage'] -= get_skillvars('tl_pickpocket','ragecost');
if(!$pdata['itms'.$itmn])
{
$log .= '此道具不存在!';
$action = ''; $bid = 0;
$mode = 'command';
return;
}
//诅咒物品都放?做个人吧!
elseif(strpos($pdata['itmsk'.$itmn],'V')!==false)
{
$log .= "你刚拿起这个道具,就感觉脑内一片空白。<br>……你本来打算干什么来着?<br>不知为何,你感到了强烈的负罪感。<br>";
$pdata['rp'] += 2333;
$action = ''; $bid = 0;
return;
}
//灵魂绑定物品放上去会消失,赛博烧纸
elseif(strpos($pdata['itmsk'.$itmn],'v')!==false)
{
$log .= "你将这个道具放到了尸体上,它瞬间化作灰烬消散了。<br>……<br>你感到内心稍微平静了一些。<br>";
destory_single_item($pdata, $itmn);
$pdata['rp'] -= 777;
$action = ''; $bid = 0;
return;
}
for($i = 1;$i <= 6; $i++)
{
if(!$edata['itms'.$i])
{
$edata['itm'.$i] = $pdata['itm'.$itmn];
$edata['itmk'.$i] = $pdata['itmk'.$itmn];
$edata['itme'.$i] = $pdata['itme'.$itmn];
$edata['itms'.$i] = $pdata['itms'.$itmn];
$edata['itmsk'.$i] = $pdata['itmsk'.$itmn];
player_save($edata);
$log .= '你冷静下来张望四周,然后迅速将一个道具放入了尸体身上的物品中。<br>希望不要有人发现……?<br>';
destory_single_item($pdata, $itmn);
//坏东西!
$pdata['rp'] += 233;
$action = ''; $bid = 0;
return;
}
}
$log .= "尸体身上已经放了不少东西,你找不到一个合适的位置来放下你的物品。<br>";
}
else
{
$log .= isset($cskills['tl_pickpocket']['lockdesc'][$lock]) ? $cskills['tl_pickpocket']['lockdesc'][$lock] : $lock;
}
return;
}
?>
......@@ -227,6 +227,23 @@ namespace revcombat
$log .= "<span class='yellow'>{$pd['nm']}没有受到「渗透」影响!</span><br>";
}
}
# 「妙手」效果判定
if (isset($pa['skill_tl_pickpocket']))
{
$picklimit = get_skillvars('tl_pickpocket','picklimit');
//这叫earn合适吗?
$earn = round($pd['money'] * rand(0, $picklimit) / 100);
if ($earn == 0) $log .= "<span class='yellow'>{$pa['nm']}没有从{$pd['nm']}身上获得金钱!</span><br>";
else
{
$pd['money'] -= $earn;
$pa['money'] += $earn;
$log .= "<span class='yellow'>你从{$pd['nm']}身上获得了{$earn}元金钱!</span><br>";
if(!$pd['type'] && $pd['nm']!='你') $pd['logsave'] .= "你被窃走了{$earn}元金钱!<br>";
elseif(!$pa['type'] && $pa['nm']!='你') $pa['logsave'] .= "你从{$pd['name']}身上获得了{$earn}元金钱!<br>";
}
}
# 「冰心」效果判定
if (isset($pd['skill_c9_iceheart']) && !empty($pd['inf']))
......
......@@ -407,14 +407,14 @@ function move_search_events(&$data,$act)
$sk = 'c21_stormedge';
$ms = get_skillpara($sk,'ms',$data['clbpara']) + 1;
$sp_down = round($msp * ($burn_rate * $ms - $consume_rate * sqrt($clbpara['consumpt']))/100);
if ($sp <= $sp_down) $sp_down = $sp - 1;
elseif ($sp_down <= 0) $sp_down = 1;
if ($sp <= $sp_down) $sp_down = max($sp - 1, 0);
elseif ($sp_down < 0) $sp_down = 0;
$sp = $sp - $sp_down;
$msp = $msp + round($gain_rate * $sp_down);
$log .= "因为体内<span class=\"glitchb\">数据风暴</span>肆虐减少了<span class=\"red\">$sp_down</span>点体力!<br>";
if($act == 'move')
{
$damage = round($mhp * ($burn_rate * $ms - $consume_rate * $clbpara['consumpt'])/100);
$damage = round($mhp * ($burn_rate * $ms - $consume_rate * sqrt($clbpara['consumpt']))/100);
if ($hp <= $damage) $damage = $hp - 1;
elseif ($damage <= 0) $damage = 1;
$hp = $hp - $damage;
......
......@@ -12,6 +12,9 @@
<!--{if $cstick_flag}-->
<input type="radio" name="command" id="cstick" value="cstick"><a onclick=sl('cstick'); href="javascript:void(0);" ><span tooltip="消耗100点怒气,将这具尸体变成一把殴系武器">抡起尸体!</span></a><br>
<!--{/if}-->
<!--{if $pickpocket_flag}-->
<input type="radio" name="command" id="pickpocket" value="pickpocket"><a onclick=sl('pickpocket'); href="javascript:void(0);" ><span tooltip="消耗30点怒气,将自己的一个物品置入其中">置入物品</span></a><br>
<!--{/if}-->
<!--{if $loot_depot_flag}-->
<input type="radio" name="command" id="loot_depot" value="loot_depot"><a onclick=sl('loot_depot'); href="javascript:void(0);" >转移安全箱权限</a><br>
<!--{/if}-->
......
想要置入哪个物品?<br><br>
<input type="hidden" name="mode" value="command" />
<input type="hidden" name="command" value="special" />
<input type="hidden" name="sp_cmd" value="sp_pickpocket_selected" />
<input type="hidden" id="choice" name="choice" value="menu" />
<!--{if $itms1}-->
置入:<input type="button" name="itm1" value="{$itm1}/{$itme1}/{$itms1}" onclick="$('choice').value='1';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<!--{if $itms2}-->
置入:<input type="button" name="itm2" value="{$itm2}/{$itme2}/{$itms2}" onclick="$('choice').value='2';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<!--{if $itms3}-->
置入:<input type="button" name="itm3" value="{$itm3}/{$itme3}/{$itms3}" onclick="$('choice').value='3';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<!--{if $itms4}-->
置入:<input type="button" name="itm4" value="{$itm4}/{$itme4}/{$itms4}" onclick="$('choice').value='4';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<!--{if $itms5}-->
置入:<input type="button" name="itm5" value="{$itm5}/{$itme5}/{$itms5}" onclick="$('choice').value='5';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<!--{if $itms6}-->
置入:<input type="button" name="itm6" value="{$itm6}/{$itme6}/{$itms6}" onclick="$('choice').value='6';postCmd('gamecmd','command.php');"><br>
<!--{/if}-->
<input type="button" class="cmdbutton" id="zz" name="back" value="[Z]返回" onclick="postCmd('gamecmd','command.php');this.disabled=true;"><br><br>
\ No newline at end of file
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