-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathKJ.js
More file actions
2294 lines (2238 loc) · 75.2 KB
/
Copy pathKJ.js
File metadata and controls
2294 lines (2238 loc) · 75.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
KJZR=function(lib,game,ui,get,ai,_status){
game.KJimport("extension",function(lib,game,ui,get,ai,_status){return {name:"未来科技",content:function (config,pack){
//等同于,player.hp=num;不过这是有时机的
lib.element.player.changeHpTo=function (num){
this.changeHp(num-this.hp);
};
lib.element.player.changeMaxHpTo=function (num){
var next=game.createEvent('changeMaxHpTo',false);
next.num=Math.abs(num-this.maxHp);
next.resultNum=num;
next.player=this;
next.setContent("changeMaxHpTo");
return next;
};
lib.element.content.changeMaxHpTo=function(){
player.maxHp=event.resultNum;
event.trigger("changeMaxHp");
};
//刷新添加的sub技能
game.updateSkill=function(type){
function check(skill){//skill是字符串
var sub=get.info(skill).subSkill;
for(var i in sub){
lib.skill[skill+"_"+i]=lib.skill[skill].subSkill[i];
var info=get.info(lib.skill[skill+"_"+i]);
if(info&&info.subSkill) check(i);
}
};
if(!type){
for(var i in lib.skill) check(i);
}
else{
if(typeof type==="string"&&lib.skill[type]){
var info=get.info(lib.skill[type]);
if(info&&info.subSkill){
check(type);
}
else return false;
}
else if(get.itemtype(type)=='player'){
var skills=type.getSkills();
for(var i=0;i<skills.length;i++){
check(skills[i]);
}
}
else return false;
}
};
/*
⚠️注意:如果writable为false,configurable为true时,通过o.name = "詹姆斯-韦恩"是无法修改成功的,但是使用Object.defineProperty()
value是该属性的属性值,默认为undefined。
writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。
enumerable是一个布尔值,表示该属性是否可遍历,默认为true。如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性。
configurable是一个布尔值,表示可配置性,默认为true。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)。也就是说,configurable属性控制了属性描述对象的可写性。
get是一个函数,表示该属性的取值函数(getter),默认为undefined。
set是一个函数,表示该属性的存值函数(setter),默认为undefined。
*/
game.setProperty=function(obj,property,...attributes){
try{
if(!obj||!property) throw "无";
for(var i=0;i<attributes.length;i++){
if(get.objtype(attributes[i])==='object') var attribute=attributes[i];
else if(typeof attributes[i]==="boolean") var bool=attributes[i];
else var num=attributes[i];
}
//if(typeof bool==="undefined"&&typeof attribute==="undefined"&&typeof num==="undefined") throw "无";
if(typeof attribute==="undefined") attribute={};
var pro=Object.getOwnPropertyDescriptor(obj,property);
if(pro){
if(pro.configurable===false){
if(pro.writable===false&&attribute.writable===true) throw "不可配置可写性";
else if(pro.writable===false&&attribute.value) throw "value已不可改写";
else throw "此对象不可配置";
}
}
if(attribute.get||attribute.set){
if(attribute.value||typeof attribute. writable!=="undefined") throw "get与set,value和writable只能存在一组";
//alert(num)
//alert(bool)
if(typeof num!=="undefined"||typeof bool!=="undefined") throw "get与set,value和writable只能存在一组";
}
if(typeof num!=="undefined") attribute.value=num;
if(typeof bool!=="undefined") attribute.configurable=bool;
if(typeof attribute. writable==="undefined"&&typeof attribute. get==="undefined"&&typeof pro. get==="undefined"
&&typeof attribute. set==="undefined"&&typeof pro. set==="undefined") attribute. writable=true;
if(typeof attribute. configurable==="undefined") attribute. configurable=true;
if(typeof attribute. enumerable==="undefined") attribute. enumerable=true;
if(attribute. set||attribute. get){
/*
var reg=/}$/;
alert(attribute. set.toString().replace(reg,"\n}"));
var setfuc=function (value){
obj[property]["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"]=value;
};//改变
*/
obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"]=(obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"]||{});
obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"][property]=obj[property];
var nother=(attribute. set||function (){});//另外赋值
var getter=(attribute. get||function (){});
var setfuc=function (value){
var num=nother(value);
obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"]=(obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"]||{});
if(typeof num!=="undefined") obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"][property]=num;
else obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"][property]=value;
//alert(game.me["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"].hp)
}//另外赋值
attribute. set=setfuc;
attribute. get=function (){
var num=getter();
if(num!==undefined) return num;
else return obj["%E7%9C%9F%E6%AD%A3%20%E5%80%BC"][property];
};//读取先前的
}
//alert(attribute. set.toString());
Object.defineProperty(obj,property,attribute);
if(get.itemtype(obj)==='player') obj.update();
return true;
}//try
catch(e){
game.print(e);
return false;
}
}
//测试
/*
game.setProperty(game.me,"hp",{
set:function(e){
game.print(e);
game.print(game.me.hp);
return e;
}
});
*/
//加载外部帮助,只是给萌新用的,大佬可以直接用lib.init.js函数加载
//game.loadHelp("未来科技","帮助例子");
//game.loadHelp是基于时间的,因为KJ.readFile加载时间是根据文件大小决定的,所以如果把game.loadHelp放在最后可能第一次无法显示出来帮助
//所以为保证其稳定性,改为第二次加载
game.loadHelp=function(extensionName,files){
if(!lib.config["extension_"+extensionName+"_enable"]) return;
//禁止加载未开启的扩展的帮助
if(!game["loadHelped"+extensionName]){
//本扩展第一次使用该函数
if(lib.config["KJloadHelp"+extensionName]){
for(var i in lib.config["KJloadHelp"+extensionName]) lib.help[i]=lib.config["KJloadHelp"+extensionName][i];
}
//加载保存的设置
game.saveConfig('KJloadHelp'+extensionName,{});
//刷新
game["loadHelped"+extensionName]=true;
}
var e=function(){
//alert(extensionName+"的帮助载入失败");
//game.print(extensionName+"的帮助载入失败");
};
if(!Array.isArray(files)) files=[files];
for(var i=0;i<files.length;i++){
KJ.readFile("extension/"+extensionName+"/"+files[i]+".js",function(mes){
var str="var obj={"+mes+"}";
try{
var toSave={};
eval(str);
for(var i in obj){
toSave[i]=obj[i];
//game.print(obj[i]);
}
var reSave=(lib.config["KJloadHelp"+extensionName]||{});
for(var i in reSave) toSave[i]=reSave[i];
game.saveConfig('KJloadHelp'+extensionName,toSave);
}
catch(e){
game.print(e);
}
},e);
}
};
//lib.skill["_dieLiliAudio"].extensionName
//game.createSkill("dieLiliAudio","东方project");
//创建扩展死亡、出杀音效
game.createSkill=function (skillName,...types){
if(skillName.indexOf("_")!==0) skillName="_"+skillName;
if(lib.skill[skillName]) alert(skillName+"已存在!");
for(var i=0;i<types.length;i++){
if(types[i]==="die"||types[i]==="sha") var type=types[i];
else var extensionName=types[i];
}
if(!type) var type="die";
switch(type){
case 'die':
lib.skill[skillName]={
trigger:{
player:'dieBegin',
},
priority:-Infinity,
forced:true,
direct:true,
extensionName:extensionName,
unique:true,
content:function(){
"step 0"
var exName=lib.skill[event.name].extensionName;
var name=get.truename(player);
var name2=player.name2;
var tags=lib.character[name][4];
if(name2) var tags2=lib.character[name2][4];
if(tags&&tags.length){
for(var i=0;i<tags.length;i++){
if(tags[i].indexOf('dieAudio:')==0){
var audionum=tags[i].slice(9);
}
}
}
if(audionum){
audionum=+audionum;
if(audionum>1) var num=get.rand(1,audionum);
else var num=1;
var audioname=name+num;
game.playAudio('..','extension',exName,audioname);
}
else{
game.playAudio('..','extension',exName,name);
event.KJ=true;
}
if(name2&&tags2&&tags2.length){
event.tags2=tags2;
event.name=name2;
}
else{
setTimeout(function(){
game.playAudio('..','extension',exName,name2);
},3000)
event.finish();
}
"step 1"
var tags2=event.tags2;
var name=event.name;
for(var i=0;i<tags2.length;i++){
if(tags2[i].indexOf('dieAudio:')==0){
var audionum=tags2[i].slice(9);
}
}
if(audionum){
audionum=+audionum;
if(audionum>1) var num=get.rand(1,audionum);
else var num=1;
var audioname=name+num;
if(event.KJ) game.playAudio('..','extension',exName,audioname);
else{
setTimeout(function(){
game.playAudio('..','extension',exName,audioname);
},3000)
}
}
else{
setTimeout(function(){
game.playAudio('..','extension',exName,name);
},3000)
}
},
}
break;
case 'sha':
////game.createSkill("shaWwzAudio","王者荣耀—<br>神梦一刀");
lib.skill[skillName]={
trigger:{
player:"useCardToPlayered",
},
filter:function (event,player){
return event.card.name=='sha';
},
forced:true,
extensionName:extensionName,
popup:false,
superCharlotte:true,
charlotte:true,
direct:true,
content:function (){
"step 0"
//alert("出杀音效")
var exName=lib.skill[event.name].extensionName;
var name=get.truename(player);
var name2=player.name2;
var tags=lib.character[name][4];
if(name2) var tags2=lib.character[name2][4];
if(tags&&tags.length){
for(var i=0;i<tags.length;i++){
if(tags[i].indexOf('shaAudio:')==0){
var audionum=tags[i].slice(9);
}
}
}
if(audionum){
audionum=+audionum;
if(audionum>1) var num=get.rand(1,audionum);
else var num=1;
var audioname=name+"ShaAudio"+num;
game.playAudio('..','extension',exName,audioname);
//alert(audioname)
}
else{
game.playAudio('..','extension',exName,name+"ShaAudio");
//alert(name+"ShaAudio")
event.KJ=true;
}
if(name2&&tags2&&tags2.length){
event.tags2=tags2;
event.name=name2;
}
else{
setTimeout(function(){
game.playAudio('..','extension',exName,name2+"ShaAudio");
},3000)
//alert(name2+"ShaAudio")
event.finish();
}
"step 1"
var tags2=event.tags2;
var name=event.name;
for(var i=0;i<tags2.length;i++){
if(tags2[i].indexOf('shaAudio:')==0){
var audionum=tags2[i].slice(9);
}
}
if(audionum){
audionum=+audionum;
if(audionum>1) var num=get.rand(1,audionum);
else var num=1;
var audioname=name+"ShaAudio"+num;
if(event.KJ){
game.playAudio('..','extension',exName,audioname);
//alert(audioname)
}
else{
setTimeout(function(){
game.playAudio('..','extension',exName,audioname);
},3000)
//alert(audioname)
}
}
else{
setTimeout(function(){
game.playAudio('..','extension',exName,name+"ShaAudio");
//alert(name+"ShaAudio")
},3000)
}
},
}
break;
}
return lib.skill[skillName];
};
// ---------------------------------------测试------------------------------------------\\
window.KJ={
findFile:function(file,pos,fuc){
if(typeof pos==="number") pos=[[pos]];
if(!Array.isArray(pos[0])) pos=[pos];
if(!fuc) fuc=function(){};
function check(file){
if(file.indexOf(lib.assetURL)===0) return file.slice(69);
return file;
}
if(Array.isArray(file)){
for(var i=0;i<file .length;i++){
file[i]=check(file[i]);
}
}
else{
var only=true;
file=[check(file)];
}
var str=[];
var num=0;
var arr=[];
var arr2=[];
function re(file){
if(!file[num]){
if(only) fuc(arr[0],arr2[0])
fuc(arr,arr2);
}
else{
KJ.readFile(file[num],function(me){
me=me.split("\n");
var p=pos[num];
arr[num]=me[p[0]-1];
arr2[num]=me[p[0]-1][p[1]-1];
num++;
re(file);
});
}
}
re(file);
},
readFile:function(filename,callback,onerror){
if(window.resolveLocalFileSystemURL){
window.resolveLocalFileSystemURL(lib.assetURL,function(entry){
entry.getFile(filename,{},function(fileEntry){
fileEntry.file(function(fileToLoad){
var fileReader = new FileReader();
fileReader.onload = function(e){
callback(e.target.result);
};
fileReader.readAsText(fileToLoad);
},onerror);
},onerror);
},onerror);
}
else if(lib.node){
lib.node.fs.readFile(__dirname+'/'+filename,function(err,data){
if(err){
onerror(err);
}
else{
callback(data);
}
});
}
},
try:function(e){
e=(e||"");
//var message="KJZR=function(lib,game,ui,get,ai,_status,player,current){\n"+e+"\n}";
game.writeFile(e,"files/","测试.js",function(){
alert("完成!");
},function(er){
game.KJtranslateError(er);
});
},
do:function(num){
if(!num) num="";
KJ.readFile("files/测试"+num+".js",function(me){
try{
var libSkill=lib.skill;
var player=game.me;
var current=_status.event.player;
var value=eval(me);
//KJZR(lib,game,ui,get,ai,_status,player,current);
if(libSkill!==lib.skill) game.updateSkill();
return value;
}
catch(e){
e.KJstring=me;
game.KJtranslateError(e,"file");
}
},function(){
alert("没有文件");
});
},
ed:function (name,method){
if(!KJbeautify) return;
//没有导入beautify.js时,不执行此函数,防止报错
if(!name) return;
if(!method) method="num";
KJ.readFile("files/"+name+".js",function(me){
switch(method){
case 'num':
var reg=/^ *\d+ /;
var X=me.split('\n');
for(var i=0;i<X.length;i++){
X[i]=X[i].replace(reg,"");//去除每行开头的数字
}
var e="";
for(var i=0;i<X.length;i++){
var check=function(str){//定义一个检测空白行的函数
if(typeof str!=="string"||str==null||str==""||/^ +$/.test(str)) return true;
return false;
}
if(check(X[i])&&(check(X[i-1])||check(X[i+1]))) continue;//不会留有两行空格
if(/^分类: JavaScript/.test(X[i])) break;
if(/^复制代码/.test(X[i])||/^效果如下:*/.test(X[i])||/^返回主页/.test(X[i])||/^博客园/.test(X[i])) continue;
e+=X[i]+"\n";
}
//弄去一些广告
game.writeFile(e,"files/",name+".js",function(){
},function(er){
game.KJtranslateError(er);
});
break;
case 'G':
var reg=/^ *\d+ /;
var X=KJbeautify(me);
X=X.split('\n');
var e="";
for(var i=0;i<X.length;i++){
var check=function(str){
if(typeof str!=="string"||str==null||str==""||/^ +$/.test(str)) return true;
return false;
}
if(check(X[i])&&(check(X[i-1])||check(X[i+1]))) continue;
e+=X[i]+"\n";
}
game.writeFile(e,"files/",name+".js",function(){
},function(er){
game.KJtranslateError(er);
});
break;
/*
case 'Y':
do;
break;
case 'Y':
do;
break;
*/
default:
alert("无效方法");
}
},function(){
alert("没有文件");
});
},
CS:function(data,num){
KJ.try(data);
KJ.do(num);
}
};
try{
game.loadHelp("东方project","扩展外部帮助");
}
catch(e){
alert(e);
}
if(!game.KJloadExtensioning){
lib.extensionMenu.extension_未来科技.KJplayerAddSkill={
name:'<center>测 试 技 能</center>',
"intro":"开局为玩家添加指定技能",
"clear":true,
}
lib.extensionMenu.extension_未来科技.KJplayerAddSkilladd={
"name":"添加",
"clear":true,
"onclick":function(){
var p=prompt("开局为玩家添加指定技能,请输入技能英文名","");
if(p!==""&&p!==null){
if(!lib.skill[p]) alert("此技能不存在哦");
else{
if(!lib.config.KJplayerAddSkill) lib.config.KJplayerAddSkill=[];
lib.config.KJplayerAddSkill.add(p);
game.saveConfig("KJplayerAddSkill",lib.config.KJplayerAddSkill)
var str="【"+get.translation(p)+"】添加成功";
alert(str);
}
}
//else alert("空字符串");
}
}
}
if(lib.config.KJplayerAddSkill&&lib.config.KJplayerAddSkill.length){
//lib.config.KJplayerAddSkill
var ableextensions="";
var X=lib.config.KJplayerAddSkill;
for(var i=0;i<X.length;i++){
ableextensions+='<option value='+X[i]+'>'+get.translation(X[i])+'</option>';
}
var KJname='请选择需要删除的技能<br><select id="KJplayerAddSkill" size="1" style="width:180px">'+ableextensions+'</select>';
lib.extensionMenu.extension_未来科技.KJplayerAddSkill2={
"name":KJname,
"clear":true,
"nopointer":true,
}
lib.extensionMenu.extension_未来科技.KJplayerAddSkillDo={
"name":"删除",
"clear":true,
"onclick":function(){
var country=document.getElementById('KJplayerAddSkill');
var str=country.options[country.selectedIndex].value;
if(confirm('是否删除【'+get.translation(str)+'】?')){
if(!lib.config.KJplayerAddSkill.contains(str)) alert('请不要重复操作!');
else {
alert('删除成功');
lib.config.KJplayerAddSkill.remove(str);
game.saveConfig('KJplayerAddSkill',lib.config.KJplayerAddSkill);
}
}
},
}
lib.extensionMenu.extension_未来科技.KJplayerAddSkillAll={
"name":"全部删除",
"clear":true,
"onclick":function(){
if(confirm('是否删除所有技能?')){
game.saveConfig('KJplayerAddSkill',[]);
alert('清除完毕');
}
},
}
lib.skill._KJplayerAddSkill={
trigger:{
global:"gameStart"
},
priority:Infinity,
forced:true,
direct:true,
filter:function(event,player){
return player===game.me;
},
content:function(){
var X=lib.config.KJplayerAddSkill;
for(var i=0;i<X.length;i++){
player.addSkill(X[i]);
}
}
}
}
//game.otherUseCard();
//其他角色随机用牌
game.otherUseCard=function(){
for(var i=0;i<arguments.length;i++){
if(typeof arguments[i]==="number"){
var num=arguments[i];
}
else if(get.itemtype(arguments[i])=='players'){
var me=arguments[i];
}
else if(get.itemtype(arguments[i])=='player'){
var me=arguments[i];
}
else if(get.itemtype(arguments[i])=='card'){
var card=arguments[i];
}
else if((typeof arguments[i]==="object"&&arguments[i].name)){
var suit,number,nature;
if(arguments[i].suit){
suit=arguments[i].suit;
}else{
suit='';
}
if(arguments[i].number){
number=arguments[i].number;
}else{
number='';
}
if(arguments[i].nature){
nature=arguments[i].nature;
}else{
nature='';
}
var card=game.createCard(arguments[i].name,suit,number,nature);
card.destroyed = true;
}
}//参数
var other=[];
if(!me) var me=game.me;
for(var i=0;i<game.players.length;i++){
if(game.players[i]!==me) other.add(game.players[i]);
}
if(typeof num==="undefined") var num=1;
if(num<=0) return;
if(num===1) var players=[other.randomGet()];
else var players=other.randomGets(num);
//随机其他人
for(var i=0;i<players.length;i++){
players[i].useCard(card,me);
}
}
// ---------------------------------------基本属性------------------------------------------\\
//为了实现暂时死亡复活的技能
lib.skill._timedie={
trigger:{
player:'dieAfter',
},
direct:true,
forceDie:true,
forced:true,
popup:false,
unique:true,
filter:function(event,player){
return player.hasSkill('timedie');
},
content:function(){
player.markSkill('timedie');
},
},
lib.skill.timedie={
init:function (player){
if(!player.storage.timedie2) player.storage.timedie2=0;
},
intro:{
name:'复活倒计时',
content:function (storage){
return '你在'+storage+'个角色死亡时复活';
},
},
marktext:"复",
mark:true,
trigger:{
global:'dieBegin',
},
direct:true,
forceDie:true,
forced:true,
popup:false,
unique:true,
filter:function(event,player){
return player.storage.timedie&&event.player!=player&&player.isDead();
return false;
},
content:function(){
"step 0"
player.storage.timedie2++;
"step 1"
if(player.storage.timedie2<player.storage.timedie) event.finish();
"step 2"
if(player.storage.alivenum<0) player.revive(player.maxHp);
else player.revive(player.storage.alivenum);
if(player.storage.drawnum>0) player.draw(player.storage.drawnum);
player.unmarkSkill('timedie');
delete player.storage.alivenum;
delete player.storage.drawnum;
delete player.storage.timedie;
},
},
//暂时死亡函数,无时机
lib.element.player.timedie=function(time,num,num2){
"step 0"
event.forceDie=true;
if(time<0||num<0||num2<0) return;
this.die();
"step 1"
if(typeof time!='number') time=1;
if(typeof num!='number') num=-1;
if(typeof num2!='number') num=0;
game.log(this,'将在'+get.cnNumber(time)+'名角色死亡后复活');
this.storage.timedie=time;
this.storage.alivenum=num;
this.storage.drawnum=num2;
this.syncStorage('timedie');
this.addSkill('timedie')
this.update();
},
lib.element.content.useModSha=function(){
"step 0"
if(event.unequip) player.addSkill('unequip');
if(event.direct) player.addSkill('shadirectall');
if(event.baseDamage){
player.storage.KJmodSha_baseDamage=event.baseDamage;
player.addSkill('KJmodSha_baseDamage');
}
if(event.extraDamage){
player.storage.KJmodSha_extraDamage=event.extraDamage;
player.addSkill('KJmodSha_extraDamage');
}
"step 1"
//alert(event.direct);
player.useCard.apply(player,event.arg);
"step 2"
if(event.unequip) player.removeSkill('unequip');
if(event.direct) player.removeSkill('shadirectall');
if(event.baseDamage){
player.storage.KJmodSha_baseDamage=0;
player.removeSkill('KJmodSha_baseDamage');
}
if(event.extraDamage){
player.storage.KJmodSha_extraDamage=0;
player.removeSkill('KJmodSha_extraDamage');
}
}
//game.me.useModSha(game.zhu,{direct:true,baseDamage:1})
lib.element.player.useModSha=function(...X){
var next=game.createEvent('useModSha',false);
var card={name:"sha"};
for(var i=0;i<X.length;i++){
if(get.itemtype(X[i])=='card'){
//alert(1)
var dinged=true;
}
else if(typeof X[i]=='object'&&X[i]&&X[i].name&&get.itemtype(X[i])!=='player'&&get.itemtype(X[i])!=='players'){
var dinged=true;
//alert(2)
}
else{
if(typeof X[i]==='object'&&X[i].mod){
var mod=X[i];
X.remove(X[i]);
}
}
}
if(!dinged) X.push(card);
//alert(mod)
if(mod){
for(var i in mod){
//alert(i)
switch(i){
case 'unequip':
next.unequip=true;
break;
case 'baseDamage':
next.baseDamage=mod[i];
break;
case 'extraDamage'://只对特定的目标有效,不对额外的有效
next.extraDamage=mod[i];
break;
case 'direct':
next.direct=true;
break;
}
}
}
next.arg=X;
next.player=this;
next.setContent("useModSha");
}
lib.skill.KJmodSha_baseDamage={
trigger:{player:'useCard'},
filter:function(event){
return event.card&&event.card.name=='sha';
},
forced:true,
popup:false,
unique:true,
direct:true,
superCharlotte:true,
charlotte:true,
content:function(){
if(!trigger.baseDamage) trigger.baseDamage=1;
trigger.baseDamage+=player.storage.KJmodSha_baseDamage;
//alert(trigger.baseDamage)
},
}
lib.skill.KJmodSha_extraDamage={
audio:2,
trigger:{player:'shaBegin'},
forced:true,
popup:false,
unique:true,
direct:true,
superCharlotte:true,
charlotte:true,
content:function (){
if(typeof trigger.extraDamage!='number') trigger.extraDamage=0;
trigger.extraDamage+=player.storage.KJmodSha_extraDamage;
},
}
//技能次数
//get函数
var pack={
get:{
other:function(pl){
var players=game.players.slice();
players.remove(pl);
return players.randomGet();
},
killNum:function (target){
var num=0;
for(var j=0;j<target.stat.length;j++){
if(target.stat[j].kill!=undefined) num+=target.stat[j].kill;
}
return num;
},
egname:function(tra,type){
if(!type) var all=true;
else{
if(type="skill") var skill=true;
if(type="card") var card=true;
}
if(!tra) return;
var cards=[];
var skills=[];
if(card||all){
for(var i in lib.card){
var name=get.translation(i);
if(name===tra) cards.add(i);
}
}
if(skill||all){
for(var i in lib.skill){
var name=get.translation(i);
if(name===tra) skills.add(i);
}
}
var result="";
if(cards&&cards.length) result+="卡牌:"+cards+"<br>";
if(skills&&skills.length) result+="技能:"+skills;
return result;
},
truename:function(pe){
if(get.itemtype(pe)=="player"){
if(get.mode()=="guozhan") return pe.name1;
else return pe.name;
}
else return;
}
}
}
for(var i in pack.get) get[i]=pack.get[i];
// ---------------------------------------设置------------------------------------------\\
//报错
lib.KJtranslateMessage={
"is not defined":"尚未定义",
"is not a function":"不是一个函数",
"Maximum call stack size exceeded":"超出了最大调用堆栈大小",
"Cannot read property":["不能读取未定义的属性","of undefined"],
"Cannot set property":["不能设置未定义的属性","of undefined"],
"Invalid regular expression:":["无效的正则表达式分组",": Invalid group"],
"Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #":
"无效的属性描述符。不能同时指定访问器和值或可写属性,#"
}
lib.KJtranslateReason={
"Maximum call stack size exceeded":"原因是每次执行代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,成千上万个此类空间累积起来,自然就超过线程的栈空间了。"+
"<li>可能运用了递归运算(即在函数内部调用本体),递归非常耗费内存,因为需要同时保存成千上百个调用记录,很容易发生\"栈溢出\"错误(stack overflow)"+
"<li>反复调用函数,即函数复函数",
"is not a function":"<li>该函数未定义直接使用,很可能函数名写错了"+
"<li>类型错误。一些函数只能针对于指定类型的对象,说明该对象的类型不对或未定义,如:"+
"<li>X.replace 不是一个函数,说明X不是字符串",
"Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #":
"使用Object.defineProperty修改的东西产生冲突,你要知道get与set,value和writable只能存在一组"
}
//翻译库
game.KJtranslateError=function(e,file){
console.log(e);
var reason="";
var message="错误信息:"+(e.message||e)+"<br>";
for(var i in lib.KJtranslateMessage){
if(Array.isArray(lib.KJtranslateMessage[i])){
var first=lib.KJtranslateMessage[i][0];
var second=lib.KJtranslateMessage[i][1];
if(message.indexOf(i)!==-1&&message.indexOf(second)!==-1) reason+="错误原因:"+lib.KJtranslateReason[i]+"<br>";
while(message.indexOf(i)!==-1&&message.indexOf(second)!==-1){
message=message.replace(i,first);
message=message.replace(second,"");
}
}
else
if(message.indexOf(i)!==-1) reason+="错误原因:"+lib.KJtranslateReason[i]+"<br>";
while(message.indexOf(i)!==-1) message=message.replace(i,lib.KJtranslateMessage[i]);
}
//错误信息翻译
var str='游戏出错:<br>' + _status.event.name + '的步骤' + get.cnNumber(_status.event.step,true);
str+='<br>'+_status.event.parent.name+"的步骤"+get.cnNumber(_status.event.parent.step,true);
str+='<br>'+_status.event.parent.parent.name+"的步骤"+get.cnNumber(_status.event.parent.parent.step,true);
var evt=_status.event;
if(evt.player||evt.target||evt.source||evt.skill||evt.card){
str+='<br>-------------'
}
if(evt.player){
str+='<br>错误角色: '+get.translation(evt.player)+"|" + get.truename(evt.player);
}
if(evt.target){
str+='<br>目标: ' +get.translation(evt.target)+"|"+ get.truename(evt.target);
}
if(evt.source){
str+='<br>事件来源角色: ' +get.translation(evt.source)+"|" +get.truename(evt.source);
}
if(evt.skill){
str+='<br>错误技能: ' +get.translation(evt.skill)+"|"+ evt.skill;
}
if(evt.card){
str+='<br>卡牌: ' +get.translation(evt.card)+"|"+ evt.card.name;
}
str+='<br>-------------<br>';
switch(e.name){
/*eg:
case "":
var name="错误类型:(错误)<br>可能原因:<li><li><br>";
break;
*/
case 'SyntaxError':
var name="错误类型:SyntaxError(语法错误)<br>可能原因:<li>变量名不符合规范<li>给关键字赋值,如function<br>";
break;
case 'ReferenceError':
var name="错误类型:ReferenceError(引用错误)<br>引用一个不存在的变量时发生的错误。将一个值分配给无法分配的对象,比如对函数的运行结果或者函数赋值。<br>可能原因:<li>引用了不存在的变量<li>给一个无法被赋值的对象赋值<br>";
break;
case "RangeError":
var name="错误类型:RangeError(范围错误)<br>RangeError是当一个只超出有效范围时发生的错误。主要的有几种情况,第一是数组长度为负数,第二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。<br>可能原因:<li>数组长度为负数<li>number对象的方法参数超出范围<br>";
break;
case "TypeError":
var name="错误类型:TypeError(类型错误)<br>变量或参数不是预期类型时发生的错误。比如使用new字符串、布尔值等原始类型和调用对象不存在的方法就会抛出这种错误,因为new命令的参数应该是一个构造函数。<br>可能原因:<li>调用不存在的方法<li>new关键字后接基本类型<br>";
break;
case "URIError":
var name="错误类型:URIError(URL错误)<br>主要是相关函数的参数不正确。<br>可能原因:<li>URI相关参数不正确时抛出的错误,主要涉及encodeURI、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()六个函数<li>待补充<br>";
break;
default:
var name="错误类型:"+e.name+"<br>";
}