全局变量#
全部变量的说法虽然有失偏颇,但它是无名杀代码编写中随时能调用的变量,称其为全局变量并不为过。
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,也可以顺藤摸瓜地找到我们想要的值和函数。