Sogal自定义脚本——SogalScript!

Sogal是大地无敌正在坑的Gal引擎
那么 一套脚本是并不可少的 所以就有了SogalScript
应该算是一套自定义脚本格式(嗯大概还没到语言的完备程度而且都是依托于python实现的)
(嘛窝觉得它的一个亮点是可以通过:和:识别说话者
刚刚才把if判断语句添加进去的说……
这是一个SogalScript脚本文件的示例:

ifselectionjumptest.sogal

#这个应该和selectionjumptest效果一样 不过引入了if!
#不再像汇编语言一样讨厌了!
@mark:start
@bg testbg2,qp luc_naked_trueheart -0.33 0
D4的路西菲尔:
「现在是做出抉择的时间呢……」

@choice D4的路西菲尔:撒,做出选择吧 , qp luc_naked_trueheart -0.33 0
上发条
--不上发条
选你妹啊!
--啊哈!?

@if last_choice == 0
    
    @qp luc_naked_desire 0.33 0
D4的路西菲尔:
「从这里跳转到各种测试试试?」

    @choice
图像测试(jump)
脚本测试(jump)
音效测试(jump)
文本框测试(expand)
图像测试(expand)

    @if  last_choice == 0
    @script
story_manager.beginScene('imagetest')
    @elif last_choice == 1
    @jump scripttest
    
温蒂达莉安:
「这条语句不会出现!」
    @elif  last_choice == 2
    @jump soundtest
    
温蒂达莉安:
「这条语句也不会出现!」
    @elif last_choice == 3
        @expand textboxtest  #嘛虽然没必要缩进
        @qp luc_naked_normal -0.33 0
D4的路西菲尔:
「刚才发生了什么……现在因为expand继续执行了呢。刚才是一个文本框测试」
        @goto start
    @elif last_choice == 4
        @expand imagetest
        @qp luc_naked_normal -0.33 0
D4的路西菲尔:
「刚才发生了什么……现在因为expand继续执行了呢。刚才是一个图像测试」
        @goto start
    @end

@elif last_choice == 2
谜の音:选这个是不行的哦,回到开头吧
    @goto start

@end

说明什么的

==================================================================

脚本在scene中以.sogal格式存储
注意文件编码统一用UTF-8
而且最好不要用Windows记事本直接编辑因为它存的UTF8好像会有奇怪的标记然后
别的系统可能不认
(嘛窝这边是Visual Studio和Eclipse都用的
音乐音效,以16位wav或ogg格式存储,因为使用的音频引擎仅仅是openal能力有限……

关于资源的放置:
图片(背景、立绘、CG)应以png24形式放在images中
anm 播放的panda3D egg格式2d动画也应放在images中
所有声音相关资源在audio中

备忘:
转义符
__在行前可以表示这是一个文本中的空行
: :表示这是一个英文或中文冒号而不是名称表达的简化形式
# 表示是#而非注释

命令列表 
命令写在命令段中(整个命令段以@开头 命令段中以,分隔不同的命令)
注意文件名都不能加空格,以后会考虑能用引号包含

TODO:在StoryManager中实现背景、立绘、声音的支持,注意要考虑到要从某个存档文件中读取背景和立
绘的情况

已实现
文本:
name = -Name    设置名字 可以有空格
name -Name   设置名字 可以有空格
文本段中开头-Name: 或-Name:(中文冒号)  设置名字的简化形式
textboxstyle normal/large 改变文本框格式,会清空文本
p 格式中用来清空已有字符 ,large文本框用,注意和显示图片的p的区别是它不带任何参数
textbox -propname -content 改变文本框属性,content可以有空格,会在脚本命名空间中eval计算(也就是如果是字符串要加引号),参考game_text_box.py中GameTextBox.properties
textbox apply 应用文本框属性的修改,会清空文本

场景:
p -key -fileName -x -z (-s) (-fadein)  在指定位置显示立绘位置 0 0表示正中  1 1表示右上 注意除了Location都不能有空格 -相同的Keyword会直接替换  fadein是淡入                       
p -key -fileName 显示立绘,如果已存在,其会在当前位置用新图片替代-否则绘制在正中
bg -FileName  立即改变背景
bg -FileName -Time 改变背景
ploc -key -x -y -z (-time)  改变立绘位置 Location应该是两个数字 x z(或是3个x y z)
ploc -key -x -z 
pcolor -key -r -g -b -a (-time)  rgba范围都在0到1
pscale -key -s (-time) 缩放 注意 以总是以这次缩放前的大小为1
del -key  移除立绘、o3d、o2d、pa
del -key -time 淡出并移除
o3d -key -fileName -x -y -z -r -g -b -a -sx -sy -sz 显示3D模型,x轴向由 y轴向屏幕内 z轴向上 大小自己看着办吧
o2d -key -fileName -x -y -z -r -g -b -a -sx -sy -sz 在3D中显示2D图片
pa -key -fileName -x -z -sx -sy (-f) 显示egg动画在前景注意动画要手动缩放宽高比
delbg 删除背景
delbg -time  淡出背景
qp -fileName -x -z   快速立绘!在进入下一个文本段时就会自动消失!
clear 重置场景。移除所有立绘,将背景设置为黑色。用于初始化和场景切换
clear -Time 重置场景。在一定时间内淡出到黑色
clear -Time -bgFileName 重置场景。以一定速度渐入到某个背景图片

声音:
v -FileName (-volume)语音
vstop    停止当前语音
se -FileName (-volume)播放音频(非语音的音效)
sestop    停止当前所有se播放的音效
bgm -FileName (-fadein) (-volume) (0) 循环播放音乐使用默认淡入淡出设置 fadein为淡入或音乐交换用时间(所有时间以秒为单位) 末尾的0作为参数表示不循环
bgmstop (-fadeout)    结束或淡出当前音乐,Time为淡出时间
env -FileName (-fadein) (-volume) (0) 循环播放环境音效 末尾的0作为参数表示不循环
envstop (-fadeout)	淡出环境音效
audiostop (-fadeout) 停止所有音效 BGM和ENV会淡出

功能逻辑:
mark: mark 标记以用于跳转,单独占一行命令
script   表示接下来的文本段是python脚本(注意其中不能有空行)
script -FileName 运行python脚本文件
注意: script脚本由专门的脚本命名空间执行 但在命名空间中请不要留下对任何panda3d物件的引用(否则可能影响序列化存档)
但是,下列引用的对象是可以在脚本空间中访问的(相对的)全局对象(参见story_manager.py中mapScriptSpace(self))
        script_global['goto'] = self.goto
        script_global['story_manager'] = self    
        script_global['game_text_box'] = self.gameTextBox
        script_global['story_view'] = self.storyView
        script_global['audio_player'] = self.audioPlayer
        script_global['gdict'] = self.script_space
另外因为Panda3D的关系(会在脚本的全局命名空间加一些无法被pickle序列化的C内容)和窝的一些小诡计所以全局命名空间不
会保存到存档文件中(但本地命名空间能保存和在下一段脚本中继承)所以使用global时要注意
——但,你可以把本地空间当成全局空间用……

choice 表示选择命令
头部有choice后,接下来的文本段每行是一个选择。
选择的结果会写入到脚本空间(本地)的last_choice变量中
第一个选项为0 第二个选项为1 以此类推
如果行开头是--则表示该选项不可用
另外select -text 可以为这个选项进行描述

goto -mark  跳转到标记
jump -FileName 读取sogal场景脚本并跳转(删除当前脚本队列)
expand -FileName 将sogal场景脚本展开到当前脚本(插入到当前脚本队列) expand命令语句只执行一次,将目标脚本插入到
当前队列后,自身也会消失

if condition 条件判断,单独占一行命令,注意冒号后接条件表达式(大概是为了以示区别吧 注意没有冒号
elif condition     你懂得,单独占一行命令
else          你懂得,单独占一行命令
end 结束当前if块 单独占一行命令

总之,再加上文本历史 自动播放 跳过已读文本 快进 隐藏界面 和简陋的主菜单——就可以一战了!

Leave a Reply

Your email address will not be published. Required fields are marked *