新手也能上手的層級構建 !
:root {
    --lh-red: #c0392b;
    --lh-blue: #2980b9;
    --lh-green: #27ae60;
    --lh-dark-green: #16a085;
    --lh-purple: #8e44ad;
    --lh-orange: #e67e22;
    --lh-yellow: #f1c40f;
 
    --lh-paper-bg: 255, 251, 240;
    --lh-string-color: 192, 57, 43;
    --lh-book-color: var(--gray-monochrome);
    --lh-tape-color: 90,90,90,0.3;
    --lh-white-bg: 249,249,249;
    --lh-dark-bg: 50, 50, 50;
    --lh-highlighter: var(--bright-accent);
    --lh-border-color: var(--gray-monochrome);
    --lh-wiki-note-color: var(--bright-accent)
}
 
/**
 *  旧代码合集
 *  为了向下兼容而保留
 */
 
.grid-container{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.grid-container,.grid-container [class*=grid]{box-sizing:border-box}[class*=grid]{padding:5px}.grid{width:100%}.grid-large{width:75%}.grid-big{width:50%}.grid-medium{width:33.33%}.grid-small{width:25%}@media screen and (min-width:768px){.wd-grid-large{width:75%}.wd-grid,.wd-grid-big{width:50%}.wd-grid-medium{width:33.33%}.wd-grid-small{width:25%}}.text-hover-hide{opacity:0;transition:opacity .3s}.text-hover-hide:hover{opacity:1}.text-block-hide{background:rgb(var(--black-monochrome));color:rgb(var(--black-monochrome));transition:background .3s}.text-block-hide:hover{background:0 0}.text-blur-hide,.text-blur-hover-hide{filter:blur(.3rem);-webkit-filter:blur(.3rem) transition: blur .3s}.text-blur-hover-hide:hover{filter:blur(0);-webkit-filter:blur(0)}.lyric-box{text-align:center;font-size:1.05rem;display:flex;flex-direction:column;flex-wrap:wrap;justify-content:center}.lyric-box p{margin:1.5em auto}.lyric-box.with-bigger-line p{margin:3em auto}
 
/**
 *  便签纸
 *  notepaper
 */
 
.notepaper {
    background: linear-gradient(rgb(var(--lh-paper-bg)) 95%, #ddd 0);
    line-height: 2em;
    background-size: 100% 2em;
    background-attachment: local;
    border: 2em solid rgb(var(--lh-paper-bg));
    box-shadow: 0 0.1rem 0.3rem rgba(0,0,0,0.2);
    padding: 0;
    margin: 1em auto;
    box-sizing: border-box;
    position: relative
}
.notepaper p {
    margin: 0;
    font-size: 1.05rem;
    letter-spacing: 0.1rem;
    line-height: inherit
}
.notepaper.narrow,
.notepaper.wide {
        width: 90%
}
@media screen and (min-width:768px){
    .notepaper.narrow {
        width: 50%
    }
    .notepaper.wide {
        width: 75%
    }
}
 
.notepaper.tight {
    border-width: 1rem;
    border-left-width: 1.2rem;
    border-right-width: 1.2rem;
    line-height: 1.8em;
    background-size: 100% 1.8em;
    font-size: 13px
}
 
.notepaper.with-string::before {
    content: '';
    width: 0.5em;
    height: 6rem;
    background: rgb(var(--lh-string-color));
    top: -2rem; right: -1rem;
    display: block;
    position: absolute;
    box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.2);
    clip-path: polygon(-100% -100%,100% 0%,100% 100%,50% 98%,0% 100%);
}
.notepaper.with-tape::before {
    content: '';
    border: 1px solid #ddd;
    background: rgba(var(--lh-tape-color));
    width: 1.5em;
    height: 4em;
    transform: rotate(45deg);
    display: block;
    position: absolute;
    top: -3em;
    left: -1.8em
}
 
.notepaper.tight.with-string::before {
    top: -1rem; 
    right: -0.25rem;
}
.notepaper.tight.with-tape::before {
    top: -2.5em;
    left: -1.3em
}
 
.notepaper.page {
    min-height: 36em;
    counter-increment: page;
    display: flex;
    flex-direction: column;
    justify-content: space-between
}
@media screen and (min-width:768px){
    .notepaper.page {
        width: 70%
    }
}
.notepaper.page:after {
    content: counter(page);
    display: block;
    text-align: center
}
.notepaper-group {
    counter-reset: page;
}
 
.book-pattern {
    display: flex;
    flex-wrap: wrap;
    flex-direction: row
}
.book-pattern .notepaper.page:not(.notepaper > .notepaper) {
    width: 100%
}
@media screen and (min-width: 768px) {
    .book-pattern .notepaper.page:not(.notepaper > .notepaper) {
        width: 50%
    }
}
 
.book-wrapper {
    background: rgb(var(--lh-book-color));
    padding: 0.5rem;
    box-shadow: 0 0.1rem 0.2rem rgba(0,0,0,0.2);
    border-radius: 5px;
    margin: 1rem auto
}
@media screen and (min-width: 768px) {
    .book-wrapper .notepaper {
        margin: 0
    }
}
 
/**
 *  文字修饰
 */
 
.text-highlighted {
    position: relative
}
.text-highlighted::before {
    content: "";
    position: absolute;
    height: 0.9em;
    bottom: 2px;
    left: -2px;
    width: 105%;
    z-index: -1;
    background-color: rgb(var(--lh-highlighter));
    opacity: .6;
    transform: skew(-15deg);
    transition: opacity .2s ease;
    border-radius: 3px 8px 10px 6px;
    transition: 0.1s ease background-color;
}
 
.text-underlined {
    text-decoration: underline;
    text-underline-offset: 4px;
    text-decoration-thickness: 2px;
    text-decoration-color: rgb(var(--lh-highlighter))
}
.text-wavy {
    text-decoration: underline wavy;
    text-underline-offset: 4px;
    text-decoration-color: rgb(var(--lh-highlighter))
}
 
.text-circled,
.text-squared {
    display: inline-block;
    border: 2px solid rgb(var(--lh-highlighter));
    border-radius: 100%;
    box-sizing: border-box
}
.text-squared { border-radius: 0 }
 
.text-shadow { text-shadow: 0.075em 0.075em 0 rgb(var(--lh-highlighter)) }
 
.text-highlighted.td-red::before { background: var(--lh-red) }
.text-circled.td-red, .text-squared.td-red { border-color: var(--lh-red) }
.text-underlined.td-red, .text-wavy.td-red { text-decoration-color: var(--lh-red) }
 
.text-highlighted.td-blue::before { background: var(--lh-blue) }
.text-circled.td-blue, .text-squared.td-blue { border-color: var(--lh-blue) }
.text-underlined.td-blue, .text-wavy.td-blue { text-decoration-color: var(--lh-blue) }
 
.text-highlighted.td-green::before { background: var(--lh-green) }
.text-circled.td-green, .text-squared.td-green { border-color: var(--lh-green) }
.text-underlined.td-green, .text-wavy.td-green { text-decoration-color: var(--lh-green) }
 
.text-highlighted.td-darkgreen::before { background: var(--lh-dark-green) }
.text-circled.td-darkgreen, .text-squared.td-darkgreen { border-color: var(--lh-dark-green) }
.text-underlined.td-darkgreen, .text-wavy.td-darkgreen { text-decoration-color: var(--lh-dark-green) }
 
.text-highlighted.td-purple::before { background: var(--lh-purple) }
.text-circled.td-purple, .text-squared.td-purple { border-color: var(--lh-purple) }
.text-underlined.td-purple, .text-wavy.td-purple { text-decoration-color: var(--lh-purple) }
 
.text-highlighted.td-yellow::before { background: var(--lh-yellow) }
.text-circled.td-yellow, .text-squared.td-yellow { border-color: var(--lh-yellow) }
.text-underlined.td-yellow, .text-wavy.td-yellow { text-decoration-color: var(--lh-yellow) }
 
.text-highlighted.td-orange::before { background: var(--lh-orange) }
.text-circled.td-orange, .text-squared.td-orange { border-color: var(--lh-orange) }
.text-underlined.td-orange, .text-wavy.td-orange { text-decoration-color: var(--lh-orange) }
 
/* 隐藏文字 */
 
.text-blank { color: rgba(0,0,0,0) }
.text-block { 
    background: rgb(var(--black-monochrome));
    color: rgb(var(--black-monochrome)); 
}
.text-blur { 
    filter: blur(0.3em);
    -webkit-filter: blur(0.3em)
}
 
.text-hoverback,
.text-selectback {
    transition-duration: 0.3s;
    transition-property: background, transform, color
}
 
.text-blank.text-hoverback:hover,
.text-blank.text-selectback::selection,
.text-blank.text-selectback *::selection { color: rgb(var(--black-monochrome)) }
 
.text-block.text-hoverback:hover { background: transparent!important }
.text-block.text-selectback::selection,
.text-block.text-selectback *::selection { color: rgb(var(--white-monochrome, 255, 255, 255)) }
 
.text-blur.text-hoverback:hover { filter: blur(0)!important; -webkit-filter: blur(0)!important }
 
/**
 * 附加项
 */
.with-border, .with-box-style { border: 1px solid rgb(var(--bright-accent)) }
.with-border-dark { border: 1px solid rgb(var(--black-monochrome)) }
.with-border-light { border: 1px solid rgb(var(--white-monochrome)) }
.with-border-thick { border-width: 2px }
 
.with-shadow-sm { box-shadow: 0 0 0.1em rgba(0,0,0,0.2) }
.with-shadow { box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.2) }
.with-shadow-lg { box-shadow: 0 0.15em 0.3em rgba(0,0,0,0.2) }
.with-shadow-xl { box-shadow: 0 0.2em 0.5em rgba(0,0,0,0.2) }
.with-shadow-xxl { box-shadow: 0 0.25em 0.8em rgba(0,0,0,0.2) }
 
.with-padding, .with-box-style { padding: 0.25em 1em }
.with-p-sm { padding: 0.125em 0.5em }
.with-p-lg { padding: 0.5em 2em }
 
.with-margin, .with-box-style { margin: 1em auto }
.with-m-sm { margin: 0.5em auto }
.with-m-lg { margin: 2em auto }
 
.with-narrow-width { 
    width: 90%!important; 
    margin-left: auto; 
    margin-right: auto 
}
@media screen and (min-width: 768px) {
    .with-narrow-width { width: 75%!important }
}
[class*="with-bg-"], [class*="with-bg-"] h1 { color: #fff!important }
.with-bg-red { background: var(--lh-red)!important }
.with-bg-blue { background: var(--lh-blue)!important }
.with-bg-green { background: var(--lh-green)!important }
.with-bg-darkgreen { background: var(--lh-dark-green)!important }
.with-bg-yellow { background: var(--lh-yellow)!important }
.with-bg-orange { background: var(--lh-orange)!important }
.with-bg-purple { background: var(--lh-purple)!important }
 
/**
 * 删除类
 */
 
.offwith-shadow { box-shadow: none!important }
.offwith-border { border: none!important }
.offwith-padding, .offwith-pam { padding: 0!important }
.offwith-margin, .offwith-pam { margin: 0!important }
 
.offwith-width-limit {
    width: auto!important;
    margin-left: auto!important;
    margin-right: auto!important
}
 
div[class*="grider"].offwith-grid-gap { grid-gap: 0!important }
 
/**
 * 网格布局
 */
 
/* Gridder 容器 */
 
div[class*="gridder"] {
    display: grid;
    box-sizing: border-box;
    grid-gap: 1rem;
    padding: 0
}
div[class*="gridder"] * { box-sizing: border-box }
 
.gridder, .gridder-col-2 {
    grid-template-columns: 1fr 1fr;
}
.gridder-col-3 {
    grid-template-columns: repeat(3, 1fr);
}
.gridder-col-4 {
    grid-template-columns: repeat(4, 1fr);
}
 
@media screen and (min-width: 768px) {
    .pc-gridder, .pc-gridder-col-2 {
       grid-template-columns: 1fr 1fr;
   }
   .pc-gridder-col-3 {
       grid-template-columns: repeat(3, 1fr);
   }
   .pc-gridder-col-4 {
       grid-template-columns: repeat(4, 1fr);
   }
}
 
.spanner, .spanner-2 {
    grid-column-start: span 2;
}
.spanner-3 {
    grid-column-start: span 3;
}
 
/**
 * 告示组件
 */
.signblock,
.signblock-dark,
.signblock-warn {
    margin: 1rem auto;
    box-shadow: 0 0.1rem 0.3rem rgba(0,0,0,0.4);
    background: rgb(var(--lh-white-bg));
    font-size: 1.05rem;
    padding: 2rem
}
@media screen and (min-width: 768px) {
    .signblock,
    .signblock-dark,
    .signblock-warn {
        width: 75%
    }
}
.signblock-dark, 
.signblock-dark h1 {
    background: rgb(var(--lh-dark-bg));
    color: #fff
}
.signblock-warn, 
.signblock-warn h1 {
    background: var(--lh-red);
    color: #fff
}
 
.signblock h1,
.signblock-dark h1,
.signblock-warn h1 {
    text-align: center;
    font-size: 2rem;
    margin: 0;
    font-weight: 700
}
.signblock-img {
    display: flex;
    flex-direction: row;
    justify-content: center
}
.signblock-img img {
    width: 8em
}
.signblock-footer {
    font-size: 0.9em;
    text-align: center;
    margin: 0.5rem 0;
    font-weight: bolder;
    display: block
}
 
/**
 * 报告
 */
 
.reportblock,
.reportblock-dark {
    border: 2px solid rgb(var(--lh-border-color));
    box-shadow: 0 0.1rem 0.2rem rgba(0,0,0,0.3);
    background: rgb(var(--white-monochrome));
    padding: 0.8rem 1.5rem;
    padding-bottom: 0.4rem;
    margin: 1.5rem auto;
    margin-bottom: 1rem;
    position: relative
}
 
.reportblock hr,
.reportblock-dark hr {
    background-color: rgb(var(--lh-border-color));
    margin-left: -1.5rem;
    margin-right: -1.5rem
}
 
.reportblock h1:first-child,
.reportblock-dark h1:first-child {
    position: absolute;
    top: -1rem;
    left: 1.5rem;
    font-size: 110%;
    font-weight: 600;
    background: rgb(var(--lh-border-color));
    color: #fff;
    padding: 0.2rem 0.5rem;
    margin: 0;
}
 
.reportblock-dark,
.reportblock-dark h1 {
    border-color: rgb(var(--lh-white-bg));
    background: rgb(var(--lh-dark-bg));
    color: #fff
}
 
.reportblock-dark hr {
    background-color: rgb(var(--lh-white-bg));
}
 
/* 更好的折叠框 */
 
.bettercollap {
  margin: 1em 0;
}
 
.bettercollap .collapsible-block {
  width: auto;
  overflow: hidden;
  border: 1px solid rgb(var(--lh-border-color))
}
 
.bettercollap .collapsible-block-content,
.bettercollap .collapsible-block-link {
  background: rgb(var(--white-monochrome));
  padding: 0.5em
}
 
.bettercollap .collapsible-block-content {
  padding-left: 1em;
  padding-right: 1em
}
 
.bettercollap .collapsible-block-link {
  color: rgb(var(--lh-border-color));
  background: rgb(var(--white-monochrome));
  transition: .3s;
  display: block;
}
.bettercollap .collapsible-block-link:hover,
.bettercollap .collapsible-block-unfolded .collapsible-block-link,
.styledcollap.bettercollap .collapsible-block-link {
  color: rgb(var(--white-monochrome));
  background: rgb(var(--lh-border-color))!important;
  text-decoration: none
}
 
.bettercollap .collapsible-block-link:hover a { color: rgb(var(--white-monochrome)) }
 
.bettercollap .collapsible-block-link::before {
  content: "\25BC";
  display: inline-block;
  margin-right: 0.5em;
  transform: rotate(-90deg) scale(0.9)
}
.bettercollap .collapsible-block-unfolded .collapsible-block-link::before {
   transform: rotate(0) scale(0.9)
}
 
.bettercollap .collapsible-block + .collapsible-block { border-top: none }
 
.styledcollap.bettercollap .collapsible-block {
  border-radius: 2px;
  box-shadow: 0 0.1rem 0.2rem rgba(0,0,0,0.3)
}
 
.styledcollap.bettercollap .collapsible-block-content {
  background-color: rgb(var(--pale-gray-monochrome));
  border-width: 3px
}
 
.styledcollap.bettercollap .collapsible-block-link:hover {
  background: rgba(var(--lh-border-color),0.95)!important;
}
 
/**
 * 提示框
 */
 
.infoblock {
    color: #f1f1f1;
    font-weight: bold;
    background: #424242;
    padding: 5px 5px 5px 5px;
    border-radius: 4px;
    margin: -0.5rem 0 1rem 0;
    display: block;
    width: fit-content;
    padding-right: 25px;
}
 
.infoblock::before {
    content: "ⓘ "
}
 
/**
 * 单页迭代 
 */
 
.offset-page:not(:target), .offset-page:target ~ div#u-default-page { display: none }
.offset-page:target { display: block }
评分: +24+x

前言

在看了M.E.G.大量的層級檔案庫後,是否對於後室每個層級的獨特性感到驚奇呢 ? 你是否曾有一種衝動,也想要自己設計出一個層級來呢? 這聽起來確實過於幻想了一些,但我要告訴你一個好消息: 這是真的可行的 !

經過大量的調查,我們發現後室的層級資訊是儲存在特定層級的服務器中的,而正是服務器內部的代碼建構出了整個層級。也就是說,只要能編寫出這些代碼,那你也可以創造出一個層級 ! 但是層級代碼作為一種特殊的程式語言,一般的電腦是無法支援的。不過還好在我們的努力下,開發出了一個能模擬服務器的系統。只要在你的電腦上安裝,就能開始順利編寫屬於你的層級了 !

下載 Backrooms Server Simulator

首先,你必須在電腦上安裝此系統。點擊以下連結,進入到我們的網站,再點擊下載鍵,就會自動下載檔案。等待檔案下載好後,點兩下檔案就會開始自動安裝。

bkr://backroomslevelmaker.br/serversimulator

注意需要預留一些記憶體與硬碟空間給系統本身,否則無法順利安裝。推薦照著建議容量來分配,如此一來會擁有比較高的效能。

記憶體 硬碟
最低需求 4 GB 64 GB
建議容量 6 GB 128 GB

開始編寫

下載好系統後,理論上需要的東西都已經準備好了,不須再額外下載其他東西。但是看到一片空白的檔案,不知道要從哪裡開始寫嗎? 在這裡,我們會教你構建層級的基礎語法 !

以下會講述基礎代碼與部分物件代碼。而關於完整的物件與其對應代碼,可以從此表中找到。

構建環境

一個層級最重要的就是環境,因此這些代碼總會出現在最前面。在20000行以前,就是環境代碼所使用的位置。通常我們會先決定層級的面積、呈現類型,再決定晝夜及季節循環、溫度,最後再處理場景細節。請參考以下代碼 (只保留片段):

267 ara set 52260 | 33025


358 type 215
359 sra 334 +c | (26101,15832)
360 bld 24 | 7+2 | (26122,15857)


11026 te 15 1 13 1
11027 ssn 0
11028 tmpc 23-16 +-2 | (day+1)

  • 267行使用 "ara set" 決定層級大小,後兩個數字為長度與寬度 (以公尺計)。如果要建立無限大的層級,數字部分輸入一個 "inf" 即可。
  • 358行使用 "type" 決定層級類型。代號215呈現的類型為小鎮。其他常見的層級類型對應代號如下:
停車場 辦公室 泳池 城市 郊區 旅館 電影院
2 4 13 16 21 33 44
  • 359和360行 (以及以下被省略的部分) 代表著環境的細部配置,也用於建立特殊地標。而最後括弧中的數字代表著該地標的座標。
    • 359行指的是 "建立一條環型河流"。(src: 水域, 334: 水域種類代號, +c: "環型" 屬性)
    • 360行指 "建立一座城堡"。(bld: 建築物, 24: 建築物種類代號, 7+2: 樓層數(地上7層、地下2層) )
  • 11026行描述該層級的晝夜循環。四個數字依序為白晝、日落、夜晚、日出持續時間 (以小時計)。若想創造沒有晝夜循環的層級,數字部分輸入一個 "0" 即可。
  • 11027行描述該層級的季節循環。由於此層級無四季循環,因此只用一個 "0" 表示。通常情況下,會有四個數字代表著春、夏、秋、冬的持續天數。
  • 11028行指的是該層級的氣溫。23和16代表最高氣溫與最低氣溫,"+-2" 則是指氣溫變化的係數 (越高代表氣溫變化越劇烈)。後面的 "day+1" 代表著白天的溫度會略高於夜晚。

順帶一提,若是使用上述系統的話,輸入完代碼並儲存後可點擊右上角的 "▶" 鍵,透過電腦來預覽此層級的各場景。

到這裡,層級的基本環境資訊等差不多都處理完了,接著我們開始處裡層級內部要有哪些實體和物品。

配置實體與物品

實體 (包含人類) 與物品的代碼會在同一個區域被編寫到。這些通常會位於第20000~30000行之間。如果該層級具有前哨或基地,則會於第30000~40000行提到。

接著請參考以下代碼:

21535 en 3 | +14 all
21536 en 9 | +13 all


24250 ob 1 (l 1375 l 1394)


30805 bas atl-12 (l 1543)
30806 bas meg-3 (l 1566)

  • 首先,21535和21536行讓特定實體出現在層級中。前面的 "en 3" 及 "en 9" 代表實體編號。"+14" 及 "+13" 則為實體密集度,數字越大代表實體越密集。後面再使用代號來決定實體的出現區域,"all" 代表能出現在層級的任何一個區域。
  • 24250行透過 "ob" 來配置物品。同樣的,後面的數字表示物品編號。後面括號內 "l + 數字" 代表物品會出現的場景位置,其中數字部分對應到前面場景代碼的行數 (例如若想建造杏仁水噴水池中,而環境代碼已在1394行建立一座噴水池,那即可輸入 "l 1394" 來指定位置為該座噴水池)
  • 30805及30806行中,透過 "bas" 代碼來建立基地。注意在團體名稱後面也接著數字,代表著基地的種類代號。後面用與物品同樣的方式設定出現位置。

入口與出口配置

最後的片段通常會用來設定入口與出口。同樣展示部分代碼作為參考:

40164 ent
40165 #0EC1A80907B23495 (l 5527 l 14308) l 771


40203 ext
40204 #00005063ED24A809 (l 3564) l 19708
40205 #0002375BC925A126 (l 5692) l 19903

  • 入口代碼的前面會用 "ent" 做標記。同樣的,出口代碼的前面會有 "ext" 。
  • 在入口方面,"#" 後面的數字代表能到此處的層級 (注意是以16進制表示)。括號內的代碼代表能從該層級的何處到達,後面的代碼則為進入此層級後會到達的位置。
  • 出口方面,同樣先寫出會到達的層級,括號內寫出離開後會到達的位置,後面則是能從此層級的何處離開。

位置以跟上面物品和基地同樣的方法來標示。需要注意的是,括號內的數值與另一個層級的代碼有關,因此在未知該層級的代碼時,是無法進行如上的指定位置的。在這種情況下,括號內可以改成 "all" 來代表該層級的所有位置。

到此為止,層級構建也差不多完成了。但是如果要使該層級真正出現在後室中的話,是需要將此代碼放入中心伺服器中的。由於該處被M.E.G.看守著,因此強烈不建議流浪者親自操作此部分。而為了解決此問題,我們也提供了上傳層級的服務 !

完成建造之後,將完整的程式碼檔案傳至此信箱,我們就會派送專人將檔案上傳至伺服器中 ! 只要大約等待3~7天,就能看到自己的層級出現在後室中 !

後記

此教程大致概括了建造層級的基礎代碼,但如果要設計些特殊效應等性質,那將會涉及到更高級的代碼。在上面有提到完整的物件代碼表,而關於更高階的層級設計,可參考此網站

如果看完了整個教程,在實作上依然感到卡手 ? 別擔心,這是很正常的。熟悉層級代碼需要一定時間的練習,且由於層級代碼量相當龐大,建造一個層級通常需要至少數個月的時間。慢慢在實作中學習,總有一天會進步的 !












頁面歸檔通知

人為上傳層級的行為可能會導致後室伺服器出現不穩定的情況,甚至導致後室崩潰。為了在後室的各位的安全,M.E.G.已歸檔此頁面,並斷開後室萬維網對上述網站的連接。

M.E.G.將會加強對伺服器所在層級的守備。

Meglogo

M.E.G.

除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License