summaryrefslogtreecommitdiff
path: root/ballance
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2020-07-25 16:00:20 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2020-07-25 16:00:20 +0800
commit860cf480016bfe1943df555c468665ffb30b9ba2 (patch)
treea1764fc35c746cc558ddae6cec7caec48d7c776e /ballance
parentf632a481109546d622b127eecc094a50105a937d (diff)
downloadweb-860cf480016bfe1943df555c468665ffb30b9ba2.tar.xz
Shit I shouldn't have been doing.
Diffstat (limited to 'ballance')
-rw-r--r--ballance/index.html0
-rw-r--r--ballance/levels/index.html0
-rw-r--r--ballance/levels/lucid/bonus.html169
-rw-r--r--ballance/levels/lucid/bonus_zh.html169
-rw-r--r--ballance/levels/lucid/index.html155
-rw-r--r--ballance/levels/lucid/index_zh.html170
6 files changed, 663 insertions, 0 deletions
diff --git a/ballance/index.html b/ballance/index.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ballance/index.html
diff --git a/ballance/levels/index.html b/ballance/levels/index.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ballance/levels/index.html
diff --git a/ballance/levels/lucid/bonus.html b/ballance/levels/lucid/bonus.html
new file mode 100644
index 0000000..1c6aac0
--- /dev/null
+++ b/ballance/levels/lucid/bonus.html
@@ -0,0 +1,169 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Ballance | Back and Forth - A Lucid Dream | 彷徨梦</title>
+<link rel="icon" href="/favicon.png">
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<style>
+h1, h2 {font-weight: normal;}
+.reduced {font-size: 75%;}
+</style>
+</head>
+<body onload="loadTheme();" class="TText">
+<script>
+function getcookie(key)
+{return document.cookie.replace(new RegExp('(?:(?:^|.*;\\s*)'+key+'\\s*\\=\\s*([^;]*).*$)|^.*$'),'$1');}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+</script>
+<h1><a href="/">Chrisoft</a>::Ballance</h1>
+<h2>Back and Forth - A Lucid Dream</h2>
+<h2>彷徨梦</h2>
+<h4><a href="bonus_zh.html">中文</a></h4>
+<a href="//filestorage.chrisoft.org/ballance/img/lucid.png"> <img width="630" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_small.png"></a>
+<p>
+If you are reading this, you probably just discovered the easter egg in the level "Back and Forth - A Lucid Dream", or followed a link in some random spoilers. If you discovered the easter egg all by yourself, you're super awesome.
+</p>
+<p>
+Unfortunately there are no actual rewards. So here is your compensation: the author's comments and some hints on this level.
+</p>
+<p>
+Contrary to the claim made in the download page, the level is actually neither very 2010-ish (it makes use of a lot of techniques used by later levels, although it did have its origin in the year 2010) nor that relaxing. Cycling mechanisms has always been the bane of my existence in a lot of games. And I'm determined to bring the pain to you, my fellow Ballance player.
+</p>
+<p>
+The basic idea of this level, which is making a tiny level where everything happens on the same platform but you have to run back and forth, has been in my mind since I got into level making. Back then folks in the custom level community were still experimenting with weird usage of components. I did finally made a level out of that idea, however it was so short that it wasn't worth publishing (three sectors, two of which contains actual content). Also, by the time I finished the level, the custom level community has started rolling out serious creations, such as "mechanism madness II", making my level look super boring in comparison. So I just put the file away.
+</p>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/board_virtools.png"> <img width="700" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/board_virtools.png"></a>
+<br>
+Virtools view of Level_01_board.nmo. The time stamp of the file is 12/05/2010 10:35.
+</div>
+<p>
+Time flies. I stepped away from Ballance. But I still occasionally opened up Virtools when I was bored, and sometimes made discoveries that were regarded as 'groundbreaking' by others (and sometimes, myself, shamelessly). But I never picked up custom level making ever, since I have witnessed the evolution of custom levels and I don't think I have the creativity or skills to reach the 'quality threshold' anymore.
+</p>
+<p>
+However my desire to remake this level was unstoppable when I pulled the file from my supposedly dead hard drive that randomly decided to show signs of life a few weeks ago: if all I have done is remaking a level I made 10 years ago, I have a perfect excuse to fall behind the current quality average. Also maybe I can salvage the idea by adding custom elements into the level. So I quickly started scribbling down ideas on my computer and piecing the parts together together in Virtools. I then started writing the scripts: it was me who made the discovery first, so it would be embarrassing if I don't use it myself. That was followed by a long and dull debugging session. And voilà, the level was done!
+</p>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/lucid_sketch.png"> <img width="480" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_sketch.png"></a>
+<br>
+Sketch of the level. There're obvious errors.
+</div>
+<p>
+The level contains TONS and TONS of scripts, more than any scripted custom levels released ever. I mean, if all the scripts were removed from the level, the file size would shrink by almost 60% percent, that's 73KB of my precious disk space taken up by just Virtools behavior scripts! However, what the huge scripts inside the level achieved is surprisingly little: just the morphing transformer and handling some animated parts (which also reveals that Virtools behavior script is a terrible tool to implement any less than trivial mechanisms). I've also took a look into all the levels with less than trivial scripting currently available, and almost all of them just crammed everything into a single script (which isn't really good for readability, especially when you are writing a script that's already hard to read by its very own nature). Hopefully this level also serves as an example of how to split your script logic properly.
+</p>
+<p>
+I haven't been playing a lot of custom levels since 2013 really, so I don't have a clue where should I put this level on the current difficulty scale. However I think it's a fairly easy level. Collecting all the extra points does take efforts, but it's mostly just timing and RNG. Below is my dissection of the level.
+</p>
+<p>
+Sector 1: nothing much. Carbon copied from the original level. Placing rotated and/or scaled parts all over the place seemed trendy back then.
+</p>
+<p>
+Sector 2: still nothing much. It's slightly modified compared to the original. Forces you to do some maneuvering through sand sacks with a paper ball, which can be avoided altogether but requires timing.
+</p>
+<p>
+Sector 3: a tiny puzzle. Shouldn't take too long to figure out.
+</p>
+<p>
+The flipping tile that's farther from the spawn doesn't tilt towards the suspension bridge. This is intentional, in attempt to make this section a little bit easier for unskilled players like me.
+</p>
+<p class="reduced">
+Solution is easy: clear the first obstacle with the stone ball, then switch to wood and get to the other side using the alternate path. Return via the seesaw, pushing it down in the process. Then switch back to stone and the sector is done.
+</p>
+<p>
+Sector 4: There is something hidden very poorly in this sector. If you are not interested, you can safely ignore the entire sector.
+</p>
+<p class="reduced">
+Hint: the preferred way to get to the extra point is to be caught by the morphing transformer when its material is wood. Then drop onto the seesaw and accelerate towards the box. You will get the points on impact, then you can proceed via the seesaw. If you are unfortunately caught by the morphing transformer when its material is stone, you have a single chance to try again by pushing the box through and change back to paper. If you got caught twice however, doom is upon you.
+</p>
+<p>
+Sector 5: Timing is everything! Get to the elevator before it is started or you have to push through all the boxes with a stone ball! Also try to stay safe on the elevator and avoid anything unexpected from above.
+</p>
+<p>
+Sector 6: Just a cliché usage of the turnstile. Nothing to see here, move along.
+</p>
+<p class="reduced">
+Hint: you have to be in your paper suit <b>before</b> entering the sector in order to collect the points!
+</p>
+<p>
+Sector 7: The road sunk! What's next?
+</p>
+<p class="reduced">
+Hint 1: Turn up your volume.
+</p>
+<p class="reduced">
+Hint 2: This is actually a cliché from some other games. I just don't know which.
+</p>
+<p class="reduced">
+Final hint: ventilators are aligned with the towers.
+</p>
+<p>
+Sector 8: Congratulations! Now enjoy the (not really) cool animation sequence.
+</p>
+<p>
+Other trivia:
+</p>
+<ul>
+<li>I haven't had a perfect playthrough of this level, cause I'm really that bad at the game. I tested the level sector by sector and with the help of special scripts.</li>
+<li>The level took a little shorter than three days to make. I spent two days writing and debugging the scripts.</li>
+<li>There were no extra life items in the level before release candidate 2. After receiving multiple complaints, I finally added two of them.</li>
+<li>I'm actually considering making sequels to this level.</li>
+<li>The name of the level is from my showerthoughts: you run back and forth in this level, but you have no time to wait. Both are reflected in the Chinese word "彷徨" (which means walking back and forth or roaming around). As for why is it a dream... maybe the entire game is a dream?</li>
+<li>Before the level has a formal name, it was referred to as Level_board_rehash or "A Stupid Level" in the scripts.</li>
+<li>If you are here without actually finding the easter egg, maybe you're still wondering where it is. Well, here you are.</li>
+</ul>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/lucid_q.png"> <img width="640" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_virtools.png"></a>
+<br>
+I don't have to tell you the answer, do I?
+</div>
+<p>
+<a href="./index.html">Return</a>
+</p>
+</body>
+</html>
+<!--
+vim: tw=80 syntax=html spell spelllang=en_us
+-->
+
diff --git a/ballance/levels/lucid/bonus_zh.html b/ballance/levels/lucid/bonus_zh.html
new file mode 100644
index 0000000..a43f988
--- /dev/null
+++ b/ballance/levels/lucid/bonus_zh.html
@@ -0,0 +1,169 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Ballance | Back and Forth - A Lucid Dream | 彷徨梦</title>
+<link rel="icon" href="/favicon.png">
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<style>
+h1, h2 {font-weight: normal;}
+.reduced {font-size: 75%;}
+</style>
+</head>
+<body onload="loadTheme();" class="TText">
+<script>
+function getcookie(key)
+{return document.cookie.replace(new RegExp('(?:(?:^|.*;\\s*)'+key+'\\s*\\=\\s*([^;]*).*$)|^.*$'),'$1');}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+</script>
+<h1><a href="/">Chrisoft</a>::Ballance</h1>
+<h2>Back and Forth - A Lucid Dream</h2>
+<h2>彷徨梦</h2>
+<h4><a href="bonus.html">English</a></h4>
+<a href="//filestorage.chrisoft.org/ballance/img/lucid.png"> <img width="630" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_small.png"></a>
+<p>
+正在阅读此文的你,可能是刚刚发现了自制关卡「彷徨梦」中的彩蛋,或者点了什么剧透的链接。如果你全靠自己就发现了彩蛋,你是真的厉害。
+</p>
+<p>
+不过实际上并没有什么奖励。作为补偿,你可以读到作者对本关的看法,还有一些有关的提示。
+</p>
+<p>
+下载页的说法是骗人的。这一关既没有多重的2010气息(图中利用了大量后来产生的机关用法,虽然基本思路确实起源于2010年),也没有那么放松。许多游戏中循环变化的机关一直是我的噩梦,现在我把这噩梦也带到了Ballance中。
+</p>
+<p>
+此关卡的基本设计思路(全部小节均在同一段路面上进行的微型关卡)实际在我刚开始试验制图时就产生了。当时制图还处在刚刚觉醒的时期,大家都在试验各种机关的怪异用法。我最后确实用沿思路制作出了一个关卡,不过它实在太短了(只有3小节,其中一个小节无实质内容)。并且等我终于完成此关时,已经有其他的制图者做出了特别优秀的作品(比如「疯狂机关II」)。与它们比起来我的这个关卡相形见绌,于是我最终把这个关卡封存了。
+</p>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/board_virtools.png"> <img width="700" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/board_virtools.png"></a>
+<br>
+Level_01_board.nmo在Virtools中打开的模样。文件最后修改于2010年12月05日10:35。
+</div>
+<p>
+时间过得飞快,Ballance从我的生活中淡出了。不过我仍然时而打开Virtools消磨无聊的时光,有时还做出了「颠覆性」的发现。但是我再也没有拾起制图这个老活。因为我已经见证了制图水平的发展,我以为靠我的创造力和工具使用水平已经做不出质量过关的地图了。
+</p>
+<p>
+然而当我从我以为已经坏掉的硬盘出抢救出这个关卡的原文件时,我完全按捺不住想要重制这个关卡的想法:毕竟如果我做的只是重制我10年前的作品,设计水平不过关兴许也是可以理解的。于是我立即把思路在电脑上画了草图,然后打开Virtools开始拼接各种零件。等关卡基本成形,我开始了脚本相关的工作:毕竟我最先发现了如何在原版游戏关卡中注入脚本,如果自己都不用就会把自己推入十分尴尬的境地。最后是又臭又长的调试。终于,「彷徨梦」诞生了。
+</p>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/lucid_sketch.png"> <img width="480" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_sketch.png"></a>
+<br>
+设计草图。其中有明显的错误。
+</div>
+<p>
+这个关卡中包含了<b>巨量</b>的脚本,比以往发布的任何包含脚本的地图都要多。如果你将本关卡中的所有脚本删除然后保存,文件尺寸会缩小接近60%。这意味着有足足73KB的数据是脚本占用的!然而,如此多的脚本达成的目的却十分简单:无非是控制三合一变球器和一些动画而已(这也暴露出Virtools脚本在实现有任何复杂性的机关时显得十分笨拙)。我同时发现所有将脚本用于修改游戏逻辑的图中,几乎无一例外地把所有逻辑全部塞进了同一个脚本中。对于Virtools脚本这种可读性本来已经不高的脚本来说,无疑是使阅读脚本变得难上加难。希望本关卡中的脚本可以作为合理的逻辑拆分的一个示范。
+</p>
+<p>
+我从2013年起玩过的自制地图实在不多,所以我也无法估计本图在现在的难度级别上能得到几颗星。不过这张地图的确不难。尽管拿到所有分数点难度稍高,但也基本是时机问题和随机因素。以下是我对本关卡中每个小节的分析。
+</p>
+<p>
+第一小节:没什么东西。几乎是原关卡的原样复制品。随意放置各种旋转缩放的机关似乎是当年非常流行的做法。
+</p>
+<p>
+第二小节:仍然没什么东西。是原关卡的第二小节稍作修改而成的。此小节强制你用纸球通过一批沙袋。你可以完全避开所有障碍,但需要掌控时机。
+</p>
+<p>
+第三小节:一个微型谜题。通过应该不会花费太长时间。
+</p>
+<p>
+远离本节出生点的浮板不会像吊桥一侧旋转,这是有意为之。目的是减轻我这种水平不高的玩家通过此关的痛苦。
+</p>
+<p class="reduced">
+解法相当简单:首先用石球清理障碍,然后换成木球从旁路通过,从跷跷板上返回并把它压下来。换回石球即可通过此关。
+</p>
+<p>
+第四小节:本小节有隐藏的物品,但没有藏住。如果你不感兴趣,你可以无视这整个小节。
+</p>
+<p class="reduced">
+提示:作者拿到本小节分数点是在三合一变球器为木质时被它捕获,掉到跷跷板上,然后撞击34机关下面的箱子。如果你不幸在三合一变球器为石质时被捕获,那么你还有重试一次的机会:推动34机关的箱子返回纸球变球器。如果你连续两次失败,那就没有办法了。
+</p>
+<p>
+第五小节:抓好时机!尽量趁电梯启动前进入,否则你会被迫用石球推掉所有的箱子。另外注意躲避高空落物。
+</p>
+<p>
+第六小节:一个被用烂的了杠杆。没什么好看的,赶紧走吧。
+</p>
+<p class="reduced">
+提示:如果想吃到本小节的分数,你必须在到达本小节前已经变成纸球。
+</p>
+<p>
+第七小节:路没了!怎么办?
+</p>
+<p class="reduced">
+提示一:开大音量。
+</p>
+<p class="reduced">
+提示二:这其实是一些某些其他游戏惯用的手法,只是我不记得是什么游戏了。
+</p>
+<p class="reduced">
+最终提示:风扇跟灯塔是对齐的。
+</p>
+<p>
+第八小节:恭喜通关!现在你可以欣赏(无聊的)通关动画了。
+</p>
+<p>
+其他趣事:
+</p>
+<ul>
+<li>我还没有完美通关过此关——没错我就是这么菜。在测试时我是按小节测试的,并且依靠了特殊脚本的帮助。</li>
+<li>本关卡的制作仅花费了不到3天的时间。其中有两天是在写脚本和调试脚本中度过的。</li>
+<li>此关在RC2版本前是没有生命球的。在多人反映被坑之后,我才加入了两个生命球。</li>
+<li>我在考虑制作本关卡的续集。</li>
+<li>本关卡的名字是洗澡时想出来的:玩家在一段路上两头跑,但没有多少时间等待。这两层意思恰好都反映在「彷徨」一词中。至于为何是梦……大概这整个游戏都是一个梦?</li>
+<li>在正式起名前,我使用"Level_board_rehash"或者"A Stupid Level"(愚蠢关卡)代称此关。</li>
+<li>如果你并没有自己找到彩蛋,但仍然好奇它在哪里的话,往下看吧。</li>
+</ul>
+<div style="text-align:center;">
+<a href="//filestorage.chrisoft.org/ballance/img/lucid_q.png"> <img width="640" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_virtools.png"></a>
+<br>
+已经不能更直白了,对吗?
+</div>
+<p>
+<a href="./index_zh.html">返回</a>
+</p>
+</body>
+</html>
+<!--
+vim: tw=80 syntax=html
+-->
+
diff --git a/ballance/levels/lucid/index.html b/ballance/levels/lucid/index.html
new file mode 100644
index 0000000..970cc14
--- /dev/null
+++ b/ballance/levels/lucid/index.html
@@ -0,0 +1,155 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Ballance | Back and Forth - A Lucid Dream | 彷徨梦</title>
+<link rel="icon" href="/favicon.png">
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<style>
+h1, h2 {font-weight: normal;}
+</style>
+</head>
+<body onload="loadTheme();" class="TText">
+<script>
+function getcookie(key)
+{return document.cookie.replace(new RegExp('(?:(?:^|.*;\\s*)'+key+'\\s*\\=\\s*([^;]*).*$)|^.*$'),'$1');}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+</script>
+<h1><a href="/">Chrisoft</a>::Ballance</h1>
+<h2>Back and Forth - A Lucid Dream</h2>
+<h2>彷徨梦</h2>
+<h4><a href="index_zh.html">中文</a></h4>
+<a href="//filestorage.chrisoft.org/ballance/img/lucid.png"> <img width="630" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_small.png"></a>
+<h3>Overview</h3>
+<p>
+An very 2010-ish map where you can just relax and ... keep annoyed by your own bad timings.
+</p>
+<p>
+This level introduces a brand new type of transformer: the morphing transformer. Its type changes over time, but locks once the player is close by. The level has no fancy brainteasers or parts that require spectacular skills. But it does have tight timings, thanks to the new type of transformer. So there's no time to roam around.
+</p>
+<p>
+The entire map (except the final sector which is so short that it can be completely ignored) happens on a platform that measures less than 100 meters in length. You have to run to and fro and finally escape somehow after the platform sinks.
+</p>
+<p>
+Enjoy!
+</p>
+
+<h3>
+Level info
+</h3>
+<table>
+<tr>
+<td>Number of sectors</td>
+<td>8 (7 with actual content)</td>
+</tr>
+<tr>
+<td>Expected play time for first playthrough</td>
+<td>&lt;=10 minutes</td>
+</tr>
+<tr>
+<td>Time spent producing the level</td>
+<td>
+a little bit shorter than 3 days or almost 10 years (depending on interpretation)</td>
+</tr>
+<tr>
+<td>Number of extra points</td>
+<td>4</td>
+</tr>
+<tr>
+<td>Number of extra life</td>
+<td>2</td>
+</tr>
+<tr>
+<td>Easter egg included</td>
+<td>Yes (who said that an easter egg must be discoverable in game? wait that's a HUGE hint!)</td>
+</tr>
+<tr>
+<td>Software used</td>
+<td>Virtools Dev 3.5, Blender 2.80, Blender 2.79b</td>
+</tr>
+<tr>
+<td>Special thanks</td>
+<td>yyc12345 (exporting NMO from blender files without losing normals), and ballancebug (fixing model of M17)</td>
+</tr>
+<tr>
+<td>Beta testers</td>
+<td>617274873, ballancebug, BallanceLover, yyc12345, 湮尘灬冷曦, yunjuyihao (chronological order)</td>
+</tr>
+<tr>
+<td>Current revision</td>
+<td>release1 (20200723)</td>
+</tr>
+<tr>
+<td>License</td>
+<td><a href="https://opensource.org/licenses/MIT">Expat (The MIT License)</a></td>
+</tr>
+</table>
+<h3>Extra info</h3>
+<ol>
+<li>
+Playing this level with a modified copy of Ballance (other than replacing the level file) shall be criminalized.
+(In case you are wondering, if you play this level with a modified game and encountered any problems, it's probably not my fault.)
+</li>
+<li>
+This level is designed to be played at 60fps. Some scripts may fail if your game deviates too much from this value.
+</li>
+<li>
+This level is somewhat resource intensive (due to excessive use of scripts that are active every frame). If you are experiencing frequent frame drops or shaky camera, please make sure that you don't have any intensive background tasks running (or just find another computer).
+</li>
+<li>
+If you encountered weird bugs (disappearing transformers, overlapping transformers, etc.), restarting the level should help in most cases.
+</li>
+</ol>
+<h3>Download</h3>
+<p>
+Click <a href="//filestorage.chrisoft.org/ballance/levels/Level_lucid.CMO">here</a>. Or <a href="https://ballance.jxpxxzj.cn/wiki/%E6%96%87%E4%BB%B6:Level_lucid.NMO">download</a> from Ballance Wiki.
+</p>
+<p>
+<a href="https://ballance.jxpxxzj.cn/wiki/Q%26A#How_to_install_custom_map">How to install.</a>
+</p>
+</body>
+</html>
+<!--
+vim: tw=80 syntax=html spell spelllang=en_us
+-->
diff --git a/ballance/levels/lucid/index_zh.html b/ballance/levels/lucid/index_zh.html
new file mode 100644
index 0000000..4840cc4
--- /dev/null
+++ b/ballance/levels/lucid/index_zh.html
@@ -0,0 +1,170 @@
+<html>
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width">
+<meta name="theme-color" content="#000000">
+<title>Chrisoft::Ballance | Back and Forth - A Lucid Dream | 彷徨梦</title>
+<link rel="icon" href="/favicon.png">
+<link rel="stylesheet" type="text/css" href="/common.css">
+<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
+<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
+<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
+<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
+<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
+<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
+<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
+<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
+<style>
+h1, h2 {font-weight: normal;}
+</style>
+</head>
+<body onload="loadTheme();" class="TText">
+<script>
+function getcookie(key)
+{return document.cookie.replace(new RegExp('(?:(?:^|.*;\\s*)'+key+'\\s*\\=\\s*([^;]*).*$)|^.*$'),'$1');}
+function loadTheme(){
+ var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
+ if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
+ var ent="";
+ var d=new Date();
+ if(thm[0]=='z')
+ {
+ var m=d.getMonth()+1;
+ if(m>=3&&m<6)thm='0'+thm[1];
+ else if(m>=6&&m<9)thm='1'+thm[1];
+ else if(m>=9&&m<12)thm='2'+thm[1];
+ else thm='3'+thm[1];
+ }
+ if(thm[1]=='z')
+ {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
+ ent=`theme${thm}`;
+ var R=new RegExp('theme[0-4][ab]');
+ for(var i=0;i<document.styleSheets.length;++i)
+ {
+ if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
+ document.styleSheets[i].disabled=true;
+ else document.styleSheets[i].disabled=false;
+ }
+ var thmcolor="";
+ switch(thm[0])
+ {
+ case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
+ case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
+ case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
+ case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
+ }
+ document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
+}
+</script>
+<h1><a href="/">Chrisoft</a>::Ballance</h1>
+<h2>Back and Forth - A Lucid Dream</h2>
+<h2>彷徨梦</h2>
+<h4><a href="index.html">English</a></h4>
+<a href="//filestorage.chrisoft.org/ballance/img/lucid.png"> <img width="630" style="max-width:100%;height:auto;" src="//filestorage.chrisoft.org/ballance/img/lucid_small.png"></a>
+<h3>简介</h3>
+<p>
+一张具有浓厚的2010气息的休闲地图。只是……你也许会被不断误事的自己气到。
+</p>
+<p>
+此地图引入了一种全新的变球器:三合一变球器。它的种类会随时间而变化,不过当玩家球接近时便会锁定。这张地图没有烧脑的成分,也不需要超强的控球技术。但因为这种新的变球器的引入,这张图需要你精确地掌握时机。因此,你也许没有时间彷徨。
+</p>
+<p>
+你在此地图中的绝大多数的时间都会在一条不到100米长的路段上度过。当这条路最后沉入深渊之后,你还需要想办法逃离此地。
+</p>
+<p>
+本图的基本设计(全部小节均在同一段路面上进行)实际来源于2010年12月我的一次制图尝试。前两个小节的内容也是从原地图中几乎原封不动地搬运过来的。
+</p>
+<p>
+祝玩得愉快!
+</p>
+
+<h3>
+地图信息
+</h3>
+<table>
+<tr>
+<td>小节数</td>
+<td>8 (7个有实际内容的小节)</td>
+</tr>
+<tr>
+<td>首通期望时长</td>
+<td>不多于10分钟</td>
+</tr>
+<tr>
+<td>制作时间</td>
+<td>
+略少于3天或几乎10年(取决于理解方式)</td>
+</tr>
+<tr>
+<td>得分点</td>
+<td>4</td>
+</tr>
+<tr>
+<td>生命球</td>
+<td>2</td>
+</tr>
+<tr>
+<td>彩蛋</td>
+<td>有 (谁说彩蛋一定要藏在游戏里面的? 这个提示给的也太直接了!)</td>
+</tr>
+<tr>
+<td>使用软件</td>
+<td>Virtools Dev 3.5, Blender 2.80, Blender 2.79b</td>
+</tr>
+<tr>
+<td>致谢</td>
+<td>yyc12345 (从blender文件导出保留法线数据的NMO文件), ballancebug (修复17号机关的模型)</td>
+</tr>
+<tr>
+<td>测试</td>
+<td>617274873, ballancebug, BallanceLover, yyc12345, 湮尘灬冷曦, yunjuyihao (按测试时间顺序排列)</td>
+</tr>
+<tr>
+<td>当前版本</td>
+<td>release1 (20200723)</td>
+</tr>
+<tr>
+<td>授权</td>
+<td><a href="https://opensource.org/licenses/MIT">Expat (The MIT License)</a></td>
+</tr>
+</table>
+<h3>注意点</h3>
+<ol>
+<li>
+ 用非原版游戏(除替换关卡文件外)游玩此关卡应入刑。
+(如果你坚持使用非原版游戏,请不要向作者报告游戏中遇到的问题。)
+</li>
+<li>
+本关卡中的脚本均为运行在 60fps 的情况设计。如果你的游戏帧率与此值差异过大,可能会导致某些脚本出错。
+</li>
+<li>
+由于添加了大量每帧均需处理的逻辑,本关卡对性能要求稍高。如果你的游戏明显掉帧,或者游戏中摄像机经常抖动,可以尝试关闭不需要的后台进程(或者直接换台电脑)。
+</li>
+<li>
+如果你遇到了罕见bug(例如变球器消失,变球器重叠等等),大多数情况下重新开始本关可以解决问题。
+</li>
+</ol>
+<p>
+如果你在 Virtools 中打开此关卡后,在脚本视图中看到了乱码,并且使用的系统是 Windows 10 1803 以上的版本,可以尝试以下调整:
+</p>
+<pre>
+控制面板 -> 区域 -> 管理选项卡 -> 非 Unicode 程序的语言 / 更改系统区域设置:
+当前系统区域设置: 中文(简体,中国)
+启用"使用 Unicode UTF-8 提供全球语言支持"
+(如此调整可能会导致其他程序出现问题。如果发现了问题,关闭"使用 Unicode UTF-8 提供全球语言支持"即可。)
+</pre>
+<p>
+如果你使用的是其他操作系统,我暂时没有可行的解决方法。
+</p>
+<h3>下载</h3>
+<p>
+按<a href="//filestorage.chrisoft.org/ballance/levels/Level_lucid.CMO">此链接</a>从本站下载。或按<a href="https://ballance.jxpxxzj.cn/wiki/%E6%96%87%E4%BB%B6:Level_lucid.NMO">此链接</a>从Ballance Wiki下载。
+</p>
+<p>
+<a href="https://ballance.jxpxxzj.cn/wiki/Q%26A/zh#.E6.80.8E.E4.B9.88.E5.AE.89.E8.A3.85.E8.87.AA.E5.88.B6.E5.9C.B0.E5.9B.BE.EF.BC.9F">如何安装关卡</a>
+</p>
+</body>
+</html>
+<!--
+vim: tw=80 syntax=html
+-->