08-09-2006, 06:22 PM
|
#1 | |||
|
Member
|
Post rating: rate
I am a Chinese.
Simultaneity I am also interested in this person of emulators. Not long ago I wrote an article about 3.9final theme and share with others. But limit to the level.There is also some mistake please point out. My E-mail is 120799052@qq.com MAOLUO·阿姆罗(lolo) (STEPMANIA 3.9 FINAL THEME) 任何一个皮肤在常规下最多有以下几部分可以被程序读取: 根目录下的metrics.ini 整体控制用脚本,大部分操作都在这里定义。 BGAnimations文件夹 存放所有背景指派为ScreenWithMenuElements的屏幕的画面。 Graphics文件夹 存放在画面中占较小面积的图片。 Fonts文件夹 存放在画面中需要使用的字模/字库图片及其索引表。 Sounds文件夹 存放游戏中需要的音乐文件 Languages文件夹 存放语言包 Numbers文件夹 存放在大多数地方所需要的数字字模/字库图片及其索引表 Other文件夹 可存放有关歌曲分数记载和How To Play歌曲的脚谱。 注意:以上各部分均不一定被要求存在于皮肤之中,例如在某些极端情况下只存在根目录下的 metrics.ini文件也是可以称为一个皮肤的。这就要涉及到皮肤加载机制。 一.缺省加载机制 当玩家所指定的皮肤中缺少程序运行所必要的信息时,程序将在default皮肤中查找,若存在则读取,反之 出现错误报告或者程序崩溃。也就是说default皮肤起着提供缺省值的作用,也正是因为这个加载机制,使 得我们可以构造一个皮肤:里面只有一个metrics.ini文件,内容只有两行。 [Common] DefaultModifiers=1256% dizzy (默认所有参与游戏的player开启12.56倍转速的dizzy效果) 这个皮肤是可以运行的,虽然他看起来好象少了很多东西。 但请注意游戏时的画面和音乐等等,是和默认皮肤的画面一样吧。这也恰恰证明了不光ini文件使用这样的机制 ,皮肤的各个部分都同样使用默认皮肤作为缺省值读取的办法。 还是从上面构造的这个简单的皮肤中,可以发现,这种机制已经足够细化。并不是存在这个ini文件则全部读取 他里面的内容而放弃default里对应ini文件中的其他值。实验表明,大多数情况下,脚本内容是逐条语 句进行重载判断。 例如:default的ini文件中写有: [Common] ColorP1=0.4,1.0,0.8,1 // sea green ColorP2=1.0,0.5,0.2,1 // orange FirstRunInitialScreen=ScreenCompany InitialScreen=ScreenCompany WindowTitle=StepMania DefaultModifiers= DefaultCpuModifiers= JoinPauseSeconds=0.8 DifficultiesToShow=beginner,easy,medium,hard,chall enge CourseDifficultiesToShow=easy,regular,difficult 现在要构造一个皮肤,希望1P用到的颜色不再是sea green(海绿色),而是和2P一样的orange(橙色)。则只要以如下的办法书写ini文件即可: [Common] ColorP1=1.0,0.5,0.2,1 至于Common段里的其他语句,程序会自行读取缺省值。 ●或许会有人问,原来文件中对应行的行尾都有//xxxxxxxx样式的东西,那是什么。 ●在stepmania脚本中,//是注释标记,自注释标记出现到本行结束的全部内容程序均不会加载,仅是一个给Theme Coder说明代码功能的机会而已。 ●本部分还告诉我们,除非必要,不要轻易对default皮肤进行改动,有什么想法要尝试尽量新建一个皮肤 来完成。 二.文件加载机制 非常规操作忽略不计,利用stepmania皮肤可以加载的文件类型如下: redir ini actor sprite png jpg bmp gif avi mpg mpeg txt mp3 ogg wav sm 解释一下后缀名为redir的文件的作用。 顾名思义,此类文件是为了提供文件重定向功能而存在的,他是一个纯文本文件。 比如程序现在需要调用名为ScreenSelectMusic difficulty easier的声音文件供播放[看文件的名字大概可以知道这个声音是选择歌曲时切换到更容易难度时被调用的],那么程序在sounds文件夹下搜索这个名字的文件,首先要搜索的就是ScreenSelectMusi c difficulty easier.redir[在整个插件系统中,只要在能够读取redir文件的场合,redir文件总是最优先被搜索]当这个文件存在,就读取其中的文本以作为要读取的文件名,当然其中的文本也是可以包含相对目录 结构的,就象/../stepmania.png这样。 若这个文件不存在,则试图搜索ScreenSelectMusic difficulty easier.ogg文件。[OGG格式是stepmania的缺省音乐文件格式] 继续来看这个例子,事实是存在这个文件,内容为ScreenSelectMusic difficulty harder,那么进行这个文件的搜索,找到了对应的ogg格式文件并读取。 事实上,这就是默认皮肤中选择歌曲时切换到更容易难度或切换到更困难难度会发出同样声音的原因 。 在图片加载的处理上redir文件扮演着同样的角色,要指出的是PNG格式为stepmania的缺省图片 文件格式。 三.屏幕加载机制 还是先来看一下根目录下的ini文件。 这种脚本文件里每个[xxxx]之间的部分称为一个段,可以简单的将所有的段分为两类。 一种段称为屏幕段,另外的段姑且称为辅助段。 要考察哪个段是屏幕段不难,绝大多数段名开头为Screen的段都可以归入。 每个屏幕段均控制对应的一个屏幕。 例如: [ScreenBranchEnding]段。 他的内容是 Class=ScreenBranch Choices=Credits,MusicScroll ConditionCredits=GetBestFinalGrade() <= Grade("AA") ConditionMusicScroll=true NextScreenCredits=screen,ScreenCredits NextScreenMusicScroll=screen,ScreenMusicScroll 他控制的是玩家签名画面结束后的那个屏幕,严格的说是屏幕的逻辑,因为这个所谓的"屏幕"并不显示任何画面 ,原因请看后文。 ●第一行代码也暂且跳过。 ●第二行代码的意思是说现在的情况有Credits和MusicScroll两种可能性。[这两个字符串不过是两种可能性的代名词而已,叫China和Chinese也没问题] ●第三行说的是如果最后如果取得不比AA差的总评,则Credits这种可能性为真。 ●第四行说的是MusicScroll这种可能性永真。[这并不和第三行矛盾,当有一种可能性为真时,就不会再判断其他的可能性是否为真了。实际上象第四行这种永真 的可能性就是逻辑的一个缺省走向] ●第五、六行表明,如果Credits这种可能性为真,则程序逻辑转入[ScreenCredits]屏幕运行。反之则转入[ScreenMusicScroll]屏幕运行。 从玩家的角度看: 如果最后总评不比AA差就显示开发组的介绍画面 反之则显示所有歌曲名上升过场的画面 上面解释说明了一个屏幕段,下面来系统的介绍一下屏幕段。 3.1屏幕类的继承与重载 Stepmania软件开发者为皮肤插件制作者设计好了若干个固定类型的屏幕段,姑且称为原生类屏幕。皮肤 作者可以在其基础上创建新的屏幕段实现自己所需要的功能或效果。 还是用上面那个段为例子来说明,请注意刚才跳过的第一行代码Class=ScreenBran ch。 事实上在原生的那些的固定类型的屏幕段中并不存在ScreenBranchEnding,这是皮肤作者创建 的新屏幕段,那行的代码的意思就是说继承ScreenBranch这个屏幕段的属性和值。 从英文词面上考察ScreenBranch意为“控制流程用的屏幕”。 ScreenBranchEnding则是“控制游戏结束后的流程用的屏幕”。 同样,我们可以根据需要创建其他的控制流程用的屏幕,比如说要求某个屏幕结束后如果本月是1月份则进入系统 菜单,如果是2月份则以默认启动12.56倍转速的dizzy效果进入选择组曲画面,其他情况则以Solo 模式进入普通选歌画面。 则可以这么写: [ScreenBranchTest] Class=ScreenBranch Choices=System,Course,Song ConditionSyetem=MonthOfYear() == 1 ConditionCourse=MonthOfYear() == 2 ConditionSong=true NextScreenSyetem=screen,ScreenOptionsMenu NextScreenCourse=mod,1256% dizzy;screen,ScreenSelectCourse NextScreenSong=Style,solo;screen,ScreenSelectMusic 关于这个例子的几点说明: ●如何使游戏的逻辑转入这一屏幕是后面要说明的问题。 ●新创建的屏幕段的段名可以随便起,自己看到名字知道是做什么用的就可以了。 ●GetBestFinalGrade()和MonthOfYear()等字符串是函数,我们能够通过函数 获得信息。实际上存在如此的一组函数,这是Stepmania.exe宿主通过Lua脚本语言下放给The me Coder调用的API函数,详细列表见下文有关Lua的部分。 ●ScreenBranch类屏幕中,NextScreenXXXX=后面不光可以跟要转向的屏幕名,还可 以执行共计11种操作,具体的内容参见后面的解析。 从这两个例子可以看到原生类屏幕确定了固定的语句格式,事实上每个原生类屏幕中都已规定了所有可以被读取的 语句和必须存在的语句。 最后来解析一下Class=XXX这个操作的实质。当执行这条语句时,语句所在的屏幕段被确定为某一种表现 形式,比如是选择歌曲处的屏幕或是游戏进行时的屏幕等,以确定他要加载的图片文件、声音文件及程序运行方式 ;与此同时,本屏幕段将继承XXX屏幕段中的全部语句作为缺省值,再按照所继承的类屏幕预设的规范来读取本 屏幕段中的语句,当所需要的语句不存在于本屏幕段时,由缺省值来替代。 这次以游戏开头菜单画面为例子。 为阅读方便,只保留有关的语句。 [ScreenTitleMenu] Fallback=ScreenWithMenuElements ChoiceNames=1,2,3,4,5,6,7 Choice1=screen,ScreenSelectStyle Name1=GAME START Choice2=screen,ScreenSelectGame Name2=SELECT GAME Choice3=screen,ScreenOptionsMenu Name3=OPTIONS Choice4=screen,ScreenEditMenu Name4=EDIT/SYNC SONGS Choice5=screen,ScreenEditCoursesMenu Name5=EDIT COURSES Choice6=screen,ScreenJukeboxMenu Name6=JUKEBOX Choice7=screen,ScreenExit Name7=EXIT Choice8=screen,ScreenTest Name8=SANDBOX ScreenTitleMenu也是一个原生类屏幕,以上的语句作用是告诉程序在这个屏幕中需要显示哪些选 项,当选择他们时逻辑的走向和这些选项显示在画面上的名字。 因为某种需求,现在我们需要创建一个继承它的屏幕,并要求第一个选项在画面中显示为ddr,其他部分不变。 只需这么写: [MaoLuoTest] Class=ScreenTitleMenu Fallback=ScreenTitleMenu Name1=ddr 关于这个例子的几点说明 ●依据段名的开头是否是Screen而判定一个段是否是屏幕段的方法被否定了,事实上象"MaoLuoTe st"这样的屏幕段段名是不被推荐的,在可能的情况下还是遵循以Screen开头的潜规则比较好。 ●执行第一条语句后本屏幕段对应的屏幕将来显示时会依照标题菜单画面的方式被构建,同时加载SceenTi tleMenu段中的值作为缺省值,除了Fallback=XXX和Name1=XXX以外的要求被加载语 句就由这些缺省值提供,而那两条语句则实现了重载。还记得2.1提到的整体加载机制么,事实上,如果我们目 前工作环境不在default皮肤的话,那么即使本皮肤中并不存在ScreenTitleMenu也没关系 ,程序会加载default皮肤中对应的段中语句作为缺省值,当然前提是default皮肤没 有被破坏。 ●关于Fallback=XXX 这条语句为什么也要重载的问题,这和后文要涉及到的屏幕画面显示机制有关,简单的说Fallback=Sc reenTitleMenu表明这个屏幕段所对应的屏幕使用和ScreenTitleMenu一样的画面。 而原来的Fallback=ScreenWithMenuElements 则表明游戏标题屏幕所需要显示的画面要到BGAnimations文件夹中进行相关的搜索。如果MaoLu oTest段中删去Fallback=ScreenTitleMenu这句,也就是说不进行重载的话,则显 示画面时也要到BGAnimations文件夹中进行相关的搜索,在现在的情况下这是没有必要 的。 上面以两个屏幕类作为例子说明了一些问题,下面给出全部的原生类屏幕列表。 ScreenAttract ScreenCaution ScreenEdit ScreenEditMenu ScreenEvaluation ScreenEz2SelectPlayer ScreenGameOver ScreenGameplay ScreenHowToPlay ScreenMapControllers ScreenMusicScroll ScreenPlayerOptions ScreenSandbox ScreenSelectDifficulty ScreenSelectGroup ScreenSelectMusic ScreenSelectStyle5th ScreenSelectStyle ScreenSelectMode ScreenSongOptions ScreenStage ScreenTest ScreenTestFonts ScreenTestSound ScreenTitleMenu ScreenEz2SelectMusic ScreenRanking ScreenLogo ScreenUnlock ScreenDemonstration ScreenInstructions ScreenNameEntry ScreenNameEntryTraditional ScreenJukebox ScreenJukeboxMenu ScreenStyleSplash ScreenCredits ScreenSelectCharacter ScreenSelectMaster ScreenEditCoursesMenu ScreenProfileOptions ScreenExit ScreenReloadSongs ScreenOptionsMaster ScreenCenterImage ScreenTestInput ScreenBookkeeping ScreenBranch ScreenEnding ScreenDownloadMachineStats ScreenSetTime ScreenTestLights ScreenClearMachineStats ScreenResetToDefaults ScreenClearBookkeepingData ScreenInsertCredit 将以上原生类屏幕的语法规范全部介绍一遍是很庞大的工程,也没有这种必要。下面只介绍一个重要的原生类屏幕 及其他几个要说明的地方,没有涉及到的其他屏幕的问题请到http://www.stepmaniathings.com/Ç...20915;。 原生类屏幕介绍之[ScreenTitleMenu] 这是游戏开头菜单画面的屏幕段,当模式为PAY时,不会显示菜单列表,而将第一个选项作为默认 转向值。 特有语句格式: ChoiceNames= Choice1= Name1= ... NumCodes= Code1= Code1Action= ... LogoHomeOnCommand= LogoOnCommand= VersionOnCommand= SongsOnCommand= MaxStagesOnCommand= MaxStagesText= LifeDifficultyOnCommand= ChoicesX= ChoicesStartY= ChoicesSpacingY= ChoicesShadowLength= HelpX= HelpY= ColorNotSelected= ColorSelected= ZoomNotSelected= ZoomSelected= MenuTextAlign= // 0=left, 1=center, 2=right MenuCommandOnCreate= MenuCommandSelectDelay= SecondsBetweenComments= SecondsBeforeAttract= 大多数语句都可以顾名思义。象ZoomSelected=2就说明了要求当前被选择的选项文字以2倍大小显 示。 几点说明: ●ChoiceNames= Choice1= Name1= ... 这显然是成套出现的,第一句说明当前有共那些选项,第二句开始解释每个选项被执行时要进行的操作,和前面某 处提到的一样,除了screen,xxx这样的语句来进入某个屏幕外,同时还可以有11种操作被执行.在马 上就会看到的[▲乱入一]部分中会看到介绍。第三句说明每个选项在画面上所显示的名字。 ●NumCodes= Code1= Code1Action= ... 在绝大多数皮肤中,只会看到NumCodes=0一句,后面的语句不存在。事实上这是一个通过玩家执行特定 按键操作解除歌曲锁定的设定,为了确定解锁操作被成功执行了,还可以同时播放sounds文件夹里的某个声 音文件。例如要求在开头菜单画面处按顺序输入上上下下然后左右同时按下,则解除MAX300的歌曲锁定,同 时播放sounds文件夹中的MAX300.ogg,则可以这么书写: NumCodes=1 Code1=Up,Up,Down,Down,Left+Right Code1Action=Unlock,MAX300;sound,MAX300 上上下下然后左右同时按下书写成Up,Up,Down,Down,Left+Right,是因为什么规范呢 ? 在脚本中,Up对应上,MenuUp对应菜单上,Down对应下,MenuDown对应菜单下,Left对 应左,MenuLeft对应菜单左,Right对应右,MenuRight对应菜单右,Start对应开始 键。(菜单左右的出现主要是为了照顾PIU等其他类型的按键。) ,表示顺序按下,至于同时按下的书写规范不清楚,貌似两个键同时按下用+连接,三个键被按下用-连接。 ●看到了许多形如XXXXXXXXCommand=这样的语句,这是皮肤中给一些预设控件设置显示效果的语 句。是否还记得菜单标题画面上面会有文字显示当前载入了多少首歌曲?那个文字显示的效果就是由SongsO nCommand=这句来控制的,比如我们写SongsOnCommand=zoom,2 会发现对应的文字变成刚才的2倍大。显然zoom,x是一个用来控制显示大小的字符串,实际上zoom也是 一个函数,不过这并不是上文提到的通过Lua下放的API函数,与zoom类似的,存在着一组可以在XXX XXXXXXCommand=语句后面执行的界面描述函数,在Stepmania中创建动画效果主要靠他们 来实现,具体列表在后文的屏幕画面显示机制部分。 ●ColorNotSelected= ColorSelected= 这两句,分别指定选中的选项文字和其他选项文字显示的颜色,至于脚本中如何表示颜色,请看很快 就要看到的[▲乱入二]这部分。 ▲乱入一 在[ScreenBranch]类屏幕的NextScreenXXX和其他屏幕段中的ChoiceX语句中可以被执行的12种 操作一览。 □game,xxx 这个操作可以指定当前要模拟的游戏类型,比如dance或是pump。 但是这个操作并不完美,切换游戏类型后程序不会进行按键信息重载,简单的说就是键位会错乱。 语句示例:game,dance □style,xxx 这个操作可以在确定模拟游戏类型的前提下指定当前的游戏类型,以dance为例,则有single,sol o,double等类型可以选择。 语句示例:style,single □playmode,xxx 这个操作可以在上面两项确定的情况下指定当前的游戏模式,以dance的single为例,有regula r,nonstop,oni,endless,rave等模式可以选择,其中regular为普通模式。 语句示例:playmode,regular □difficulty,xxx 这个操作可以确定要选择歌曲的难度水准,分为beginner,easy,medium,hard,cha llenge几类。这也就是所谓的红脚、绿脚、蓝脚之类。 语句示例:difficulty,challenge □announcer,xxx 这个操作没使用过,大概是用来调用声音包里某个文件进行发声。 □name,xxx 赋予当前选项一个名字,和语言包、声音包的调用有关。 □mod,xxx 这个操作给参与游戏的player添加Modifiers效果,也就是游戏时的特效,象是mini,diz zy,2x,C400,solo之类,有关mod请参考[乱入三]。 语句示例:mod,1256% dizzy □song,xxx 这个操作指定游戏当前选定的歌曲,注意要填写的歌曲名字须和歌曲文件夹名字一致。 语句示例:song,MAX300 □steps,xxx 这个操作没使用过,大概是用来指定当前游戏选定的歌曲的难度等级数 □course,xxx 类似,song,xxx。这个操作指定游戏当前选定的曲组。 语句示例:course,mTrickyRandom □screen,xxx 这个操作用来跳转到xxx屏幕。 语句示例:screen,ScreenSelectMusic □setenv,xxx,yyy 这个操作明显区别于以上的11种操作,Theme Coder可以通过它给全局变量赋值,似乎也可以理解为参数传递的手段。 语句示例:setenv,is_dance_single,1 示例说明:执行后,is_dance_single的值为1。至于完成参数传递的第二步--读取全局变量的值请参见下文有关Lua的部分。 □多个操作之间用;隔开 语句示例:game,pump;style,single;playmode,nonstop;scree n,ScreenSelectCourse ▲乱入二 关于Stepmania脚本中颜色的表示方法。 有两种形式都可以在脚本中表示颜色,其本质是一样的。 那就是RGB值表示法,颜色可以由红(Red)绿(Green)蓝(Blue)三原色分量来表示,RGB值 表示法使用一套由16进制位组成的数码来表示颜色。 三原色中任一种颜色的最小值为0,最大为255(16进制的FF)。 知道这种表示法的规则,则可以写出纯红的RGB值为#FF0000(#是颜色标记),纯绿的RGB值为#0 0FF00,等等。要知道其他的颜色的RGB值,可以参考以下办法: 打开windows附件中的"画图"程序,颜色→编辑颜色→规定自定义颜色 新窗口最右侧有红绿蓝的数值填写框,可以填写数值看对应的颜色,也可以选中需要的颜色的查看其 RGB值。 需要注意的是画图程序使用10进制表示数字,10进制和16进制互相转换的工作可以使用windows附件 中的"计算器"程序完成: 查看→科学型。当10进制需要转换为16进制时,点选十进制,之后录入数字并点选十六进制即可;16进制转 换为10进制的方法同理。 前面提到还有另外一种表示形式,这种表示形式把三原色中任一种颜色的数值范围0-255均匀的分配到0-1之间,用小数来表示。比如原为#80FF00以这种形式表示的话是0.5,1,0,1最后那个1似乎是额 外的数值?这个1占用的这个位是来说明颜色的透明度的,同样的颜色如果透明度不同自然看起来也是不同的,事 实上Stepmania默认的游戏进行时歌词的显示办法就是依据此原理构造的。 [ScreenSelectMusic]屏幕类中的几点说明 ●关于歌曲信息,象是地雷数,跳跃notes数等信息要在本段写上一句ShowPanes=1后再构造对应 的辅助段才可以实现,这个后面会提到。但还有一个实用的信息是歌曲文件的长度。 TotalTimeX=0 TotalTimeY=0 TotalTimeOnCommand=hidden,1 TotalTimeOffCommand= 本段中这套语句是控制歌曲文件长度在屏幕上的显示的,把hidden,1去掉,然后调整TotalTime X,TotalTimeY(控件的横纵坐标)到满意为止。 其他的很多控件都与它类似,而且从语句名字不难联想到他们的作用。 ●借这个屏幕类中的TimerSeconds=60语句顺便提一下,这个语句基本上在屏幕段中都可以出现, 如果希望时间无限的话一般都写为TimerSeconds=-1 ●象AutogenIconP1X=48 AutogenIconP1Y=248 AutogenIconP1OnCommand=zoomy,0;linear,0.5;zoomy,1 AutogenIconP1OffCommand=linear,0.5;zoomy,0 这样的语句都是去读取Graphics文件夹里的内容,还是前面提到的,在熟悉皮肤插件系统中各部分存放的 内容的前提下,很多语句顾名思义猜想之后不难联想到作用。 以[ScreenPlayerOptions]屏幕类为例对类似的几个屏幕段做以下说明 ●LineNames=1,2,3,4,5,6,.... OptionMenuFlags= Line1=list,Speed ...... 作为提供选项的屏幕,LineNames语句说明了全部选项的代号。 之后由Linexxx语句来分别说明这个代号所代表具体哪些选项。 第二句的OptionMenuFlags是一个菜单项目标志,它可以被赋予如下的几种属性: together 菜单选项是1P 2P共享状态 explanations 未知 forceallplayers 进入此屏幕时强制1P 2P均存在 smnavigation 菜单选项的内容可以是跳转到某屏幕 toggle 未知 firstchoicegoesdown 未知 类似的,构造list时可以在选项总数后面以,分隔加上两个标志,分别是together和multise lect,后者的作用是使本list中的选项可以复数选中。 至于Linexxx=后面可以跟随的内容之类型有如下几种: 1.list,xxx 除少数情况(如NoteSkins项)外都是要在[ScreenOptionsMaster]段中预先设计好的,具体格式可以参考手头上的皮肤。要提示的是这个list中每一个项都可以带 有[乱入一]中所提到的12种操作。 2.conf,xxx 这是stepmania预设的功能配置高级接口,用来实现对整个程序运行环境的调整。 具体有哪些conf项,可以在脚本中搜索获得。 3.steps 显示当前选定歌曲的难度列表 4.characters 显示当前存在的伴舞列表 ▲乱入三 Stepmania提供的全mod效果一览表 第一部分: Boost Brake Wave Expand Boomerang Drunk Dizzy Mini Flip Tornado Tipsy Bumpy Beat Hidden Sudden Stealth Blink RandomVanish Reverse Split Alternate Cross Centered Dark Blind Cover Passmark Mirror Left Right Shuffle SuperShuffle NoHolds NoMines Little Wide Big Quick BMRize Skippy Mines Echo Stomp Planted Floored Twister NoJumps NoHands NoQuads ProTiming Incoming Space Hallway Distant 另外象变化速度2.5x还有稳定速度C400之类甚至noteskin的指定也在mod的工作 范围内。 第二部分: norecover suddendeath power-drop death normal-drain failarcade failimmediate fail30misses failendofsong failoff faildefault assisttick autosync savescore bar battery n(大于1的整数)Lives 1 Life n(0到2之间的小数)xMusic 关于mod的使用,全部mod都可以加前缀no 来使用,表示解除这个mod效果。 对于第一部分的mod,大多数还可以有另外的使用方式。 那就是加前缀*N ABCD%的形式,作用可以理解为把效果的显示加强。 3.2辅助段 辅助段可以认为是一个个的模块。 比如说选择歌曲时BPM显示模块就对应着[BPMDisplay]段。 段内描述了BPM显示模块的各种属性,象通常情况下的显示颜色,数值在变化情况下显示的颜色,如果在没有B PM的场合(比如当前状态是在一个文件夹上)要显示什么字符,模块内部的控件的坐标偏移量等等。 选择歌曲的场合需要使用这个BPM模块 BPMDisplayX= BPMDisplayY= BPMDisplayOnCommand= BPMDisplayOffCommand= 用以上语句指定了这个模块的显示坐标和进入/离开这个屏幕时要执行的界面修饰效果。 了解了辅助段和屏幕段这种互相配合的工作原理后,大多数辅助段还是顾名思义的猜想就不难知道它的作用,当然 有时也需要必要的修改测试。 下面介绍几个重要的辅助段。 [Common]段: 本段中的内容属于公共属性,比如程序运行时窗口上显示的标题。 段内语句规范: ColorP1= ColorP2= FirstRunInitialScreen= InitialScreen= WindowTitle= DefaultModifiers= DefaultCpuModifiers= JoinPauseSeconds= DifficultiesToShow= CourseDifficultiesToShow= ●第三句指定以本皮肤进入游戏时从哪个屏幕段开始运行。相应的第四句是指定游戏状态重置后逻辑从哪个屏幕段 开始运行。 ●第六、七句前面前面提到过,用于给参与游戏的player或cpu设置默认选择的mod效果。 ●第八句指定有新的玩家加入游戏时,程序暂停运行的秒数。 [MusicWheel]段 本段是一个歌曲转盘模块,在选择歌曲时会被调用。 说明几处语句的作用: ●ShowRoulette= ShowRandom= ShowPortal= 以上语句中等号后为1的意为是,0为否。如ShowPortal=1,则选歌时转盘上会有"随机显示"备选 。脚本中其他类似的语句用法均与此一致。 ●SortMenuNames= SortMenuActions= 在常规的皮肤中,选择歌时输入上下上下则会进入选择歌曲分类方式模式,第一条语句即是设置在那里显示的分类 名,一一对应的,在第二条语句中设置具体的分类方式。 分类方式对照表如下: GROUP 文件夹顺序 TITLE 曲名顺序 ARTIST 歌手名顺序 BPM BPM顺序 PLAYERS BEST 欢迎度顺序 TOP GRADE 最佳成绩顺序 EASY METER 黄脚难度顺序 MEDIUM METER 红脚难度顺序 HARD METER 绿脚难度顺序 CHALLENGE METER 蓝脚难度顺序 PREFERRED 乱序 写在SortMenuActions=后的排序方式要以sort,前缀说明,多个方式之前用: 割开。 一个示例: SortMenuActions=sort,GROUP:sort,TITLE:sort,ARTIST: sort,BPM:sort,PLAYERS BEST:sort,TOP GRADE:sort,EASY METER:sort,MEDIUM METER:sort,HARD METER:sort,CHALLENGE METER:sort,PREFERRED SortMenuNames=按文件夹顺序:曲名顺序:歌手顺序:BPM顺序:欢迎度顺序:最佳成绩顺序: 黄脚难度顺序:红脚难度顺序:绿脚难度顺序:蓝脚难度顺序:无顺序杂排 [DifficultyMeter]段 本段是歌曲难度脚数显示模块,在选择歌曲时会被调用。 说明几处语句的作用: ●NumFeetInMeter=语句。在这里设置难度显示槽里最多可以容纳的脚数。类似的,MaxFee tInMeter=语句设置可以显示的脚数的最大值。 ●GlowIfMeterGreaterThan=语句。设置当脚数超过指定数值时出现闪烁效果 。 [ScreenWithMenuElements]段 所有背景(Fallback=)指派为ScreenWithMenuElements的屏幕段所对应的屏幕 在画面显示时不仅在BGAnimations文件夹中会进行有关的搜索,在Graphics文件夹中也会有 特定的图片被载入。具体内容参见后文的屏幕画面显示机制部分。 至于本段的作用,则是给这些特定的图片设置坐标、修饰效果等显示属性,并将这些值作为所有屏幕段的缺省值。 换言之,任何屏幕段都可以对其进行重载。 例如本段有一句: HeaderX=320 而在我们创建的MaoLuoTest屏幕中,需要对应的MaoLuoTest Header图片文件横坐标为180。 则在[MaoLuoTest]屏幕段中加一句HeaderX=180即可。 [CodeDetector]段 本段是一个秘籍处理模块,Stepmania预先设定了一些秘籍,触发方法可以由Theme Coder控制。 预设的全部秘籍: Easier1= Easier2= Harder1= Harder2= NextSort1= NextSort2= NextSort3= NextSort4= SortMenu1= SortMenu2= ModeMenu1= ModeMenu2= Mirror= Left= Right= Shuffle= SuperShuffle= NextTransform= NextScrollSpeed= PreviousScrollSpeed= NextAccel= NextEffect= NextAppearance= NextTurn= Reverse= HoldNotes= Mines= Dark= CancelAll= NextTheme= NextTheme2= NextAnnouncer= NextAnnouncer2= NextGame= NextGame2= NextBannerGroup= NextBannerGroup2= Hidden= RandomVanish= SaveScreenshot= CancelAllPlayerOptions= BackInEventMode= 以上秘籍均只能在开头标题菜单屏幕或选曲画面才能使用。 几个秘籍项的说明: ●CancelAll,此项目触发后当前选定mod特效全部取消,回到初始状态。 ●NextTheme(2),触发后切换到下一皮肤。 ●NextAnnouncer(2),触发后切换到下一语音解说包。 ●NextGame(2),触发后切换到下一游戏类型。这个操作存在某个问题,某些情景会切换失败。反而衍 生出另一种作用,那就是快速切回到默认加载的皮肤 |
|||
|
|
08-09-2006, 06:25 PM
|
#2 |
|
Member
|
Post rating: rate
●NextGame(2),触发后切换到下一游戏类型。这个操作存在某个问题,某些情景会切换失败。反而衍 生出另一种作用,那就是快速切回到默认加载的皮肤。注意默认加载的皮肤并不一定是默认皮肤,乃是程序运行后 进入游戏的那个皮肤。
[PaneDisplay]段 本段是一个歌曲信息显示模块,包括歌曲内notes总数,需要跳跃notes数,地雷数等。 当选曲段内ShowPane=1时,调用本模块,ShowPane=0时,模块不被调用,本段不存在也没问 题。 几点说明: ●ShiftP1X=,ShiftP2Y=这些语句,用来调整模块内1P、2P显示容器的偏移位 置。 ●SongNumStepsNumLevels=5 SongNumStepsLevel1= ... 类似这样的语句,可以按照歌曲某个信息在某个取值范围内修饰以某种显示效果。 如: SongNumStepsNumLevels=5 SongNumStepsLevel1=1;stopeffect;diffuse,#FFFFFF SongNumStepsLevel2=200;stopeffect;diffuse,0.2,1,0. 2,1 SongNumStepsLevel3=350;stopeffect;diffuse,0.9,0.9, 0,1 SongNumStepsLevel4=550;stopeffect;diffuse,1,0,0.2, 1 SongNumStepsLevel5=9999;stopeffect;diffuse,1,0,0.2 ,1;glowshift;effectclock,bgm;effectperiod,1 歌曲总notes数共有5种分级指标。 范围在1到199时,以#FFFFFF颜色显示。 范围在200到349时,以0.2,1,0.2,1颜色显示。 ... 范围在9999以上(含)时以1,0,0.2,1颜色显示,并随背景音乐产生闪烁效果。 四.屏幕画面显示机制 之前反复提到,屏幕段中存在Fallback=ScreenWithMenuElements语句的屏幕画 面会在BGAnimations文件夹和Graphics文件夹中进行相关搜索。 当这个屏幕段名为XXX时,在BGAnimations文件夹中会进行XXX in,XXX out,XXX background的搜索,在Graphics文件夹中会进行XXX header,XXX footer的搜索。 设置画面显示效果多在前者中进行,至于后者,若不希望XXX header,XXX footer显示出图片,就利用redir文件把它们转向到_blank.png吧。 在BGAnimations文件夹中,大多数屏幕画面都独立的放置在对应名字的文件夹中。 在此文件夹中可以简单的放置一个图片供显示,不过这是老式办法,且不能设置显示效果。 现在的办法是在此文件夹中放置一个BGAnimation.ini脚本,在脚本中管理图片在屏幕画面上的显 示方式及相关设置。 这个脚本里同样也有若干个段。 4.1[BGAnimation]段 这是一个概要段,对这个屏幕画面作出基本的设置。 不要求必须存在本段。 段内语句: ●LengthSeconds=。指定本屏幕画面在游戏中显示多少秒 ●Condition=或Cond=。表明这个屏幕画面是一个条件显示画面,只有当等号后面的表达式经Lu a解释器运算后返回的值不为假时才显示本画面。关于Lua的介绍就在随后的[▲乱入四]。 ●UseScroller=。当等号后为1时表明使用滚动显示模块,这个模块大多在显示制作组织滚屏时用到 。 ●InitCommand=。可在此处设置画面被创建时的初始修饰效果,修饰效果函数列表在随后 的[▲乱入五]。 Stepmania开发人员写下的注释表明,不鼓励在这里修饰太多的效果,而期望尽量在metrics.i ni脚本中完成任务。 4.2[LayerXX]段 最为重要的图层显示段。 图片的载入和具体修饰效果在这些段内完成。 序号XX不得超过1000。 段内基本语句: ●Import=。这是一条可选语句,作用是将其他屏幕画面导入到本图层显示。 ●File=。指定本图层加载的文件。 ●Condition=。表明这个图层是一个条件显示图层。 ●Text=。在画面中利用Fonts中的字库显示文字。要使用这一项,要求在File=语句中指定要使用 的字库索引表,具体参考后面有关字库的部分。 ●Type=。指定本图层的类型。 当值为0时,类型为sprite。 当值为1时,类型为stretch。 当值为2时,类型为particles。 当值为3时,类型为tiles。 当设置为非sprite的类型时,还可在本段中对本类型的一些属性进行重载。 例如设为particles类型时,可有语句段: ZoomMin=.5 ZoomMax=2 VelocityXMin=-400 VelocityXMax=400 VelocityYMin=-400 VelocityYMax=400 NumParticles=15 stretch、particles、tiles三个类型的可重载的部分属性如下: StretchTexCoordVelocityX StretchTexCoordVelocityY ZoomMin ZoomMax VelocityXMin VelocityXMax VelocityYMin VelocityYMax VelocityZMin VelocityZMax OverrideSpeed NumParticles ParticlesBounce TilesStartX TilesStartY TilesSpacingX TilesSpacingY TileVelocityX TileVelocityY ●(On)Command=。对本图层进行显示效果修饰。 ▲乱入四 关于Lua脚本编程语言及其在Stepmania中的应用。 Lua脚本编程语言由巴西人开发,葡萄牙语中意为月亮,官方站地址为http://www.lua.org 网络游戏魔兽世界就使用其作为逻辑控制脚本。 Stepmania使用的是其5.0.2版本,与魔兽世界类似的,使用未编译的Lua代码来控制游戏。 在阅读下面的内容前请先找份Lua的教材学习,或许<<Programming in LUA中文版>>还不错,下面这个帖子供参考:http://www.wowtc.com/bbs/read.php?tid=4998&fpage=2 Stepmania开发者为了避免皮肤开发者通过Lua进行扩展性的"非法操作"导致程序不稳定或其他原因 ,封锁一些Lua的库或库函数。 □基本函数方面未做过多的封锁,象断言[assert]都可以使用,不过loadlib函数则进行封锁,不然皮肤开发者可以自行编译一个动态库给Lua调用,很有 可能是一个危险的操作。 □协同处理库未做过多的封锁,目前没有发现其利用价值。 □调试库未加载。 □输入输出库未加载。 □数学运算库完全加载。 □操作系统库未加载。 □字符串处理库未加载。 □构造表处理库未加载。 ■额外的,Stepmania 3.9通过Lua下放的API函数列表: MonthOfYear() DayOfMonth() Hour() Minute() Second() Year() Weekday() DayOfYear() GetStagesPlayed() OnePassed() FullCombo() Grade() GetBestGrade() GetWorstGrade() GetGrade() MaxCombo() OneGotGrade() GetFinalGrade() GetBestFinalGrade() IsPlayerUsingProfile() IsWinner() IsCourseMode() IsDemonstration() StageIndex() IsExtraStage() IsExtraStage2() PlayModeName() PlayerUsingBothSides() CurSong() CurSteps() IsHumanPlayer() NumStagesLeft() IsFinalStage() GetEasiestNotesDifficulty() IsPlayerEnabled() CurStyleName() GetNumPlayersEnabled() UsingModifier() CourseSongIndex() GetEnv() SetEnv() 注意,对于此函数,目前未发现成功使用的场合。 IsAnyPlayerUsingMemoryCard() IsNetConnected() SongFullDisplayTitle() StepsMeter() Song() 在Stepmania 3.9皮肤脚本中,常规情况下,仅在Condition=或Cond=语句中会运行Lua解释器。 由于编程时的限制,if else 等Lua关键字不能出现在Condition=或Cond=语句后的表达式中,如果出现则表达式解释失败, 实际上我们可以通过某种手法饶过这种限制。 比如用以下的办法: Lua基本函数中,有一个 require (packagename),可以加载一个Lua代码文件作为库,那么可以写若干个函数到一个文本文件中, 然后在Cond=处调用之,在之后的地方就可以调用那些函数了,而那些函数体的语句中则可以含 有if else for之类的关键字。 要额外提到的是API函数GetEnv(),还记得前面setenv,xx,xx那个操作吧。这个函数是和 他对应的,可以完成一些参数传递任务。 如之前有setenv,is_dance_single,1这个操作,后面要验证这个操作是否被执行了,则 可用GetEnv("is_dance_single")=="1"来进行。 实际上,虽然Lua脚本语言扩展了皮肤的可编程特性,但由于3.9版本仅在Condition=或Cond =语句中会运行Lua解释器,运算的结果无非是True或False而已,其作用是有限的。 ▲乱入五 图象画面修饰描述函数列表: sleep linear accelerate decelerate bouncebegin bounceend spring stoptweening finishtweening hurrytweening x y z addx addy addz zoom zoomx zoomy zoomz zoomtowidth zoomtoheight stretchto cropleft croptop cropright cropbottom fadeleft fadetop faderight fadebottom fadecolor diffuse diffuseleftedge diffuserightedg diffusetopedge diffusebottomedge diffusealpha diffusecolor glow glowmode whiten brighten rotationx rotationy rotationz heading pitch roll shadowlength horizalign left center right vertalign top middle bottom diffuseblink diffuseshift glowblink glowshift rainbow wag bounce bob pulse spin vibrate stopeffect effectcolor1 effectcolor2 effectperiod effectoffset effectdelay effectclock timer bgm effectmagnitude scaletocover scaletofit animate setstate texturewrapping additiveblend blend normal add noeffect zbuffer ztest ztestmode off writeonpass writeonfail zwrite clearzbuffer backfacecull cullmode back front none hidden hibernate draworder playcommand queuecommand 此类函数调用方式可参见手头上的皮肤。 4.3[Scroller]段 前面提到这是一个滚动显示模块。 段内语句: SecondsPerItem= NumItemsToDraw= RotationDegreesX= RotationDegreesY= RotationDegreesZ= TranslateTerm0X= TranslateTerm0Y= TranslateTerm0Z= TranslateTerm1X= TranslateTerm1Y= TranslateTerm1Z= TranslateTerm2X= TranslateTerm2Y= TranslateTerm2Z= ItemPaddingStart= ItemPaddingEnd= 用来控制滚动时的角度、速度等属性。 五.字库文件加载机制 Fonts文件夹内存放游戏时要使用的文字图片及其索引表。 谈到索引表不得不强调一个概念:画面显示时,不存在"文字",那些"文字"和其他在画面上显示的物件一样是 普通的图片。 在Stepmania中调用文字,程序会在Fonts文件夹中找到对应的字符索引表,根据索引表指定的内容 找到对应那个字符的一部分图象,并将其显示在画面上。 这部分具体内容描述起来比较麻烦,鉴于Theme Coder对其也都有一定了解,这里跳过。 在这里谈一下我所使用的一种制作Stepmania用汉字库的办法,使用这种办法制作GB2312汉字库的 6763个汉字只需十分种时间,当然,这是指在准备工作都完成的情况下。 首先设法获得要制作的字库不重复文字连续文本,我是从网络上找了一份编码表然后去掉区位信息形成列表。然后 设法按照Stepmania的字符索引表格式将其编排,为此,专门写了一个小程序来辅助。 下载地址:(随程序附带GB2312 BIG5 GBK不重复文字连续文本各一份。) http://mikejsxh.111.tofor.com/fonttool.zip 不重复文字列表保存为maoluo.txt放于FONT.EXE同目录下,运行FONT.EXE后生成PH OTO.txt和FONT INI.txt两个文本文件,后者就是所需要的字符索引表,将此文件加上[common]段的必要修饰后另存为UTF-8编码格式的ini文件,就可以将其导入_16px fonts.ini等文件里了。 下面来制作字模图片,刚才生成的PHOTO.txt文件就是为此而存在的。这个文件里每一个段落里的文件对 应一个字模图片,用Photoshop创建一个透明图片,大小则请根据自己的需要计算,把这些字以白色字黑 色描边的方式写到图片里,最后就是细节的调整对齐直到显示效果满意为止。 [common]段中的常见修饰 Top= Baseline= 均对字模显示时的竖直方向偏移量有影响 LineSpacing= 换行时候的空间间隔大小 DefaultWidth= 读取字模图片时每个字模的大小 六.语言包 这部分只要注意如果有新加入list的菜单项目等,不要忘记在语言包里加入对应的语句。 七.音乐播放 当名为XXX的屏幕需要有背景音乐时,将名为XXX music.ogg[mp3 wav也可]的文件放入Sounds文件夹就可以了,要注意的是,Sounds文件夹中的音乐文件名如果最后以(loo p)结尾,则表示循环播放。 ※对[一.缺省加载机制]的补充,事实上,如果在脚本中加入 [Global] FallbackTheme= 这样一个段,则可以指定哪个皮肤中作为本皮肤的缺省值提供皮肤,且可以多次跌代指定。即A皮肤为B皮肤提供 缺省值,B皮肤为C皮肤提供缺省值... 若仍有要求加载的语句不存在时,读取default皮肤中的内容作为缺省值。 八.几个应用上文内容的实例 8.1限制条件转入画面 选择single或double类型后,由于某种需求,若类型为solo或double则有可 能以1/2的概率进入选择难度画面,其他情况一律强制以single类型,普通模式,hard难度进入选择歌曲画面 。 [ScreenSelectStyle]段内有关的内容如下: Choice1=Style,single;name,single Choice2=Style,versus;name,versus Choice3=Style,couple;name,couple Choice4=Style,double;name,double Choice5=Style,solo;name,solo NextScreen1=ScreenSelectDifficulty NextScreen2=ScreenSelectDifficulty NextScreen3=ScreenSelectDifficulty NextScreen4=ScreenSelectDifficulty NextScreen5=ScreenSelectDifficulty 说明了五个选项的内容和要转向的屏幕。 由于这个例子涉及到流程判断,自然要引入一个继承原生类屏幕ScreenBranch的子屏幕 。 起名为ScreenTest1。 则[ScreenSelectStyle]语句要改为 Choice1=Style,single;name,single Choice2=Style,versus;name,versus Choice3=Style,couple;name,couple Choice4=Style,double;name,double Choice5=Style,solo;name,solo NextScreen1=ScreenTest1 NextScreen2=ScreenTest1 NextScreen3=ScreenTest1 NextScreen4=ScreenTest1 NextScreen5=ScreenTest1 然后创建[ScreenTest1]段: Class=ScreenBranch Choices=1,2 Condition1=(CurStyleName()=="double" or CurStyleName()=="solo")and math.random(2)==1 Condition2=true NextScreen1=screen,ScreenSelectDifficulty NextScreen2=style,single;playmode,regular;difficul ty,hard;screen,ScreenSelectMusic 8.2时间显示模块 ![]() 当在街机上游戏Stepmania时,看时间只能通过手机显得有些麻烦。 出于此种需求,考虑为Stepmania添加时间显示模块。 基本思路是利用图层显示中Condition=条件判断的功能和通过Lua下放的函数来制作。 将要显示的时间数字按位拆分,逐位判断,这样代码量可以缩减不少,按照这种思路,在BGA文件夹里创建一个 文件夹,名为Time,里面的脚本内容如下: //小时分钟秒的个位 [Layer2] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==0 [Layer3] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==1 [Layer4] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==2 [Layer5] Text=3 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==3 [Layer6] Text=4 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==4 [Layer7] Text=5 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==5 [Layer8] Text=6 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==6 [Layer9] Text=7 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==7 [Layer10] Text=8 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==8 [Layer11] Text=9 File=_shared2.ini Command=rainbow;zoom,1.5;x,240;y,415 Cond=math.mod(Hour(),10)==9 //分隔 [Layer111] Text=: File=_shared2.ini Command=rainbow;zoom,1.5;x,258;y,415 [Layer12] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==0 [Layer13] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==1 [Layer14] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==2 [Layer15] Text=3 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==3 [Layer16] Text=4 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==4 [Layer17] Text=5 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==5 [Layer18] Text=6 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==6 [Layer19] Text=7 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==7 [Layer20] Text=8 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==8 [Layer21] Text=9 File=_shared2.ini Command=rainbow;zoom,1.5;x,310;y,415 Cond=math.mod(Minute(),10)==9 // //分隔 [Layer222] Text=: File=_shared2.ini Command=rainbow;zoom,1.5;x,328;y,415 [Layer22] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==0 [Layer23] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==1 [Layer24] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==2 [Layer25] Text=3 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==3 [Layer26] Text=4 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==4 [Layer27] Text=5 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==5 [Layer28] Text=6 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==6 [Layer29] Text=7 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==7 [Layer30] Text=8 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==8 [Layer31] Text=9 File=_shared2.ini Command=rainbow;zoom,1.5;x,380;y,415 Cond=math.mod(Second(),10)==9 // //小时分钟秒的十位 //最多二十四小时 [Layer32] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,210;y,415 Cond=Hour()/10>=0 and Hour()/10<1 [Layer33] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,210;y,415 Cond=Hour()/10>=1 and Hour()/10<2 [Layer34] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,210;y,415 Cond=Hour()/10>=2 // //最多六十分钟 [Layer35] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=0 and Minute()/10<1 [Layer36] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=1 and Minute()/10<2 [Layer37] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=2 and Minute()/10<3 [Layer38] Text=3 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=3 and Minute()/10<4 [Layer39] Text=4 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=4 and Minute()/10<5 [Layer40] Text=5 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=5 and Minute()/10<6 [Layer41] Text=6 File=_shared2.ini Command=rainbow;zoom,1.5;x,280;y,415 Cond=Minute()/10>=6 // //最多六十秒 [Layer42] Text=0 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=0 and Second()/10<1 [Layer43] Text=1 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=1 and Second()/10<2 [Layer253] Text=2 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=2 and Second()/10<3 [Layer874] Text=3 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=3 and Second()/10<4 [Layer218] Text=4 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=4 and Second()/10<5 [Layer413] Text=5 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=5 and Second()/10<6 [Layer666] Text=6 File=_shared2.ini Command=rainbow;zoom,1.5;x,350;y,415 Cond=Second()/10>=6 在需要使用这个显示模块的屏幕画面脚本中用Import语句将其导入就可以了。 由于Cond的判断只在画面生成时起作用,故暂无法从实质上作到动态显示,但在有限秒内模拟动态显示效果倒 也不无办法,不过这个不足可以通过把秒数的去掉得以掩盖。 8.3投币模式下自如切换模拟的游戏类型 (这个实例相对较复杂,已经完成这个功能的脚本可以在这下载: http://mikejsxh.111.tofor.com/metrics.zip 解压缩出metrics.ini文件并覆盖Theme/default/下的同名文件即可,建议先备份之前的脚本文件。) 还是当在街机上游戏Stepmania时,无法自主切换要模拟的游戏类型,使得某些游戏跳舞板没有得到最大 利用,以北京东四明星娱乐世界来说,其跳舞板是这样的: 123 456 789 也就是说既可以玩DDR也可以玩PIU。 这个例子中涉及到的修改部分和添加的部分如下: [Common] InitialScreen=ScreenSelectGame [ScreenPlayerNum] Class=ScreenBranch Choices=1,2 Condition1=IsPlayerEnabled(1) == false or IsPlayerEnabled(2) == false Condition2=IsPlayerEnabled(1) == true and IsPlayerEnabled(2) == true NextScreen1=screen,Screencoinadd1 NextScreen2=setenv,is_num_2,1;style,single;screen, Screencoinadd1 [Screencoinadd2] Class=ScreenBranch Choices=1,2 Condition1=GetEnv("is_num_2") == "1" NextScreen1=setenv,is_num_2,0;screen,Screencoinadd 1 Condition2=true NextScreen2=style,single;screen,ScreenSelectGame [Screencoinadd1] TimerSeconds=1 Fallback=ScreenPlayerOptions PrevScreen=ScreenTitleMenu NextScreen=Screencoinadd2 LineNames=1 OptionMenuFlags=together;forceallplayers Line1=characters Class=ScreenOptionsMaster HeaderOnCommand=hidden,1 HeaderOffCommand=hidden,1 FooterOnCommand=hidden,1 FooterOffCommand=hidden,1 [ScreenTitleCosplay] Class=ScreenTitleMenu Fallback=ScreenTitleMenu HeaderOnCommand=hidden,1 HeaderOffCommand=hidden,1 FooterOnCommand=hidden,1 FooterOffCommand=hidden,1 ChoiceNames=1 Choice1=screen,ScreenSelectStyle Name=DDR or PIU [ScreenTitleMenu] Choice1=screen,ScreenPlayerNum [ScreenSelectGame] NextScreen=ScreenTitleCosplay OptionMenuFlags=together;forceallplayers 前面提到过ScreenTitleMenu这个开头菜单屏幕在投币模式下不显示菜单项,以第一项作为默认项 。 为了提供切换模拟游戏类型的机会,有必要将此项更改为其他的项目,在一个新创建的流程中完成任 务。 现在我们让ScreenPlayerNum成为默认项,这个流程屏幕通过API函数进行判断当前只有一人开 启了游戏或是两个人都开启了游戏,而跳转入不同的屏幕。 这里要提到一个非常规操作: 在调试中发现若当前参与游戏的人数与游戏类型不符时,程序会自动修正。 比如在两个player存在的场合,强制single游戏类型,则会"匀"出一个player 所需的币数。 这个操作在这个实例里占有很高的地位,因为切换模拟游戏类型后,包括用setenv设置的环境变量的大部分 游戏信息会清空,而币数则是不被影响的数据。 言归正传,在ScreenPlayerNum屏幕中,若1P 2P都存在,则给环境变量is_num_2赋值1,然后进入Screencoinadd1屏幕,这是一个继 承原生类屏幕ScreenOptionsMaster的一个屏幕,加入这个屏幕的目的只是为了通过forc eallplayers标志强制1P 2P都存在。这个屏幕的后继屏幕为Screencoinadd2,这也是一个流程屏幕,在此屏幕中,若发现 is_num_2的值为1,则给is_num_2赋值0,然后再进入Screencoinadd1屏幕。( 如果不对is_num_2改值的话,会出现无限循环的情况,当然币数也随之无限增加。)若is_num_2 的值非1,则进入ScreenSelectGame屏幕。 以上烦琐的操作是为了对玩家分两种情况进行投币补偿,不然会出现为了切换模拟游戏类型而白白损失游戏币的情 况。 在ScreenSelectGame屏幕中,就可以切换模拟游戏类型了。 但成功切换后,会切回到[Common]段中指定的InitialScreen屏幕。 可将其改为InitialScreen=ScreenSelectGame 这样成功切换后,逻辑会保留在ScreenSelectGame屏幕中,由此实现了无限次切换类型,降低了 误选游戏类型的概率。 只有在当前游戏类型与选择的游戏类型一致时,才跳出本屏幕,进入ScreenTitleCosplay屏幕 。这是一个继承ScreenTitleMenu的屏幕,这里将其作为跳板,转入正常的游戏逻辑 。 从玩家的角度看: 若一人进入游戏,首先出现一个画面,1秒后消失,并补偿一人份的投币。 若两人进入游戏,首先出现一个画面,1秒后消失,之后再出现这个画面一次,1秒后消失,总计补偿两人份的投 币。 之后进入选择游戏类型的画面,若没有额外安装游戏支持包,则只有Dance Pump两个选项,选择自己要玩的游戏类型,(如果是切换了游戏类型的话则需要再确认一次,当然同样也可以 放弃,而改回原来的游戏类型),之后进入和标题画面样子一样的一个画面,此后就和通常游戏时一 样了。 The End. 全文完。 参考网站: http://www.stepmania.com http://foonmix.nothing.sh/foonplus_h...nimations.html http://www.lua.org http://stepmaniathings.com 致谢: MAOLUO·毛毛(拳皇盟's Mv Maker:LostFeather):带领我接触ddr这个游戏并研究stepmania软件特性的好朋 友,经常提出一些乍看起来难以实现的创意,是研究这款模拟器的动力所在。 邪恶小熊猫:小熊猫前辈曾在M-G-Z论坛发表经其修改的system zero panda.版皮肤,里面不光灵活地运用了上文提到的内容,还使用非常规手段通过皮肤增加了大量的mod效 果,此项技术是我至今也无法企及的。小熊猫前辈通过几次闲聊的机会,给我指明了方向,几次大的突破都和之有 关。 |
|
|
08-09-2006, 09:46 PM
|
#3 |
|
Member
|
Post rating: rate
i like cheese
__________________
Working at Sportland Arcade, OC, MD. Schooling at Del Tech, Georgetown, DE. Comp Sci. My Myspace | My Groovestats |
|
|
08-09-2006, 09:57 PM
|
#4 | |
|
Moderator
|
Post rating: rate
Next time, post a link to the file instead of copying and pasting its contents.
__________________
XxDemonxX's sig offends me. Quote:
|
|
|
|
11-17-2006, 10:45 AM
|
#7 |
|
Member
|
Post rating: rate
This is an excellent [strike]article with a comperhensive reference[/strike] handbook for anyone who wants to make a theme and ... um ... understands Chinese. Luckily I speak Chinese as a native language, so I can apperciate it.
Next time, though, something like this should be posted on a Chinese Stepmania forum (see Links page at stepmania site). I can try to translate it though I have more important matters to attend to (like preparing for the China College Enterance Exams or playing bard in a not-so-well-known MMORPG ^_-.) Edit: A mail from the author identified himself as a modernator of the Stepmaina China Forums, and the article in question is in fact first posted at there. http://kakurady.googlepages.com/arel...createthetheme |
|
|
11-18-2006, 07:20 AM
|
#9 |
|
Member
|
Post rating: rate
Current Progress: Section 3-1(of 7), Interheritage and Overloading of Screen Classes.
Bytes 12,480 of total 46,263 processed. The partially translated is at: http://kakurady.googlepages.com/arel...createthetheme Anyone willing to help out? |
|
|
12-16-2006, 03:11 AM
|
#10 | |
|
Member
|
Post rating: rate
Quote:
(I usually have an absymal sense of humor in English. All I can do is detecting puns and irony.)
__________________
Since when has Kuri clearfied their gender? Kakurady Drakenar |
|
|
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
|
|
All times are GMT. The time now is 06:42 AM.
|