作者StubbornLin (Victor)
看板GameDesign
标题[转录][情报] BBS-Lua
时间Wed Jan 9 21:17:19 2008
※ [本文转录自 C_and_CPP 看板]
作者: ForSinSoKing ( Penguin & Fish :)) 看板: C_and_CPP
标题: [情报] BBS-Lua
时间: Wed Jan 9 18:22:36 2008
以下文章都是转录自P2《BBSLua》版piaip 大师的文章:)
有兴趣的板友可以去P2参观看看, 目前P2可以在线上跑程式.
如果确认会实装的话, 以後可以直接在BBS 上面跑程式.
(已经由版主同意分享此资讯给大家, 感谢版主)
--
作者 piaip (piaip) 看板 BBSLua
标题 [文件] BBS-Lua 简介
时间 Sun Jan 6 21:52:29 2008
───────────────────────────────────────
如果你是来体验 BBS-Lua 的,请在板上找任一篇开头为 [Lua ] 的文章,
阅读後按下大写 P 即可
===========================================================================
本文件的最新版请至 PTT2 BBSLua 板取得
本文件为推广说明用,转录不需通知原作者 (推文会被不定期删除,请见谅)
===========================================================================
● 什麽是 BBS-Lua?
BBS-Lua 是一个实验性的计画,由 piaip 开发并於 2008 年开始在 PTT2 BBS
(ptt2.cc) 站开始试用。
正如它的名字,这个计画的目的就是
「在 BBS 上执行 Lua(程式)」。
Lua 是什麽呢? Lua 念成「LOO-ah」(噜~啊),它是一个程式语言,
被大量的用在各种游戏平台中,包括着名的魔兽世界 (Wow) UI 界面
也是使用 Lua 来制作。 Lua 的相关资讯请见
http://www.lua.org/
所以, BBS-Lua,就是要「
让使用者可以在 BBS 上轻易的用 Lua 写程式」。
● 为何要开发此计画?
BBS-Lua 的诞生有好几个因素。 最主要的因素是来自於它的前身 - 互动式
BBS 动画。 在 2007 年末, PTT/PTT2 开始实装新一代的 pmore 2007 动画系统,
内含了不少互动与即时的指令,用来方便制作多重结局的动画。 这些指令後来
被拿来试作不少小游戏,但毕竟是以动画为出发点设计的系统,没有变数、回圈,
於是只要游戏的状态与变数一多,需要产生的画面就以指数成长。
基於这个经验,我们决定另外创造一个全新的互动系统,以真正的程式语言为基础,
独立於动画之外 - 也就是 BBS-Lua 计画。
另外,使用此计画还有不少的好处:
-
减轻 BBS 非核心系统的开发负担
现有 BBS 有半数以上跟效率无关的程式 (包含许多游戏)。 使用 BBS-Lua 可以
把这些部份全部独立出来,修改程式也不用重新编译或启动 BBS
-
方便移植程式
传统的 BBS 程式虽是用 C 写成,但各家分岐仍然过大 (Maple 2.x, Maple 3,
Firebird, PTT, ...),导致程式码流通不易。 最明显的例子就是游戏: 这家
写的游戏要让另一个分支的 BBS 能跑,通常都要下一番功夫。
BBS-Lua 计画,可以允许 BBS 的底层南辕北辙,只要支援同样的 BBS-Lua 标准,
就可以让 BBS-Lua 的程式几乎一行都不用改就可以在别处执行。
-
方便程式流通
现在是开放源码 (Open Source) 的时代。 遗憾的是,BBS 这个超大程式平台,
现在并不方便让大家交流。 在某个 BBS 看到印象深刻的功能或游戏,若是直接
转寄到其它 BBS 就能玩,不是很有趣吗? 而且若是一般使用者也能进行创作,
相信 BBS 上可玩的东西数目会大增,品质也会增加。
以往你觉得游戏不好玩、美工不够好,只能每日一信建议站长改;现在你可以
自己动手作!
● 我要如何参与 / 使用 BBS-Lua?
要体验 BBS-Lua, 可以先找有内含 BBS-Lua 程式的文章。 它们通常会
在文内出现如 --#BBSLUA 这样的一行。
PTT2 BBSLua 板上
[Lua] [程式] [BBSLua] 或 [范例] 通常都是此类文章。
找到以後,进入阅读画面後按下大写 P (小写 p 是播放动画)
就可以执行 BBS-Lua 程式了。
另外,
所有的 BBS-Lua 程式都可以在任何时候按下 Ctrl-C 中断执行。
如果你有程式设计的基础或是对於制作 BBS-Lua 有兴趣,请到
ptt2.cc 的 BBSLua 板,可以找到最新版的语法、API文件与说明。
● BBS-Lua 的未来 / 以後会有别的 BBS 也支援吗?
基本上 PTT1/PTT2 应该是会支援,虽然 PTT1 的时程未定(或许在2009前)。
不过也要视 PTT2 测试的状况而定。 我们无法保证未来一定会实装。
我们很欢迎别的 BBS 一起来实作 BBSLua ,不过毕竟这不是我们能决定的罗~
如果未来发展的好,应该是很有机会的事。
关於 BBS-Lua 的发展计画,我们希望在 2008 结束前能制定一个 1.0 标准版,
有足够的 API 来完成大部份 BBS 单人环境能作的事 (ex, 游戏)
或许会推出能在单机上执行的模拟环境与 SDK
2.0 之後则是以两人以上互动的架构为主轴。
● 我有问题 / 我找到 Bug / 我想发表程式
目前 PTT2 的 BBSLua 板是最适合作这些事的地方。
--
作者 piaip (piaip) 看板 BBSLua
标题 [文件] BBS-Lua 规格与 API 说明文件
时间 Sun Jan 6 21:52:29 2008
───────────────────────────────────────
=====================================================================
Interface: 0.112
本文件最後更新时间: 2008/01/08 23:45
最新版本请至 PTT2 BBSLua 板取得
本文件为推广说明用,转录不需通知原作者 (推文会被不定期删除,请见谅)
但由於 BBS-Lua 目前变动非常频繁,建议您附上原出处方便阅读者取得最新版
=====================================================================
提醒您: BBS-Lua 系统还在初期开发中,所有的架构/API 都随时可能大改!
请有您现在的作品可能忽然就跑不动的心理准备。
BBS-Lua 是在 BBS 里面跑程式语言的机制,选用的程式语言是
Wow UI 所使用的 Lua。 关於此程式语言请见
http://www.lua.org/pil/
http://www.lua.org/manual/5.1/manual.html
这份文件说明了如何在 BBS 上使用 Lua (也就是 BBS-Lua 计画),
以及目前可使用的 API 相关说明。
2008 Jan, piaip
=====================================================================
● BBS-Lua 的格式
BBS-Lua 的程式使用一般文章发文即可。 程式码要用特殊的标签前後标起来。
这个标签写成: (须在行前,前面不可有空白)
--#BBSLUA
让我们来看个最简单的范例吧:
--#BBSLUA
print("Hello, world")
--#BBSLUA
这就是一个最简单的 BBS-Lua 程式。
执行它的方法,目前是在阅读文章时按下大写 P 。
另外, 紧接着 --#BBSLUA 的下一行可以给定版本及作者资讯, (中间不可有空行)
称之为 TOC Tag。 格式为:
-- Name: Value
TOC 可由 BBS-Lua 中使用 toc.xxx 来存取,同时也可以让 BBS-Lua 系统警告
是否有相容性的问题。
目前支援的 TOC Tag 有:
-- Interface: BBS-Lua API 版本号码 (可方便系统警示不相容的讯息)
-- Title: 程式名称
-- Notes: 程式说明
-- Author: 作者资讯
-- Version: 程式自订的版号
-- Date: 最後修改日期 (0.113+)
Interface 的号码,请填上您开发时参考的文件编号 (见本文开头)
下面是一个完整的范例:
--#BBSLUA
-- Interface: 0.112
-- Title: 贪食蛇
-- Notes: 在 BBS 上玩贪食蛇, Ctrl-C 可中断
-- Author: Hung-Te Lin <
[email protected]>
-- Version: 0.1
-- Date: 2008/01/09
print("hello, world");
--#BBSLUA
建议您平时最少加上 Interface 资讯,其它则是可加可不加:
--#BBSLUA
-- Interface: 0.112
print("Hello, world!")
--#BBSLUA
=====================================================================
● BBS-Lua 与标准 Lua 异同之处
目前的 BBS-Lua 使用的是标准 Lua 5.1,除了下列不同:
- print() 被转换为 BBS 输出
- os library 无法使用
- io library 无法使用
- debug library 无法使用
- load (package) library 无法使用
- 可使用 math library
- 可使用 string library
- 可使用 table library
- 内建 bitlib (
http://luaforge.net/projects/bitlib )
=====================================================================
● API 说明
目前 BBS-Lua 提供的专属输出入功能有:
[输出]
bbs.addstr(str, ...) 画字到目前位置
bbs.outs(str, ...) 画字到目前位置 (同 addstr)
bbs.title(str) 移至左上角绘制标题
bbs.print(str, ...) 印完所印字串後再加上一个换行 (bbs.outs(str,...,"\n"))
print(str, ...) 同 bbs.print
* 全系列画字函式都可以接受 ANSI 指令
* 注意: 输出并不会立刻反应在画面上,要等 refresh()
或其它输入函式才会作全萤幕的更新。请见 refresh() 说明
[移动]
bbs.getyx() 传回游标目前位置 (y, x), y/x 由 (0,0)表左上角
bbs.getmaxyx() 传回目前萤幕大小 (my,mx), 实际可移动范围到(my-1,mx-1)
bbs.move(y,x) 移动到 (y,x) (也就是 ANSI 的 *[x;yH)
bbs.moverel(dy,dx) 移动到游标目前位置加上 (dy,dx)
[清除]
bbs.clear() 清除整个画面+回到左上角
bbs.clrtoeol() 清至行尾
bbs.clrtobot() 清至萤幕底端
[更新画面]
bbs.refresh() 呼叫此命令时才会真的更新画面
(呼叫输入等待指令如 getch/getstr/pause/kbhit/sleep
时也会自动更新)
另外注意: 1.10 前为了加速输出,在使用者已有输入资料且
程式尚未处理时, refresh() 完全不会更新输出。
1.10 後,一般输入指令的自动更新在输入资料未处理完时
不会更新画面,但 refresh() 会强制更新。
注: 由於这关乎总输出资料量,我们不保证未来会维持这个行为
或许哪天就会改回有输入资料未处理完前不更新输出。
请尽量把您的程式写好一点
[属性]
bbs.color(c1,c2,...) 切换 ANSI 属性 (也就是 *[c1;c2;....m)
不指定参数时 bbs.color() = *[m (重设属性)
bbs.setattr(c1,c2,...) 同 color()
bbs.ANSI_COLOR(c1,...) 传回 ANSI 属性字串 (不马上变属性,要 outs 才会变)
bbs.ANSI_RESET 传回 *[m 字串
bbs.ESC 传回 ANSI 的 *
[输入]
bbs.getch() 输入单键
特殊按键为大写名: UP DOWN LEFT RIGHT
ENTER BS TAB HOME END INS DEL PGUP PGDN F1 ... F12
另外与 Ctrl 合按的复合键会以 ^X 的形式出现。
bbs.getdata(n,echo) 画 n 个字元的输入框并输入字串
echo (可省略) = 0 时只输入不画字 (可作密码输入)
bbs.getstr(n,echo) 同 getdata
bbs.pause(msg) 在底部画暂停讯息并等输入单键 (传回值同 getch())
bbs.kbhit(wait) 传回使用者是否有按键 (若无输入则会等待最多 wait 秒)
bbs.kbreset() 清空输入缓冲区 (吃掉所有已输入的键)
[时间]
bbs.time() 现在时间 (以数字表示),精准度到秒 (处理速度较快)
bbs.now() 同 time()
bbs.ctime() 现在时间 (以字串表示)
bbs.clock() 高精准度的时间 (可到秒的小数点以下但速度较慢)
bbs.sleep(sec) 停止执行 sec 秒 (可到小数点以下)
[BBS 资讯]
bbs.userid() 目前使用者的 id
bbs.sitename BBS 站名
bbs.interface BBS-Lua API 版本号码
[程式 TOC 资讯]
toc.interface TOC 中的 Interface: 资讯
toc.title TOC 中的 Title: 资讯
toc.notes TOC 中的 Notes: 资讯
toc.author TOC 中的 Author: 资讯
toc.version TOC 中的 Version: 资讯
toc.date TOC 中的 Date: 资讯 (0.113+)
[位元操作 (bitlib) ]
bit.cast(a) cast a to the internally-used integer type
bit.bnot(a) returns the one's complement of a
bit.band(w1, ...) returns the bitwise and of the w's
bit.bor(w1, ...) returns the bitwise or of the w's
bit.bxor(w1, ...) returns the bitwise exclusive or of the w's
bit.lshift(a, b) returns a shifted left b places
bit.rshift(a, b) returns a shifted logically right b places
bit.arshift(a, b) returns a shifted arithmetically right b places
=====================================================================
● 版本更新注意事项
=== 2008/01/06 2:03 前的作品昇级要注意: (0.101) ===
1. -- BBSLUA 改前後加上 --#BBSLUA
2. stand_title 改 title
3. bbs.outs(bbs.ANSI_COLOR(1,33) .. "test" .. bbs.ANSI_RESET);
建议改成 bbs.color(1,33); bbs.outs("test"); bbs.color();
=== 2008/01/06 13:00 後有效: (0.102) ===
1. 新增 getmaxyx(), moverel()
2. chattr() 改为 setattr()
3. igetch() 停止支援,请用 getch
4. getnstr() 停止支援,请用 getstr 或 getdata
5. vmsg() 停止支援,请用 pause
6. bbs.outs() / bbs.addstr() 可改为写 print(),不用加前面的 bbs.
=== 2008/01/06 15:55 後有效: (0.103) ===
1. 新增 bbs.userid() 为目前使用者 id
2. 新增 bbs.kbhit()
=== 2008/01/06 17:05 後有效: (0.104) ===
1. print()/bbs.print() 现在会比 outs() 多印一个换行
2. 修正跑久会停住的问题
=== 2008/01/06 21:53 後有效: (0.105) ===
1. 新增 bbs.clock()
=== 2008/01/07 10:50 後有效: (0.106) ===
1. 新增 bbs.sleep(),暂时只开放最多 10 秒
=== 2008/01/07 11:50 後有效: (0.107) ===
1. 修正 bbs.sleep() 未处理 Ctrl-C 的问题,重新开放上限
2. 新增 bbs.kbreset()
=== 2008/01/07 14:15 後有效: (0.108) ===
1. 新增 bitlib (
http://luaforge.net/projects/bitlib ) 为标准之一,
方便移植用 C 写的程式
=== 2008/01/07 21:05 後有效: (0.109) ===
1. 新增 bbs.interface bbs.sitename
2. 格式新增 TOC tags (toc.*)
=== 2008/01/08 01:00 後有效: (0.110) ===
1. 由於太多人无法理解 refresh() 与 input queue 的关系,此版起 refresh()
会无视输入缓冲区强制更新。
=== 2008/01/08 03:00 後有效: (0.111) ===
1. 修正 co-routine yield/resume 不正常的问题
=== 2008/01/08 23:45 後有效: (0.112)
1. 修正 bbs.pause() 传回值,现在与 bbs.getch() 相同
2. 修正 bbs.color(): 无参数时等於 bbs.color(0) (重设颜色)
=== 2008/01/?? ??:?? 後有效: (0.113) ===
1. 新增 toc.date
=== 未制定 API:
1. user store / global store (user.store.load/user.store.save)
2. TOC about dialogs
3. communiction api
----
有兴趣的人就去P2研究看看吧!
piaip 大师说只要有程式底子的都可以研究看看喔:)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.211.94.214
1F:推 compbell:虽然跟C/C++没什麽关系 可是这东西好像很有趣XD 01/09 18:24
2F:推 revivalworld:看起来很有趣 01/09 19:39
3F:推 StubbornLin:看起来蛮有趣的 XD 01/09 19:43
4F:→ StubbornLin:我来改写我以前的贪吃蛇变成BBS Lua版好了 XD 01/09 19:55
5F:推 qazq:已经有人在 ptt2 的 BBSLua 板写好了 XD 01/09 20:01
6F:推 vizshala:比起bbs-lua lua本身的程式码更有趣 01/09 20:07
7F:→ vizshala:如何用c就可以完成一个脚本语言 这和本版比较有关 01/09 20:07
8F:推 StubbornLin:借转 GameDesign 01/09 21:16
--
VICTOR工作室
http://www.kinmen.info/vic/
程式设计教学
http://victorlin.serveftp.org/programming/article/?article_id=2
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.231.211.128
9F:推 asoedarren:lua是好物 01/09 21:40
10F:推 keitaandwing:lua是好物+1 01/09 21:52
11F:→ StubbornLin:BBS + Lua真的不错玩 XD 大家可以去玩玩看 01/09 21:58
12F:推 geken:学lua会不会很难? (没有lua的版...) 01/09 22:03
13F:推 HalfLucifer:推个Lua! 真的很赞 不会很难学喔 :D 01/09 22:15
14F:→ doomleika:露啊!(我只是路过) 01/09 22:50
15F:推 LPH66:如果有C的基础的话 www.lua.org的manual看过应该基本没问题 01/10 00:57