noname无名杀1武将说明文档 | CrazyWorld
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....’)alert ()console .log ()
输入:
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。命名规范和变量一样。需要注意的是,常量不允许重新赋值,声明的时候必须初始化(赋值)。
数据类型
描述
案例
基本数据类型
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.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 (变量起始值;终止条件;变量变化量){ 循环体 }
1.8 数组 1.8.0 数组?
数组是个数据类型,按顺序保存数据。
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.8.4 数组查
1.8.5 数组取反
1.8.6 数组vs数组
1.9 函数 函数声明:
函数传参:
关于函数的动态参数?
arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参。
关于函数的剩余参数?
允许将一个不定数量的参数传入。
…arr这玩意是真数组,接收最末的剩余的实参。使用的时候不需要写…
展开运算符?
可以合并数组。求数组最大值,最小值。
函数的返回值:
return 后面没写东西,默认为undefined。
函数的作用域:
可用性的代码范围。
匿名函数:(函数表达式)
这玩意没法直接用。是赋给某个变量,通过调某个变量名用的。必须先声明后调用。
立即执行函数:
1 2 3 4 (function ( ) {console .log () } )( ); (function ( ) {console .log () } ( ));
可以避免全局变量的污染。
箭头函数?
箭头函数更适合替代原本就需要使用匿名函数的地方。
形参小括号指向函数体。
如果只有一个形参,那么你可以省略小括号。
如果只有一行代码,那么可以省略大括号。
1 2 const a =b=>log (a)const a =b=>b+b
return也能省略
这玩意没有动态参数,只有剩余参数。
解构赋值
数组解构
对象解构
遍历数组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.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" ); let buf_4=Buffer .from ([1 ,2 ,]);let buf_4.toString (x);
1.13.4.1 fs模块(file system) 导入模块
1 2 3 4 const fs =require ('fs' );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 ();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 ( ) document .getElementsByTagName ( ) document .getElementsByCalssName ( )
操作元素内容?
1 2 3 4 对象.innerText 对象.innerHTML
操作元素常用属性?
对象.属性=值
Herf、title、src
操作元素样式属性?
先获取,然后再:
如果要修改的比较多?
操作类名操作样式:
1 2 3 4 5 6 7 8 9 10 11 12 元素.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 ){ 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...] ){ 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); } 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的方法:
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’部分
卡牌的颜色
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)
展示手牌(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)
player.choosePlayerCard(角色[,数量][,位置][,提示][,强制][,限制][,ai])
player.chooseDrawRecover([摸牌数量][,回血数量][,提示][,强制][,ai])
说明:player选择回复1点体力或摸1张牌
参数:
下一个step 的结果(result ):
key
result.属性
说明
0
buttons
1
cards
2
targets
3
control
‘回复体力’\‘摸牌’
4
links
5
index
0:’摸牌’ ; 1:’回复体力’
player.chooseBool([提示][,ai])
player.chooseControl([选项A][,选项B][,选项C][,选项D]….[,ai])
player.chooseControlList([选项列表][,提示][,强制][,ai])
player.chooseCardTarget()
player.chooseTarget()
player.chooseUseTarget()
player.chooseCard([数量][,位置][,提示][,强制][,限制][,ai])
player.chooseCardOL()
player.chooseSkill()
player.chooseToCompare()
player.chooseToDiscard()
player.chooseToUse()
player.chooseToRespond()
player.chooseToDisable()
player.chooseToEnable()
player.chooseToDuiben()
player.chooseToPlayerBeatmap()
player.chooseToGuanxing()
player.chooseToPSS()
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)
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)
玩家可以进行一次判定。
判定牌的属性:
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。比如:获取判定牌的类型:
如果需要更详细的信息,请参考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
getAllHistory
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 ();dialog.classList .add ('fixed' ); dialog.classList .add ('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 ("手牌区与装备区" ); 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
效果图
组件02
组件03
组件04
组件05
组件06
组件07
组件08
组件09
组件10
组件11
组件12
组件13
组件14
组件15
组件16
组件17
组件18
五、扩展!技能基本框架 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 "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 , 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 , reverseEquip :true , presha :true , pretao :true , nokeep :true , maixie :true , "maixie_hp" :true , "maixie_defend" :true , maihp :true , noe :true , noh :true , damageBonus :true , "directHit_ai" :true , 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 , guanxing :true , refuseGifts :true , weather :true , forceYingbian :true , skillTagFilter :function (player,tag,arg ){ }, }
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官网下载需要的包,地址为:
这里就选择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
查看镜像源是否成功:
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 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 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 const electron = require ('electron' )const { app, BrowserWindow } = electronconst 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安装依赖
构建打包
!需要注意的是,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/nonameIcon =/usr/share/icons/noname.icoTerminal =false StartupNotify =true Type =ApplicationCategories =Game
开始打包
1 dpkg -b . ../noname-1.0.0.deb
查看版本
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 :
暂时的解决方法: 官方的game.js从这里开始替换
也就是:将官方的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 source :'damageBegin1' global :'damageBegin3' +event.source ==playerplayer :'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. noname无名杀1武将说明文档 2. 序 3. 前言 4. 一、Js基础与noname 4.1. 1.0 Js介绍 4.1.1. 1.0.0 Js简介 4.1.1.1. Js快速入门=> 4.1.1.2. Js能够做什么? 4.1.1.3. Js是由哪些组成的?分类? 4.1.1.4. Js语言基础包含哪些玩意? 4.1.1.5. DOM是啥玩意? 4.1.1.6. BOM是啥玩意? 4.1.1.7. Js写在哪里? 4.1.1.8. 关于注释? 4.1.1.9. 关于结束符? 4.1.2. 1.0.1 输入与输出 4.1.2.1. 输出: 4.1.2.2. 输入: 4.1.3. 1.0.2 字面量 4.2. 1.1 变量 4.3. 1.2 常量 4.4. 1.3 数据类型 4.5. 1.4 类型转换 4.6. 1.5 运算符 4.7. 1.6 分支语句 4.8. 1.7 循环语句 4.9. 1.8 数组 4.10. 1.9 函数 4.11. 1.10 对象 4.12. 1.11 值类型与引用类型 4.13. 1.12 深拷贝与浅拷贝 4.14. 1.13 Node.js® 4.14.1. 1.13.0 nodejs介绍 4.14.2. 1.13.1 开发服务器端应用 4.14.3. 1.13.2 开发工具类应用 4.14.4. 1.13.3 开发桌面端应用 4.14.5. 1.13.4 开始 4.14.5.1. 1.13.4.-2 npm介绍 4.14.5.2. 1.13.4.-1 package.json 4.14.5.3. 1.13.4.0 Buffer 4.14.5.4. 1.13.4.1 fs模块(file system) 4.14.5.5. 4.15. 1.14 HTML5 4.16. 1.14.0 W3C标准 5. 5.1. 1.15 CSS3 5.2. 1.16 DOM 5.3. 1.17 BOM 5.4. 1.18 Noname中的Js 5.4.1. 1.18.0 Noname介绍 5.4.2. 1.18.1 game.js 5.4.3. 1.18.2 被重写的函数 5.4.4. 1.18.3 filter的参数 5.4.5. 1.18.4 parse 5.4.6. 1.18.5 step与上一步的result 5.5. 1.19 electron 5.5.1. 1.19.0 基础 5.5.2. 1.19.1 代码调试 5.5.3. 1.19.2 进程通信IPC 5.5.4. 1.19.3 窗口菜单 5.5.5. 1.19.4 子窗口与模式窗口 6. 二、基本逻辑!与面杀的实际联系 6.1. 2.0 event事件 6.2. 2.1 trigger对象 6.3. 2.2 触发条件与前提条件 6.4. 武将牌上的牌 6.5. 2.1 标记 6.6. 2.2 移出游戏 7. 三、noname!简单概念与函数 7.1. 3.0 简单概念 7.1.1. 3.0.0 角色状态与基本属性(player) 7.1.1.0.1. player.name 7.1.1.0.2. player. 7.1.1.1. 3.0.0.0 角色player 7.1.1.2. 3.0.0.1 当前回合角色 _status.currentPhase 7.1.1.3. 3.0.0.2 7.1.1.4. 3.0.0.3 7.1.1.5. 3.0.0.4 7.1.2. 3.0.1时机与阶段、触发器(trigger) 7.1.2.1. 3.0.1.0 时机与阶段 7.1.2.2. 3.0.1.1trigger属性与方法 7.1.3. 3.0.2卡牌(Card) 7.1.3.0.1. 属性 7.1.3.0.2. 方法 7.1.3.0.3. 和卡牌有关的函数 7.1.3.1. 3.0.2.0 基本牌(basic) 7.1.3.2. 3.0.2.1 锦囊牌(trick、delay) 7.1.3.3. 3.0.2.2 装备牌(equip) 7.1.4. 3.0.3 技能标签 7.1.4.1. 3.0.3.0 触发技 7.1.4.2. 3.0.3.1 锁定技 7.1.5. 3.0.4 事件event 7.1.6. 3.0.5 总牌堆(ui.cardPile),牌堆(ui.cardPile2)、field与弃牌堆(ui.discardPile) 7.1.7. 3.0.6 itemtype 7.1.8. 3.0.7 objtype 7.2. 3.1 函数/player的方法 7.2.1. 3.1.0 牌(cards) 7.2.2. 3.1.1 标记(mark、storage) 7.2.3. 3.1.2 技能(skill) 7.2.4. 3.1.3时机(trigger) 7.2.5. 3.1.4目标(target) 7.2.6. 3.1.5选择牌的使用目标,选择目标,选择玩家的牌,弃置玩家的牌,选择(player.chooseXXX) 7.2.6.0.1. player.choosePlayerCard(角色[,数量][,位置][,提示][,强制][,限制][,ai]) 7.2.6.0.2. player.chooseDrawRecover([摸牌数量][,回血数量][,提示][,强制][,ai]) 7.2.6.0.3. player.chooseBool([提示][,ai]) 7.2.6.0.4. player.chooseControl([选项A][,选项B][,选项C][,选项D]….[,ai]) 7.2.6.0.5. player.chooseControlList([选项列表][,提示][,强制][,ai]) 7.2.6.0.6. player.chooseCardTarget() 7.2.6.0.7. player.chooseTarget() 7.2.6.0.8. player.chooseUseTarget() 7.2.6.0.9. player.chooseCard([数量][,位置][,提示][,强制][,限制][,ai]) 7.2.6.0.10. player.chooseCardOL() 7.2.6.0.11. player.chooseButton() 7.2.6.0.12. player.chooseButtonOL() 7.2.6.0.13. player.chooseVCardButton() 7.2.6.0.14. player.chooseCardButton() 7.2.6.0.15. player.chooseSkill() 7.2.6.0.16. player.chooseToCompare() 7.2.6.0.17. player.chooseToDiscard() 7.2.6.0.18. player.chooseToUse() 7.2.6.0.19. player.chooseToRespond() 7.2.6.0.20. player.chooseToDisable() 7.2.6.0.21. player.chooseToEnable() 7.2.6.0.22. player.chooseToDuiben() 7.2.6.0.23. player.chooseToPlayerBeatmap() 7.2.6.0.24. player.chooseToGuanxing() 7.2.6.0.25. player.chooseToPSS() 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的方法 7.2.12.0.1. 1.get.position(card,ordering) 7.2.12.0.2. 2.get.cards(num) 7.2.13. 3.1.12 getParent() 7.2.14. 3.1.13判定与废除 7.2.14.1. 3.1.13.0 判定(judge) 7.2.14.2. 3.1.13.1 废除 7.2.15. 3.1.14 hasHistory、getHistory、getGlobalHistory、getLastHistory、hasAllHistory和getAllHistory与event事件 7.2.15.1. hasHistory 7.2.15.2. getHistory 7.2.15.3. getGlobalHistory 7.2.15.4. getLastHistory 7.2.15.5. getAllHistory 7.2.15.6. hasAllHistory 7.2.16. 3.1.15 插入时机 7.2.17. 3.1.16 捏牌 8. 四、组件(ui) 8.0.0.1. dialog 8.0.0.2. 组件01 8.0.0.3. 组件02 8.0.0.4. 组件03 8.0.0.5. 组件04 8.0.0.6. 组件05 8.0.0.7. 组件06 8.0.0.8. 组件07 8.0.0.9. 组件08 8.0.0.10. 组件09 8.0.0.11. 组件10 8.0.0.12. 组件11 8.0.0.13. 组件12 8.0.0.14. 组件13 8.0.0.15. 组件14 8.0.0.16. 组件15 8.0.0.17. 组件16 8.0.0.18. 组件17 8.0.0.19. 组件18 9. 五、扩展!技能基本框架 9.1. 5.0 触发技 9.2. 5.1 主动技 9.3. 5.2 mod类锁定技 9.4. 5.2.0 获取所有mod类技能 9.5. 马术、乡害与空城 9.6. 5.3 限定技 9.7. 5.4 标记类 9.8. 5.5 转换技 9.9. 5.6 视为技 9.10. 5.7 主公技 9.11. 5.8 技能组 9.12. 5.9 全局技能 10. 六、Ai!人工智障也会高端操作 10.1. 6.0 Ai简介与说明 10.2. 6.1 Ai分类 10.2.1. 6.1.0check类 10.2.2. 6.1.1主动技ai:{} 10.2.3. 6.1.2choose类 10.2.4. 6.1.3processAI 10.2.5. 6.1.4 全局Ai 10.2.6. 6.1.5 其他(Others) 10.3. 6.2 收益论!卡牌与技能Ai 10.4. 6.3 尝试爬取ai 10.5. 6.4Ai案例—云将扩展 11. 七、优秀的设计独辟蹊径!武将设计哲学 11.1. 7.0 数值膨胀与机制膨胀 11.1.1. 7.0.0一般的突破(违规) 11.1.2. 7.0.1新的机制(规则之外的新规则) 11.1.3. 7.0.2修改本体 11.1.4. 7.0.3我是上帝 11.1.5. 7.0.4全局的较量 11.1.6. 7.0.5局外的不讲武德 11.2. 7.1 降维打击的边界与极限 11.3. 7.2 天下武功,唯快不破 11.4. 7.3 抗性时代2.0的降临 12. 八、简单的武将!武将案例解析 12.1. 8.0民间传说系列之:妖周泰 12.2. 8.1 暴力的美学:黄盖 12.3. 8.2 长得帅就是能多摸牌:周瑜 12.4. 8.3 那个男人:孙策 12.5. 8.4 极致的信仰:陆逊 12.6. 8.5 在线称桃子:曹冲 12.7. 8.6 时代的骄傲:李儒 12.8. 8.7 猜猜看呐:于吉 12.9. 8.8 鸽鸽说的在理:颜良文丑 12.10. 8.9 武将台词最多提及的男人:吴懿 12.11. 8.10 高贵的名门不需要队友:袁绍 12.12. 8.11 蜀中无大将,净出猪脚亮:诸葛亮 12.13. 8.12 阳光大男孩:徐盛 12.14. 8.13 爱记仇的:钟会 12.15. 8.14 棘手、摧毁、怀念:马超 13. 九、Come on!来动手制作一名武将/模式吧 13.1. 9.0 生成一个白板武将扩展 13.2. 9.1 编写、修改与实现 13.2.1. 9.1.0 扩展的结构说明 13.2.2. 9.1.1 更方便的开发与调试 13.2.3. 9.1.2 初步模仿与糅合已有的武将代码 13.2.4. 9.1.3 快捷键与效率 13.3. 9.3 分享与制作实体卡牌 13.4. 9.4 武将配音与动效 13.5. 9.5 额外的模式 13.6. 9.6 国战 13.7. 9.7 联机与搭建服务器 13.8. 9.8 配置环境、制作自己的noname并发布 13.8.1. 9.8.0 Linux配置node环境 13.8.1.1. 9.8.0.0 需要的包 13.8.1.2. 9.8.0.1 安装 13.8.1.3. 9.8.0.2 换源 13.8.1.4. 9.8.0.3 安装electron打包器 13.8.1.5. 9.8.0.4 补齐缺失的文件 13.8.1.6. 9.8.0.5 打包 13.8.1.7. 9.8.0.5 上架星火商店 13.8.1.7.1. 9.8.0.6 图标设计–GIMP 13.8.1.8. 9.8.0.7 关于导出错误与许可证的添加 13.8.1.8.0.1. 暂时的解决方法: 13.8.2. 9.8.1 Android开发 13.8.3. 9.8.2 ios开发 14. 十、大佬语录 14.1. 第一篇 14.2. 第二篇 14.3. 第三篇 15. 十一、给读者的话 15.1. New York is 3 hours ahead of California 15.2. 开源的哲学、卑劣的人心 15.3. 新的开始,新的社区–无名杀大事记 16. 十二、附录