2012年6月25日星期一

rb-readline

不知道从哪个版本起,RubyInstaller的irb就开始有一个Bug,表现为输入或粘贴某些中文字符进去的时候,irb会无提示退出。因为不常遇到,所以一直都懒得查。前两天精神来了就追了一下,发现问题出在rb-readline。

rbreadline.rb文件readline_internal_charloop函数,大概4635行:

rl_setstate(RL_STATE_READCMD)
c = rl_read_key()
rl_unsetstate(RL_STATE_READCMD)
# look at input.c:rl_getc() for the circumstances under which this will
#be returned; punt immediately on read error without converting it to
#a newline.
if (c == READERR)
  eof_found = true
  break
end

READERR的值是0xFE.chr,而GBK和BIG5的编码范围都包括了0xFE,于是这又是一个编码问题。Bug已经提交,我是觉得直接把整个if都删掉就好了,看作者打算怎么改吧。

2012年6月23日星期六

Homemade RaySource

好吧,我们都知道fs2you链接长什么样,自然也看得出来,fs2you://后面的部分,其实是经过Base64编码的字符串。

比如:

fs2you://Y2FjaGVmaWxlMzIucmF5ZmlsZS5jb20vemgtY24vZG93bmxvYWQvYjI3ODI1NzQ2YjgxOWYyMmY1ZGY0ZTFkNTE0NDFjNmQvJUU3JTk0JUIwJUU0JUI4JUFEJUU4JThBJUIzJUU2JUEwJTkxLnJhcnwxMjkyMTEzOQ==

经过解码,可以得到:

cachefile32.rayfile.com/zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar|12921139

竖线符分隔的第一个部分看起来是一个URL,第二个部分则是文件尺寸。有时候竖线符有两个,第三部分是另外一个文件名。通过抓取客户端RaySource的数据包,可以验证以上猜测。

GET /zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar HTTP/1.0
Host: cachefile32.rayfile.com
Accept: */*
Referer: 
Cookie: 
User-Agent: Grid Service 2.1.10.8366
Grid: aWQ9nc3JxpnLys4mcF9udW09MCZkX3NwZWVkPTA=
Range: bytes=0-262144

Grid又是一个Base64字符串,解码后的内容是:

"id=\x9D\xCD\xC9\xC6\x99\xCB\xCA\xCE&p_num=0&d_speed=0"

id均为8个字节,当成GBK字符解码,可以得到四个看起来像天书的中文。p_num可能是process,同时下载多个文件时会有不同的值。s_speed有可能是当前的下载速率,可我想不出为什么服务器会对这个数值感兴趣。

经验证,构造一个类似的HTTP请求,可以用别的下载工具获取文件,比如:

curl --verbose --remote-name --user-agent "Grid Service 2.1.10.8366" --header "Accept: */*" --header "Referer: " --header "Cookie: " --header "Grid: aWQ9nc3JxpnLys4mcF9udW09MCZkX3NwZWVkPTA=" --header "Range: bytes=0-12921138" "http://cachefile32.rayfile.com/zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar"

正常情况下,可以得到一个206响应。只要一切正常,即可直接下载到目标文件。不过就像大家都知道的那样,网络是很不靠谱的。当下载时遭遇断线,构造正常的Range头,如“Range: bytes=1234-12921138”并不能断点续传。

关于这个问题,抓包并没有太大的帮助。RaySource发出的请求中,Range的两个数字除了0和文件的实际尺寸外,均为256KB的正整数倍,且整个Range不超过5MB。嗯,这也太奇怪了点儿。

通过各种尝试,我发现有时候Range的起始值可以是不大于文件尺寸的任意数,且只要Range不大于8000000,也可以获得服务器正确的响应。不过这个有时候,具体是什么情况,我也说不清楚…

嗯,基本上目前就是这样,问题依旧没有解决的说。

2012年6月21日星期四

Razer DeathAdder

手上的Razer Diamonback跟了我很多年,除了微动有些粘黏之外,运行状况倒是良好。只不过毕竟用了这么久,背上RAZER几个字母,都快被磨光了。因为这只鼠标是收到的一份礼物,不想完全用坏,于是就买了个新的,Razer DeathAdder。

要说我有多喜欢Razer,其实还好。我眼中Razer的缺点,在这一枚DeathAdder几乎都有体现。背面所谓的类肤材质虽然防滑,不过用久了跑不掉被磨光的命运。相对于背部,左右两侧的镜面材质又有些太滑,手感差异也太大了些。再加上手掌根部缺少支撑,还有发热,DeathAdder的握持感并没有很好。

找个不错的鼠标垫应该能解决一部分发热问题,至于别的,也只好将就了。毕竟我买的只是所谓的升级版,比起换了材质的经典版便宜差不多100块。

微动糟糕的罗技不想再碰,或许下次应该搞个微软来试试。

2012年6月4日星期一

Super Metroid

一周目4小时33分,收集率99%,应该是漏了Ridley那里的Energy Tank。以下是二周目的流程,模拟器Snes9X,PS2手柄。

整个游戏流程我抓了一百多张图,不过Blogger上传图片实在不太好用,干脆丢压缩包吧,解压密码otnth:https://www.boxcn.net/s/1fa631b7c451b5593ca7

以下100%流程没有太过逆天的Sequence Breaking,应该属于中高级难度吧。熟练一点的话,3个小时怎么都够了。

基本内容

SFC手柄除方向键外,还有八个键,本作全部用到。Select切换武器,Start进入菜单,L斜下方瞄准,R斜上方瞄准,A键跳跃,B键加速,X键射击,Y键取消。

虽说本作比GBA上的两作在武器方面更为丰富,某些地方或许是不得已,不过我还是觉得这样的键位设计很怪。例如在加速跑时经常需要射击,于是右手就需要去按手柄右侧上方和下方两个键,并没有很舒服。

本作有专门的加速键,不过跟GBA的两作相比,加速冲刺对攻关的必要性却没那么强。不但无法接力加速,而且冲刺时还会消耗HP。本作中最重要的两项技巧,是Wall Jump和Mockball。

Wall Jump的方法是,面向右边墙壁,按右键和跳跃键起跳,在贴近墙壁滚动下落时,快速按下右键再接跳跃键,即可弹墙往左上方跳。关键在于第二次起跳的方向键和跳跃键不能同时按,但时间间隔也不能太长。Wall Jump可以连续发动,掌握该技能后在拿到HI-Jump Boots和Space Jump之前,就能去到很多一般跳跃去不了的地方。

Mockball相对Wall Jump来说重要性不高,需要用到的地方不多。其方法是加速跑的过程中起跳,在空中按下下键,在着陆的一瞬间再次按下下键变身为球,接着快速切换为前进键,其间加速键和跳跃键一旦按下就都没有放开。Mockball失败最主要的原因是在半空中就完成了变形为球的动作,这种情况下球形Samus着陆后会弹动两下。正确发动的Mockball在着陆后不会损失速度,能以球形状态通过本需要加速跑才能通过的地形。

获得Charge Beam、Power Bomb和其他任意一种枪械后,可以消耗Power Bomb发动特殊攻击。方法是Start键中启用Charge Beam及其他任意一种枪械,Select选中Power Bomb,按住射击键蓄力。由于总是需要切换来切换去的,我个人是觉得用处不大。

获得Charge Beam之后,按住射击键蓄力,完成后跳跃,可以用来撞一般的小兵。有点像Screw Attack,西方居然有人管这一招叫one night stand…

流程

空间站

本区域没有岔路,快速通过即可,走到最后就会看见小Metroid和宿敌Ridley。这场战斗输赢没所谓,所以为了节省时间直接去碰Ridley吧,HP掉到一定程度Ridley就会抓起小Metroid闪人。此时空间站自爆程序启动,限时脱出。

Morphing Ball、Missile、Bomb

Samus追着Ridley来到行星Zebes,游戏流程正式开始。

从飞船处先向左再一路向下,来到Brinstar,拿到Morphine Ball。在右边一个房间内,向下打穿地板,拿到第一个Missile。再右边一个门内现在还可以拿到一个Missile,不过该房间内的其他物品现在拿不到,不想浪费时间可以以后再回来收。

沿路返回Crateria,变身为球拿到Bomb,遭遇第一个小Boss,一个鸟人像Chozo,十来发Missile即可搞定。

接着向地图左边进发,途中拿到第一个Energy Tank后,进入Brinstar。

Super Missile、Charge Beam

下了电梯,右边第一个红色的门内有三个Missile,一个Super Missile和一个Reserve Tank。不过现在就想全部拿到,需要你会Mockball和Wall Jump,否则目前只能拿到一个Missile,其他的需要获得Speed Booster之后才可入手。

这里是整个游戏中练习Mockball技巧最好的地方,有兴趣的人可以试一试。大概的方法是,五发Missile打开红色的门,站在平台边缘按住加速键和右键起跑,在离进门大约一步的地方按住跳跃键起跳过门,发动Mockball着陆至上方平台即可通过。

提前拿到Super Missile并不会大幅度改变游戏流程,算是小小的成就感吧。接着向下穿过通道,来到地图中部最上方打Boss。Boss战很简单,等它张嘴的时候抓住机会用导弹轰就是了。搞定之后爬上通道,从尽头处掉下来拿到Super Missile。

接着去拿Missile和Charge Beam,并向地图右下方前进。途中有一个Missile,Wall Jump上去可以拿到一个Missile。

继续前进来到Brinstar地图右边最后一条上下联通的主通道。如果对自己的Wall Jump技术相当自信,可以尝试一下从这里上去提前拿到Power Bomb。不过这条路比较难,虽然飞天乌龟可以用Super Missile干掉,但仍然需要动作很快才行。而且在这里提前拿到Power Bomb,对游戏流程也没有什么实质性的影响。实在做不到的话,等以后获得Ice Beam或Speed Booster之后再来拿吧。

Spazer、Varia Suit、HI-Jump Boots

会Wall Jump的话,从图示处往上就可以拿到Spazer。同样,从图示处起跳借助Wall Jump也可以现在去打Boss和拿Varia Suit。

Boss叫Kraid,在它张嘴的时候攻击嘴巴,大概四发Super Missile就可以搞定。拿到Varia Suit和一个Energy Tank后原路返回,坐电梯来到Norfair。

一路向下到底,左边红门进去,拿到Energy Tank和Missile各一个以及HI-Jump Boots。如果之前没有拿Spazer和Varia Suit的话则回去拿,否则继续前进。

Wave Beam、Speed Booster、Power Bomb、Grappling Beam、Ice Beam

电梯下面右边第一个蓝门进去,路上有一个Missile。来到一个大房间内,右边尽头处往下,也有一个Missile。

此处依靠Wall Jump可以跳到右上角去拿Speed Booster,不过非常难就是了,我跳了不下百次,也就上去了几次而已。实在做不到的话,可以从这个房间左边地上的门下去,绕一个圈子。路上有一个红色的门,进去跳过几个悬浮平台,可以拿到Missile。在这个平台上加速跑往前跳,借着被地刺扎到的无敌时间,可以用Wall Jump跳上前方平台,进门可以拿到Wave Beam。出来以后跳进地刺,穿过单向地板,从左边出去,往上走同样可以拿到Speed Booster。进门之前记得先把Missile拿掉,不然拿到Speed Booster后岩浆涨潮,会有点儿手忙脚乱。

接下来去地图中部,打Boss Crocomire。Crocomire是打不死的小强,只能在它张嘴的时候用导弹攻击,受到攻击后Crocomire会退后,退到一定程度就会掉进岩浆被烧死。

从图示处起跳,在空中按住加速键并落至悬浮平台边缘,助跑一步后向左边跳,即可跳上左上方平台,拿到第一个Power Bomb。

继续往地图左下方走,沿路有一个Missile。到达底部时,利用加速冲刺向左上方和上方跳,可获得Grappling Beam和Missile。之后就要返回,正常流程是从Grappling Beam那个房间往上走,不过要是会Wall Jump也可以原路返回,个人觉得还会快一点。

从Crocomire所在的房间一直往上,进左边的房间,拿到一个Missile。用Super Missile轰击开关开门,之后来到地图左上角,拿到Ice Beam之后。用Power Bomb炸开地板,在下面的房间清空跑道,撞上左边的墙壁后按发射键,可拿到一个Missile。之后原路返回,搭电梯回到Brinstar。

X-Ray Scope、Gravity Suit

沿路往左再往上,进入遇到的第一个黄门。在图示处放置Bomb,前进后拿到X-Ray Scope。鸟人像背后紧邻天花板的位置,Bomb炸出缺口,向下再向右滚动到动不了的地方再次放置Bomb,即可离开房间。

回到纵向通道,往上走到头,进入右边的门再走到头。往下可以拿到一个Power Bomb和一个Missile。往上在电梯下面左边第一个门里,则有一个Power Bomb。

搭电梯返回Crateria,向上再一直向右走,途中有一个Missile。进入Wrecked Ship后往地图右下方走,去打Boss Phantoon。

Phantoon只有在现出实体时攻击它才有效,攻击它放出的鬼火可以获得补给,基本上仍然是很容易打发的一战。

搞定之后,Wrecked Ship的地图就完全开放了。纵向主通道往上,沿路收了两个Super Missile,一个Missile和一个Energy Tank后来到地图最顶层,右边还有一个Missile。

全部拿到之后从左边的门出去,回到Crateria。借助天上飞的那玩意儿,可以拿到房间左上方的Missile。落地之后用Super Missile打开地板也有一个Missile。只是拿到之后要原路返回,不然会掉到房间下面一层去。前进几步,炸开地板的另外一个出口,往右再次回到Wrecked Ship。

一路前行,在鸟人像爪子上变身球形,鸟人像会启动并行进到下面一层的房间。停下来之后落地,用Bomb炸开地板,右边还有一个Missile。接着用Power Bomb炸掉鸟人像和其后的墙壁,加速冲刺到底往上跳,拿到Reserve Tank。

接着往左走,拿到Gravity Suit后出门,回到Crateria。该房间左下角还有一个Missile,图示处进入即可获得。

绕路清版

接下来要去Maridia,搭乘Crateria中部的电梯就可以,不过有志于100%收集的话可以从Crateria最左边往Brinstar绕一圈清理一下。

首先是飞船所在的房间,加速闪光之后站在飞船顶部按住L键向右上方冲刺,掉下来后进黄门,可以拿到一个Power Bomb。再次加速往左边冲刺,方向合适可以直接冲破墙壁,如果差了一点也可以用Power Bomb。

进入该通道,沿路有一个Energy Tank和两个Missile。拿这两个Missile时要站在两块单向地板的中间,不然需要多跑一趟。

然后搭电梯来到Brinstar,一路向下用Power Bomb到达最底部,往左走有Energy Tank和Super Missile各一个。

向下再向左,会遇到三只Etecoon。按照游戏的设定,Wall Jump这个逆天技能就是它们教给Samus的。用Wall Jump到达顶部,右边墙壁上的缺口进去,有一个Power Bomb。这里需要跳到空中快速按两下下键变成球,再按右键,进不去就只有等拿到Spring Ball技能之后再回来了。

接着前进至一个上下联通的大房间,Wall Jump可以拿到一个Missile。拿到后Power Bomb开路,进去有一个Energy Tank。然后是右边的黄门,里面有一个Power Bomb。用Power Bomb炸开Charge Beam所在房间的通道,进去还有一个Energy Tank。

Space Jump、Spring Ball

向右下方前进,用Power Bomb炸开透明通道进入Maridia。

往上走,在一个上下联通的大房间里有一个Missile,需要从下方冲刺上来才能拿到。

接着进入右下角的门,Wall Jump爬到房间中上部再往右下走,穿过一个隐藏的通道,打开红门进入一个大房间。站在右边打小乌龟,大乌龟会冲过来扁你,站在大乌龟背上,待其冲高时射击右边墙壁可以看到一个Missile。之后切换到电索枪,Wall Jump往房间中间跳,可拿到一个Energy Tank。

回到左边的房间,再往上一个房间,左边墙壁上有一个隐藏的缺口,找不到的话注意看看螃蟹的行进路线。变身为球进去可以拿到一个Super Missile。

回到房间从右上方的门出去,往上走过一个门往右,有一个Missile。再往地图左上方前进,有Missile和Super Missile各一个。

原路返回,炸开地板打开一个绿门,Power Bomb开路,Wall Jump往上去打小Boss。一如既往,打它的头就是了。

向右上方前进,沿途拿到一个Missile后,往下走去打Boss Doreigon。打Doreigon有个技巧,先把两面墙上的发射台打掉,再换成电索枪,当Doreigon抓住你向上飞的时候,向发射台开枪,Doreigon会被电死。

拿到Space Jump后,回到地图右上方最底层,向左走拿到一个Energy Tank。之后跳入流沙,来到地图中部。从左边的门出去,到达房间底层,打破地板,进入右边的流沙,拿到Missile和Power Bomb各一个。

进入流沙来到下方,往右走,利用电索枪去掉挡板往上走,Power Bomb开路帮助清道夫,继续前进获得Spring Ball。

Plasma Beam、Screw Attack

往左,Bomb炸开天花板,进入一个绿门来到地图上方。往右上角走,获得Plasma Beam。

往右下方,回到拿到Space Jump之后拿Energy Tank的地方,再次穿过流沙,回到小Boss所在的房间的下面一层。拿到Missile和Super Missile各一个后,再次打开地板,往左边的流沙下去,获得Missile和Reserve Tank各一个。至此,Maridia的物品也收集齐全了。

往左下角走,如果之前拿Varia Suit时没拿到Missile,现在去。然后坐电梯,前往Norfair。

从拿Ice Beam的那条路向下再向右直线前进到底,打开左边的黄门直线前进,搭电梯来到地图下部,往左到底,用Power Bomb炸开鸟人像,变身为球坐到爪子上去使岩浆退潮。从下方走,得到一个Missile后,打小Boss,加强版的鸟人像Chozo。

这个鸟人像只能用蓄力枪来打,不过也不算难。搞定之后,头顶上还有一个Super Missile,然后进入鸟人像背后的房间,拿到Screw Attack。

沿右上方走,爬到一个通道顶层时打破天花板往右,可找到一个Missile。之后穿过一个岩浆涨潮的大房间,炸开地板,往地图右下方走,路上拿到一个Power Bomb后,会遇到本作最强的宇宙海盗。普通状态下这两货可以免疫攻击,只有等它们跳起来后变成黄色才攻击有效。

搞定之后继续前进,不远处再次遭遇Ridley。基本上,这是本作中唯一稍微难一点的Boss,不过也就是稍微难一点而已。搞定之后进Ridley背后的房间,拿到一个Energy Tank。

最终Boss

从Norfair右方绕回去,路上可以找到一个Energy Tank,一个Power Bomb,四个Missile和一个Reserve Tank。

坐电梯回到Brinstar,从拿Charge Beam再右边一点的房间里的黄门往右,拿到一个Power Bomb,再用Power Bomb开路,可以回到拿Morphing Ball的房间。往右走到底,可以拿到一个Energy Tank。Power Bomb开路,网上走可以拿到两个Missile。

坐电梯回到Crateria,沿路拿到两个Missile和一个Super Missile,全部物品收集齐全。

最终Boss在Tourian,沿途没有岔路。这里的Metroid需要先冻住,然后用五发Missile,跟系列中其他的作品一样。即使是最终Boss仍然一点难度都没有,斜上方45°不停射击就是了。

搞定之后再次限时脱出。拿第一个Missile的地方去一趟可以救出教你加速冲刺和Wall Jump的四只动物。去过的话,Zebes爆炸之后,可以看到一个形似流星的物体往画面右方脱出,应该就是那几个家伙吧。