看板 GameDesign 關於我們 聯絡資訊
※ [本文轉錄自 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
compbell:雖然跟C/C++沒什麼關係 可是這東西好像很有趣XD 01/09 18:24
revivalworld:看起來很有趣 01/09 19:39
StubbornLin:看起來蠻有趣的 XD 01/09 19:43
StubbornLin:我來改寫我以前的貪吃蛇變成BBS Lua版好了 XD 01/09 19:55
qazq:已經有人在 ptt2 的 BBSLua 板寫好了 XD 01/09 20:01
vizshala:比起bbs-lua lua本身的程式碼更有趣 01/09 20:07
vizshala:如何用c就可以完成一個腳本語言 這和本版比較有關 01/09 20:07
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
asoedarren:lua是好物 01/09 21:40
keitaandwing:lua是好物+1 01/09 21:52
StubbornLin:BBS + Lua真的不錯玩 XD 大家可以去玩玩看 01/09 21:58
geken:學lua會不會很難? (沒有lua的版...) 01/09 22:03
HalfLucifer:推個Lua! 真的很讚 不會很難學喔 :D 01/09 22:15
doomleika:露啊!(我只是路過) 01/09 22:50
LPH66:如果有C的基礎的話 www.lua.org的manual看過應該基本沒問題 01/10 00:57