--- title: 「Escape from 5F」企劃書 tags: project, django, game, ctf description: 1. title 請改為 [專案名稱]企劃書 2. tag 請刪去template,加上專案內容類型或名稱 3. 下方會議記錄請使用會議記錄範本 4. 加上"{%hackmd BkVfcTxlQ %}"意為套用黑色模板 --- {%hackmd BkVfcTxlQ %} # ***Escape from 5F*** > 負責人聯絡資訊: > 王譽錚 / 手機:0931998389 / Email:opp40519@gmail.com / Line ID: opp40519 :::info 專案參與成員: * 王譽錚、楊斯丞、許堃陽、葉宗儒、李崇瑋 共計 5 人 [name=專案負責人:王譽錚] <br/> 會議記錄: * [Jun. 5^th^, 2020](https://hackmd.io/@Arashi/S1i2TBD3U) ::: > [TOC] > > References: > 1. [How to create interactive terminal like website?](https://itnext.io/how-to-create-interactive-terminal-like-website-888bb0972288) > 2. [jQuery Terminal Emulator Plugin](https://terminal.jcubic.pl/) > 3. [網頁自動轉址/重新導向/URL重定向方法(HTML/Javascript/PHP的轉址)](https://tzuhsiang.com/webmaster/url-html-javascript-php/) > 4. [Javascript session](http://dreamerslab.com/blog/tw/javascript-session/) *** ## **專案資訊** * 專案時期: [time=] Jul. 5^th^ * 專案客戶資訊: * 無 * 專案預期對象: * SIRLA 會內成員 --- ### *專案概述* 整個遊戲主要以文字 RPG 的方式進行,主畫面以一般類似終端機的樣貌呈現,在遊戲的過程中會有相當多謎題,這些謎題皆以網頁或者檔案的方式呈現。 遊戲中融合相當多的主題元素,其中包括解謎、懸疑、逃脫等,並且以夢結局的方式來結束整個遊戲 --- ### *預期目標* 利用 Django 的架構利用現實中密室逃脫的概念,以 CTF 的方式進行遊戲的呈現,並將資訊相關領域的各方面知能作為題目,以提升遊戲玩家在資訊相關方面的能力。 主要提升的領域包含資訊安全、網站架設、程式語言等相關內容,藉此亦能提升會內成員在面臨問題的思維與解決問題的能力,同時也提升開發成員之運算思維。 --- ## **專案內容** ### *環境* * Python == 3.8.2 * Django == 3.0.7 ### *技術簡介* * 劇情摘要 :::info 一位名為李崇璋的學生於廁所企圖自殺,在失去意識的過程中進到了這個五樓空間,並且失去了自身的所有記憶;透過在五樓解謎的過程當中,慢慢地將所有記憶拼湊,並還原自身的狀況與自殺的原因。 在理解整個事件後從而甦醒,來選擇對於事情真相的處理,以及對於即將因失血過多死亡的自己,選擇活下去或者就此死去。 ::: * 整個遊戲主要以文字 RPG 的方式進行,主畫面以一般類似終端機的樣貌呈現,在遊戲的過程中會有相當多謎題,這些謎題皆以網頁或者檔案的方式呈現 * 遊戲主題 * 解謎 * 懸疑 * 逃脫 * 結局 * 夢結局 > 需要思考入夢的理由、入夢後場景的關聯性 * 故事線索以日記方式呈現 * 玩家的動作有: | 動作 | 說明 | | --- | --- | | move | 移動到另一個地圖 | | act | 針對物件的動作 | | look | 觀察地圖 | | show | 查詢能夠前往的地點或查詢能夠做的動作 | ### *系統架構* ``` |------------| |----------| | web server |------| database | |------------| |----------| ``` #### ++*Database Tables*++ > Use SQLite * Flag * ans * checkpoint | ans | checkpoint | | --- | ---------- | | ANS{5+ud3n+\_!D} | billboard | | ANS{s3lf\_m0\[k3ry_bu+\_\[4n_n0+\_d!sp3l\_d0ub+5} | 5a - badguy space | | ANS{5+0p\_c0mf0r+\_y0ur\_p4!n\_!t\_!5\_l!k3\_4\_3v!l\_34gl3\_d3v0ur3d\_y0ur\_\[h3s+} | department office | #### ++*Web Roadmap*++ * Escape * Django project | file / directory | description | | ---------------- | ----------- | | `settings.py` | 基本設定 | | `urls.py` | 網址設定 | | `_init_.py` |(無需更改) | | `asgi.py` |(無需更改) | | `wsgi.py` |(無需更改) | * Escape_story * Django App | file / directory | description | | ---------------- | ----------- | | `_init_.py` | (無需更改) | | `admin.py` | 管理員設定 | | `app.py` | 新增app | | `modles.py` |資料庫設定 | | `tests.py` |(無需更改) | | `views.py` |建立function | * templates * 放置網頁模版 | file / directory | description | | ---------------- | ----------- | | `5A.html` | 5A場景頁面 | | `Beginning.html` | 初始場景頁面 | | `Corridor_i.html` |走廊一場景頁面 | | `Corridor_ii.html` |走廊二場景頁面 | | `Department_office.html` |系辨公室場景頁面 | | `Toilet.html` |廁所場景頁面 | | _CTF/ |放置題目網頁| . . . . . . . ``` |-------------| /---| CTF Problem | / |-------------| |----------| / | terminal |--- |----------| \ \ |-------------| \---| Diary | |-------------| ``` ### *系統流程* ``` |--------------| | Beginning | |--------------| | | V |--------------| Get "KEY" | Toilet |--------------------------------------------------------| |--------------| | ^ | | | | | V /----(Stair) | |--------------| / | | Corridor I |----------(Elevator) | |--------------| | ^ | | |------------+---| | | | | | /----(Billboard) | | | | / | Get |--------------| | | | / | "ID Card" /----| Badguy Space | | | V / V / |--------------| | | |--------------| / |--------------| / | | | Corridor II |----------X| 5A |---- | | |--------------| | |--------------| \ | | ^ | \ |--------------| | | | | \----| De Space | | | | | |--------------| | | | | | | | | | | | | | | | | |--------------| | | | |<----X| Department |<----------------------------| | | | Office | | | |--------------| | | | |<---------------------------------------------------------------------| | V |--------------| | Corridor III | |--------------| ``` --- ## **專案安排** ### *專案工作* * 工作內容: 1. 建立django與首頁和資料庫(遊戲輸入操作的那個頁面,資料表1可放flag的內容,資料表2可放玩家註冊的資料之類的) 2. 網站UI設計 3. 題目生成,如複製系網內容下來,並適當進行增減(像是如果複製下來的部分有連結,跳到別的地方的,看要不要刪掉)、藏flag 4. 劇情撰寫 5. 協助與整合 | 姓名 | 工作內容 | | --- | ------- | | 辣母羊 | 1, 2 | | small ant | 2, 5 | | 薯羊 | 2 | | 夜猫 | 3, 4 | | arashi | 5 | ### *專案時程* * [time=] ~Jul. 5^th^ * 做到 Corridor II --- ## **備註與附件** > 劇情參考: > [何謂思覺功能障礙?](https://www.brainlohas.org/%E4%BD%95%E8%AC%82%E6%80%9D%E8%A6%BA%E5%8A%9F%E8%83%BD%E9%9A%9C%E7%A4%99/) > [完全自殺手冊](https://reurl.cc/0oMxdx) ### *地圖* ``` |----------------|----------|--------|----------------------| | Boy’s Toilet | Elevator | Stair | 5A | |----------------|----------|--------|----------------------|-----------------------------------------------------------------------------------| | | | | Corridor I Corridor II Corridor III Corridor IV | Learning Common | | | | |----------------|--------| Billboard |---------------------|-------|-------|-------|-------|-------|-----------------| | | Girl’s Toilet | | Department Office | 506 | 505 | 504 | 503 | 502 | 501 | Library |-------------------------| |----------------| |---------------------|-------|-------|-------|-------|-------|-----------------| | Stair | Elevator | |--------|----------| ``` ### *劇情* 眼見不一定為憑... 真相...有時候就藏在所看到的細節中... :::warning ++廁所 Toilet++ Move: 走廊一 Get: Key ::: > Beginning > [color=#9999FF] > 你睜開雙眼。 眼前是熟悉卻又陌生的場景。 你唯一可以理解到的事就是你正身處廁所,四周沒有任何燈光,彷彿到了某個異空間一般。 你站起身來,摸索了一下自己,發現口袋中有自己的手機。 你打開手機的手電筒一照,看到了門口後慢慢的走出去。 > Other > [color=#9999FF] > 回到最初醒來的起點,周圍也沒看到什麼特別的。 用手機照到廁所隔間的門,上頭赫然是大大的幾個字,寫著:「你以為...你...逃得掉嗎...」。 > `if key == false` > [color=#9999FF] > 你嚇了一跳,想到最初醒來的時候牆上還沒有這些字,卻在轉眼間就冒了出來。 你強忍著心中的恐懼,慢慢地靠近隔間的門,手避開那些字,小心翼翼地推開了門。 用手機的手電筒一照,發現一道閃光反射到自己的眼中,仔細一看發現,在馬桶蓋上放著一把鑰匙。(取得系辦鑰匙) > `if key == true` > [color=#9999FF] > 你看著這幾個字,已不如最初看到時的恐懼。 但是心底像是被什麼東西撓著一樣,明明應該記得什麼事情,但卻回想不起來。 :::warning ++走廊一 Corridor I++ Move: 走廊二、廁所 Look: 電梯、樓梯 ::: 你走出廁所,往左看到了電梯後相當興奮,想著應該能夠坐電梯到樓下吧! 同時發現電梯旁有個本來應該是樓梯的地方。 :::info (電梯) 按了電梯卻發現完全沒反應。 ::: :::info (樓梯) 樓梯被一堆障礙物封了起來。 你用手機燈光照出去,發現仍舊一片漆黑。 ::: :::warning ++走廊二 Corridor II++ Move: 走廊一、走廊三、5A、系辦 Look: 佈告欄 Get: ID Card ::: 慢慢地往前走,手機微弱的燈光在黑暗中格外的明顯。 寂靜的四周僅有自己的腳步聲迴盪著。 稍微環視了一下,好像有一個佈告欄。 定睛一看,佈告欄上似乎曾經貼著什麼,但離得太遠看不清楚。 再看到旁邊的牆上寫著「你記得嗎?你是誰?」 「我當然記得,我是...我是...我是誰?」你突然發現自己完全不記得自己的身份。 :::info (佈告欄 Billboard) > 說明 flag 的形式 > [color=#9999FF] > 走到佈告欄前,發現上頭有幾張已經被撕得不成形的紙,剩下的訊息似乎寫著什麼。 「...門...線索...」 「解碼...ANS{}...格式...」 > `if id_card == false` > [color=#9999FF] > 「ANS{5+ud3n+\_!D}...」 仔細一看,佈告欄的角落貌似還有著一張學生證,但是上頭的照片相當的模糊,彷彿被人刻意的抹掉一般。 你伸手嘗試將它拿起來,卻發現沒有辦法,明明沒有任何工具或黏著劑,卻好像被鑲嵌在上頭似的絲毫不動。 這時手機突然響了起來,跳出了一個要求輸入的畫面。 「What is your answer?」 ... > `if flag == true` > [color=#9999FF] > 「啪」的一聲,學生證不再黏在佈告欄上,直直地掉落到地板上。 你撿起了學生證,上頭本來應該呈現名字的地方印著:▩▩▩。 「這到底是誰的學生證?為何看不見名字?」你疑惑著。 > `if flag == false` > [color=#9999FF] > 手機瞬間暗屏,接著彷彿血一般紅色慢慢地蔓延整個螢幕。 在螢幕的中央緩緩地浮現出了幾個字。 「你...答錯了...呵呵呵...」 ::: :::warning ++5A++ Move: 走廊三 ::: 你試著從門外看到 5A 電腦教室的內部,但小窗上的玻璃反射了手機的手電筒,看不清楚內部到底有些什麼。 轉頭一看,門的旁邊似乎有個刷卡的系統。 > `if id_card == true` > [color=#9999FF] > 你拿起剛剛取得的學生證往上頭一刷,門應聲而開。 走進 5A 電腦教室環視了一下,一種難以言喻的感覺湧上心頭 「這好像不是我熟悉的教室?」你正這麼想著,身後的門「碰」地一聲關上了,打也打不開。 環視周圍,無數的電腦不斷閃爍,有種令人毛骨悚然的感覺。 走到教室的最角落,上頭寫著「阿德的研究空間」,電腦被鎖了起來,需要密碼才能夠解開。(一個題目) 走到教室靠近白板的角落,一個牌子上寫著「壞人空間」,仔細檢查了一下發現有張小卡,同時那個空間連通了一扇門。(一個題目) 此時你的手機又是一震 「What is your answer?」 :::warning ++系辦 Department Office++ Move: 走廊二 ::: > `if key == false` > [color=#9999FF] > 走到系辦門口,想試著推開,卻發現大門被鎖了起來 拿手機一照發現門口上似乎用了特殊的墨水,用光照射才會顯示文字 「回想當初,這是你的起點。」(鑰匙在廁所) > `if key == true` > [color=#9999FF] > 用找到的鑰匙打開了大門後,你走了進去 光往前一照,突然發現在辦公桌後方有著類似人的形狀,讓你嚇了一跳。 仔細一看...那是兩個用紙做的人形,呈現一種正襟危坐的樣子放在椅子上 原本應該是五官的部分分別寫著「童」、「靜」 「這是誰的惡作劇?」你不免皺眉思考 靠近辦公桌,發現電腦上似乎正開著網頁(一個題目) 此時你的手機一震 「What is your answer?」 #### ++走廊三 Corridor III++ Goto: 走廊二、走廊四、506、505、504、503 ++506++ ++505++ ++504++ ++503++ #### 走廊四 Corridor IV Goto: 走廊三、共享空間、502、501、系館 ++502++ ++501++ ++系館 Library++ #### 共享空間 Learning Common Goto: 走廊四、樓梯、電梯 ### *日記* :::success 9 月 14 日 天氣晴 地點:系辦公室 --- 這是久違的來到學校,看到了熟悉的面孔,是▩▩助教跟▩▩助教呢,真沒想到她們還記得我啊。 但是該怎麼說呢,看到她們這樣的笑臉,莫名地感受到諷刺啊...是我的問題嗎?是我開始變得不正常了嗎?還是說是她們的問題呢? 我依然笑著與她們對談著,可是心裡卻是對這樣的笑容隱隱作嘔,啊...好想破壞掉啊,這樣虛偽的日常,難道就沒有個辦法可以搞壞掉這樣的日常嗎? 可是我就覺得有些害怕...嗯?害怕?我到底在害怕什麼東西? 算了,反正我也就是個普通人,我想一般人不會在意到我的,應該說千萬不要來在意我,不然我想我應該會忍不住吧...呵呵... ::: ### *人物設定* * 姓名:李崇璋 * 性別:男 * 年齡:23歲 * 身份:輔仁大學 圖書資訊學系 肄業生 * 身高:178 cm * 體重:57 kg 具有相當程度的憂鬱症與思覺障礙,經常處於幻覺狀態。 在本篇故事當中因為產生了幻覺而誤認為自己殺了人,並且做了分屍;同時在肢解後憂鬱症發作而自殺,也因此失去意識而進到本篇故事的場景。 整篇故事主要探索主角內心的混亂世界,其中包括: 1. 由於社交能力下降,而導致對於名字的無法辨識 2. 由於對自身的否定,而導致對於自身名字的無法辨識 3. 各個場景有不同的心理暗示來表示各種內心的混亂 4. 每個場景都可能會有數量不一的謎題,顯示其心理上的封閉,並且在解開之後得到的日記顯示其真實的想法 其主角自幼長年受到家暴,而導致內在潛藏的報復心理,因而在成長的過程當中被牽扯入暴力相關事件層出不窮。 有過最嚴重的前科為殺人案件,死者為主角的雙親,但由於當時年僅十六,且證據不足而未被起訴或求刑,事情真相至今仍是謎題。 --- ### 額外小程式 以下程式都會共用此變數︰ ```javascript= var term = $('body').terminal; ``` #### 顯示內容控制 為了控制訊息的顯示方式,特意加入 2 個 function 以便日後格式進行調整。 `display()`是針對一般顯示用句子。 `display_menu()`主要是針對會引用 array 的句子。 ##### display() * 使用方式︰ `display("stance1", "stance2", ....)` * 程式碼︰ ```javascript= function display(){ term.echo("\n" + "==================================================" + "\n"); //------------content--------------------- for (var i = 0; i < arguments.length; i++){ term.echo(" " + arguments[i]); } //--------------------------------------- term.echo("\n" + "==================================================" + "\n"); } ``` ##### display_menu() * 使用方式 `display_menu(Array, "stance1", "stance2",...)` * 程式碼 ```javascript= function display_menu(menu, ...theArgs){ term.echo("\n" + "==================================================" + "\n"); //------------content--------------------- menu.forEach(i => term.echo(i)); for (var i = menu.length; i < arguments.length; i++){ term.echo(arguments[i]); } //--------------------------------------- term.echo("\n" + "=================================================="); } ```