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块 单独占一行命令
总之,再加上文本历史 自动播放 跳过已读文本 快进 隐藏界面 和简陋的主菜单——就可以一战了!