2008年1月8日 星期二

[轉錄] BBS-Lua 簡介

作者: piaip (piaip) 看板: BBSLua
─────────────────────────────────────

===========================================================================
本文件的最新版請至 PTT2 BBSLua 板取得
本文件為推廣說明用,轉錄不需通知原作者 (推文會被刪除,請見諒)
===========================================================================

● 什麼是 BBS-Lua?

BBS-Lua 是一個實驗性的計畫,由 piaip 開發並於 2008 年開始在 PTT2 BBS
(ptt2.cc) 站開始試用。

正如它的名字,這個計畫的目的就是 在 BBS 上執行 Lua(程式)」 。

Lua 是什麼呢? 它是一個程式語言,被大量的用在各種遊戲平台中,包括
著名的魔獸世界 (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 板上 [程式] 或 [範例] 通常都是此類文章。
找到以後,進入閱讀畫面後按下大寫 P (小寫 p 是播放動畫)
就可以執行 BBS-Lua 程式了。

另外,所有的 BBS-Lua 程式都可以按下 Ctrl-C 中斷執行。

如果你有程式設計的基礎或是對於製作 BBS-Lua 有興趣,請到
ptt2.cc 的 BBSLua 板,可以找到最新版的語法、API文件與說明。

● BBS-Lua 的未來 / 以後會有別的 BBS 也支援嗎?

基本上 PTT1/PTT2 應該是會支援,雖然 PTT1 的時程未定。
我們很歡迎別的 BBS 一起來實作 BBSLua ,不過畢竟這不是我們能決定的囉~
如果未來發展的好,應該是很有機會的事。

關於 BBS-Lua 的發展計畫,我們希望在 2008 結束前能制定一個 1.0 標準版,
有足夠的 API 來完成大部份 BBS 單人環境能作的事 (ex, 遊戲)
或許會推出能在單機上執行的模擬環境與 SDK

2.0 之後則是以兩人以上互動的架構為主軸。

● 我有問題 / 我找到 Bug / 我想發表程式

目前 PTT2 的 BBSLua 板是最適合作這些事的地方。
作者: piaip (piaip) 看板: BBSLua
─────────────────────────────────────

===========================================================================
本文件的最新版請至 PTT2 BBSLua 板取得
本文件為推廣說明用,轉錄不需通知原作者 (推文會被刪除,請見諒)
===========================================================================

● 什麼是 BBS-Lua?

BBS-Lua 是一個實驗性的計畫,由 piaip 開發並於 2008 年開始在 PTT2 BBS
(ptt2.cc) 站開始試用。

正如它的名字,這個計畫的目的就是 在 BBS 上執行 Lua(程式)」 。

Lua 是什麼呢? 它是一個程式語言,被大量的用在各種遊戲平台中,包括
著名的魔獸世界 (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 板上 [程式] 或 [範例] 通常都是此類文章。
找到以後,進入閱讀畫面後按下大寫 P (小寫 p 是播放動畫)
就可以執行 BBS-Lua 程式了。

另外,所有的 BBS-Lua 程式都可以按下 Ctrl-C 中斷執行。

如果你有程式設計的基礎或是對於製作 BBS-Lua 有興趣,請到
ptt2.cc 的 BBSLua 板,可以找到最新版的語法、API文件與說明。

● BBS-Lua 的未來 / 以後會有別的 BBS 也支援嗎?

基本上 PTT1/PTT2 應該是會支援,雖然 PTT1 的時程未定。
我們很歡迎別的 BBS 一起來實作 BBSLua ,不過畢竟這不是我們能決定的囉~
如果未來發展的好,應該是很有機會的事。

關於 BBS-Lua 的發展計畫,我們希望在 2008 結束前能制定一個 1.0 標準版,
有足夠的 API 來完成大部份 BBS 單人環境能作的事 (ex, 遊戲)
或許會推出能在單機上執行的模擬環境與 SDK

2.0 之後則是以兩人以上互動的架構為主軸。

● 我有問題 / 我找到 Bug / 我想發表程式

目前 PTT2 的 BBSLua 板是最適合作這些事的地方。

[轉]BBS-Lua 規格與 API 說明文件

作者: piaip (piaip) 看板: BBSLua
─────────────────────────────────────

=====================================================================
本文件最後更新時間: 2008/01/07 14:00
v0.108
最新版本請至 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 。

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

● 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/kbhit/sleep
時也會自動更新)
另外注意: 為了加速輸出,在使用者已有輸入資料且程式
尚未處理時,螢幕完全不會更新輸出。

[屬性]
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 HOME END INS DEL PGUP PGDN TAB

bbs.getdata(n,echo) 畫 n 個字元的輸入框並輸入字串
echo (可省略) = 0 時只輸入不畫字 (可作密碼輸入)
bbs.getstr(n,echo) 同 getdata

bbs.pause(msg) 在底部畫暫停訊息並等輸入單鍵
bbs.kbhit(wait) 傳回使用者是否有按鍵 (若無輸入則會等待最多 wait 秒)
bbs.kbreset() 清空輸入緩衝區 (吃掉所有已輸入的鍵)

[時間]
bbs.time() 現在時間 (以數字表示),精準度到秒
bbs.now() 同 time()
bbs.ctime() 現在時間 (以字串表示)
bbs.clock() 高精準度的時間 (gettimeofday,可到秒的小數點以下)
bbs.sleep(sec) 停止執行 sec 秒 (可到小數點以下)

[BBS 資訊]
bbs.userid() 目前使用者的 id

[位元操作 (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 前的作品昇級要注意: ===
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 後有效: ===
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 後有效: ===
1. 新增 bbs.userid() 為目前使用者 id
2. 新增 bbs.kbhit()

=== 2008/01/06 17:05 後有效: ===
1. print()/bbs.print() 現在會比 outs() 多印一個換行
2. 修正跑久會停住的問題

=== 2008/01/06 21:53 後有效: ===
1. 新增 bbs.clock()

=== 2008/01/07 10:50 後有效: ===
1. 新增 bbs.sleep(),暫時只開放最多 10 秒

=== 2008/01/07 11:50 後有效: ===
1. 修正 bbs.sleep() 未處理 Ctrl-C 的問題,重新開放上限
2. 新增 bbs.kbreset()

=== 2008/01/07 14:15 後有效: ===
1. 新增 bitlib ( http://luaforge.net/projects/bitlib ) 為標準之一,
方便移植用 C 寫的程式
作者: piaip (piaip) 看板: BBSLua
─────────────────────────────────────

=====================================================================
本文件最後更新時間: 2008/01/07 14:00
v0.108
最新版本請至 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 。

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

● 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/kbhit/sleep
時也會自動更新)
另外注意: 為了加速輸出,在使用者已有輸入資料且程式
尚未處理時,螢幕完全不會更新輸出。

[屬性]
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 HOME END INS DEL PGUP PGDN TAB

bbs.getdata(n,echo) 畫 n 個字元的輸入框並輸入字串
echo (可省略) = 0 時只輸入不畫字 (可作密碼輸入)
bbs.getstr(n,echo) 同 getdata

bbs.pause(msg) 在底部畫暫停訊息並等輸入單鍵
bbs.kbhit(wait) 傳回使用者是否有按鍵 (若無輸入則會等待最多 wait 秒)
bbs.kbreset() 清空輸入緩衝區 (吃掉所有已輸入的鍵)

[時間]
bbs.time() 現在時間 (以數字表示),精準度到秒
bbs.now() 同 time()
bbs.ctime() 現在時間 (以字串表示)
bbs.clock() 高精準度的時間 (gettimeofday,可到秒的小數點以下)
bbs.sleep(sec) 停止執行 sec 秒 (可到小數點以下)

[BBS 資訊]
bbs.userid() 目前使用者的 id

[位元操作 (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 前的作品昇級要注意: ===
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 後有效: ===
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 後有效: ===
1. 新增 bbs.userid() 為目前使用者 id
2. 新增 bbs.kbhit()

=== 2008/01/06 17:05 後有效: ===
1. print()/bbs.print() 現在會比 outs() 多印一個換行
2. 修正跑久會停住的問題

=== 2008/01/06 21:53 後有效: ===
1. 新增 bbs.clock()

=== 2008/01/07 10:50 後有效: ===
1. 新增 bbs.sleep(),暫時只開放最多 10 秒

=== 2008/01/07 11:50 後有效: ===
1. 修正 bbs.sleep() 未處理 Ctrl-C 的問題,重新開放上限
2. 新增 bbs.kbreset()

=== 2008/01/07 14:15 後有效: ===
1. 新增 bitlib ( http://luaforge.net/projects/bitlib ) 為標準之一,
方便移植用 C 寫的程式