全局变量#
全部变量的说法虽然有失偏颇,但它是无名杀代码编写中随时能调用的变量,称其为全局变量并不为过。
lib#
所谓library,顾名思义就是就是一个数据存储库,其定义和初始化于noname/library/index.js中,并且内容为全局的,不会因游戏过程而改变。
常量/变量#
在lib中有许多常量其实是无关紧要的,比如前几个configprefix、versionOL之类的,更多的就去看源文件,我们主要挑出在扩展编写中会遇到的来进行说明。
设置相关#
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.online、game.onlineID和game.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包括三个基本方法chooseButton、chooseCard、chooseTarget分别告诉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,也可以顺藤摸瓜地找到我们想要的值和函数。