全局变量#

全部变量的说法虽然有失偏颇,但它是无名杀代码编写中随时能调用的变量,称其为全局变量并不为过。

lib#

所谓library,顾名思义就是就是一个数据存储库,其定义和初始化于noname/library/index.js中,并且内容为全局的,不会因游戏过程而改变。

常量/变量#

在lib中有许多常量其实是无关紧要的,比如前几个configprefixversionOL之类的,更多的就去看源文件,我们主要挑出在扩展编写中会遇到的来进行说明。

设置相关#

lib.config为游戏的设置内容,具体项可以参考game/config.js,我们需要注意config.js为第一次初始化的设置,而以后设置的读取和更改均在lib.config中进行,并且在以后通过indexedDB进行加载和保存。

lib.configMenu也是类似的,具体项参考game/package.js

lib.configOL存储联机时的额外配置。

卡牌相关#

lib.card存储卡牌信息,比如lib.card[‘sha’]就是各种杀的信息。其中有一个特殊元素lib.card.list,表示游戏内牌堆的所有牌,每个元素以[花色,点数,名称]的形式存在。

lib.cardPack它为一个代理对象(Proxy),代理的内容为各个卡包,拦截内容为设置值的时候,也就相当于初始化的时候,主要更新了卡牌包的UI,也就是说其主要用于带动UI一起更新,以减少工作量。

lib.cardPackList用于联机时额外存储卡牌,一般情况下为空。

lib.cardPackInfo用于保存扩展卡牌包信息用的,一般情况下为空。

角色相关#

lib.character存储角色信息,每个元素以[性别,势力,血量,技能组]的方式进行存储。

lib.characterPack与前面的lib.cardPack类似。

lib.characterFilter即角色过滤信息,表示在哪些模式下此角色不会出现。

lib.characterReplace即同名角色之间的可切换关系,例如曹叡、旧曹叡、界曹叡之间的互相切换关系。

lib.characterSubstitute为换肤换音预留的东西,在本体中没有用处。

lib.characterInitFilter前面characterFilter的初始化,历史垃圾。

lib.characterGuozhanFilter历史垃圾。

技能相关#

lib.skill存储技能信息,比如lib.skill[‘xiecui’]就是孙茹的撷翠技能,其中以“_”开头为全局技能,自带内容被固定在了lib类的定义中,玩家当然也可以自行添加。当然全局技能具体执行时,使用的是子数组lib.skill.global的内容。lib.skill中还有一系列用于存储技能执行信息的变量,如storage、undist等,其属于动态数据,讲技能编写时我们再深入探究。

lib.skilllist是一个字符串数组,为当前开启的角色的所有技能名。

信息相关#

lib.characterTitle即角色右点击信息显示中,基本信息与技能之间的文字,属于角色的可选内容。

lib.characterIntro即角色双击信息显示中,介绍一栏的内容。

lib.characterSort用于菜单栏的显示,包括再分包和按顺序显示。

lib.translate即翻译内容,用于内容展示,例如“xiecui”对应“撷翠”。

lib.dynamicTranslate即动态翻译内容,出现于转换技、修改技之类的技能描述会动态改变的技能中。

lib.suit花色。

lib.group势力。

lib.nature元素伤害。

功能相关#

lib.init存储LibInit对象,其定义在noname/library/init/index.js,主要存储一些工具类函数。其中有被遗弃的init、onload之类的函数,也有还在使用的reset、js、json等函数。

lib.sort存储一些排序用的函数。

lib.filter存储一些过滤用的函数。

lib.comparator存储一些比较用的函数。

lib.cheat存储一些作弊代码。

lib.message存储联机相关函数。

函数#

lib中的大部分核心函数都以object的形式存在,这增大了调试的困难,并不值得赞赏,而成员函数基本为private级别的用法,我们压根无需关注。

game#

所谓game,就是用于一局游戏中各种控制的类,之前(角色、卡牌、扩展)导入的game.import、事件创建的game.createEvent、游戏主循环的game.loop和游戏初始摸牌的game.gameDraw。每次初始化一局游戏,都会执行proceed2,其会在开始时清除game的内容。

常量/变量#

由于game主要为功能类,因此常量/变量并不多,可以一次性全部讲完。

game.onlinegame.onlineIDgame.onlineKey用于保存联机信息。

game.players表示存活玩家,game.dead表示死亡玩家。

game.playerMap为id到玩家的对应映射。

game.phaseNumber表示当前处于第几个角色的回合。

game.roundNumber表示当前处于游戏第几轮。

game.shuffleNumber表示当前第几次洗牌。

game.me表示当前操作的玩家。

game.chess表示当前是否为下棋模式。

函数#

game最大的作用是对游戏进行控制,里面的函数为其核心功能。

历史遗物#

game.addNature添加新的属性杀。

game.hasNature判断卡牌信息/事件是否有某个属性。

game.setNature设置卡牌信息/事件的属性。

game.addXXX添加XXX。

game.addBackgroundMusic在设置选项中添加一首背景音乐。

game.removeBackgroundMusic从设置选项中移除一首背景音乐。

game.generateBeatmapTimeleap用给定的BPM、节拍和偏移生成谱面。

牌堆相关#

game.washCard洗牌。

game.addCardKnower为牌添加知情者。

game.clearCardKnowers移除牌的所有知情者。

game.cardsDiscard弃牌。

game.cardsGotoOrdering把牌顺序摆放。

game.cardsGotoSpecial把牌作为某种标记。

game.cardsGotoPile把牌放到牌堆顶。

game.replaceHandcards置换手牌。

game.removeCard移除卡牌。

记录相关#

game.getAllGlobalHistory获得_status.globalHistory中的操作历史,可以嵌入一个函数来根据历史信息做出某些操作。

game.log输出游戏日志。

game.showHistory展示游戏日志的UI。

联机相关#

game.broadcast

game.broadcastAll

game.updateWaiting

game.waitForPlayer

game.connect

game.send

game.sendTo

game.createServer

扩展相关#

game.import

game.importExtension

game.export

game.hasExtension

game.hasExtensionLoaded

game.removeExtension

流程相关#

game.forceOver

game.over

game.pause

game.pause2

game.resume

game.resume2

game.delaye

game.delayex

game.delay

game.delayx

game.check

其它#

game.addGlobalSkill

game.removeGlobalSkill

game.resetSkills

game.addRecentCharacter

game.createCard

game.createCard2

game.swapSeat

game.swapPlayer

game.swapControl

game.swapPlayerAuto

game.countPlayer

game.countPlayer2

...

ui#

所谓ui,就是视图相关的类,功能性并不强,里面的元素几乎都是HTMLDivElement,想要美化UI的可以研究一下。当然其中还有一个子类ui.create包含一些列创建UI的封装方法,可以用来快速创建UI。最后UI是一个本地属性,只能影响本地的界面。

get#

所谓get,主要用于信息的获取,在没有属性权限的情况下,还额外搞个封装并大量应用,我不好评价。至于用法直接看意思,望文生义即可,没啥好说的。

ai#

所谓ai,就是指游戏中非玩家操作的方法论。基础的AI包括三个基本方法chooseButtonchooseCardchooseTarget分别告诉AI选择哪个按钮、哪个卡牌、哪个目标。哪个按钮指的是,当AI处于能发动技能的时候,要选择哪个技能发动,而如何发动的过程则是写进每个技能的AI属性中;哪个卡牌指的是,当AI处于能使用卡牌的时候,要选择哪个卡牌,而如何使用卡牌的过程写进了每个卡牌的AI属性中;哪个目标也是同理的。对于ai这个全局变量实际没什么使用和改变的必要,它本身是写进技能和卡牌的,所以其相当于一个无效参数。

_status#

所谓_status,是一个全局状态记录类,其不止限于一局游戏,而是贯穿整个程序的运行。

_status.paused_status.paused2_status.paused3用来表示游戏所处的暂停状态,总之都是系统自己控制的,别去管就行了。

_status.clicked_status.dragged_status.touchconfirmed表示UI相关状态,同上。

_status.extension_status.importingExtension_status.extensionLoaded_status.extensionLoading_status.importing表示扩展相关状态,同上。

_status.over表示游戏是否结束。

_status.auto表示是否为托管状态。

_status.event表示当前在处理的事件。

_status.globalHistory以每个玩家的回合为单位,记录卡牌移动、卡牌使用、血量变化等信息。

_status.cardtag记录带有标签的卡牌。

_status.renku仁库记录,其为部分武将使用的游戏外共通区域。

_status.connectMode是否为联机状态。

_status.currentPhase表示当前的回合。

_status.roundStart表示一轮开始的玩家。

小结:在实际开发的过程中,我们使用最多的主要为lib、game、_status这三个变量,有时会稍微用一下get和ui,只要我们搞清楚这些变量的定位和生命周期,就算我们不知道全部的API,也可以顺藤摸瓜地找到我们想要的值和函数。