This commit is contained in:
libccy 2015-10-08 14:16:37 +08:00
parent 34255ae2d0
commit 89e33f696f
32 changed files with 355 additions and 22 deletions

View File

@ -1,2 +1,4 @@
1.3.1
战棋模式改进
单人控制改进
新武将

View File

@ -445,16 +445,23 @@ card.hearth={
shenenshu:{
fullskin:true,
enable:true,
usable:1,
filterTarget:function(card,player,target){
return target!=player;
},
type:'trick',
content:function(){
var num=player.num('h')-target.num('h');
if(num<1) num=1;
if(num<-3) num=-3;
if(num>3) num=3;
target.draw(num);
if(num>0){
target.draw(num);
}
else if(num<0){
player.draw(-num);
}
else{
game.asyncDraw([target,player]);
}
},
ai:{
order:10,
@ -466,7 +473,18 @@ card.hearth={
if(!player.skills.contains('jizhi')){
nh--;
}
return Math.max(1,nh);
if(nh>0) return nh;
if(nh==0) return 1;
return 0;
},
player:function(player,target){
var nh=target.num('h')-player.num('h');
if(!player.skills.contains('jizhi')){
nh++;
}
if(nh>0) return nh;
if(nh==0) return 1;
return 0;
}
},
expose:0.2
@ -589,7 +607,7 @@ card.hearth={
linghunzhihuo:'灵魂之火',
linghunzhihuo_info:'对一名角色造成一点火焰伤害,然后随机弃置一张手牌',
shenenshu:'神恩术',
shenenshu_info:'对一名其他角色使用,令其摸X张牌直到手牌数与你相等X不小于1且不大于3',
shenenshu_info:'对一名其他角色使用,令你与目标中手牌数较少的摸若干张牌直到手牌数相等X不大于3若手牌数已相等改为你与目标各摸一张牌',
zhiliaobo:'治疗波',
zhiliaobo_info:'对一名受伤角色使用,令其回复一点体力,若其仍处于受伤状态,则进行一次判定,若结果为红色则再回复一点体力',
yuansuhuimie:'元素毁灭',

View File

@ -174,7 +174,7 @@ character.hearth={
trigger:{global:'dieAfter'},
forced:true,
filter:function(event,player){
return !event.player.storage.bingshi;
return !event.player.storage.bingshi&&event.player.skills.contains('bingshi');
},
content:function(){
'step 0'
@ -385,7 +385,11 @@ character.hearth={
},
content:function(){
var card=cards[0];
player.gain(game.createCard('liuxinghuoyu',get.suit(card),get.number(card)),'gain2');
var card2=get.cardPile('liuxinghuoyu');
if(!card2){
card2=game.createCard('liuxinghuoyu',get.suit(card),get.number(card));
}
player.gain(card2,'gain2');
},
ai:{
order:9,
@ -1467,6 +1471,9 @@ character.hearth={
player.addSkill('tuteng1');
}
else{
if(rand.length>1){
rand.remove('tuteng1');
}
player.addSkill(rand.randomGet());
}
if(rand2.length>=3){

View File

@ -1105,6 +1105,9 @@ character.refresh={
}
return target.num('he')>0;
},
filter:function(event,player){
return player.num('he')>0;
},
filterCard:true,
position:'he',
selectTarget:[1,Infinity],

View File

@ -1729,7 +1729,7 @@ character.sp={
effect:{
target:function(card,player,target){
if(get.tag(card,'damage')){
if(target.hp==target.maxHp) return [0,1];
if(target.hp==target.maxHp&&target.hasFriend()) return [0,1];
}
if(get.tag(card,'recover')&&player.hp>=player.maxHp-1) return [0,0];
}

View File

@ -4370,7 +4370,7 @@ character.swd={
frequent:true,
content:function(){
"step 0"
event.cards=get.cards(Math.max(3,get.cardCount(true,player)+1));
event.cards=get.cards(3);
player.showCards(event.cards);
"step 1"
for(var i=0;i<cards.length;i++){
@ -7719,7 +7719,7 @@ character.swd={
miejing:'灭境',
miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到一点雷电伤害',
lingxin:'灵心',
lingxin_info:'回合结束阶段,你可以亮出牌堆顶的X+1张牌然后获得其中的红桃牌X为你回合内使用的牌数且至少为2',
lingxin_info:'回合结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌',
fushen:'附身',
fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后流失一点体力',
fushen2:'附身',

129
character/xiake.js Executable file
View File

@ -0,0 +1,129 @@
character.xiake={
character:{
// xk_dongfangweiming:['male','shu',4,[],['fullskin']],
xk_guyuexuan:['male','qun',3,['rouquan','gzhenji'],['fullskin']],
// xk_jinji:['male','shu',4,[],['fullskin']],
// xk_shenxiangyun:['female','wei',3,[],['fullskin']],
xk_fujianhan:['male','qun',4,['zuijian','zitong'],['fullskin']],
},
skill:{
rouquan:{
mod:{
selectTarget:function(card,player,range){
if(card.name=='sha'&&!player.get('e','1')&&range[1]!=-1) range[1]=Infinity;
}
},
enable:'phaseUse',
position:'e',
filter:function(event,player){
return player.num('e')>0;
},
filterCard:true,
prompt:'弃置要重铸的牌并摸一张牌',
discard:false,
delay:0.5,
check:function(card,player){
var val=ai.get.equipValue(card);
var player=_status.event.player;
var cards=player.get('h',{subtype:get.subtype(card)});
for(var i=0;i<cards.length;i++){
if(ai.get.equipValue(cards[i])>=val){
return 1;
}
}
return 0;
},
prepare:function(cards,player){
player.$throw(cards,1000);
},
content:function(){
"step 0"
player.draw();
"step 1"
for(var i=0;i<cards.length;i++){
ui.discardPile.appendChild(cards[i]);
}
},
ai:{
order:9.5,
result:{
player:1
}
}
},
gzhenji:{
trigger:{source:'damageEnd'},
frequent:true,
filter:function(event,player){
return _status.currentPhase==player&&event.card&&event.card.name=='sha';
},
content:function(){
player.draw();
player.addTempSkill('gzhenji3','phaseAfter');
}
},
gzhenji3:{
mod:{
cardUsable:function(card,player,num){
if(card.name=='sha') return num+1;
}
},
},
zuijian:{
enable:'phaseUse',
filterCard:true,
position:'he',
viewAs:{name:'jiu'},
viewAsFilter:function(player){
if(!player.num('he')) return false;
},
prompt:'将一张手牌或装备牌当酒使用',
check:function(card){
return 4-ai.get.value(card);
},
mod:{
attackFrom:function(from,to,distance){
if(from.skills.contains('jiu')) return distance-1;
}
},
ai:{
skillTagFilter:function(player){
return player.num('he')>0;
},
threaten:1.2
}
},
zitong:{
trigger:{player:'useCard'},
frequent:true,
filter:function(event,player){
return _status.currentPhase==player&&get.cardCount(true,player)==2;
},
content:function(){
var card=get.cardPile('chuansongmen');
if(!card){
card=game.createCard('chuansongmen');
}
player.gain(card,'gain2');
},
ai:{
threaten:1.2
}
}
},
translate:{
xk_dongfangweiming:'东方未明',
xk_guyuexuan:'谷月轩',
xk_jinji:'荆棘',
xk_shenxiangyun:'沈湘芸',
xk_fujianhan:'傅剑寒',
gzhenji:'震击',
gzhenji_info:'你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀',
rouquan:'柔拳',
rouquan_info:'你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标',
zuijian:'醉剑',
zuijian_info:'出牌阶段,你可以将一张手牌或装备牌当酒使用;当你使用酒后,你的攻击范围+1',
zitong:'自通',
zitong_info:'当你于自己的回合内使用第二张牌时,你可以将一张传送门置于你的手牌',
},
}

View File

@ -6056,7 +6056,7 @@
if(range[0]!=range[1]||range[0]>1) auto=false;
for(i=0;i<game.players.length;i++){
var nochess=true;
if(lib.config.mode=='chess'){
if(lib.config.mode=='chess'&&!event.chessForceAll){
if(player&&get.distance(player,game.players[i],'pure')>7){
nochess=false;
}

View File

@ -17,7 +17,8 @@ character.pack={
swd:'轩辕剑',
xswd:'轩辕剑·二',
gujian:'古剑奇谭',
xianjian:'仙剑',
xianjian:'仙剑奇侠传',
xiake:'侠客风云传',
};
card.pack={
standard:'标准',

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -30,6 +30,8 @@ table{table-layout: fixed;}
#handcards1,#handcards2{white-space:nowrap;overflow-x: scroll;overflow-y:hidden;display: block;text-align: center;}
#handcards1{left: 0;top:calc(100% - 140px);}
#handcards2{left: calc(50% + 120px);top:calc(100% - 140px);}
#arena.single-handcard #handcards1{width: 100%;}
#arena.single-handcard #handcards2{display: none;}
#system{padding: 6px;width: calc(100% - 12px);white-space: nowrap;z-index: 3;}
#system>div{height: 100%;position: relative;margin: 0;padding: 0;}
#system>div:last-child{text-align: right;float:right}
@ -203,6 +205,16 @@ margin-bottom: 5px;
.control{font-size: 18px;white-space: nowrap;position: relative;overflow: hidden;width: 0;opacity:0}
.control>div{position: relative;padding: 3px;}
/*--------角色--------*/
.player>.avatar>.action{
margin: 5px;
font-family: 'huangcao';
font-size: 20px;
letter-spacing: -2px;
text-shadow: black 0 0 1px, rgba(10, 155, 67, 1) 0 0 5px, rgba(10, 155, 67, 1) 0 0 10px;
}
.player>.avatar:not(.glow2)>.action{opacity: 0}
.player.fakeme{width:100px;height:120px;top:calc(100% - 140px)}
.player.fakeme>.avatar{width: 100%;height: 100%;box-shadow: none;left: 0;top: 0}
.player{z-index: 4;width: 240px;height: 120px;}
.player.minskin{width:120px;}
.player.replaceme{-webkit-animation:replaceme 0.5s}
@ -734,6 +746,7 @@ div[data-nature='soil']{
box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 133, 255, 0.8) 0 0 15px !important;
}
.glow2{
/*-webkit-animation:control_glow 4s infinite;*/
box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px !important;
}
@ -757,6 +770,14 @@ div[data-nature='soil']{
}
/*--------动画--------*/
@-webkit-keyframes control_glow{
0%{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px}
30%{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px}
70%{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px}
100%{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px}
/*from{box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(10, 155, 67, 1) 0 0 15px, rgba(10, 155, 67, 1) 0 0 15px !important;}
to{box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.45) 0 3px 10px !important}*/
}
@-webkit-keyframes cardflip{
from {-webkit-transform:perspective(600px) rotateY(-90deg) translateX(52px)}
to{-webkit-transform:perspective(600px) rotateY(0deg) translateX(0)}

View File

@ -175,7 +175,9 @@ mode.boss={
}
ui.create.me();
if(game.me!==boss){
ui.fakeme=ui.create.div('.player',ui.arena);
game.singleHandcard=true;
ui.arena.classList.add('single-handcard');
ui.fakeme=ui.create.div('.player');
ui.fakeme.dataset.position=0;
ui.fakeme.line=lib.element.player.line;
ui.fakemebg=ui.create.div('.avatar',ui.fakeme).hide();
@ -247,9 +249,15 @@ mode.boss={
event.bosslist.delete();
game.arrangePlayers();
for(var i=0;i<game.players.length;i++){
ui.create.div('.action',game.players[i].node.avatar).innerHTML='行动';
}
"step 3"
game.gameDraw(game.boss);
game.bossPhaseLoop();
setTimeout(function(){
ui.updateh(true);
},200);
}
},
bossPhaseLoop:function(){
@ -323,11 +331,12 @@ mode.boss={
}
ui.versushighlight=game.me;
game.me.node.avatar.classList.add('glow2');
game.me.line(ui.fakeme,{opacity:0.5,dashed:true});
// game.me.line(ui.fakeme,{opacity:0.5,dashed:true});
ui.fakemebg.style.backgroundImage=game.me.node.avatar.style.backgroundImage;
ui.fakemebg.style.backgroundSize='cover';
}
ui.updateh(true);
},
modeSwapPlayer:function(player){
game.swapControl(player);
@ -485,7 +494,7 @@ mode.boss={
},
boss:{
boss_zhangjiao:{
loopType:2,
// loopType:2,
},
boss_caiwenji:{
loopType:2,

View File

@ -369,7 +369,6 @@ mode.chess={
"step 0"
if(!player.movable(0,1)&&!player.movable(0,-1)&&
!player.movable(1,0)&&!player.movable(-1,0)){
event.finish();
return;
}
event.switchToAuto=function(){
@ -523,6 +522,117 @@ mode.chess={
game:{
minskin:true,
singleHandcard:true,
phaseLoopOrdered:function(player){
var next=game.createEvent('phaseLoop');
next.player=player;
next.content=function(){
"step 0"
var passed=false;
for(var i=0;i<game.players.length;i++){
if(!game.players[i].classList.contains('acted')){
if(game.players[i].side==player.side){
passed=true;break;
}
}
}
if(!passed){
var num1=0;
var next=null;
for(var i=0;i<game.players.length;i++){
if(game.players[i].side==player.side){
game.players[i].classList.remove('acted');
num1++;
}
else if(!next){
next=game.players[i];
}
}
var num2=game.players.length-num1;
if(num2>num1){
if(next.side==game.me.side){
next=game.me;
}
var str;
if(num2-num1>1){
str='选择至多'+get.cnNumber(num2-num1)+'个已方角色各摸一张牌'
}
else{
str='选择一个已方角色摸一张牌'
}
var nevt=next.chooseTarget(str,function(card,player,target){
return target.side==next.side;
},[1,num2-num1]);
nevt.ai=function(target){
return Math.max(1,10-target.num('h'));
};
nevt.chessForceAll=true;
}
else{
event.goto(2);
}
}
else{
event.goto(2);
}
"step 1"
if(result.bool){
game.asyncDraw(result.targets);
}
"step 2"
var players=[];
var next=null;
if(player.side==game.me.side){
player=game.me;
}
for(var i=0;i<game.players.length;i++){
if(game.players[i].side==player.side){
if(!game.players[i].classList.contains('acted')){
players.push(game.players[i]);
}
}
else if(!next){
next=game.players[i];
}
}
if(players.length>1){
var nevt=player.chooseTarget('选择下一个行动的角色',function(card,player,target){
return target.side==player.side&&!target.classList.contains('acted');
},true);
nevt.chessForceAll=true;
nevt.ai=function(target){
var nj=target.num('j');
if(nj){
return -nj;
}
return Math.max(0,10-target.hp);
}
}
else{
event.decided=players[0];
event.player=next;
}
"step 3"
if(event.decided){
event.decided.phase();
event.justacted=event.decided;
delete event.decided;
}
else{
var current=result.targets[0];
current.phase();
event.justacted=current;
for(var i=0;i<game.players.length;i++){
if(game.players[i].side!=player.side){
event.player=game.players[i];
break;
}
}
}
"step 4"
event.justacted.classList.add('acted');
event.goto(0);
}
},
isChessNeighbour:function(a,b){
if(a&&a.dataset){
a=a.dataset.position;
@ -799,7 +909,12 @@ mode.chess={
}
}
game.gameDraw(p);
game.phaseLoop(p);
if(get.config('chess_ordered')){
game.phaseLoopOrdered(p);
}
else{
game.phaseLoop(p);
}
game.setChessInfo(p);
}
},
@ -1414,6 +1529,10 @@ mode.chess={
delay:false,
preservecancel:true,
filter:function(event,player){
if(!player.movable(0,1)&&!player.movable(0,-1)&&
!player.movable(1,0)&&!player.movable(-1,0)){
return false;
}
var move=player.skills.contains('noactpunish')?2:1;
move=game.checkMod(player,move,'chessMove',player.get('s'));
return move>0;
@ -1425,7 +1544,14 @@ mode.chess={
player.chooseToMove(move).phasing=true;
"step 1"
if(!result.bool){
player.getStat().skill._chessmove--;
var skill=player.getStat().skill;
skill._chessmove--;
if(typeof skill._chessmovetried=='number'){
skill._chessmovetried++;
}
else{
skill._chessmovetried=1;
}
}
},
ai:{
@ -1464,6 +1590,9 @@ mode.chess={
return 1;
},
player:function(player){
if(player.getStat().skill._chessmovetried>=10){
return 0;
}
var x=lib.skill._chessmove.ai.result.playerx(player);
if(player.isMad()) return -x;
return x;
@ -1629,6 +1758,7 @@ mode.chess={
chessscroll_speed_config:'边缘滚动速度',
chess_character_config:'战棋武将',
only_chess_character_config:'只用战棋武将',
chess_ordered_config:'指定行动顺序',
chess_caocao:'曹操',
chess_xunyu:'荀彧',
@ -1797,9 +1927,18 @@ mode.chess={
'战棋模式':'<ul><li>n人对战n人的模式由单人控制开始游戏后随机分配位置与出牌顺序<li>'+
'每人在出牌阶段有一次移动的机会若一名角色在移动之前使用过指定其他角色为目标的牌该回合可移动的最大距离为2否则最大距离为1<li>'+
'任何卡牌或技能无法指定位置相隔8个格以上的角色为目标<li>'+
'杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚'
'杀死对方阵营的角色可摸一张牌,杀死本方阵营无惩罚<li>'+
'开启指定行动顺序后双方将交替行动在一方行动完毕进行下一轮行动时若其人数比另一方少另一方可指定至多X名角色名摸一张牌X为人数之差'
},
config:['battle_number','ban_weak','free_choose','change_choice',
function(game,lib,get,ui){
var current=get.config('chess_ordered');
if(typeof current!=='boolean'){
game.saveConfig('chess_ordered',true,true);
current=true;
}
return ui.create.switcher('chess_ordered',current,ui.click.sidebar.local2);
},
function(game,lib,get,ui){
var current=get.config('chess_character');
if(typeof current!=='boolean'){

View File

@ -324,13 +324,17 @@ mode.versus={
delete _status.list;
var num=lib.storage.number;
ui.create.players(num*2);
for(var i=0;i<game.players.length;i++){
ui.create.div('.action',game.players[i].node.avatar).innerHTML='行动';
}
if(lib.storage.single_control&&lib.storage.control_all&&game.players.length>=4){
ui.arena.dataset.number=parseInt(ui.arena.dataset.number)+1;
for(var i=0;i<game.players.length;i++){
game.players[i].dataset.position=parseInt(game.players[i].dataset.position)+1;
}
ui.fakeme=ui.create.div('.player',ui.arena);
ui.fakeme.dataset.position=0;
game.singleHandcard=true;
ui.arena.classList.add('single-handcard');
ui.fakeme=ui.create.div('.player.fakeme');
ui.fakeme.line=lib.element.player.line;
ui.fakemebg=ui.create.div('.avatar',ui.fakeme).hide();
}
@ -820,7 +824,7 @@ mode.versus={
}
ui.versushighlight=game.me;
game.me.node.avatar.classList.add('glow2');
game.me.line(ui.fakeme,{opacity:0.5,dashed:true});
// game.me.line(ui.fakeme,{opacity:0.5,dashed:true});
var info=lib.character[name];
if(lib.config.layout=='newlayout'&&info[4]&&info[4].contains('fullskin')){