noname无名杀1武将说明文档

noname无名杀1武将说明文档

2023.2.13


杀友们:

你们好!我是余既成,英文名Reagan·Ⅹ(里根十世),没有我,你得不到三连啊


前言

​ 无名杀武将说明文档,从2023年2月开始写起,那也是编者入坑无名杀的时间。你可以看到,在贴吧、无名杀网站和QQ群,都有一些教程,但都不够入门和全面。因此,这就是为什么这份文档会诞生。

​ 0基础的萌新可以在看完第一章之后,你可以直接跳转到第九章:Come on!来制作一名武将/模式吧 这一章节,你可以从这里正式开始。用少量的知识就能做自己的武将,难道还不够振奋人心吗?

​ 当然,如果你已经有了JavaScript基础,你可以跳过第一章,但是你仍然需要看第一章的1.18节,这非常重要。

​ 如果你已经练习两年半的无名杀,那么我相信你一定不需要这份文档,因为受众不同嘛,这份文档是为萌新们准备的,但你仍然可以为开源做出贡献,发布自己的无名杀武将开发教程,将无名杀与开源的理念传播到蒲公英能够旅行到的每一个地方。

​ 第一章是Js基础与noname。这一章主要是JavaScript的快速入门以及noname部分源码解读。这部分非常重要而且基础。

​ 第二章是和面杀的基本联系。相信每一个杀友,都或多或少的接触过面杀。这部分主要是为萌新引路,用编程的思想解释面杀中的步骤。

​ 第三章是简单概念和函数。这一部分主要列举了常用的对象的属性和方法,记不住?这不需要记得住,大不了查文档嘛!

​ 第四章是组件ui,这一部分是chooseButton做出来的各种ui组件,你可以封装它,这是自由的。

​ 第五章是基本框架。这一部分主要是讲解一些技能应该如何去分解和编写,有框架可以直接使用,效率翻倍。

​ 第六章是Ai,这一章主要写Ai这一部分的作用。这一章也是非常重要的。

​ 第七章是武将设计哲学。在不停的设计和对战中,难免会感到枯燥和乏味。这就带来了:数值膨胀和机制膨胀。一个很典型的数值膨胀的例子就是徐盛和界徐盛。而数值膨胀的终点在哪里呢?十周年已经给出了答案。在人人都是阴间的环境里面,追求数值膨胀是没有意义的。那么,机制膨胀呢?转换技、翻面、觉醒技等机制在刚出来时是那么新颖和优秀,而差的机制也被人唾弃。追求绝对的机制,尽头是什么呢?这里留给读者自己思考,编者认为:无名杀社区抗性1.0时代已经给出了答案。

​ 第八章是武将案例解析。这里会解析一些武将的代码以及其设计,你可以不看。

​ 第九章是0基础萌新的起点,也是编者最先写完的部分,相信你一定对此有所收获,增长见识。

​ 第十章是大佬语录,主要是大佬们水群时的“惊人之语“,编者把它放在这里供大家娱乐,闲的没事干的时候翻出来看看也是很有意思的。

​ 第十一章是给读者的话,编者希望每一位热爱开源的玩家都能秉持开源的精神和理念,这是伟大而且可以实现的,而你我都是建设者。

​ 第十一章是附录,主要是写一些附录应该写的东西。

​ 好,内容就介绍到这里,开启你的无名杀之旅吧!相信你可以从中获得好玩的知识,和你的朋友分享快乐。

一、Js基础与noname

1.0 Js介绍

1.0.0 Js简介

Js快速入门=>

Js是什么?

Js是什么?JavaScript是一种运行在客户端(浏览器)的编程语言,是web开发非常好用的语言。关于Js的第一印象,您只需要知道这个就足够啦!

Js能够做什么?

当然可以用来开发noname!

网页特效、表单验证(你输入的手机号合不合法)、数据交互、node.js。

Js是由哪些组成的?分类?

ECMAScript(Js语言基础)、Web APIs(DOM页面文档对象模型+BOM浏览器对象模型)

Js语言基础包含哪些玩意?

就是Js的语法核心知识。比如:变量、分支语句、循环语句、对象等等。

DOM是啥玩意?

 操作文档。主要是对页面元素进行移动、大小、添加删除等操作。

BOM是啥玩意?

 操作浏览器。比如:页面弹窗、检测窗口宽度、存储数据到浏览器等。

Js写在哪里?

内部:直接写在HTML里,用script标签括住。规范:script标签写在上面。

外部:代码写在以.js为结尾的文件里面。通过script标签,引入到HTML页面中。没错,noname就是这么做的。

行内:内联Js,代码写在标签内部的。

关于注释?

 单行注释与多行注释,在vscode中的快捷键分别为Ctrl+/和Ctrl+Alt+a

关于结束符?

;可以省略。但是要么每一句都写,要么都不写。Noname是每句都写的。

1.0.1 输入与输出

输出:

1
2
3
4
5
document.write(‘you want write....’)// 也可以里面写标签,向body里面输出东西。

alert()//弹出警示窗

console.log()//控制台输出

输入:

1
promote()//弹窗输入

1.0.2 字面量

[]数组字面量

{}对象字面量

字符串字面量

数字字面量

。。。。。。

1.1 变量

变量是什么?是一个‘装东西的盒子’,是容器。

声明变量(创建变量、定义变量):使用let关键字:let age;

变量赋值。使用“=”来给变量赋值。age=18;

更新变量。age=19;

交换变量。使用temp临时变量来交换两个变量。

命名规范。

let和var的区别?

var是以前声明变量的方式,有很多问题。当然是使用let了,现在谁TM还用var啊。

数组。Array。使用[]来定义。let arr=[];每个数据之间使用英文逗号隔开。

数组的索引?可以使用**arr[x]**来索引。

数组的长度?使用arr.length属性来获得。

1.2 常量

使用const声明的变量,而不是let。命名规范和变量一样。需要注意的是,常量不允许重新赋值,声明的时候必须初始化(赋值)。

1
const G=‘noname’;
数据类型 描述 案例
基本数据类型 number 只要是个数字,就是number类型 18,18.88,-18,
string 单引号,双引号,反引号`包裹的数据都是字符串 noname,123
boolean 有两个固定的值:true和false let hasGudingdao=true;
undefined 只声明变量但不赋值,变量默认就是undefined let num; // undefined
null 代表空、无、值未知的特殊值。 let obj = null;
引用数据类型 object对象

1.3 数据类型

number类型的操作:

算术运算符(数学运算符) 案例
加(求和) + 3+2=5
减(求差) - 3-2=1
乘(求积) ***** 3*2=6
除(求商) / 4/2=2
取余(取模) % 3%5=3

string类型的操作–字符串拼接:

使用+来拼接字符串。比如:’noname’+’现任更新者是唐家三少’

模板字符串:

使用反引号``来拼接内容变量。在内容拼接变量时,用**${ }**包住变量。

比如:

1
2
3
let age = 18;

console.log(我是个${age}岁的阳光开朗大男孩,一刀便砍了4血);

null:

null 是一个作为尚未创建的对象。将来有个变量,里面会存一个对象。但是对象还没有创建好,就先给个null。

null 表示赋值了,但是内容为空。undefined表示还没有赋值。

typeof 关键字:

1
2
3
typeof x

typeof(x)

这两种都可以。

1.4 类型转换

隐式转换与显式转换

隐式转换:系统自动给你转了,yyds。+号作为正号解析可以转换为数字型。比如:console.log(+’12138’)

显式转换:

语法 描述 案例
转换为数字型 Number(数据) 转成数字类型,转失败为NaN
parseInt(数据) 只保留整数
parseFloat(数据) 可以保留小数
转换为boolean ‘’、0、undefined、null、false、NaN转换为boolean都是false,其余为true

1.5 运算符

1.5.0 赋值运算符

对变量进行赋值的运算符。

比如:=,+=,-=之类的。

1.5.1 一元运算符

根据所需表达式个数可以分为一元运算符、二元运算符、三元运算符

正负号:+4、-2

自增:2++、3–、++2、–3

1.5.2 比较运算符

比较运算符 描述
> 左边是否大于右边
< 左边是否小于右边
>= 左边是否大于或等于右边
<= 左边是否小于或等于右边
== 左右两边值是否相等
=== 左右两边是否类型和值都相等
!== 左右两边是否不全等

字符串比较,比较的是ASCII码值,没啥意义。

1.5.3 逻辑运算符

符号 名称 日常读法 特点 口诀
&& 逻辑与 并且 两边都是true,才为true 一假则假
|| 逻辑或 或者 两边有一个true就是true 一真则真
逻辑非 取反 true变false false变true 真变假,假变真

1.5 Js****表达式与语句

在HTML中,Js语句是有由Web浏览器执行的指令。这些指令会被按照编写的顺序逐一执行。这些语句需要使用英文的分号来隔开。你当然可以在同一写行写多条语句。强烈建议,以分号结束语句,尽管您可能会在网上看到不带分号的例子。

关于Js中的空白字符,为了增强可读性,添加合适的空格是必要的,特别是在运算符旁边增加也相当不错。

代码块,是用{}组合在一起的代码,定义一同执行的语句。

和表达式有什么区别吗?

表达式是可以被求值的代码。语句是一段可以执行的代码。语句不一定有值。表达式会可以写在赋值语句的右侧。

1.6 分支语句

1.6.0 if分支语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//单分支:
if(条件){
满足条件执行代码
}
//双分支:
if(条件){
满足条件执行代码
}else{
不满足条件执行代码
}
//多分支:
if(条件1){
满足条件1执行代码
}else if(条件2){
满足条件2执行代码
}else if(条件3){
满足条件3执行代码
}else{
都不满足执行代码
}

1.6.1 三元运算符

条件?满足条件执行代码:不满足条件执行代码

一般用来取值

1.6.2 switch语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(数据){
case(值1)
代码1
break
case(值2)
代码2
break
case(值3)
代码3
break
default:
代码n
break
}

若没有全===就执行default里面的代码。不适合做区间判断。没有break会造成case穿透。

1.7 循环语句

while循环

1
2
3
4
5
while(循环条件){

要重复执行的代码(循环体)

}

循环退出?

break和continue。这两玩意和其他语言里面的一样。

1
2
3
4
5
6
7
// for循环

for(变量起始值;终止条件;变量变化量){

循环体

}

1.8 数组

1.8.0 数组?

数组是个数据类型,按顺序保存数据。

1
let 数组名=[ ]

1.8.1 数组增

1
2
3
4
5
6
7
8
arr.push(新增的内容)

arr.push(新增的内容) //会把一个或多个元素添加到数组的末尾,并返回该数组的新长度。

arr.unshift(新增的内容)

arr.unshift(新增的内容) //会把一个或多个元素添加到数组的开头,并返回该数组的新长度。

1.8.2 数组删

1
2
3
4
5
6
7
8
9
arr.pop() //从数组中删除最后一个元素,并返回删除的值。

arr.shift()

arr.shift() //从数组中删除第一个元素,并返回删除的值。

arr.splice(删除的下标,删除的个数)

arr.splice(删除的下标,删除的个数) //删除数组中的元素,并返回被删除元素的数组。

1.8.3 数组改

1
数组[下标]=数据

1.8.4 数组查

1
数组[下标]

1.8.5 数组取反

1.8.6 数组vs数组

1.9 函数

函数声明:

1
function 函数名(){函数体}

函数传参:

1
function 函数名(参数列表){函数体}

关于函数的动态参数?

arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参。

关于函数的剩余参数?

允许将一个不定数量的参数传入。

…arr这玩意是真数组,接收最末的剩余的实参。使用的时候不需要写…

展开运算符?

可以合并数组。求数组最大值,最小值。

1
Max.min(...arr)

函数的返回值:

return 后面没写东西,默认为undefined。

函数的作用域:

可用性的代码范围。

匿名函数:(函数表达式)

1
function(){}

这玩意没法直接用。是赋给某个变量,通过调某个变量名用的。必须先声明后调用。

立即执行函数:

1
2
3
4
//方式1:
(function( ) {console.log() } )( );
//方式2:
(function( ) {console.log() } ( ));

可以避免全局变量的污染。

箭头函数?

箭头函数更适合替代原本就需要使用匿名函数的地方。

形参小括号指向函数体。

1
const a=()=>{}

如果只有一个形参,那么你可以省略小括号。

1
const a=b=>{}

如果只有一行代码,那么可以省略大括号。

1
2
const a=b=>log(a)
const a=b=>b+b

return也能省略

这玩意没有动态参数,只有剩余参数。

解构赋值

数组解构

1
[ ]=[ ]

对象解构

1
{ }={ }

遍历数组forEach()方法

1
2
3
被遍历的数组.forEach(function(当前数组元素[,当前元素索引]){

})

逻辑中断

符号 短路条件
&& 左边为false就短路
|| 左边为true就短路

一般被用在变量赋值。

1.10 对象

据说,对象学好了,以后不愁找对象!因为Js里面的对象非常多!

对象也是一种数据类型。直接棒打狗男女!

声明对象:

1
2
3
4
5
6
7
8
9
let 对象名 = {

属性名:属性值,

方法名:函数

}

let 对象名 = new Object()

对象使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
//对象属性增:
对象名.新属性名=新值

//对象属性删:
delete 对象名.属性名

//对象属性改:
对象.属性=值

//对象属性查:
对象.属性
对象[属性]

对象中的方法:

就是个匿名函数。

方法名:function(){}

遍历对象:

1
2
3
4
for(let k in obj){
console.log(i)

}

这玩意搞出来的是字符串类型的属性名,不能直接obj.k直接用。可以用obj[k]

内置对象:

Math

方法 描述
Math.random() 生成0-1之间的随机数(不包括1)
Math.ceil() 向上取整
Math.door() 向下取整
Math.max() 最大值
Math.min() 最小值
Math.pow() 幂运算
Math.abs() 绝对值
Math.round() 舍入为最接近的整数
Math.sign() 返回数的符号
Math.sqrt() 返回平方根

1.11 值类型与引用类型

简单类型,又叫做基本数据类型、值类型。复杂类型又叫做引用类型。

值类型存储值本身,放在栈里面,引用类型存储的是引用(内存地址),放在堆里面。

1.12 深拷贝与浅拷贝

  经常会遇到需要复制对象或者数组的情况,但是有的时候它并不像我们预期的那样工作。

  浅拷贝是对象的逐位复制。创建一个新对象,该对象具有原始对象中值的精确副本。如果对象的任何字段是对其他对象的引用,则只复制引用地址,即,复制内存地址。【默认情况下引用类型(object)都是浅拷贝】

简单理解就是:浅拷贝复制的是对象的引用地址,没有开辟新的栈,复制的结果是两个对象指向同一个地址,所以修改其中一个对象的属性,另一个对象的属性也跟着改变了。

 深拷贝复制所有字段,并复制字段所指向的动态分配内存。深拷贝发生在对象及其引用的对象被复制时。【默认情况下基本数据类型(number,string,null,undefined,boolean)都是深拷贝。】嗯,就是和上面的值类型存储有关系。

如何实现数组的深拷贝?

1.使用slice()

2.使用concat()

3.ES6扩展运算符

4.Array.form()

如何实现对象的深拷贝?

Object.assign()拷贝的是(可枚举)属性值。假如源值是一个对象的引用,它仅仅会复制其引用值。

也就是说:如果对象的属性值为简单类型(如Number,String),通过Object.assign({},Obj)得到的新对象为深拷贝;如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的。

浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;

深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变

第三种创建对象

自定义构造函数

简单说。。。就是new一个!

静态方法

1
2
3
4
Object.keys(a)

Object.values(a)

Object.assign(a,b)a是新的copy好的,b是要copy的对象。给对象加属性用的。

内置构造函数–数组array

1
arr.reduce(function(a,b){},c)

1.13 Node.js®

1.13.0 nodejs介绍

Node.js是一个开源的、跨平台的JavaScrip运行环境。可以开发服务器应用、开发工具类应用、开发桌面端应用。

1.13.1 开发服务器端应用

用户可以通过访问浏览器url,就可以看到应用

1.13.2 开发工具类应用

比如:Webpack、Vite、Babel

1.13.3 开发桌面端应用

VScode、Figma、Postman

1.13.4 开始

1.13.4.-2 npm介绍

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题。

换镜像源:

1
npm config set registry http://registry.npmmirror.com

安装模块

1
npm install <Module Name>

查看模块版本

1
npm list -g

卸载模块

1
npm uninstall express

更新模块

1
npm update express

搜索模块

1
npm search express

创建模块

1
npm init

删除以前安装的模块

1
npm cache clean

1.13.4.-1 package.json

package.json 位于模块的目录下,用于定义包的属性。

属性说明(具体查看:https://docs.npmjs.com/cli/v9/configuring-npm/package-json)

属性 说明
name 包名
version 版本号
description 描述
homepage 官网url
author 作者名字
contributors 其他贡献者名字
dependencies 依赖包列表,别人安装项目时,会安装里面的依赖
repository 包代码存放的地方类型,git、svn
main 程序的入口文件,默认为根目录下面的index.js
keywords 项目关键字,可用于npm官网搜索
bugs 提交bug的方式
license 证书
funding
files 别人安装包时,所需要安装的文件
browser 同main,当包为web包时,优先级比main高
bin 定义了可执行文件
man 项目手册地址
directories
scripts 配置了可以被npm执行的命令
config 设置配置属性,配合scripts使用
devDependencies 项目依赖,别人使用该项目时不会安装里面的依赖
peerDependencies 声明使用该插件时,宿主环境必须存在的插件
peerDependenciesMeta
bundleDependencies 执行npm pack时,这里的依赖会作为该项目的一部分一起打包
optionalDependencies 可缺省的依赖
overrides
engines 指定代码运行环境
os 指定代码运行时的操作系统
cpu {Object},指定代码运行时的cpu架构
private {Boolean},设置为true,npm模块不会发布成功
publishConfig 发布时的一些配置
workspaces
maintainters 维护者

node里面不允许使用DOM和BOM

1.13.4.0 Buffer

Buffer是[缓冲区],是一个类似于Array的对象,用于表示固定长度的字节序列

1
2
3
4
5
6
7
8
9
10
11
12
13
let buf =Buffer.alloc(10);

let buf_2=Buffer.allocUnsafe(10); //速度快,但是内存不会在创建时清零

let buf_3=Buffer.from("hello"); // 转成数字存到buf中

let buf_4=Buffer.from([1,2,]);

// 转换为字符串,toString方法,默认utf-8编码,x为你想要几进制的
let buf_4.toString(x);

/// 可以通过 [下标] 的方式获取元素

1.13.4.1 fs模块(file system)

导入模块

1
2
3
4
const fs =require('fs');

// ES6语法:
import {writeFileSync} from 'fs';

文件的创建

1
fs.writeFile(file,data[,options],callback)
  • file 文件名
  • data 待写入的数据
  • options 选项设置(可选)
  • callback 写入回调,写入完成之后调用函数,将错误传递给这个函数

返回值为undefined

1
2
3
4
5
6
7
8
9
const fs =require('fs');

fs.writeFile('./hello.js','hello',err=>{
if(err){
return "fail"
}else{
return "OK"
}
});

文件的删除

文件重命名

文件的移动

文件的读取

1
2
3
fs.readFile('./hello.txt')

fs.readFileSync('./hello.txt')

文件的写入

同步

1
fs.writeFileSync('./hello.txt','hello')

追加写入

1
2
fs.appendFile();
fs.appendFileSync();

流式写入

1
2
3
4
5
6
7
// 创建写入流对象
const ws = fs.creatWriteStream();
// write
ws.write("我是里根十世");
ws.write("这里是无名杀的世界");
// 关闭通道
ws.close();

相当于存档,想写就写。

文件夹操作

1.14 HTML5

1.14.0 W3C标准

结构 主要是学习HTML

表现 CSS

行为 Js

1.14.1 HTML标签

1.14.1.0 HTML语法规范

1.14.1.1 HTML 基本结构标签

1.14.1.2 开发工具

1.14.1.3 HTML常用标签

<></>

1.14.1.4 HTML中的注释和特殊字符

1.15 CSS3

1.16 DOM

DOM ,文档对象类型。BOM,浏览器对象类型。

通过Js方式,控制标签、图片。这就是DOM的内容

BOM,就是控制浏览器,比如alert()弹窗。

就是如此简单!

API由DOM和BOM组成,DOM是文档对象类型。可以用来操作网页内容。可以开发常见的网页特效,等等等等。

DOM树?

就是将HTML文档以树状结构直观的表现出来。称之为文档或DOM树。可以直观的体现标签和标签的关系。

1
2
3
4
document.querySelector(‘选择器’)

document.querySelectorAll(‘选择器’)

使用const更好。

1
const lis=document. querySelectorAll(‘ul li’)

这玩意获取到的数组并不是真的数组,是个伪数组。

和css一样,class是 .box ,#box是

其他获取元素方式:

1
2
3
4
5
6
document.getElementById( ) //获取id第一个元素

document.getElementsByTagName( ) //获取第一类元素

document.getElementsByCalssName( ) //获取类名为w的元素

操作元素内容?

1
2
3
4
对象.innerText //属性,不解析标签

对象.innerHTML //属性,会解析标签

操作元素常用属性?

对象.属性=值

Herf、title、src

操作元素样式属性?

1
对象.style.样式属性=值

先获取,然后再:

1
Box.style.width=’200px’

如果要修改的比较多?

操作类名操作样式:

1
2
3
4
5
6
7
8
9
10
11
12
//元素.className=’active’,须保留之前的类名,如果有的话。

//通过classList操作类控制css

//为了解决className容易覆盖以前的类名,我们可以通过classList的方式追加和删除类名

元素.classList.add() //追加

元素.classList.remove()//删除

元素.classList.toggle()//切换

随机数?

1
parseInt(Math.random()*数组长度)

返回数组下标

操作表单属性

DOM对象.属性名

DOM对象.属性名=新值

自定义属性

我的属性我说了算!

属性分两种:标准属性和自定义属性。

标准属性就是标签天生就自带的属性。class、id、title等

自定义的属性就是:data-自定义属性(html5),在标签上一律以data-开头。在DOM对象上一律以dataset对象方式获取。

对象.dataset.自定义属性

获取这个玩意

定时器

开启:setInterval(函数名,间隔时间)

返回值为该定时器的id,因此要用let而非const给他接收返回值。

关闭:clearInterval(n)

事件监听

元素对象.addEventListener(‘事件类型’,要执行的函数)

事件类型

鼠标事件 click鼠标点击 mouseenter鼠标经过 mouseleave鼠标离开

焦点事件 focus 获得焦点 blur失去焦点

键盘事件 Keydown键盘按下触发 Keyup 键盘抬起触发

文本事件 input用户输入触发

事件对象event

一般是命名为event,ev,e

就是上面的那个“要执行的函数”里面参数的第一个,就是事件对象

常用部分属性:

type 获取当前事件类型

clientX\clientY 获取光标相对于浏览器可见窗口左上角的位置

offsetX\offsetY 获取光标相当于当前DOM元素左上角的值

key 用户按下键盘的值

环境对象

函数内部特殊变量this,代表当前函数运行时所处的环境。

谁调用,this就是谁

1.17 BOM

1.18 Noname中的Js

1.18.0 Noname介绍

1.18.1 game.js

1.18.2 被重写的函数

无名杀也重写了一些函数以便开发使用。这些函数有:

函数 描述 示例

1.18.3 filter的参数

1
2
3
filter:function(event,player){
return true
}

filter:function(event,player){}里面的参数,为固定位置的参数。参数名称event,player与叫什么名字无关,和顺序有关。

比较简写的是:

1
2
3
filter:function(e,p){  //event,player
return true
}

可能会感到疑惑,为何filter里面没有trigger,而是event?

不如我们来尝试一下,看看filter的参数都是些什么。

1
2
3
4
5
6
7
function reg(x){
var k = 0;
for(i in x){
game.log(k,i,x[i]);
k++;
}
}

很明显可以看到,filter中的event参数就是trigger。那么,第二个参数是player,也就是这个技能的所有者。那么,剩下的参数呢?

我们会发现,剩下的参数始终为trigger触发器所触发的事件名,也就是name。从第三个参数开始,你无论写多少个参数,写什么参数,都是一样的。

也就是说,真正的参数应该是这样的:

1
2
3
4
filter:function(trigger,player[,name...]){ 
//如果传入了第三个参数name,那么这里的name其实就是trigger.name,类型为String
return true
}

1.18.4 parse

1.18.5 step与上一步的result

“step”是无名杀特有的东西。为了让玩家选择牌时停留,设计出这种玩意。

step上一步所

1.19 electron

1.19.0 基础

1.19.1 代码调试

1.19.2 进程通信IPC

预加载脚本,可以使用部分nodejs模块

1.19.3 窗口菜单

1.19.4 子窗口与模式窗口

二、基本逻辑!与面杀的实际联系

2.0 event事件

2.1 trigger对象

2.2 触发条件与前提条件

武将牌上的牌

在线下玩面杀时,如果你玩到钟会,你可能会看到“置于你的武将牌上,称为‘权’”这样的描述。在游戏中,你就会真的将一张牌置于武将牌上。因为武将牌上的牌属于十分特殊的区域。在无名杀中,有手牌区、判定区、装备区。也就是说,武将牌上的牌比较特殊。于是,我们可以将武将牌上的牌打一个标签(tag)。

2.1 标记

2.2 移出游戏

三、noname!简单概念与函数

3.0 简单概念

3.0.0 角色状态与基本属性(player)

在这里,我想要做这样一个工作。我将尝试查看player的所有属性和方法。当然,你也可以这么做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(var p in card){
game.log(p);
}

for(var p in event){
game.log(p);
}

for(var p in player){
game.log(p);
}
//也可以使用key和values

// 如果想要查看函数的参数?
alert(arguments)

相信我,你很快就能得到它的所有属性了,这是非常便利的。那么,下面来解释一下这些属性吧。这一节将从player讲起。

.属性/方法() 描述 .属性/方法() 描述 .属性/方法() 描述
.name 名称 .name1 名称 .sex 性别
.group 势力 .hp 体力值 .maxHp 体力上限
护驾 .seatNum 座位号 .phaseSkipped 回合是否被跳过
.isZhu 是否为主公/地主 .identityShown 身份是否被亮出 .playerid 玩家id
身份 .previousSeat 上一家 previous 上一家
.nextSeat 下一家 .next 下一家 showIdentity()
logAi() (国战)身份暴露程度 dieAfter2() dieAfter()
$dieAfter() getTopCards() 在特定场合摸牌和判定时(如智斗三国的个人牌堆)改变牌堆顶牌的获取方式 $phaseJudge()
$die() $dieflip() $damagepop()
$damage $fullscreenpop $recover
$coin $dust $epic
$legend $rare2 $epic2
$legend2 $ $fire
$thunder $gain2 $skill
$equip $gain $giveAuto
$give $throwxy2 $throwDice
$throwordered1 $throwordered $
$compare $throw $compareMultiple
$draw $drawAuto
getJudge() getEquip() canEquip()
mayHaveShan() hasCard() hasSha()
hasShan() isUnknown() hasWuxie()
hasUnknown() hasJudge() hasFriend()
hasSkillTag() hasGlobalTag() hasZhuSkill()
hasStockSkill() hasSkill() distanceFrom()
distanceTo() needsToDiscard() checkShow()
isOffline() isOnline() isOnline2()
isUnderControl() isUnseen() isMin()
isIn() 玩家是否进入游戏 isOut() 玩家是否移出游戏 isTurnedOver()
isLinked isMinEquip isMaxEquip
isMinHandcard isMaxHandcard isMaxCard
isMinCard isMaxHp isMinHp
isDamaged() 玩家是否受伤 isHealthy() 玩家是否没扣过血 isDead
isDying isEnemiesOf isAlive
isFriendOf isFriendsOf isEnemyOf
getFriends getEnemies getHandcardLimit
getGlobalTo getGlobalFrom getAttackRange
getCardUsable getLastStat quene
getStat getLastUsed hasAllHistory
getAllHistory getLastHistory hasHistory
getHistory checkConflict clearSkills
attitudeTo addTempSkill removeSkill
removeSkillTrigger removeEquipTrigger addEquipTrigger
checkMarks enableSkill disableSkill
restoreSkill awakenSkill removeAdditionalSkill
addAdditionalSkill addSkill addSkillLog
addSkillTrigger getSubPlayers exitSubPlayer
toggleSubPlayer callSubPlayer removeSubPlayer
addSubPlayer getUseValue hasValueTarget
canUse removeLink hasUseTarget
unmark addLink mark
markSkillCharacter unmarkSkill markCharacter
markSkill getStorage getExpansions
markAuto unmarkAuto showTimer
hideTimer popup_old _popup
popup prompt_old prompt
unprompt unwait logSkill
link skip wait
turnOver out in
judge addJudgeNext canAddJudge
addJudge 装备 addExpose
tempHide unMad goMad
isMad 复活 die
dying getDebuff getBuff
changeHujia changeHp gainMaxHp
loseMaxHp loseHp doubleDraw
recover damage lose
give addToExpansion gain
gainMultiple directgains directgain
$addToExpansion directequip swapHandcards
respond loseToDiscardpile randomGain
discard randomDiscard drawTo
draw useCard useSkill
moveCard useResult canMoveCard
viewHandcards viewCards showCards
showHandcards gainPlayerCard discardPlayerCard
choosePlayerCard chooseDrawRecover chooseBool
chooseControl chooseControlList chooseCardTarget
chooseTarget chooseUseTarget chooseCard
chooseCardOL chooseButtonOL chooseButton
chooseVCardButton chooseCardButton discoverCard
chooseSkill chooseToCompare chooseToDiscard
chooseToRespond chooseToUse
phaseJieshu phaseDiscard phaseDraw
phaseUse phaseJudge phaseZhunbei
phase insertEvent insertPhase
setIdentity playerfocus syncSkills
syncStorage get getSkills
getOriginalSkills countGainableCards countDiscardableCards
countCards getGainableSkills getGainableCards
getDiscardableCards getCards getStockSkills
countSkill countUsed getPrevious
line line2 getNext
updateMarks num updateMark
countMark hasMark removeMark
addMark flashAvatar update
setAvatarQuene setAvatar setNickname
getState applySkills showGiveup
emotion chat say
getId throwEmotion send
changeSeat getTop smoothAvatar
uninit getLeft initRoom
reinit initOL uninitOL
init enableJudge disableJudge
$enableJudge $disableJudge isEmpty
isDisabled $enableEquip enableEquip
$disableEquip disableEquip canCompare
swapEquip isPhaseUsing countDisabled
chooseToDisable chooseToEnable chooseToPSS
chooseToDuiben changeGroup getDamagedHp
inRange inRangeOf hasUsableCard
tryCardAnimate trySkillAnimate tryJudgeAnimate
$throwEmotion chooseToGuanxing chooseToMove
chooseToPlayBeatmap $showCharacter showCharacter
canSave removeGaintag addGaintag
loseToSpecial removeSkillBlocker addSkillBlocker
differentSexFrom sameSexAs hasSex
getSeatNum setSeatNum $changeZhuanhuanji
changeZhuanhuanji queneCount outCount
ai marks tempSkills
storgae actionHistory stat
judging popups damagepopups
forbiddenSkills awakenedSkills hiddenSkills
disabledSkills additionalSkills initedSkills
skills node phaseNumber
skipList
_noVibrate _giveUp _hoverfunc

player的属性:

  • player.name
    • player的name属性会
  • player.

player的方法:

3.0.0.0 角色player

我们经常可以看到这样的表述:其他角色xx阶段,一名玩家xxx,在noname里,技能触发、使用的时机是被写在trigger;{}里面的,具体写哪些,可以参考本篇“时机与阶段”。global是全场玩家,当然包括自己。那么,要想写其他玩家(除自己以外的玩家),就可以在 filter:function(){}里面填写。例如:除自己以外的玩家;其他角色出牌阶段开始时;

1
2
3
4
trigger:{global:"phaseUseBegin"},
filter:function (event,player){
return event.player!=player ;
},

除此之外,还有game.players,也是指全场玩家。

3.0.0.1 当前回合角色 _status.currentPhase

同样的,如果你的武将说明了“当前回合角色”

3.0.0.2

3.0.0.3

3.0.0.4

3.0.1时机与阶段、触发器(trigger)

3.0.1.0 时机与阶段

时机 描述 前缀 event.getParent(0~game)* trigger.name
gameStart 游戏开始,所有人都展示武将牌后(init) global 0trigger 1trigger 2arrangeTrigger 3game game
enterGame (init) player
gameDrawAfter 游戏发牌后 global 0trigger 1trigger 2arrangeTrigger 3gameDraw 4game gameDraw
roundStart 一轮开始时 global 0trigger 1trigger 2arrangeTrigger 3_turnover 4trigger 5arrangeTrigger 6phase 7phaseLoop 8game _turnover
phaseZhunbeiBegin 回合开始时 phaseZhunbei
phaseJieshuBegin 回合结束时 phaseJieshu
phaseBegin 回合开始时(已被取代) phase
phaseEnd 回合结束时(已被取代) phase
gameDrawBefore/Begin/End/After 游戏开始阶段 前/时/后/结束后 global gameDraw
phaseBefore/Begin/End/After* 回合阶段 开始前/时/后/结束后 player,global phase
judgeBefore/Begin/End/After* 判定阶段 开始前/时/后/结束后 judge
phaseDrawBefore/Begin/End/After* 摸牌阶段 开始前/时/后/结束后 phaseDraw
phaseUseBefore/Begin/End/After 出牌阶段 开始前/时/后/结束后 phaseUse
discardBefore/Begin/End/After* 弃牌阶段 开始前/时/后/结束后 discard
phaseJudgeEnd 判定阶段结束时 phaseJudge
phaseDiscardEnd 弃牌判定阶段结束时 phaseDiscard
useCard 0trigger 1trigger 2arrangeTrigger 3useCard 4chooseToUse 5phaseUse 6phase 7phaseLoop 8game
useCardToPlayered 使用牌指定目标时 player/global 0trigger 1trigger 2arrangeTrigger 3useCardToPlayered 4useCard 5chooseToUse 6phaseUse 7phase 8phaseLoop 9game useCardToPlayered
shaBefore/Begin/End/After/Miss 使用杀 之前/时/后/结束后/被闪后 target/player 0trigger 1trigger 2arrangeTrigger 3杀 4useCard 5chooseToUse 6phaseUse 7phase 8phaseLoop 9game
juedouBeforeBegin/End/After 使用决斗 之前/时/后/结束后
loseBefore/Begin/End/After 失去卡牌 之前/时/后/结束后 0trigger 1trigger 2arrangeTrigger 3lose 4useCard 5chooseToUse 6phaseUse 7phase 8phaseLoop 9game
gainBefore/Begin/End/After 获得卡牌 之前/时/后/结束后
useCardBefore/Begin/End/After 使用卡牌 之前/时/后/结束后
useCardToBefore/Begin/End/After 使用卡牌指定 之前/时/后/结束后
respondBefore/Begin/End/After 打出卡牌 之前/时/后/结束后
drawBefore/Begin/End/After 从牌堆摸牌 之前/时/后/结束后
equipBefore/Begin/End/After 装备装备牌 之前/时/后/结束后
chooseToRespondBefore/Begin/End/After 打出卡牌 之前/时/后/结束后
chooseToUseBegin 需要使用牌开始时
chooseToCompareAfter 拼点后
turnOverBefore/Begin/End/After 武将牌翻面 之前/时/后/结束后
linkBefore/Begin/End/After 武将牌横置(连环) 之前/时/后/结束后
dyingBefore/Begin/End/After 进入濒临状态 之前
damageBefore/Begin/End/After 受到伤害 之前/时/后/结束后 (若前缀为source则为你造成伤害)
loseHpBefore/Begin/End/After 失去(流失)体力 之前/时/后/结束后
recoverBefore/Begin/End/After 回复体力 之前/时/后/结束后
changeHp 体力值发生改变后
loseMaxHpBefore/Begin/End/After 减少体力上限 之前/时/后/结束后
gainMaxHpBefore/Begin/End/After 增加体力上限 之前/时/后/结束后
dieBegin 确定死亡开始时
judge 判定时
chooseCard 选牌时
respond 响应时 0trigger 1trigger 2arrangeTrigger 3respond 4chooseToRespond 5要相应的牌 6usecard 7chooseToUse 8phaseUse 9phase 10phaseLoop 11game
loseEnd 失去牌结束时
gainEnd 获得牌结束时
linkAfter 连环后

  

  

  • 任何时机都能通过添加”Before”,”Begin”,”End”,”After”获得不同时间点的新时机

  • 任何事件函数都有时机(例如:draw,recover,chooseToDiscard,changeHp)

  • 任何牌都有时机(例如:taoAfter,”juedouAfter”,”huogongAfter”)

  • 注1:init其实是global:”gameStart”和player:”enterGame”,时机

  • 注2:没有changeHujia这个时机,但有changeHujiaBegin等时机(因为没trigger)

  • 注3:changeHp没有changeHpBegin等时机(因为false了)

  • event.getParent(0~game)并不固定,需要在开发中结合具体情况看。但是,3一定是该事件

1
2
3
4
5
var k = 0;
do{
game.log(k,event.getParent(k));
k++;
}while(event.getParent(k-1).name!="game");

3.0.1.1trigger属性与方法

enable主动技

/ .属性/方法() 描述 类型/返回值 示例
0 .name
1 .step
2 .finished
3 .next
4 .after
5 .custom
6 _alexclude
7 _notrigger
8 _result
9 _set
10 changeToZero
11 finish()
12 cancel()
13 neutralize()
14 unneutralize()
15 goto()
16 redo()
17 setHiddenSkill()
18 set()
19 setContent()
20 getLogv()
21 send()
22 resume()
23 getParent()
24 getTrigger()
25 getRand()
26 insert()
27 insertAfter()
28 backup()
29 restore()
30 isMine()
31 isOnline()
32 notLink()
33 isPhaseUsing()
34 addTrigger()
35 trigger()
36 untrigger()
37 ._super
38 addMessageHook()
39 triggerMessage()
40 .isFirstTarget
41 content()
42 .targets
43 .target
44 .card
45 .cards
46 .player
47 .excluded
48 .customArgs
49 .forceDie
50 .parent
51 ._triggering

3.0.2卡牌(Card)

属性
.属性 描述 类型与值 Object.keys(card)[?] 非转化非虚拟 多牌转化(丈八) 多牌转化(龙魂双牌) 单牌转化(武圣) 单牌转化(火计,蛊惑,龙魂单牌) 虚拟
name 名称 string 0 0 0 0 0 0
suit 花色 string/none,♥♠♣♦ 1 1 2 1
number 点数 number,1~13 2 2 3 2
nature 属性 string,火雷刺 3 1 1 3
isCard 是否为转化牌 bool 4 4
cardid 嗯!一样的 string 5 5
wunature 五行生克* 6 6
storage Object Object 7 7
cards 原本的牌 Object 8 1 2 3 4 8
  • 如果武圣使用的牌被扇子转化,那么,4 nature
  • 使用的普通杀被扇子转化,那么会将3 nature undefined修改为3 nature 火
  • 转化牌的isCard一般undefinded,也就是没有iscard属性。虚拟牌的isCard为true
  • 卧虫诸葛火计视为的火攻为火属性,是因为远古遗留问题,不管他。
  • 红桃♥:’heart’; 黑桃♠:’spade’; 梅花♣:’club’; 方片♦:’diamond’; 无花色:’none’
  • color: string 不为卡牌的参数,若希望得到请使用 get.color(card)
  • 红色:’red’; 黑色:’black’; 无色:’none’
  • 单牌转化为其原本的颜色与花色
  • 多牌转化无花色
  • 若多牌转化时原本牌的颜色相同,则转化牌的颜色为此颜色;否则为无色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var k = 0;
for(i in trigger.card){
game.log(k,i,trigger.card[i]);
k++;
}


game.log("0",Object.keys(trigger.card)[0],trigger.card.name);
game.log("1",Object.keys(trigger.card)[1],trigger.card.suit);
game.log("2",Object.keys(trigger.card)[2],trigger.card.number);
game.log("3",Object.keys(trigger.card)[3],trigger.card.nature);
game.log("4",Object.keys(trigger.card)[4],trigger.card.iscard);
game.log("5",Object.keys(trigger.card)[5],trigger.card.cardid);
game.log("6",Object.keys(trigger.card)[6],trigger.card.wunature);
game.log("7",Object.keys(trigger.card)[7],trigger.card.storage);
game.log("8",Object.keys(trigger.card)[8],trigger.card.cards);
方法
方法() 返回值 描述 示例
filterInD 对象
contains bool 是否包含xxx
add
addArray
remove
removeArray
randomGet
randomRmove
randomSort
randomGets
sortBySeat
和卡牌有关的函数

这一部分中详细内容,可以查看3.1’函数‘章节’get’部分

卡牌的颜色

1

3.0.2.0 基本牌(basic)

3.0.2.1 锦囊牌(trick、delay)

3.0.2.2 装备牌(equip)

3.0.3 技能标签

3.0.3.0 触发技

3.0.3.1 锁定技

锁定技标签A locked true false
锁定技标签B forced
true 强制且锁定 强制但不锁定 强制且锁定,默认locked:true
false 锁定但不强制 非强制非锁定 非强制非锁定
锁定 非强制非锁定 非强制非锁定

3.0.4 事件event

/ .属性/方法() 描述 类型/返回值 示例
0 .name 事件名称 string
1 .step 步骤数 number
2 .finished 事件是否完成 bool
3 .next
4 .after
5 .custom 一个对象
6 ._alexclude
7 ._notrigger
8 ._result
9 ._set
10 ._triggered
11 changeToZero()
12 finish
13 cancel()
14 neutralize()
15 unneutralize()
16 goto()
17 redo()
18 setHiddenSkill()
19 set()
20 setContent()
21 getLogv()
22 send()
23 resume()
24 getParent()
25 getTrigger()
26 getRand()
27 insert()
28 insertAfter()
29 backup()
30 restore()
31 isMine()
32 isOnline()
33 notLink()
34 isPhaseUsing()
35 addTrigger()
36 trigger()
37 untrigger()
38 ._super
39 addMessageHook()
40 triggerMessage()
41 .player
42 ._trigger
43 .triggername
44 content()
45 .skillHidden
46 .parent

3.0.5 总牌堆(ui.cardPile),牌堆(ui.cardPile2)、field与弃牌堆(ui.discardPile)

.属性/方法() 描述
.lastChild 牌堆底第一张牌
.firstChild 牌堆顶第一张牌
lastElementChild
firstElementChild
.childElementCount
childNodes[]
appendChild()
insertBefore()
.childNodes.length
removeChild()

3.0.6 itemtype

要知道,除了js的那些类型外,无名杀自身还人为的定义了一些类型。它们可以使用*get.itemtype()*来获得

js的数据类型:

数据类型 描述 案例
基本数据类型 number 只要是个数字,就是number类型 18,18.88,-18,
string 单引号,双引号,反引号`包裹的数据都是字符串 noname,123
boolean 有两个固定的值:true和false let hasGudingdao=true;
undefined 只声明变量但不赋值,变量默认就是undefined let num; // undefined
null 代表空、无、值未知的特殊值。 let obj = null;
引用数据类型 object对象

noname定义的类型:

定义的类型 类型 描述 案例
position String 位置,’h’:手牌区; ‘e’:装备区; ‘j’:判定区; ‘s’:特殊区域、牛马; ‘x’:扩展区
nature String
players String
cards
select number
divposition
button div
card div
player div
dialog div
event

3.0.7 objtype

array
object
div
table
tr
td

3.1 函数/player的方法

3.1.0 牌(cards)

3.1.0.0 摸牌player.draw()

1
2
3
4
5
'step 0'
player.draw()
'step 1'
game.log(result)
// 这里的result是'step 0'摸牌的结果,也就是说摸的卡牌的一个数组。

展示手牌(showHandcards)、展示牌(showCards)、观看手牌(viewHandcards)与观看牌(viewCards)

展示手牌,函数名为showHandcards,

3.1.0.1 获得牌,计算牌

3.1.0.2 选择牌,选择使用牌,选择响应牌,选择弃置牌,选择拼点牌

3.1.0.3 discoverCard

3.1.0.4 移动牌、摸牌(draw)、弃置牌、随机弃置与随机获得

摸牌(draw),也就是draw(X),这里的X为数值或返回值为数值的其他,代表要摸X张牌,X值可以不填,默认为1。比较经典的案例有:

【图射】你可以摸X张牌,X为该牌指定的目标数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
skill:{
"xinfu_tushe":{
audio:2,
trigger:{
player:"useCardToPlayered",
},
frequent:true,
filter:function (event,player){
if(get.type(event.card)=='equip') return false;
if(event.getParent().triggeredTargets3.length>1) return false;
Return event.targets.length>0&&!player.countCards('h',{type:'basic',});
},
content:function (){
player.draw(trigger.targets.length);
},
ai:{
presha:true,
pretao:true,
threaten:1.8,
},
},
}

除此之外,还有【节命】、【遗计】、【观潮】等。

弃置牌(),

3.1.1 标记(mark、storage)

3.1.1.0

移去标记(removeMark),增加标记(addMark),计算标记数(countMark),更新标记(updateMark和updateMarks),hasMark

3.1.2 技能(skill)

3.1.2.0获得技能,选择技能

3.1.3时机(trigger)

3.1.4目标(target)

3.1.5选择牌的使用目标,选择目标,选择玩家的牌,弃置玩家的牌,选择(player.chooseXXX)

  1. player.choosePlayerCard(角色[,数量][,位置][,提示][,强制][,限制][,ai])
    • 说明:玩家可以选择一名玩家的手牌装备牌判定区的牌,角色参数为必填项,类型为Object

    • 参数:

      • 角色:该方法一般被用在’step 1’中,比较常用的案例是:角色参数用来接收上一个step的*result.targets[0]*。此参数只能接收1个player对象

        1
        2
        3
        4
        // player的上一家
        player.choosePlayerCard(player.previous)
        // player的下一家
        player.choosePlayerCard(player.next)
      • 数量:这里是指的要选择的牌的数量

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        // 默认选择1张手牌
        player.choosePlayerCard(player)
        // 选择2张手牌
        player.choosePlayerCard(player,2)
        // 选择1~2张手牌
        player.choosePlayerCard(player,[1,2])
        // 选择至少1张手牌
        player.choosePlayerCard(player,[1,Infinity])
        // 选择所有手牌,填写负数即可
        player.choosePlayerCard(player,-1)
        // 其他类型为Number或[a,b]形式的数组类型的变量(a、b也可以为Number或Number类型的变量或返回值为Number类型的表达式)或返回值为这些的表达式,且a必须小于等于b。此处给出例子:玩家的体力值
        player.choosePlayerCard(player,player.hp)
      • 位置:默认是手牌,可以选择手牌、装备区的牌和判定区的牌

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        // 装备区
        player.choosePlayerCard(player,'e')
        // 默认为手牌
        player.choosePlayerCard(player,'h')
        // 判定区
        player.choosePlayerCard(player,'j')
        // 手牌和装备区
        player.choosePlayerCard(player,'eh')
        // 装备区和判定区
        player.choosePlayerCard(player,'ej')
        // 手牌和判定区
        player.choosePlayerCard(player,'hj')
      • 提示:默认是’请选择xx角色的一张牌’

        1
        player.choosePlayerCard(player,'无名杀创始人是唐家三少')
      • 强制:

        1
        2
        3
        4
        // 默认为false,不强制
        player.choosePlayerCard(player)
        // true,强制,不允许取消
        player.choosePlayerCard(player,true)
      • 限制:

        1
        2
        3
        4
        5
        6
        7
        8
        // 选择一张牌名为杀的手牌
        player.choosePlayerCard(player,{name:'sha'})
        // 选择一张花色为黑桃的手牌
        player.choosePlayerCard(player,{suit:'spade'})
        // 选择一张点数为4的手牌
        player.choosePlayerCard(player,{number:'4'})
        // 选择一张属性为雷的手牌,抱歉,在这个1.9.124的版本,目前无法使用
        // 你发现了吗?牌的属性的这些其实都是可以用这种{key:value}的形式来限制选择的卡牌的。color不可以,它并不是牌的属性。匿名函数目前也不可以使用
      • ai:

    • 下一个step的结果(result):

      key result.属性 说明
      0 buttons 牌名的数组
      1 cards 选择的牌,为数组。result.cards[0]是第一张牌
      2 targets
      3 confirm 是否选择了。’确定’、’取消’
      4 bool 是否选择了牌。true、false
      5 links 选择的牌,为数组。result.links[0]是第一张牌
    • .set()

  2. player.chooseDrawRecover([摸牌数量][,回血数量][,提示][,强制][,ai])
    • 说明:player选择回复1点体力或摸1张牌

    • 参数:

    • 下一个step的结果(result):

      key result.属性 说明
      0 buttons
      1 cards
      2 targets
      3 control ‘回复体力’\‘摸牌’
      4 links
      5 index 0:’摸牌’ ; 1:’回复体力’
  3. player.chooseBool([提示][,ai])
    • 说明:player.chooseBool(),可以让player选择是否发动技能

    • 参数:

      • 提示:

        1
        2
        // 示例
        player.chooseBool('无名杀是唐家三少写的吗?')
      • ai:默认为是,如果不写,ai会无脑选择是

        1
               
    • 下一个step的结果(result):

      key result.属性 说明
      0 buttons
      1 cards
      2 targets
      3 control ‘xxx’
      4 links
      5 index 0,1…
  4. player.chooseControl([选项A][,选项B][,选项C][,选项D]….[,ai])
    • 说明:player必须从若干个选项中选择1项,列成一行以供选择:选项A 选项B 选项C 选项D

    • 参数:

    • 下一个step的结果(result):

      key result.属性 说明
      0 buttons
      1 cards
      2 targets
      3 confirm 确定;取消
      4 bool true;false
      5 links
  5. player.chooseControlList([选项列表][,提示][,强制][,ai])
    • 说明:player可以从若干个选项中选择一项,列成一列以供选择。

    • 参数:

      • 选项列表:是一个数组,里面包含选项

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        // 如果不使用数组[],那么第一个变为提示,剩余的变为选项。下例中,"唐家三少"变成了提示,剩余的为选项。
        player.chooseControlList('唐家三少','天残马铃薯世','天马铃薯','地马铃薯','人马铃薯')
        // 如果使用[]括起来使其成为数组,那么数组中的元素皆为选项。
        player.chooseControlList(['唐家三少','天残马铃薯世','天马铃薯','地马铃薯','人马铃薯'])
        /* 提示
        [选项A]
        [选项B]
        [选项C]
        [选项D]
        ...
        [选项1][选项2][选项3][取消]
        */
      • 提示:

      • 强制:默认为false。填写true为强制。

      • ai

  6. player.chooseCardTarget()
    • 说明:
    • 参数:
  7. player.chooseTarget()
    • 说明:
    • 参数:
  8. player.chooseUseTarget()
    • 说明:
    • 参数:
  9. player.chooseCard([数量][,位置][,提示][,强制][,限制][,ai])
    • 说明:player.chooseCard() 可以让player选择指定的或非指定类型的手牌装备牌

    • 参数:

      • 数量:number类型或数组类型。默认为1

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        // 默认选择1张手牌
        player.chooseCard()
        // 选择2张手牌
        player.chooseCard(2)
        // 选择1~2张手牌
        player.chooseCard([1,2])
        // 选择至少1张手牌
        player.chooseCard([1,Infinity])
        // 选择所有手牌,填写负数即可
        player.chooseCard(-1)
        // 其他类型为Number或[a,b]形式的数组类型的变量(a、b也可以为Number或Number类型的变量或返回值为Number类型的表达式)或返回值为这些的表达式,且a必须小于等于b。此处给出例子:玩家的体力值
        player.chooseCard(player.hp)
      • 位置:position类型,字符串,可以填*’h’:手牌,‘e’*:装备牌。默认为手牌区的牌

        1
        2
        3
        4
        5
        6
        // 默认选择1张手牌
        player.chooseCard()
        // 选择1张装备区的牌
        player.chooseCard('e')
        // 选择1张装备区或手牌区的牌
        player.chooseCard('he')
      • 提示:String类型,字符串

        1
        2
        3
        4
        // 默认为请选择1张牌
        player.chooseCard()
        // 提示:我是个大聪明
        player.chooseCard('我是个大聪明')
      • 强制:boolean值,truefalse

        1
        2
        3
        4
        // 默认为false,不强制
        player.chooseCard()
        // true,强制,不允许取消
        player.chooseCard(true)
      • 限制:此处可以是匿名函数或{key:value}的形式

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        // 选择一张‘杀’
        player.chooseCard(function(card){
        return card.name=='sha'
        })
        // 此处箭头函数的参数顺序不可以更换,箭头函数里面的card指的是player的牌,player就指的是玩家自己
        player.chooseCard((card,player)=>{
        return card.name=='sha'
        })
        // 选择一张牌名为杀的手牌
        player.chooseCard(player,{name:'sha'})
        // 选择一张花色为黑桃的手牌
        player.chooseCard(player,{suit:'spade'})
        // 选择一张点数为4的手牌
        player.chooseCard(player,{number:'4'})
        // 选择一张属性为雷的手牌
        player.chooseCard(player,{nature:'thunder'})
        // 你发现了吗?牌的属性的这些其实都是可以用这种{key:value}的形式来限制选择的卡牌的。color不可以,它并不是牌的属性。需要使用匿名函数/箭头函数,在里面使用get.color(card)来判断
        player.chooseCard((card,player)=>{
        return get.color(card)=='red'
        })
      • ai:默认为无

        1
        2
        3
        4
        5
        6
        7
        8
        // 可以使用set
        player.chooseCard().set("ai",function(card){
        return get.value(card);//选择价值高的牌
        });
        // 也可以这么做
        player.chooseCard().ai=function(card){
        return get.value(card);//选择价值高的牌
        };
    • 下一个step的结果(result):

      key result.属性 说明
      0 buttons
      1 cards 选择的牌,为数组。result.cards[0]是第一张牌
      2 targets
      3 confirm 是否选择了。’确定’、’取消’
      4 bool 是否选择了牌。true、false
      5 links
    • .set()

  10. player.chooseCardOL()
    • 说明:
    • 参数:
  11. player.chooseButton()
    • 说明:
    • 参数:
  12. player.chooseButtonOL()
    • 说明:
    • 参数:
  13. player.chooseVCardButton()
    • 说明:
    • 参数:
  14. player.chooseCardButton()
    • 说明:
    • 参数:
  15. player.chooseSkill()
    • 说明:
    • 参数:
  16. player.chooseToCompare()
    • 说明:
    • 参数:
  17. player.chooseToDiscard()
    • 说明:
    • 参数:
  18. player.chooseToUse()
    • 说明:
    • 参数:
  19. player.chooseToRespond()
  20. player.chooseToDisable()
  21. player.chooseToEnable()
  22. player.chooseToDuiben()
  23. player.chooseToPlayerBeatmap()
  24. player.chooseToGuanxing()
  25. player.chooseToPSS()
  26. player.chooseToMove()

3.1.6 响应牌、交换手牌、直接分配牌

3.1.7 addToExpansion拓展区:武将牌上的牌(Expansion)

3.1.8 受伤、回血(recover)、失去体力与增减体力上限

回血或回复体力(recover),也就是recover(X),这里的X为数值或返回值为数值的其他,代表要回复X点体力,X值可以不填,默认为1。比较经典的案例有

3.1.9护甲(changeHujia)、buff、重置、横置与翻面

护甲(Hujia),在无名杀中,护甲值意味着在受到伤害时,你无需掉血,你因为有护甲,你不会受到伤害,护甲会为你承担。但护甲不能阻止失去体力,这是需要注意的。

changeHujia(X),

3.1.10 game

.属性/方法() 描述
updateRenku
loseAsync
getRarity
getGlobalHistory
getAllGlobalHistory
cardsDiscard
cardsGotoOrderding
cardsGotoSpecial
online
onlineID
onlineKey
showHistory
createBackground
changeLand
checkFileList
replaceHandcards
removeCard
randomMapOL
closeMenu
closeConnectMenu
closePopped
broadcast
broadcastAll
syncState
updateWaiting
waitForPlayer
countDown
countChoose
stopCountChoose
联机
send
sendTo
creatServer
playAudio 放音乐的
trySkillAudio
playSkillAudio
playBackgroundMusic
import
loadExtension
createDir
importExtension
export
multiDownload2
multiDownload
fetch
playVideo
playVideoContent
videoContent
reload
reload2
exit
open
reloadCurrent
update
unupdate
stop
run
addVideo
draw
vibrate
prompt
alert
animate
print
linexy
_linexy
creatTrigger
creatEvent
addCharacter
addCharacterPack
addCard
addCardPack
addSkill
addMode
addGlobalSkill
removeGlobalSkill
resetSkills
removeExtension
addRecentCharacter
createCard
createCard2
forceOver
over
loop
pause
pause2
resume
resume2
delaye
delayex
delay
delayx
check
uncheck
swapSeat
swapPlayer
swapControl
swapPlayerAuto
findNext
loadModeAsync
switchMode
loadMode
loadPackage
phaseLoop
gameDraw
chooseCharacterDouble
updateRoundNumber
asyncDraw
asyncDrawAuto
finishSkill
finishCards
checkMod
prepareArena
clearArena
clearConnect
log
logv
putDB
getDB
deleteDB
save
showChangeLog
showExtensionChangeLog
saveConfig
saveConfigValue
saveExtensionConfig
getExtensionConfig
clearModeConfig
addPlayer
addFellow
triggerEnter
restorePlayer
removePlayer
replacePlayer
arrangePlayer
filterSkills
expandSkills
css
hasPlayer
hasPlayer2
countPlayer
countPlayer2
filterPlayer
filterPlayer2
findPlayer
findPlayer2
findCards
countGroup
players
dead
imported
playerMap
phaseNumber
roundNumber
shuffleNumber
download
readFile
readFileAsText
writeFile
removeFile
getFileList
ensureDirectory
layout
deviceZoom
documentZoom
recommendDizhu
addRecord
getState
updateState
getRoomInfo
getVideoName
showIdentity
checkResult
checkOnlineResult
chooseCharacterZhidou
chooseCharacterHuanle
chooseCharacterKaihei
chooseCharacterBinglin
chooseCharacter
chooseCharacterOL
chooseCharacterZhidouOL
chooseCharacterBinglinOL
chooseCharacterHuanleOL
chooseCharacterKaiheiOL
me
zhu
editExtension
checkForUpdate
checkForAssetUpdate

3.1.11 get的方法

get.??() 描述 示例
numOf
connectNickname
zhinangs
sourceCharacter
isLuckyStar
infoHp
infoMaxHp
infoHujia
is
buttomCards
discarded
cardOffset
colorspan
evtprompt
autoViewAs
max
min
player*
characterintro
groupnature
sgn
rand
sort
sortSeat
zip
delayx
prompt
prompt2
url
round
playerNumber
benchmark
stringlfy
copy
inpliefull
inplie
inplie2
typeCard
libCard
ip
modetrans
charactersOL
trimip
mode
idDialog
arenaState
skillState
id
zhu*
选项**
coinCoeff
rank
skillRank
targetsinfo
infoTargets
cardsinfo
infoCard
infoCards
cardInfo
cardInfoOL
infoCardOL
infoCardsOL
playerInfoOL
infoPlayerOL
playerInfoOL
playersInfoOL
infoPlayersOL
funcInfoOL
infoFuncOL
eventInfoOL
infoEventOL
stringifledResult
parsedResult
verticalStr
numStr
rawName
rawName2
slimName
time
utc
evtDistance
xyDistance
itemtype
equipNum
objtype
type
type2
subtype
equiptype
name
suit
color
number
nature
cards
judge
judge2
distance
info
select
card
player
players
position
skillTranslation
skillInfoTranslation
translation
strNumver
cnNumber
selectableButtons
selectableCards
skills
gainableSkills
gainableSkillsName
gainableCharacters
selectableTargets
filter
cardCount
skillCount
owner
noSelected
population
totalPopulation
cardtag
tag
sortCard
difficulty
cardPile
cardPile2
discardPile
aiStrategy
skillintro
intro
storageintro
nodeintro
linkintro
groups
types
links
threaten
condition
attitude
sgnAttitude
useful
unuseful
unuseful2
unuseful3
value
equipResult
equipValue
equipValueNumber
disvalue
disvalue2
skillthreaten
order
result
effect_use
effect
damageEffect
recoverEffect
buttonValue
attitude2
rawAttitude
qyRateNum
1.get.position(card,ordering)
  • 说明:
  • 参数:
  • position对照表:
String 对应 说明
‘h’ handcards 手牌区
‘e’ equips 装备区
‘j’ judges 判定区
‘s’ special 特殊区域
‘x’ expansions 扩展区
‘c’ cardPile 牌堆
‘d’ discardPile 弃牌堆
‘o’ ordering 处理区
2.get.cards(num)
  • 说明:
  • 参数:

3.1.12 getParent()

属性/方法 描述
name
step
finished
next
afterlogSkill
_alexclude
_notrigger
_set
skill 该事件的技能
player 该事件的玩家
triggername 该事件的名称
_trigger 该事件
forceDletrue
parent 上一级事件
logvid
1
2
3
4
5
var m = 0;
for(i in event.getParent(0)){
game.log(m,i,event.getParent(0)[i]);
m++;
}

3.1.13判定与废除

3.1.13.0 判定(judge)

1
player.judge();

玩家可以进行一次判定。

判定牌的属性:

key .属性 返回类型 说明
0 card Object 这张判定牌
1 name String 牌名
2 number number 点数
3 suit ♦♠♥♣ 花色:红桃♥:’heart’; 黑桃♠:’spade’; 梅花♣:’club’; 方片♦:’diamond’; 无花色:’none’
4 color String 颜色:红色,黑色,none,undefined
5 node Object 对象,也就是这张判定牌
6 judge 0
7 bool ?

如果你想要获得判定牌的其他,你不能用属性,而应该使用get。比如:获取判定牌的类型:

1
get.type(result.card);

如果需要更详细的信息,请参考3.0.2卡牌(Cards)

3.1.13.1 废除

3.1.14 hasHistory、getHistory、getGlobalHistory、getLastHistory、hasAllHistory和getAllHistory与event事件

hasHistory

1
player.hasHistory(key,filter)
描述 示例
Key
gain
sourceDamage
damage
useSkill
useCard
lose
current
custom
respond
filter
last

getHistory

描述 示例
Key
useCard
respond
skipped
lose
gain
sourceDamage
damage
custom
useSkill
filter
last

getHistory(key,filter,last)函数的第一个参数

1·useCard

2·respond

3·skipped

4·lose

5·gain

6·sourceDamage

7·damage

8·custom

9·useSkill

getGlobalHistory

描述 示例
Key
cardMove
custom
useCard
changeHp
filter

getLastHistory

描述 示例
Key
filter
last

getAllHistory

描述 示例
Key
filter
last

hasAllHistory

getLastUsed

getStat

getLastStat

getCardUsable

3.1.15 插入时机

3.1.16 捏牌

getHistory | getGlobalHistory | getAllHistory | getLastHistory

3.1.15 getParent和event.parent

3.1.16 Others & unique

3.1.17 ui.create

四、组件(ui)

dialog

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
var dialog=ui.create.dialog();//有两个参数,第一个是xxx,第二个是'hidden','vcard'
//那个框框
dialog.classList.add('fixed');//固定定位,没有大框框,也无从谈起移动这个了
dialog.classList.add('static');//自动定位,可以拖动,就是给个框框,里面有牌,然后可以移动的。如果fixed或static没写,那么默认就是这个

//滚动行为
dialog.classList.add('scroll1');
dialog.classList.add('scroll2');

dialog.classList.add('scroll3');
//
dialog.classList.add('noupdate');如果没有,dialog会把框框去掉然后把文字搞成一行


dialog.classList.add('center');
dialog.classList.add('fullwidth');
dialog.classList.add('fullheight');


dialog.classList.add('compare');
dialog.classList.add('single');
dialog.classList.add('xdialog');


dialog.classList.add('big');
dialog.classList.add('small');

dialog.classList.add('fpopped');
dialog.classList.add('forcebutton');
dialog.classList.add('character');
dialog.classList.add('choose-character');
dialog.classList.add('nobutton');
dialog.classList.add('bosscharacter');
dialog.classList.add('withbg');
dialog.classList.add('modeshortcutpause');
dialog.classList.add('noselect');



dialog.style.height = '60%';
dialog.style.top = '2%';
//
dialog.addText("手牌区与装备区");//是一个xx
dialog.add(cards1);//添加一整块
//
var choose=ui.create.div("选择");
choose.innerHTML='<span>最小</span>';
dialog.content.appendChild(choose);


//
player.chooseButton(dialog,[0,4]);

ui.create.div()

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
div:function(){
var str,innerHTML,position,position2,style,divposition,listen;
for(var i=0;i<arguments.length;i++){
if(typeof arguments[i]=='string'){
if(typeof str=='string'){
innerHTML=arguments[i];
}
else{
str=arguments[i];
}
}
else if(get.objtype(arguments[i])=='div'||
get.objtype(arguments[i])=='table'||
get.objtype(arguments[i])=='tr'||
get.objtype(arguments[i])=='td'||
get.objtype(arguments[i])=='body') position=arguments[i];
else if(typeof arguments[i]=='number') position2=arguments[i];
else if(get.itemtype(arguments[i])=='divposition') divposition=arguments[i];
else if(typeof arguments[i]=='object') style=arguments[i];
else if(typeof arguments[i]=='function') listen=arguments[i];
}
if(str==undefined) str='';
var node=document.createElement('div');
for(var i=0;i<str.length;i++){
if(str[i]=='.'){
if(node.className.length!=0){
node.className+=' ';
}
while(str[i+1]!='.'&&str[i+1]!='#'&&i+1<str.length){
node.className+=str[i+1];
i++;
}
}
else if(str[i]=='#'){
while(str[i+1]!='.'&&str[i+1]!='#'&&i+1<str.length){
node.id+=str[i+1];
i++;
}
}
}
if(position){
if(typeof position2=='number'&&position.childNodes.length>position2){
position.insertBefore(node,position.childNodes[position2]);
}
else{
position.appendChild(node);
}
}
if(style) node.css(style);
if(divposition) node.setPosition(divposition);
if(innerHTML) node.innerHTML=innerHTML;
if(listen) node.listen(listen);
return node;
},

本章是由本人开发设计的,我称之为ui组件。ui组件包含一些还未被封装(以后也不会被封装),但是提供思路与方法的简便操作。主要是应对小游戏武将、选择数字、选择其他的东西,当然,主要是chooseButton。

组件01

1

效果图

组件02

1

组件03

1

组件04

1

组件05

1

组件06

1

组件07

1

组件08

1

组件09

1

组件10

1

组件11

1

组件12

1

组件13

1

组件14

1

组件15

1

组件16

1

组件17

1

组件18

1

五、扩展!技能基本框架

5.0 触发技

5.1 主动技

5.2 mod类锁定技

5.2.0 获取所有mod类技能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 通过角色发动主动技能,获取到所有的mod类技能(需配合扩展“全能搜索”,搜索lib.skill.ceshi)
"getModSkill": {
enable: "phaseUse",
content: function () {
for (var i in lib.skill) {
if (lib.skill[i].mod) {
for (var j in lib.skill[i].mod) {
if (!lib.skill['ceshi']['mod'][j]) {
lib.skill['ceshi']['mod'][j] = lib.skill[i].mod[j];
}
};
};
};
},
},
ceshi: {
mod: {

},
},

5.2.1 所有的mod类技能

马术、乡害与空城

如果想要实现“你的坐骑牌视为【酒】”,你可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mod:{

cardname:function (card,player){

var type=get.subtype(card,false);

if(type=='equip3'||type=='equip4'||type=='equip6'){return 'jiu'}

},

globalFrom:function (from,to,distance){

return distance-2;

},

},

特别地,这里提到了subtype和type。

5.3 限定技

5.4 标记类

5.5 转换技

5.6 视为技

5.7 主公技

5.8 技能组

5.9 全局技能

filterButton:this.filterButton,

​ selectButton:this.selectButton,

​ filterTarget:this.filterTarget,

​ selectTarget:this.selectTarget,

​ filterCard:this.filterCard,

​ selectCard:this.selectCard,

​ position:this.position,

​ forced:this.forced,

​ fakeforce:this.fakeforce,

​ _aiexclude:this._aiexclude,

​ complexSelect:this.complexSelect,

​ complexCard:this.complexCard,

​ complexTarget:this.complexTarget,

​ _cardChoice:this._cardChoice,

​ _targetChoice:this._targetChoice,

​ _skillChoice:this._skillChoice,

​ ai1:this.ai1,

​ ai2:this.ai2,

​ filterOk:this.filterOk,

六、Ai!人工智障也会高端操作

6.0 Ai简介与说明

6.1 Ai分类

我们可以从一些武将的代码中看到:

因此,无名杀的Ai可以分为四类。

6.1.0check类

6.1.1主动技ai:{}

6.1.2choose类

6.1.3processAI

6.1.4 全局Ai

6.1.5 其他(Others)

6.2 收益论!卡牌与技能Ai

趣味问答:

Q1:如果你使用的武将是马保国,自身未横置,现在处于你的回合。本回合你还未使用过杀。目前你手里还剩下一张麒麟弓,一张铁锁和4张黑色普通杀。面对任意个未横置的白板武将(皆为0手牌,0装备),你最多还能打多少点伤害?如何打?如果这些白板武将手中有牌,那么最多可以打多少点伤害?

6.3 尝试爬取ai

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"getAi":{
enable:"phaseUse",
content:function (){
for(var i in lib.skill){
if(i!="ceshi"&&lib.skill[i].ai){
for(var j in lib.skill[i].ai){
if(lib.skill[i].ai[j]===true) lib.skill["ceshi"].ai[j]=lib.skill[i].ai[j]
};
}
}
},
},
ceshi:{
ai:{
},
},

爬取到的ai

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
ai:{
"unequip":true,//无视防具
"unequip2":true,//无视防具
"unequip_ai":true,//无视防具只用于ai判断

respondShan:true,//是否能使用或打出闪
respondSha:true,//是否能使用或打出杀
respondTao:true,//是否能使用或打出桃
save:true,//能否救人
jiuOther:true,//能用酒救其他角色

damage:true,//这个技能能否造成伤害

noCompareTarget:true,//不能成为拼点的目标

nofire:true,//是否对火焰伤害免疫
nothunder:true,//是否对雷电伤害免疫
nodamage:true,//是否免疫伤害
filterDamage:true,//此技能是否会减免或免疫伤害
fireAttack:true,//是否能造成火焰伤害
noDirectDamage:true,//受到的伤害转为体力流失 拥有这个标签的ai会优先装藤甲

reverseEquip:true,//增加装备的使用优先度

presha:true,//提升杀的使用优先度
pretao:true,//提升桃的使用优先度
nokeep:true,//ai有桃就吃 不会留桃

maixie:true,//此技能能否卖血
"maixie_hp":true,//此技能买血对自己有收益
"maixie_defend":true,//此技能会反噬伤害来源
maihp:true,//流失体力会有收益 参考诈降


noe:true,// 失去装备会发动技能 参考枭姬
noh:true,// 失去手牌会发动技能 参考连营

damageBonus:true,//此技能会增加伤害

"directHit_ai":true,//ai判断能否强命 有此标签时会提升卡牌对目标的使用收益


nosave:true,//存在疑问,召唤随从的全局技能里面的

noDieAfter:true,//国战专属 拥有此技能标签被杀死时不执行奖惩
"noDieAfter2":true,//国战专属 拥有此技能标签被杀死人时不执行奖惩

rejudge:true,//此技能可以改判

halfneg:true,//内奸标签 技能通常比较差
neg:true,//内奸标签 技能通常比较差

"mingzhi_no":true,//询问明置武将牌不明置武将牌
"mingzhi_yes":true,//询问明置武将牌明置武将牌
mingzhi:true,//询问明置武将牌明置武将牌
nomingzhi:true,//武将牌不能明置

nofrequent:true,//用有此标签时 即便点了自动发动技能 也会询问是否发动


reverseOrder:true,//会改变卡牌的所在区域 存在疑问

noautowuxie:true,//此技能是否自动询问无懈 存在疑问



viewHandcard:true,//其他人的手牌对你可见
ignoreSkill:true,//无视某些技能 参考界铁骑
jueqing:true,//是否克制卖血技能

nogain:true,//不能获得牌 参考自书
notemp:true,//技能发动上下波动大

useShan:true,//使用闪有收益
usedu:true,//使用毒有收益
nodu:true,//不受毒的影响
noShan:true,//使用闪对自己有负面收益

notrick:true,//防止受到锦囊牌造成的伤害
notricksource:true,//防止自己锦囊牌造成的伤害



nohujia:true,//使护甲失效

"left_hand":true,//计算角色距离时逆时针结算
"right_hand":true,//计算角色距离时顺时针结算
nodiscard:true,//弃置牌会发动技能 参考屯田
nolose:true,//失去牌惠发动技能 参考屯田

link:true,//此技能会使自己横置
luckyStar:true,//幸运星 提升某些幸运值
isLuckyStar:true,//蔡阳印卡技能
noturnOver:true,//不会受到翻面的影响



shihuifen:true,//古剑包的石灰粉标签
forceMajor:true,//国战专属 视为大势力

"nowuxie_judge":true,//ai不会帮你无懈掉判定牌

guanxing:true,//能排序牌堆顶的牌


refuseGifts:true,//此技能能够拒绝被赠予

weather:true,//天气??
forceYingbian:true,//强化带有应变标签的牌

skillTagFilter:function(player,tag,arg){
//返回值为 false 令技能标签失效
//player 为技能的拥有者 tag为技能标签 arg 不固定

//技能ai标签 用player.hasSkillTag(tag,hidden,arg,globalskill) 检测
},
}

6.4Ai案例—云将扩展

七、优秀的设计独辟蹊径!武将设计哲学

7.0 数值膨胀与机制膨胀

 事实上,任何武将的设计都是在原有规则上做小的违规,说好听点就是突破。比如摸牌阶段只能摸两张牌,出牌阶段只能出一张杀,结果人均英姿双刀。
1
2
3
4
5
6
trigger:{
global:"damageBegin1",
},
content:function(){
trigger.player=game.zhu
},

7.0.0一般的突破(违规)

7.0.1新的机制(规则之外的新规则)

7.0.2修改本体

7.0.3我是上帝

7.0.4全局的较量

7.0.5局外的不讲武德

7.1 降维打击的边界与极限

7.2 天下武功,唯快不破

7.3 抗性时代2.0的降临

八、简单的武将!武将案例解析

8.0民间传说系列之:妖周泰

妖周泰的技能很简单,

不悔:锁定技,你不能成为【杀】的目标。

短短的一句描述,就让人感受到阴间之力,是那种即使天打雷劈,我自岿然不动的感受。在标风时代,这样一个武将,选出来就是降维打击的存在。即使放到现在,也能克制一大堆阴间武将,实在是令人暖心。尽管在当时算是设计最失败的武将之一,但是现在这些阴间武将,哪个不是设计失败的呢?只会加数值、秒杀素将而非拓展新玩法罢了。

8.1 暴力的美学:黄盖

黄盖的技能也是很简单的:

苦肉:出牌阶段,你可以失去1点体力,然后摸两张牌。

这样一个技能,让盖子成为上限极高,下限极低的武将。能发挥多大价值,全看运气。

来看看代码:

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
skill:{
kurou:{
audio:2,
enable:'phaseUse',
prompt:'失去一点体力并摸两张牌',
content:function(){
"step 0"
player.loseHp(1);
"step 1"
player.draw(2);
},
ai:{
basic:{
order:1
},
result:{
player:function(player){
if(player.countCards('h')>=player.hp-1) return -1;
if(player.hp<3) return -1;
return 1;
}
}
}
},
}

8.2 长得帅就是能多摸牌:周瑜

8.3 那个男人:孙策

8.4 极致的信仰:陆逊

8.5 在线称桃子:曹冲

8.6 时代的骄傲:李儒

8.7 猜猜看呐:于吉

8.8 鸽鸽说的在理:颜良文丑

8.9 武将台词最多提及的男人:吴懿

8.10 高贵的名门不需要队友:袁绍

8.11 蜀中无大将,净出猪脚亮:诸葛亮

8.12 阳光大男孩:徐盛

8.13 爱记仇的:钟会

8.14 棘手、摧毁、怀念:马超

九、Come on!来动手制作一名武将/模式吧

9.0 生成一个白板武将扩展

经过上面的阅读,我相信您已经充分了解了无名杀的一些机制并跃跃欲试,打算做一份自己的扩展。接下来,我们来尝试自己动手,制作一个可用的武将扩展。

如果我们要从头开始编写一个扩展和武将,那是极其麻烦的事情。但是,无名杀客户端提供了这样一个机会,你可以预先生成一个白板武将扩展,然后再利用文本编辑器修改原有的东西,这对于从0开始制作一名武将来说,节省了许多步骤。

具体为:启动无名杀->【选项】->【扩展】->【制作扩展】->填写一些信息(包括导入武将图片)->【编辑武将】->【保存】->【导出扩展】->选择合适的位置保存

这样,你就可以得到一个zip压缩包了,里面包含武将图片、extension.js和package.js三个文件。在119版本更新之后,从无名杀导出的扩展会自带一份GPL V3的许可证文件。当然,如果你分发这份扩展,你需要这个文件。

9.1 编写、修改与实现

9.1.0 扩展的结构说明

OK,你现在已经有了这样一份空白的武将扩展包,来看看这里面都有些什么东西。

这份武将扩展包目录是这样的:

xxx.zip

filter的参数event,player,

9.1.1 更方便的开发与调试

lib.node.debug

9.1.2 初步模仿与糅合已有的武将代码

如果你想尝试技能组合,你可以直接引用已有的代码,将其粘贴到合适的地方,然后压缩成zip格式。不过特别地,需要注意的一点是,这个zip包的根目录必须有extension.js文件,而不是下一层。如果你使用winrar预览后是这样的:

而不是这样的:

,那么你的导入大概率会失败。

很好,你现在已经得到一个空白的武将扩展包了。你可以打开调试控制台,在里面先写武将的代码。

9.1.3 快捷键与效率

9.3 分享与制作实体卡牌

9.4 武将配音与动效

9.5 额外的模式

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
game.import("extension",function(lib,game,ui,get,ai,_status){
return {name:"我的扩展",content:function(config,pack){
},precontent:function(){
game.addMode('扩展名',{
game:{
syncMenu:true,
createview:function(node,charalist){

},
},
start:function(){
},
},{translate:'我的扩展',},{image:['图片.jpg'],});
},onremove:function(){
game.clearModeConfig('fuckcaowash');},
help:{},
config:{},package:{
character:{
character:{
},
translate:{
},
},
card:{
card:{
},
translate:{
},
list:[],
},
skill:{
skill:{
},
translate:{
},
},
intro:"",
author:"里根十世",
diskURL:"",
forumURL:"",
version:"1.0",
},files:{"character":[],"card":[],"skill":[]}}})

9.6 国战

9.7 联机与搭建服务器

9.8 配置环境、制作自己的noname并发布

9.8.0 Linux配置node环境

9.8.0.0 需要的包

本机所使用的为UOS 22 家庭版。

从nodejs官网下载需要的包,地址为:

1
https://nodejs.org/en

这里就选择current,新版本。

9.8.0.1 安装

解压tar.gz,并放置在/opt/nodejs/下面。

使用软链接的方式设置全局变量

1
2
ln -s /opt/nodejs/bin/npm /usr/local/bin
ln -s /opt/nodejs/bin/node /usr/local/bin

9.8.0.2 换源

永久更换为淘宝源(淘宝)镜像站

1
npm config set registry http://registry.npmmirror.com

单次使用:

1
npm install --registry=http://registry.npmmirror.com

查看镜像源是否成功:

1
npm config get registry

9.8.0.3 安装electron打包器

1
2
3
npm install electron-installer-debian --save-dev
npm install electron-packager --save-dev
npm install electron --save-dev

需要特别提示的是,如果使用的cnpm,可能需要把xx放到xx下面才行。

1
2
3
4
5
6
!TODO

ln -s /opt/nodejs/bin/npm /usr/local/bin
ln -s /opt/nodejs/bin/node /usr/local/bin


9.8.0.4 补齐缺失的文件

如果你的noname是从github上clone下来的源码,那么大概率会缺少一个main.js文件。

在这里给出,其主要作用是开一个窗口并规定窗口大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// main.js 测试版

const { app, BrowserWindow } = require('electron')
function createWindow () {
const win = new BrowserWindow({
width: 1000,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
win.loadFile('index.html')
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})

noname Windows端的main.js:

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
// 由理版Windows端main.js

const electron = require('electron');
const {app} = electron;
const {BrowserWindow} = electron;

let win;

function createWindow() {
win = new BrowserWindow({width: 960, height: 660, title:'无名杀'});
win.loadURL(`file://${__dirname}/app.html`);
win.on('closed', () => {
win = null;
});
}

app.on('ready', createWindow);
app.on('window-all-closed', () => {
app.quit();
});

app.on('activate', () => {
if (win === null) {
createWindow();
}
});
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
// main.js V1.0.0
const electron = require('electron')

const { app, BrowserWindow } = electron
const Menu = electron.Menu
function createWindow () {
Menu.setApplicationMenu(null);
const win = new BrowserWindow({
width: 1000,
height: 660,
title:'Noname無名殺',
icon:'icons/noname.ico',
webPreferences: {
nodeIntegration: true
}
})
win.loadFile('index.html')
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})

除此之外,还需要一份package.json文件,它可以由electron-packager生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name": "noname",
"description": "",
"version": "1.0.0",
"main": "main.js",
"keywords": [],
"author": "",
"webkit": {
"plugin": true,
"java": false,
"page_cache": false
},
"scripts": {
"start": "electron ." ,
"pack": "electron-packager . noname --linux --out ../noname --arch=x64 --app-version=0.0.1 --electron-version=25.1.1"
}
}
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
{
"name": "noname",
"description": "An open source kill-playing game like Bang!",
"version": "1.0.0",
"main": "main.js",
"keywords": [],
"author": "水乎",
"homepage": "https://github.com/libccy/noname",
"license": "GPL",
"os": ["linux"],
"cpu":["x64"],
"webkit": {
"plugin": true,
"java": false,
"page_cache": false
},
"scripts": {
"start": "electron ." ,
"pack": "electron-packager . noname --linux --out ../noname --arch=x64 --app-version=1.0.0 --electron-version=25.1.1"
},
"repository": {
"type": "git",
"url": "https://github.com/libccy/noname",
"directory": ""
}

}
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
{
"name": "noname",
"description": "An open source kill-playing game like Bang!",
"version": "1.0.0",
"main": "main.js",
"keywords": [],
"author": "水乎",
"homepage": "https://github.com/libccy/noname",
"license": "GPL",
"os": ["linux"],
"cpu":["x64"],
"linux":{
"icon":"icons/noname.ico"
},
"webkit": {
"plugin": true,
"java": false,
"page_cache": false
},
"scripts": {
"start": "electron .",
"pack": "electron-packager . noname --linux --out --icon=./icons/noname.ico ../noname_build --arch=x64 --app-version=1.0.0 --electron-version=25.1.1"
},
"repository": {
"type": "git",
"url": "https://github.com/libccy/noname"
},
"devDependencies":{
"electron":"^25.1.1"
}

}

9.8.0.5 打包

构建electron项目

npm安装依赖

1
electron .

构建打包

1
electron-packager .

!需要注意的是,UOS的sudo被修改了,sudo创建的文件,所有者为root而非普通用户。因此,如果普通用户想要做些什么,是很难的。因此,应该在打包完毕后将所有者改为当前的普通用户。这样就方便用户自己修改了。

1
sudo chown -R reaganx:reaganx ./noname-linux-x64/

deb包

构建deb包的目录原理与目录

control文件

DEBIAN/control

1
2
3
4
5
6
7
8
9
10
11
12
Package:noname
Version:1.0.0
Section:games
Priority:optional
Architecture:amd64
Maintainer:Reaganx<yjcreaganx@outlook.com>
Installed-Size:
Eseential:no
Conflicts:
Homepage:
Description:An open source role-playing game like Bang!

desktop文件

1
2
3
4
5
6
7
8
9
10
11
[Desktop Entry]
Encoding=UTF-8
Name=无名杀
Version=1.0.0
Comment=An open source role-playing killing game like Bang!
Exec=/opt/noname-linux-x64/noname
Icon=/usr/share/icons/noname.ico
Terminal=false
StartupNotify=true
Type=Application
Categories=Game;

开始打包

1
dpkg -b . ../noname-1.0.0.deb

查看版本

1
navigator.appVersion

li-lo包

Appimage

9.8.0.5 上架星火商店

第一次投递

后续更新

换包强更

9.8.0.6 图标设计–GIMP

9.8.0.7 关于导出错误与许可证的添加

  • 版本:1.9.122.2

  • 平台:UOS家庭版(22.0)

  • electron版本:25.1.1

  • node版本:20.3.0

  • 报错说明:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Uncaught TypeError:game.readFile is not function
    chooseButton:1
    chooseCharacter:1
    game:5
    -----------------
    player:undefined
    -----------------
    41337
    14
    TypeError:game.readFile is not a function
    at file:///opt/noname-linux-x64/resources/app/game/game.js:41337:14

暂时的解决方法:

官方的game.js从这里开始替换

image-20230620144857129

也就是:将官方的processExtension:

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
var processExtension=function(exportext){
if(page.currentExtension){
if(page.currentExtension!=inputExtName.value&&!exportext){
game.removeExtension(page.currentExtension);
}
}
inputExtName.disabled=true;
setTimeout(function(){
var ext={};
var config=null,help=null;
for(var i in dash4.content){
try{
if(i=='content'||i=='precontent'){
eval('ext[i]='+dash4.content[i]);
if(typeof ext[i]!='function'){
throw('err');
}
else{
ext[i]=ext[i].toString();
}
}
else{
eval(dash4.content[i]);
eval('ext[i]='+i);
if(ext[i]==null||typeof ext[i]!='object'){
throw('err');
}
else{
ext[i]=JSON.stringify(ext[i]);
}
}
}
catch(e){
console.log(e);
delete ext[i];
}
}
page.currentExtension=inputExtName.value||'无名扩展';
var str='{name:"'+page.currentExtension+'"';
for(var i in ext){
str+=','+i+':'+ext[i];
}
dash2.content.pack.list=[];
for(var i=0;i<dash2.pile.childNodes.length;i++){
dash2.content.pack.list.push(dash2.pile.childNodes[i].link);
}
str+=',package:'+get.stringify({
character:dash1.content.pack,
card:dash2.content.pack,
skill:dash3.content.pack,
intro:introExtLine.querySelector('input').value||'',
author:authorExtLine.querySelector('input').value||'',
diskURL:diskExtLine.querySelector('input').value||'',
forumURL:forumExtLine.querySelector('input').value||'',
version:versionExtLine.querySelector('input').value||'',
});
var files={character:[],card:[],skill:[]};
for(var i in dash1.content.image){
files.character.push(i);
}
for(var i in dash2.content.image){
files.card.push(i);
}
for(var i in dash3.content.audio){
files.skill.push(i);
}
str+=',files:'+JSON.stringify(files);
str+='}';
var extension={'extension.js':'game.import("extension",function(lib,game,ui,get,ai,_status){return '+str+'})'};
for(var i in dash1.content.image){
extension[i]=dash1.content.image[i];
}
for(var i in dash2.content.image){
extension[i]=dash2.content.image[i];
}
game.readFile('LICENSE',function(data){
extension['LICENSE']=data;
game.writeFile(data,'extension/'+page.currentExtension,'LICENSE',function(){})
if(exportext){
var proexport=function(){
game.importExtension(extension,null,page.currentExtension,{
intro:introExtLine.querySelector('input').value||'',
author:authorExtLine.querySelector('input').value||'',
netdisk:diskExtLine.querySelector('input').value||'',
forum:forumExtLine.querySelector('input').value||'',
version:versionExtLine.querySelector('input').value||'',
});
};
if(game.getFileList){
game.getFileList('extension/'+page.currentExtension,function(folders,files){
extension._filelist=files;
proexport();
});
}
else{
proexport();
}
}
else{
game.importExtension(extension,function(){
exportExtLine.style.display='';
});
}
},function(){
alert('许可证文件丢失,无法导出扩展');
});
},500);
};



替换为processExtension:

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
var processExtension=function(exportext){
if(page.currentExtension){
if(page.currentExtension!=inputExtName.value&&!exportext){
game.removeExtension(page.currentExtension);
}
}
inputExtName.disabled=true;
setTimeout(function(){
var ext={};
var config=null,help=null;
for(var i in dash4.content){
try{
if(i=='content'||i=='precontent'){
eval('ext[i]='+dash4.content[i]);
if(typeof ext[i]!='function'){
throw('err');
}
else{
ext[i]=ext[i].toString();
}
}
else{
eval(dash4.content[i]);
eval('ext[i]='+i);
if(ext[i]==null||typeof ext[i]!='object'){
throw('err');
}
else{
ext[i]=JSON.stringify(ext[i]);
}
}
}
catch(e){
console.log(e);
delete ext[i];
}
}
page.currentExtension=inputExtName.value||'无名扩展';
var str='{name:"'+page.currentExtension+'"';
for(var i in ext){
str+=','+i+':'+ext[i];
}
dash2.content.pack.list=[];
for(var i=0;i<dash2.pile.childNodes.length;i++){
dash2.content.pack.list.push(dash2.pile.childNodes[i].link);
}
str+=',package:'+get.stringify({
character:dash1.content.pack,
card:dash2.content.pack,
skill:dash3.content.pack,
intro:introExtLine.querySelector('input').value||'',
author:authorExtLine.querySelector('input').value||'',
diskURL:diskExtLine.querySelector('input').value||'',
forumURL:forumExtLine.querySelector('input').value||'',
version:versionExtLine.querySelector('input').value||'',
});
var files={character:[],card:[],skill:[]};
for(var i in dash1.content.image){
files.character.push(i);
}
for(var i in dash2.content.image){
files.card.push(i);
}
for(var i in dash3.content.audio){
files.skill.push(i);
}
str+=',files:'+JSON.stringify(files);
str+='}';
var extension={'extension.js':'game.import("extension",function(lib,game,ui,get,ai,_status){return '+str+'})'};
for(var i in dash1.content.image){
extension[i]=dash1.content.image[i];
}
for(var i in dash2.content.image){
extension[i]=dash2.content.image[i];
}
if(exportext){
var proexport=function(){
game.importExtension(extension,null,page.currentExtension,{
intro:introExtLine.querySelector('input').value||'',
author:authorExtLine.querySelector('input').value||'',
netdisk:diskExtLine.querySelector('input').value||'',
forum:forumExtLine.querySelector('input').value||'',
version:versionExtLine.querySelector('input').value||'',
});
};
if(game.getFileList){
game.getFileList('extension/'+page.currentExtension,function(folders,files){
extension._filelist=files;
proexport();
});
}
else{
proexport();
}
}
else{
game.importExtension(extension,function(){
exportExtLine.style.display='';
});
}
},500);
};

这样做,虽然不再报错,扩展也可以正常导出,但是导出的扩展中不再包含许可证,需要手动添加许可证。

9.8.1 Android开发

9.8.2 ios开发

十、大佬语录

第一篇

1.希望有人把我的语录记下来
2.反正我自己说的话,就是教程[菜狗子]
3.啥,你有涩图?
4.大失所望
5.。。。
6.你得自己学起来,再向人请教
7.我是现实主义者[图片]
8.全局技能,你可以将此牌当无中生有或铁索使用[滑稽]
9.不然就只能给这张牌加个右击点击事件,点击后显示两个按钮,用全局变量记录你的选择
10.我啥素材都没有
11.[疑问]
12.那就只能改useCard函数了
13.不写在content里,可以写在contentBefore里
14.你想说明你菜,还是无名杀菜
15.关于死亡配音
教程有个播放死亡配音,看那个 game.playAudio(‘..’,’extension’,’/你的扩展名,
如果有需求,比如语音文件放在主文件里的其他文件夹中,可以用:不阴间系列/audio/die/‘,trigger.player.name);
16.计数主技能
主动技用player.getStat,触发技用player.storage.counttrigger 都是本回合生效 两个注意事项:
1).getStat在技能没有发动的时候不是0而是null
2).direct类的技能也会计入counttrigger,不发动记得手动减一
17.新人复新人,新人何其多
18.你这个viewAs明显是动态视为,动态viewAs和chooseButton要写hiddenCard。
所以viewas技能里的filter和viewasfilter有啥区别?少个参数的区别。
19.你们完全不用英文联想功能的吗?习惯不好。有些英文符号跟中文符号很像,代码只能用英文符号
。这种因为用中文符号引起报错的我一般建议抠眼珠子。
20.承接19。不会,我按shift很快的。我改成ctrl+空格了。单按shift切输入法容易误触,贼难受。
21.顶装备有个swapEquip的属性为真,检测这个就知道是不是顶装备了。百度会不会,没流量我给你冲。性感狗妈在线教学
22.用英语单词做id就是拼音排序不太友好。雪豹所至,片甲不存,雪豹,我们上。虎豹骑都是jk美少女啊,jk,嘿嘿 ,样式狗都不做。
23.又玩抗性是吧,你信不信我让你强行移出游戏。老整这些有的没的,难蚌。
24.同时获得牌,不可响应directHit不就行了,

1
2
3
4
5
6
7
trigger:{player:'useCardToPlayer'},
filter:function(event,player){
return event.target.getSkills(null,false,false).some(skill=>lib.translate[skill].includes('龙'));
},
content:function(){
trigger.parent.directHit.add(trigger.target);
},

多难的事儿。知道为啥用useCardToPlayer不,这里面的trigger.target都是对当前目标单个发动的。
aoe就会每个目标都检查一遍。chooseTarget(lib.filter.notMe)
25.使用【杀】造成的大于1的伤害该怎么写?event.card&&event.card.name==’sha’&&event.num>1
26.Q: trigger.getParent().directHit.push(trigger.target); 加了这句代码,杀没有反应了,这句话不是不可响应吗?
A:要不你把push换add试试?
27:Q:大佬们 有什么方法可以清空history么?getHistory和getGlobalHistory返回的结果。
A:你到管的宽,历史记录也敢乱删。
28.承接27.A2.你改游戏机制怎么想的,你以为历史是用了干什么的,让你想改就改的吗。
Q2.我还是在牌进入弃牌堆的时候记录一下 然后清空记录吧
29.Q:关于锁定技的forced和locked?
A:locked的优先级大于forced,只有forced默认locked为true,如果有locked:false则forced:true只有强制没有锁定。
30.最有价值的是大佬语录。道可道非常道[滑稽]
31.觉醒寄的定义是达成条件触发。
32.Q:经常报错怎么办?A:关掉你那b十周年UI
33.管理呢?那个放不死代码的禁下言。
34.Q:大佬们,怎么没有lib.number啊。A:为什么要有lib.number,你想用这个干什么,是ASCII码不够用了特意要编一个数字库吗。
35.Q:提问无名杀是谁做的。1水月2水乎3苏婆4水某。A1:首先排除水枪。就是啊,A2:水乎谁啊,一看名字就是无名小卒。
36.Q:get.color后边的括号是什么,首先排除牌和数组。Q1:我就想算一下有多少红牌。
A1:getCards这么好用的东西咋不用呢。
A2:player.getExpansions(‘quanji’).filter(card=>get.color(card)==’red’).length
A3:这不就是红色权的数量。
37.Q:chooseControl无法同时选多个选择项,怎么做?
A1:多选直接用choosebutton啊。
A2:button对于萌新来说可能有点超纲。
A3:button太超纲,control刚刚好。
A4:control不能多选
A3:那确实
A2:很多技能都需要用到choosebutton,它还是需要掌握的
A1:chooseButton和step交织在一起,萌新搞懂了,就避免了很多错误
A5:choosebutton其实就是一个参数列表,其中可以有多种类型,比如,布尔值、对话框、选择菜单、数字、函数和数组。
参数,可以设置一些选项方式、筛选条件、菜单大小、AI行为等一系列操作。
嗯,差不多就是这个原理
A5:非常简单
38.Q:关于创造事件?
A:创建事件是进阶玩法,你先把基础搞懂,别整些有的没的。
这么跟你说,手动创建事件是没有trigger的,你首先就要考虑这个事件该插在事件链的哪个位置。
有些特殊时机是手动trigger出来的,事件链里没有地方给你插,这种你还用不了手搓事件,比如useCard1。
你想玩还有得学,这个就是手搓事件,回合结束时摸牌。
除了setContent里那一行是摸牌以外其他的都是定位,你要保证事件能插到回合结束时。
39.Q:这大佬语录怎么大部分是狗妈说的
A:主要是有时候看到,就懒得记了。
40:Q:关于locked:function(){}?
A:你猜sp姜维的困奋怎么写的。locked+direct,里面logskill,简单。
Q:为啥forced:function(){}不生效?
A:没有这种写法,不支持function。A1:forced哪有这种写法。A2:forced not a function。A3:那如果我要薛定谔的forced呢
A1:而且本身你想不锁。没必要加这玩意。
41:Q:关于direct?direct:true是不是默认locked:true了
A:其实就是发动但不声明,也就是偷偷发动,而且是锁定发动的.肯定没语音,因为发动但不声明,后面想让他声明就需要专门写一个logSkill。
害,算了。
42:承接41:A:反正主动技的话。得log:false,他才不会log。还有silent:true,代表沉默,写了silent:true,不会发动语音。
A2:懂了,给许攸加这个。A:骆驼的用牌计数器就是加了silent:true,所以不会BB。
A3:懂了,这就去删了。A4:懂了,这就去删了。A5:懂了,这就去删了。
A6:你们都这么想bb吗?
43:关于无名杀不能做到的事?A:学会js啥都差不多只不过是表现形式的问题
44.Q:关于移除tempSkill?
A:断肠参数如果不是true,是不会移除tempSkill的
45.Q:如果场上有三个新杀徐荣 ,他们的暴戾标记如何区分呢?现在是不区分的。但我想要区分开来,有啥办法实现吗?区分不同角色的相同技能携带的同一标记
A:有啊,就是麻烦。
Q:给个关键词?A:没有关键,全是关键
A1:建议做一个给别人发牌的武将。Q:先辅能区分吗?
A1:全场最忙的角色。A:我觉得很简单,但是很麻烦,公用标记多舒服,不然一个人身上挂来自八个人的标记
Q:新杀徐荣可以移除暴戾造成效果 会被别的虚荣变成白板。不行 我要想办法解决。
A1:防止一个场上有超过一个以上该技能的事。A3:直接把限制条件删掉
A4:发标记的形式改为map,而不是addMark,就可以解决这个问题。A:很显然我觉得他不会A4:正常
Q:能说详细一点吗?实现思路。
A5:改描述吧,从根源解决问题。A4:直接搜索map,你就能找到很多实例。看不懂的话,我这里还有付费咨询服务呢亲。
A:都不看他说的 A5:说什么了我瞅瞅。A:人家说的是区分不同角色的相同技能携带的同一标记,你改描述区分个锤子。
A5:搜噶。
Q:用标记记录map的key 和value?A4:很简单吧,能说出key和value,应该是懂的。看他有没有看见id这个东西了。
A3:付费咨询?我可以我是废物,可以把我付给你吗?A4:说起来有没有可能无名杀这个id机制在运气逆天的情况下出现bug啊。随机出两个相同的id。@A3 也不是不行,送你去下矿也可以换小钱钱
A5:付出身体嘛,有点。。。。。。黑奴的感觉。A4:所以说前提是“运气逆天”
A3:哥们去不了葡萄园!A:之前某位群友就搞过
Q:通过 player.playerid 可以获取到id是不?A4:是的
A5:开始消光。可爱捏。A4:来玩暗区突围。A5:暗区,我电脑没下,但是下着使命呢。
A4:电脑上也没有吧。A5:众所周知,消逝的光芒中的丧尸是狂犬病的突变病毒导致的,所以,水里才是最安全的安全区。我想不出来我怎么死
46:Q:大佬们,game.getGlobalHistory(‘cardMove’,function(evt){ })里面,怎么筛选出在弃牌阶段内的evt啊,有没有类似evt.isUsing()这样的判断函数
A:笨蛋,

1
2
3
4
var cards=[]; trigger.player.getHistory('lose',function(evt){
if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger.getParent('phaseDiscatd')) cards.addArray(evt.cards2.filterInD('d'));
});

A1:多谢大佬,世界观+1
47:Q:audio这个能用函数吗,在技能里?
A:为什么不能?A1:没见过别人用。A2:可以用playAutio。
48:Q:大佬们,问个问题,无名杀中白银狮子狮子的减伤和回血是同一类型的代码嘛,以及青釭剑使防具无效的代码?
A:承接44.断肠用的是clearSkills,这个函数有个布尔值参数,为真才会删tempSkill。很显然断肠没有加这个参数
A2:当年我看丧尸片,最喜欢就是那种传染力,破坏性,一堆丧尸追着跑,从这点上说我也挺喜欢怪兽片,可惜现在没什么这种相关的好片了。
49:Q:大佬们,怎么转换装备牌?
A:散兵。喜欢转化是吧
A1:问个问题把你问急了?
A2:三国杀里好像没有转化装备的吧.
A3:周处。A4:周处是转化酒,把装备转化成酒。A:转装备是转基本锦囊不能满足你还是会转装备显得你高人一等
A1:我有要求来问把你问急了?这么容易急?A2:傻逼,转不了.但凡搜索一下多不会出来狗叫,都
A1:合着我来问问都不行?那我进这群干啥?没找到相关解释问问怎么了?问个问题就出来骂人了?家里少了人?出来说一下不能就行的事,偏要来骂个人彰显自己nb?
A4:怎么说,新的语录?A2:第一这个问题很多人问,问问题之前应该自己先去寻找答案
A1:我知道有人问了?我有不懂的来问有问题?那这群别叫什么萌新交流群了,叫大佬喷萌新群得了,要啥萌新
A2:要先自己找看不到吗。A1:我就是没找到啊,而且这是你骂人的理由?真家里少人给你急了?
A:如果你在代码交流群里问这个问题我会告诉你方法,你来萌新群问这个问题是钓鱼吗
A1:萌新不是萌新问问题的地方?这是萌新问问题的群还是让你喷人的?你这大佬这么nb?萌新问个问题就来骂人?
A5:动底层规则都比较麻烦。
A:知道为什么其它牌都可以印唯独装备不能不,其它牌的效果都是不是牌本身的效果。是使用牌时创建了牌效果的事件,装备牌本身就带效果。
A2:装备牌在手牌区只有一个效果(不包括其他技能):使用,并且去向是装备区,在装备区能使用
A:都是说的简单,开口前从来不考虑实现问题。是能硬塞进装备区,那效果呢,装备效果的实现方式跟手牌都不一样。印装备只能捏牌,有几个萌新会凭空捏张牌出来。
A6:印装备这货,是有平替方案的。可以做到伪的效果,原来的牌直接置入弃牌堆,然后印一张同花色同点数的牌,以此法印的牌置入弃牌堆后销毁之,问题就出在这,被顺走以后这张牌不会变回去,所以说只是伪的方法,算是平替,技术上没有什么难度。
A7:我现在就在教刚刚那个萌新捏牌
A6:苏婆加一个补丁就能跑了,但是,苏婆是不会在意扩展作者的想法的。
Q1:是指虚拟牌吗?
A:不,是造一个游戏里不存在的新牌。并用这张新牌实现对应效果。
A6:只能等狗卡出。
A7:不是虚拟牌,虚空印牌,也是实体牌。
A8:虚空印牌也是实体卡,你改init也是实体卡
A:这个新牌是用完即销。
A8:总之,转化装备牌目前是做不到的,直接跟他说要money。
A6:哈哈哈哈,那个ai写的都是漏洞百出。还指望什么软件。
50:Q:关于chatGPT?
A:很大“设计师”都以为有chatGPT就能为所欲为了,我只想说,chatGPT能看懂他描述再说。看懂了能满足他要求再说
A1:确实,而且chatGPT就算看懂了,写出来的也不尽人意。而且账号我记得要钱的。
A2:年关还有个亲戚跟我吹chat能自动写代码,哪儿有那么简单的事。ai能写人类早死完了。
A3:那个的官方群我本来在来着。其实就是套的chat,后面那个官方群我就退了。因为制作者,把那个软件关闭了。
A2:快进到硅基生物占领地球
A3:chat可以解决你js的简单问题,但是解决不了无名杀那种别人定义的语言格式的问题,除非,你把无名杀喂给他
51:Q:subSkill里面写sub:true,和不写有啥区别
52:关于拼点胜利:
A:上次写了个你拼点时可以崩一滴血视为胜利,结果就是把两个拼点函数都重写了一遍
视为拼点胜利就是出了胜利的人是你以外其它数据都不变,别人点数该比你大还是比你大,面杀神技,口头表示你赢了
A2:总得来说确实如此,因为拼点判断胜负只和点数相关,所以说,按照严谨的话。确实如果是视为胜利。那太棘手了。很多东西看似简单自由。但确实是面杀特别好处理的情况。但网杀。。饶了程序吧。然而网杀也有好处理的情况。而面杀及其复杂。总之来说就是一言难尽,网杀检索特定牌,一秒钟就搞定。面杀???
就以前那界徐庶。14年那时候,面杀谁玩都得挨一顿打。浪费大家时间。垃圾桶这东西真不配玩游戏好吧这哪里是玩游戏,这是被游戏玩,线下烧条会被打的(bushi
A2:懂了,线下响应条取决于反应时间
53:Q:关于鸽子的一个bug
A:魔王去找你没有。A1:什么,莫名其妙拼点,不愧是鸽子。
A:不是这个问题,技能效果执行到展示牌,后续没了。后续要执行获得技能,他说没了。就直接跳过了。我已经找到一个bug了
randomGets和randomGet不一样,addSkillLog不兼容randomGets的返回值。
A2:randomGet返回的是一个值,randomGets返回的是一串值。addSkillLog不能跟addSkill一样批量加技能,当然不兼容。
A:啥函数啊,不可能,绝对不可能。你randomGets那个值用addSkillLog,怎么可能加的上。
A3:急了,鸽子一急就发语音。A4:我只是腾不出手。A3:手在搞什么
A4:这什么玩意,我写过这个吗?,我去瞅瞅,我记得我循环了一下。按他描述也是因为我函数加的问题,要有这类加不上的问题,应该早就发现了
A:可是他不应该能跑,你说的是这个吧。
A2:这个我早发现了,但鸽子写那么久居然还没发现。
54:Q:有大佬在吗,可不可以解决一下问题呀,我这边设置了5个选项,我怎么让这五个选项在回合开始的时候能够让我选择啊,我参考了其他角色的有选择的代码但是有些看不懂,有大佬可以解答一下或者给一些更详细的代码吗?
A:6,直接所有东西写在trigger里是吧,trigger没括号都没发现吗。
55:别信他。这人知名同济大学的。
A:上海交通职业技术学院
A1:简称上交大是吧@Reagan x
56:QQ钱包,wx钱包,支付宝,都可以解决,js也可以解决。解决办法多了去了,选择以后再点,对应选项界面出现被划掉的横条都可以
A:chooseControlList,选过的用一个storage存着就行。remove,js的函数多少根py不同,翻翻es6的文档就有了,没必要删除元素就重置数组,哦,没看清,存数据用storage,别用event,event每次发动技能都会重置
A1:init不行吗
A:可以啊,怕他不会用。

1
2
3
init:function(player,skill){
if(!player.storage[skill]) player.storage[skill]=[];
}

player.storage[技能id]这个数组用来存选过的。
57:浏览器版vscode,真的黑科技。
58:我挺好奇py的运行原理,没头没尾一句print()就能打印文本。玩不来玩不来
59:Q:我又来了,为什么生成不了卡牌?
A:card 都没定义,;就已经结束了。
A1:因为是抄的,在哪步去定义啊。
A:card card=
A1:后面写啥
A:没定义。前面加个var ,或者var 后面的info;改成,
A2:有没有可能,变量要声明呢?,直接赋值得该作用域已有的值才行。
60:关于var和let?
A:据说用var会有一些问题?
A1:你触发不了
61:嗯,写的是寄吧。正常人写的代码不会这样毫无逻辑的
62:承接60:。在无名杀中。技能中包括有step 的。var 声明的变量只在该作用域(也就是这一步的step)有效。
63:班门弄斧,一个人玩消光好瘆人。
64:Q:行外人问一句,step就是类似作用域一样的东西吗
A:不是作用域,是水乎独创的语法,目的是为了等待玩家操作完某个事件,比如挑选别人的手牌。
A1:step是无名杀特有的吧,会被parse处理成??然后??我记得之前哪位大佬说过,可惜我只记住了前半句
A2:说了也白说,教过很多次了只能说
A3:step是无名杀特色
A4:各位大佬们已经解析了很多次了,还有一点,技能代码里的注释 不要包含step 1之类的
A5:类似生成器,生成器里面的yield
A2:

1
2
3
4
'step 0'
player.draw();
'step 1'
player.recover();

约等于

1
2
3
4
switch(step){ 
case '0':trigger.player.draw();break;
case '1':trigger.player.recover();break;
}

但他是会循环执行每一个step的,从0开始,content会经过parse处理。
所以看似它一个参数也没有,实际有那么多个参数。溜了溜了,不讲了。
65:你说的大佬是指现在还在用group写七八个同名技能塞一个技能里吗?
A:这种码风吗?公开处刑就算表演节目了
A1:我的自学代码启蒙导师是ex包,还是很久的ex包,他里面就这样写技能的
66:你要不翻翻聊天记录?狗妈教过很多次了。问计问明白了。也要记住啊。天天问计天天忘,那有什么意义呢
67:小刀拉屁股。
68:他输入法不太聪明,看直播就能注意到
A:讲课的时候,总是打错,大大降低了我的效率,然后在代码公开课玩消光打丧尸
69:同济小伙起这么早
A:是上交院的
A1:上交?上哪交
A:上交院是啥?只听说过上交
A:上海交通职业技术学院
70:Q: prompt2: ‘’, 这个里面可以用get.translation() 吗?
A:可以,技能里要写成function,map不用,如果没有其它地方要用的话map特指chooseCardTarget
71:喜欢整一个技能多个效果还不能多收点了,非回合内外效果少说就算两个技能,还带升级的,不下百来行谁写的完
光是分配牌那儿就少说50行,你去看看界郭嘉
麻烦各位diy技能时尽量想得跟个人样,不要认为描述字少对应的代码就好写
我宁愿写小作文也不想看到“分配”“对方”这些字眼。来,你跟我写个:把攻击范围分配给以下数值①杀的目标数,②闪的响应数,③杀后摸牌数
72:确实诡异,代码全是顶头,不知道用的啥编辑器写的。您完全不缩进是吗
73:A1:md不缩进是吧。A2:c语音老师暴死,没缩进我看得要去世了
73:魔王有这钱不如送给我和狗妈
74:我写过的逆天多了去了
75:改函数给removeMark加个空事件来捕获触发就可以写global:’removeMarkAfter’了
76:Q:写代码免费,修bug收费。这样才能生生不息,源源不绝
A:我又想起了那个饮料免费上厕所20一次的模拟游乐园
77:好那么展开话题,一个简短的效果,各位会怎么实现呢
锁定技,杀死你的角色不执行奖惩。
A:苏婆:我直接改源码
A1:吧来源赋空
A2:对了一半,但总归是还是要有凶手的,凶手还是原来的
A3:苏婆这个方法有点暴力。而且有局限性
A2:身份模式就用不了了,你知道我是怎么解决的吗,找到奖惩事件的本体函数,
draw啊,lose啊,然后Before的时候判定,getParent是die,getParent是die
A4:改player.dieAfter
78:@Angel 别xjb发了,这玩意会at全体,辉烬人在家中坐,直接鱼从天上来
//5月6号,13.45.30
79:Q:肆军:准备阶段开始时,你可以弃置任意张点数之和为36的牌,若如此做,你随机获得若干张点数为36约数的牌且这些牌点数之和须为36或36的倍数(且以此法获得的牌数不能超过你弃置牌数的两倍)。
张角:我TM数学能有这么好?@通宵了 狗妈去写一下
A:上次写了个36的算法,没被采用,然后删了。别来找我,原理就是组合加进出栈,自己去研究
算法狗都不写,for循环就完事了。本体那个不就是一个循环for到底,你就说有没有36点吧。
A1:其实这个蛮好解的因为不可能有点数36和18的牌。只需要判断牌堆的1,2,3,4,6,9,12。这7个数。组合拳组起来成36就行了。不过牌堆的牌组不起来的话。那就只能组72了。当然牌越来越少就是five技能了
A1:本体确实写的相当于来说要简单很多。如果像狗卡那样从1开始捡。就会复杂些。也会更强,
A:不想置评。
Q1:神张角里面没有36的计算吗
A1:本体的是直接找任意牌凑够三十六意思意思。
A2:蛙趣,突然看懂了你这个。好恐怖啊
A1:不是从1,2,3,4,5,6,这样开始找的。比如说,从1开始找,没有1了,再找2,然后找3,找4这样子
80:Q:游戏本体武将的技能代码在哪个文件夹
A:character
81:Q:请问怎么添加一个锁定技,出杀次数+2那个
A:return num+=2,张飞那个
82:A:会敲无名杀代码是不是都是理科博士啊,你们整的这些我咋一个也看不懂
A1:无名杀现更新者苏婆也不过是才上大学而已
A2:等着,我六点半可能上课,到时候就能用笔算了
A:那都是大学生,我咋看不懂你们写的是什么
A3:别上大学,会变成我这德行。我告诉你,我这个helloworld人都能写无名杀代码
A1:有没有可能,这是要学的呢虽然学过c的很容易上手这个。
83:苏婆刚接手无名杀的时候刚刚上高中没多久,小孩子不懂,写着玩的(bushi
A:你们毕业了吗,或者今年毕业吗,哦,那我告诉你,小心依托答辩。我和你的区别在于,我是我们学校最后一届计算机学生。今年毕不了业的话,就等着被业毙
A:上了大学后,就再也没有自己的人生了。
84:近代S的人物谁敢出游戏啊
85:接单能挣钱,那自己写扩展包能拿来卖钱吗
A:接单好
86:关于无名杀在线作者?
A:都2023年了。还有人答唐家三少
A1:难能可贵
A2:无名杀有很多三国杀的武将和玩法,所以应该和三国杀同一作者,而三国杀的作者是基于三国演义设计的很多武将,因此作者一定比罗贯中更加了解三国,所以作者一定是和三国时期很近的人而且具有超人的智慧(在古代写代码),因此无名杀的作者是诸葛亮
A3:不,还有一种可能,是罗贯中的小舅子
87:Q:推荐推荐扩展有哪些好玩的
88:Q:大佬们谁有假装无敌的扩展呀
A:加群呗(314590231),或者微信公众号
A1:不知道答案(悲)
A:建议公众号找答案,正常入坑的懒人包也有答案,答案还是不能说的
A2:清瑶
A3:高达一号
A4:唐纳德,唐吉柯德,唐醋里脊
89:哪里错了?

1
2
3
4
5
6
7
8
9

forced:true,
trigger:{
source:"damageBegin",
},
direct:true,
content:function(){
trigger.baseDamage++;
},

这个代码不是你造成的伤害+1吗 我试了试不管用
A:trigger.num++
A1:加伤 时机是usecard的话,用base,两种方式
A2:baseDamage是给牌用的,extraDamage是给目标用的,目前只有杀和决斗有。baseDamage是数值牌都能用,伤害类,回复类,酒(最近加的)
A3:但对跨事件的牌无效
A2:你要说baseDamage对目标生效也不是不行,在牌生效是对event._target增加baseDamage就行了,无懈就是对event._target特异生效的,反正奇奇怪怪加伤的方法多了去了
A3:但得决斗直接加baseDamage,搬石砸脚的话可太痛了。
A2:

1
2
3
4
5
// trigger.num++类:
source:'damageBegin1'//(你造成伤害)
global:'damageBegin3'+event.source==player//(受到你造成的伤害)
//trigger.baseDamage++类:
player:'useCard'//(使用牌的伤害基数)

Q1: 给兵临城下加个加伤buff,对里面的杀能有效吗,
A2:肯定有效的。无论是baseDamage还是extraDamage。都可以。都是服务于牌的。
至于trigger.num++那更不用说了。
90:Q:这是怎么回事 选将不能选了 点了没反应
A:应该是双将,再选一个.
A1:我说咋回事 不小心点住双将了
91:enable: “chooseToUse”,不能在被动技用。enable不能和trigger同时出现,还有usable拼写错了
92:被整活群友气晕
93:Q:获取牌堆中所有牌的类型怎么搞
A:啥类型,type吗,直接遍历(
A1:先不说我这有花朵牌,东方包还有禁忌牌,本体还有食物等等…
A:那不遍历咋办
A2:lib.cardType。好像是不包括基本锦囊和装备的(
A3:lib.cardType[subtype], 好家伙,话还不说全……,我现去game.js看的…
A2:我说type都是lib.cardType的键值所以说Object.keys(lib.cardType)获取tye数组
94:关于
你所xx的体力值

怎么写
A:你要的- 1 +,源码在这儿,请抄
A2:暴躁狗妈,在线教学。
A:抄都抄不来就别整那些花哨的
95:Q:大佬,问一下,group前面跟后面为什么有符号。这个不会影响吗
A:哪个符号
A1:/*
A:这个,是注释。注释里面的内容怎么写都没事
96:Q:关于round
A:round标签是最近加的轮次技标签。数字是几轮后重置。
A:去升级版本了再用,不然就别用,每轮限一次又不是没有替代方案
A1:你啥版本啊。哪有round都不过关的。@Apathy丿灬寒羽
A:以前写每轮重置都是加个轮次开始就删的临时技能,检测到就不发动,就这么简单
97:typeof就是用来检测数据类型的,typeof 1 就得到一个number,但也很少用了
98:好了。继续今天的话题。
当一名其他角色执行死亡奖惩时,你可以翻面,代替其执行此次奖惩。
群友们会如何写呢
A:我不会,翻倍给下一个.
A1:当然是打开手机,订票。直接去找他
A2:那不是更简单了,把事件角色换了就行了
A3:狗妈是第一个答对的
A2:’drawBefore’,’chooseToDiscardBefore’,然后把trigger.player换了
A3:在无名杀这种情况是非常简单的
A2:这才叫代替执行,本质还是奖惩,只有人不同了,那种取消了又执行了事件都变了
A4:好暴力
A3:小乔:你在骂!
99:Q:重铸也是使用技能?
A:_chongzhu,你觉得呢
100:沉迷星铁,无名杀暂时都没写技能了
101:c,狠狠地无语住了
102:不予置评,和室友打cf去了,你就用诗笺版就行了,我客户端就用的那个
103:我对各位金主的单子还是非常上心的
104:A1:这个dialog没啥必要手搓,用tdnodes就行了。
A:苏婆:我明明更新了更好更便捷的
A2:但是我过往引用的都是过往的
A1:tdnodes,textbutton就是为了避免手戳td,而封装出来的,
105:正经的主动技哪里会加Charlotte啊,本来这个标签就是防止被封印或白板的。
A:不一定
A1:那这个技能衮就行了。
A:衍生效果是可以合法加的
A1:我只能说,一个正常效果的主动技,而且是主技能,加各种标签防止被失效或者什么的。那都不配待在三国杀好吧。是主动技且是主技能,百分之百是不会写这个标签的。
106:Q:有个问题,什么叫神圣死亡
A:不会触发死亡的相关技能
107:阴间路上,自有更强者
108:谁告诉你content用匿名的,content没返回值啊。外面加个大括号框着啊,好好写content:function不好非要学鸽子那套
A:没有返回值也可以省略大括号,但是无名杀这里不要省略。if也建议别省略大括号
109:鸽子教的是方法,别学人代码风格啊
110:喜欢玩抗性就做点贡献,CF一把火麒麟888,你要做抗性技能怎么也要给个千把块钱意思意思吧
111:这是一场瓜分世界的会议。是人类有史以来,最血腥的计划,参加会议的每一个人,都是最狂热的法西斯主义者,时隔八十余年,战火将再次笼罩世界
112:是时候开启,代码之间的巅峰对决了
A:我不是很喜欢无法反制的技能
A1:无所谓,我会开这个
A2:我请大家好自为之
A3:到时看t不t出群聊就完事了
113:因为他插阶段不插回合数据的。也就造成了他的出牌阶段,不是他的回合内的奇葩
114:读书人那能叫撸管嘛,那叫打角,那叫磨枪
115:刚出门又一个爆爆
116:Q:如何检测牌的视为名而不是本名?
比如我头上有个方块闪变的乐,我想检测到它是乐不思蜀而不是闪
A:cards,牌的数组,而不是card。
Q1:那要是输出的result.links[0]呢
A:event.cards表示其原本的牌event.card表示其最终的结果
117:moveCard没有logSkill用着不舒服
118:小屁孩写着玩的是吧,那你辍学了?
119:也就魔王设计这种一堆操作然后只靠数值的屑阴间东西了
120:Q:大们 content:function中的你摸一张红色牌的代码是player.什么呀
A:没有,牌指定特性了就叫获得牌,因为是定向检索的

但可以伪造一下:

1
2
3
4
5
6

var card = get.cardPile(card => get.color(card) == 'red');
if (card) {
player.gain(card, 'draw');
game.log(player, '摸了一张红色牌');
}

假装自己摸了一张红牌,实际上是检索的,但如果你要让获得牌的父事件是摸牌那就只能改draw函数
121:小葵花鸽子课堂开课啦
A:孩子老喜欢用ai写ai怎么办
A1:多半是废了,打一顿也治不了
A2:萌新教了代码不学怎么办,多半是爷新,提了就好了
122:@Reagan x 下次做个铝宝语录
123:虚空索敌不好找问题
124:Q:本局游戏总共的牌数怎么获取,包括牌堆弃牌堆手牌装备判定区武将牌上等等
A:还有处理区哦
A1:有点难获取。因为你什么都要记。但是只考虑length的话,随动获取的话。那要考虑的东西太多了,如果只需要获得一开始游戏的牌数那就很简单
A2:我直接

1
2
var length=0;
Object.keys(lib.cardPile).forEach(i=>length+=lib.cardPile[i].length);

A3:您完全不用nodelist自带的属性是吗,ui.cardPile.childElementCount,这不就是牌堆长度
125:Q:为什么锁定标签没生效呢…我可是照着shiroha_guying改的……是因为这个提示吗?
A:你技能被锁了吗?还是说没有强制发动。你还记得陈年老图吗?reagan x发的
A1:我好像知道怎么回事了…他是锁定技,但不是强制发动…我再看看吧
A1:好了,借鉴了其他变态型锁定技,理论上成功了。称之为变态型锁定技,灵感来自于初中学的变态发育……
A1:判定结果无法被修改有谁可以借鉴呢?noChangeJudge:true,(胡言乱语)
A:翻开牌堆顶一张牌,然后执行对应效果。不用judge
A1:想起来了,好像之前有谁说过,改判是judge的事件,跳过这个触发节点就OK了。不行,原话记不太清了,我再看看
A2:有些武将有改判后不能被改的功能。具体是谁忘了。
A3:有一张牌叫昊天塔,判定不能改

第二篇

第三篇

十一、给读者的话

New York is 3 hours ahead of California

New York is 3 hours ahead of California,

纽约时间比加州时间早三个小时,

but it does not make California slow.

但加州时间并没有变慢。

Someone graduated at the age of 22,

有人22岁就毕业了,

but waited 5 years before securing a good job!

但等了五年才找到好的工作!

Someone became a CEO at 25,

有人25岁就当上CEO,

and died at 50.

却在50岁去世。

While another became a CEO at 50,

也有人迟到50岁才当上CEO,

and lived to 90 years.

然后活到90岁。

Someone is still single,

有人依然单身,

while someone else got married.

同时也有人已婚。

Obama retires at 55,

奥巴马55岁就退休,

but Trump starts at 70.

川普70岁才开始当总统。

Absolutely everyone in this world works based on their Time Zone.

世上每个人本来就有自己的发展时区。

People around you might seem to go ahead of you,

身边有些人看似走在你前面,

some might seem to be behind you.

也有人看似走在你后面。

But everyone is running their own RACE, in their own TIME.

但其实每个人在自己的时区有自己的步程。

Don’t envy them or mock them.

不用嫉妒或嘲笑他们。

They are in their TIME ZONE, and you are in yours!

他们都在自己的时区里,你也是!

Life is about waiting for the right moment to act.

生命就是等待正确的行动时机。

So, RELAX.

所以,放轻松。

You’re not LATE.

你没有落后。

You’re not EARLY.

你没有领先。

You are very much ON TIME, and in your TIME ZONE Destiny set up for you.

在命运为你安排的属于自己的时区里,一切都准时。

开源的哲学、卑劣的人心

开源是什么?我们为什么要开源?是free?还是opensource?

  • 无名杀扩展必须开源
  • 无名杀扩展不可以禁传
  • 无名杀扩展可以收费
  • 无名杀扩展可以被倒卖,但是倒卖的时候,你必须说明:此扩展是免费的开源的,你可以从xx处获得它,如果你购买了这份扩展,我负责维护你的这份扩展

新的开始,新的社区–无名杀大事记

当我们开始新的一天时,我们可以这样打招呼:正是因为保持着这样一种开源精神,我们跨越山川与河流、俯瞰日月与星辰、穿越时间与空间,来到这样一个自由之地。

十二、附录

Contents
  1. 1. noname无名杀1武将说明文档
  2. 2.
  3. 3. 前言
  4. 4. 一、Js基础与noname
    1. 4.1. 1.0 Js介绍
      1. 4.1.1. 1.0.0 Js简介
        1. 4.1.1.1. Js快速入门=>
        2. 4.1.1.2. Js能够做什么?
        3. 4.1.1.3. Js是由哪些组成的?分类?
        4. 4.1.1.4. Js语言基础包含哪些玩意?
        5. 4.1.1.5. DOM是啥玩意?
        6. 4.1.1.6. BOM是啥玩意?
        7. 4.1.1.7. Js写在哪里?
        8. 4.1.1.8. 关于注释?
        9. 4.1.1.9. 关于结束符?
      2. 4.1.2. 1.0.1 输入与输出
        1. 4.1.2.1. 输出:
        2. 4.1.2.2. 输入:
      3. 4.1.3. 1.0.2 字面量
    2. 4.2. 1.1 变量
    3. 4.3. 1.2 常量
    4. 4.4. 1.3 数据类型
    5. 4.5. 1.4 类型转换
    6. 4.6. 1.5 运算符
    7. 4.7. 1.6 分支语句
    8. 4.8. 1.7 循环语句
    9. 4.9. 1.8 数组
    10. 4.10. 1.9 函数
    11. 4.11. 1.10 对象
    12. 4.12. 1.11 值类型与引用类型
    13. 4.13. 1.12 深拷贝与浅拷贝
    14. 4.14. 1.13 Node.js®
      1. 4.14.1. 1.13.0 nodejs介绍
      2. 4.14.2. 1.13.1 开发服务器端应用
      3. 4.14.3. 1.13.2 开发工具类应用
      4. 4.14.4. 1.13.3 开发桌面端应用
      5. 4.14.5. 1.13.4 开始
        1. 4.14.5.1. 1.13.4.-2 npm介绍
        2. 4.14.5.2. 1.13.4.-1 package.json
        3. 4.14.5.3. 1.13.4.0 Buffer
        4. 4.14.5.4. 1.13.4.1 fs模块(file system)
        5. 4.14.5.5.
    15. 4.15. 1.14 HTML5
    16. 4.16. 1.14.0 W3C标准
  5. 5.
    1. 5.1. 1.15 CSS3
    2. 5.2. 1.16 DOM
    3. 5.3. 1.17 BOM
    4. 5.4. 1.18 Noname中的Js
      1. 5.4.1. 1.18.0 Noname介绍
      2. 5.4.2. 1.18.1 game.js
      3. 5.4.3. 1.18.2 被重写的函数
      4. 5.4.4. 1.18.3 filter的参数
      5. 5.4.5. 1.18.4 parse
      6. 5.4.6. 1.18.5 step与上一步的result
    5. 5.5. 1.19 electron
      1. 5.5.1. 1.19.0 基础
      2. 5.5.2. 1.19.1 代码调试
      3. 5.5.3. 1.19.2 进程通信IPC
      4. 5.5.4. 1.19.3 窗口菜单
      5. 5.5.5. 1.19.4 子窗口与模式窗口
  6. 6. 二、基本逻辑!与面杀的实际联系
    1. 6.1. 2.0 event事件
    2. 6.2. 2.1 trigger对象
    3. 6.3. 2.2 触发条件与前提条件
    4. 6.4. 武将牌上的牌
    5. 6.5. 2.1 标记
    6. 6.6. 2.2 移出游戏
  7. 7. 三、noname!简单概念与函数
    1. 7.1. 3.0 简单概念
      1. 7.1.1. 3.0.0 角色状态与基本属性(player)
        1. 7.1.1.0.1. player.name
        2. 7.1.1.0.2. player.
      2. 7.1.1.1. 3.0.0.0 角色player
      3. 7.1.1.2. 3.0.0.1 当前回合角色 _status.currentPhase
      4. 7.1.1.3. 3.0.0.2
      5. 7.1.1.4. 3.0.0.3
      6. 7.1.1.5. 3.0.0.4
    2. 7.1.2. 3.0.1时机与阶段、触发器(trigger)
      1. 7.1.2.1. 3.0.1.0 时机与阶段
      2. 7.1.2.2. 3.0.1.1trigger属性与方法
    3. 7.1.3. 3.0.2卡牌(Card)
      1. 7.1.3.0.1. 属性
      2. 7.1.3.0.2. 方法
      3. 7.1.3.0.3. 和卡牌有关的函数
    4. 7.1.3.1. 3.0.2.0 基本牌(basic)
    5. 7.1.3.2. 3.0.2.1 锦囊牌(trick、delay)
    6. 7.1.3.3. 3.0.2.2 装备牌(equip)
  8. 7.1.4. 3.0.3 技能标签
    1. 7.1.4.1. 3.0.3.0 触发技
    2. 7.1.4.2. 3.0.3.1 锁定技
  9. 7.1.5. 3.0.4 事件event
  10. 7.1.6. 3.0.5 总牌堆(ui.cardPile),牌堆(ui.cardPile2)、field与弃牌堆(ui.discardPile)
  11. 7.1.7. 3.0.6 itemtype
  12. 7.1.8. 3.0.7 objtype
  • 7.2. 3.1 函数/player的方法
    1. 7.2.1. 3.1.0 牌(cards)
    2. 7.2.2. 3.1.1 标记(mark、storage)
    3. 7.2.3. 3.1.2 技能(skill)
    4. 7.2.4. 3.1.3时机(trigger)
    5. 7.2.5. 3.1.4目标(target)
    6. 7.2.6. 3.1.5选择牌的使用目标,选择目标,选择玩家的牌,弃置玩家的牌,选择(player.chooseXXX)
      1. 7.2.6.0.1. player.choosePlayerCard(角色[,数量][,位置][,提示][,强制][,限制][,ai])
      2. 7.2.6.0.2. player.chooseDrawRecover([摸牌数量][,回血数量][,提示][,强制][,ai])
      3. 7.2.6.0.3. player.chooseBool([提示][,ai])
      4. 7.2.6.0.4. player.chooseControl([选项A][,选项B][,选项C][,选项D]….[,ai])
      5. 7.2.6.0.5. player.chooseControlList([选项列表][,提示][,强制][,ai])
      6. 7.2.6.0.6. player.chooseCardTarget()
      7. 7.2.6.0.7. player.chooseTarget()
      8. 7.2.6.0.8. player.chooseUseTarget()
      9. 7.2.6.0.9. player.chooseCard([数量][,位置][,提示][,强制][,限制][,ai])
      10. 7.2.6.0.10. player.chooseCardOL()
      11. 7.2.6.0.11. player.chooseButton()
      12. 7.2.6.0.12. player.chooseButtonOL()
      13. 7.2.6.0.13. player.chooseVCardButton()
      14. 7.2.6.0.14. player.chooseCardButton()
      15. 7.2.6.0.15. player.chooseSkill()
      16. 7.2.6.0.16. player.chooseToCompare()
      17. 7.2.6.0.17. player.chooseToDiscard()
      18. 7.2.6.0.18. player.chooseToUse()
      19. 7.2.6.0.19. player.chooseToRespond()
      20. 7.2.6.0.20. player.chooseToDisable()
      21. 7.2.6.0.21. player.chooseToEnable()
      22. 7.2.6.0.22. player.chooseToDuiben()
      23. 7.2.6.0.23. player.chooseToPlayerBeatmap()
      24. 7.2.6.0.24. player.chooseToGuanxing()
      25. 7.2.6.0.25. player.chooseToPSS()
      26. 7.2.6.0.26. player.chooseToMove()
  • 7.2.7. 3.1.6 响应牌、交换手牌、直接分配牌
  • 7.2.8. 3.1.7 addToExpansion拓展区:武将牌上的牌(Expansion)
  • 7.2.9. 3.1.8 受伤、回血(recover)、失去体力与增减体力上限
  • 7.2.10. 3.1.9护甲(changeHujia)、buff、重置、横置与翻面
  • 7.2.11. 3.1.10 game
  • 7.2.12. 3.1.11 get的方法
    1. 7.2.12.0.1. 1.get.position(card,ordering)
    2. 7.2.12.0.2. 2.get.cards(num)
  • 7.2.13. 3.1.12 getParent()
  • 7.2.14. 3.1.13判定与废除
    1. 7.2.14.1. 3.1.13.0 判定(judge)
    2. 7.2.14.2. 3.1.13.1 废除
  • 7.2.15. 3.1.14 hasHistory、getHistory、getGlobalHistory、getLastHistory、hasAllHistory和getAllHistory与event事件
    1. 7.2.15.1. hasHistory
    2. 7.2.15.2. getHistory
    3. 7.2.15.3. getGlobalHistory
    4. 7.2.15.4. getLastHistory
    5. 7.2.15.5. getAllHistory
    6. 7.2.15.6. hasAllHistory
  • 7.2.16. 3.1.15 插入时机
  • 7.2.17. 3.1.16 捏牌
  • 8. 四、组件(ui)
    1. 8.0.0.1. dialog
    2. 8.0.0.2. 组件01
    3. 8.0.0.3. 组件02
    4. 8.0.0.4. 组件03
    5. 8.0.0.5. 组件04
    6. 8.0.0.6. 组件05
    7. 8.0.0.7. 组件06
    8. 8.0.0.8. 组件07
    9. 8.0.0.9. 组件08
    10. 8.0.0.10. 组件09
    11. 8.0.0.11. 组件10
    12. 8.0.0.12. 组件11
    13. 8.0.0.13. 组件12
    14. 8.0.0.14. 组件13
    15. 8.0.0.15. 组件14
    16. 8.0.0.16. 组件15
    17. 8.0.0.17. 组件16
    18. 8.0.0.18. 组件17
    19. 8.0.0.19. 组件18
  • 9. 五、扩展!技能基本框架
    1. 9.1. 5.0 触发技
    2. 9.2. 5.1 主动技
    3. 9.3. 5.2 mod类锁定技
    4. 9.4. 5.2.0 获取所有mod类技能
    5. 9.5. 马术、乡害与空城
    6. 9.6. 5.3 限定技
    7. 9.7. 5.4 标记类
    8. 9.8. 5.5 转换技
    9. 9.9. 5.6 视为技
    10. 9.10. 5.7 主公技
    11. 9.11. 5.8 技能组
    12. 9.12. 5.9 全局技能
  • 10. 六、Ai!人工智障也会高端操作
    1. 10.1. 6.0 Ai简介与说明
    2. 10.2. 6.1 Ai分类
      1. 10.2.1. 6.1.0check类
      2. 10.2.2. 6.1.1主动技ai:{}
      3. 10.2.3. 6.1.2choose类
      4. 10.2.4. 6.1.3processAI
      5. 10.2.5. 6.1.4 全局Ai
      6. 10.2.6. 6.1.5 其他(Others)
    3. 10.3. 6.2 收益论!卡牌与技能Ai
    4. 10.4. 6.3 尝试爬取ai
    5. 10.5. 6.4Ai案例—云将扩展
  • 11. 七、优秀的设计独辟蹊径!武将设计哲学
    1. 11.1. 7.0 数值膨胀与机制膨胀
      1. 11.1.1. 7.0.0一般的突破(违规)
      2. 11.1.2. 7.0.1新的机制(规则之外的新规则)
      3. 11.1.3. 7.0.2修改本体
      4. 11.1.4. 7.0.3我是上帝
      5. 11.1.5. 7.0.4全局的较量
      6. 11.1.6. 7.0.5局外的不讲武德
    2. 11.2. 7.1 降维打击的边界与极限
    3. 11.3. 7.2 天下武功,唯快不破
    4. 11.4. 7.3 抗性时代2.0的降临
  • 12. 八、简单的武将!武将案例解析
    1. 12.1. 8.0民间传说系列之:妖周泰
    2. 12.2. 8.1 暴力的美学:黄盖
    3. 12.3. 8.2 长得帅就是能多摸牌:周瑜
    4. 12.4. 8.3 那个男人:孙策
    5. 12.5. 8.4 极致的信仰:陆逊
    6. 12.6. 8.5 在线称桃子:曹冲
    7. 12.7. 8.6 时代的骄傲:李儒
    8. 12.8. 8.7 猜猜看呐:于吉
    9. 12.9. 8.8 鸽鸽说的在理:颜良文丑
    10. 12.10. 8.9 武将台词最多提及的男人:吴懿
    11. 12.11. 8.10 高贵的名门不需要队友:袁绍
    12. 12.12. 8.11 蜀中无大将,净出猪脚亮:诸葛亮
    13. 12.13. 8.12 阳光大男孩:徐盛
    14. 12.14. 8.13 爱记仇的:钟会
    15. 12.15. 8.14 棘手、摧毁、怀念:马超
  • 13. 九、Come on!来动手制作一名武将/模式吧
    1. 13.1. 9.0 生成一个白板武将扩展
    2. 13.2. 9.1 编写、修改与实现
      1. 13.2.1. 9.1.0 扩展的结构说明
      2. 13.2.2. 9.1.1 更方便的开发与调试
      3. 13.2.3. 9.1.2 初步模仿与糅合已有的武将代码
      4. 13.2.4. 9.1.3 快捷键与效率
    3. 13.3. 9.3 分享与制作实体卡牌
    4. 13.4. 9.4 武将配音与动效
    5. 13.5. 9.5 额外的模式
    6. 13.6. 9.6 国战
    7. 13.7. 9.7 联机与搭建服务器
    8. 13.8. 9.8 配置环境、制作自己的noname并发布
      1. 13.8.1. 9.8.0 Linux配置node环境
        1. 13.8.1.1. 9.8.0.0 需要的包
        2. 13.8.1.2. 9.8.0.1 安装
        3. 13.8.1.3. 9.8.0.2 换源
        4. 13.8.1.4. 9.8.0.3 安装electron打包器
        5. 13.8.1.5. 9.8.0.4 补齐缺失的文件
        6. 13.8.1.6. 9.8.0.5 打包
        7. 13.8.1.7. 9.8.0.5 上架星火商店
          1. 13.8.1.7.1. 9.8.0.6 图标设计–GIMP
        8. 13.8.1.8. 9.8.0.7 关于导出错误与许可证的添加
          1. 13.8.1.8.0.1. 暂时的解决方法:
    9. 13.8.2. 9.8.1 Android开发
    10. 13.8.3. 9.8.2 ios开发
  • 14. 十、大佬语录
    1. 14.1. 第一篇
    2. 14.2. 第二篇
    3. 14.3. 第三篇
  • 15. 十一、给读者的话
    1. 15.1. New York is 3 hours ahead of California
    2. 15.2. 开源的哲学、卑劣的人心
    3. 15.3. 新的开始,新的社区–无名杀大事记
  • 16. 十二、附录
  • ,