#!/usr/bin/env ruby # coding: utf-8 # @th[0][X] シーンXにおいて移動しない登場物 # @th[1][X] シーンXにおいて移動する登場物 # @h[0] 持ち物 # @h[1] 体の大きさ(0…小さい,1…大きい) # @co 各シーン・ブロックに受け渡す動詞,名詞の通し番号(動詞 # ナンバー×100+名詞ナンバー) # @vrS[X] 動詞単語群 # @naS[0 か 1][X] 名詞単語群(0…移動しないもの,1…移動するもの) # @fmS[X] メッセージ文章群 # @maS[X] シーンナンバーXにおいて,そこにあるものと同じ名前の # ものがすでに使われているとき,それを無視するようにす # るための変数。無視する変数は2桁ずつ順に入っている。 class Alice def __debug(level, *str) # level > 0 and puts(*str) end def val(str) str.to_i end def len(str) str.size end def leftS(str, len) str[0, len] end def midS(str, pos, len) str[pos - 1, len] end def chrS(chr) chr == 4 and return("\x08") # カーソルを左に戻す chr == 6 and return("\ec") # 画面をクリア chr == 29 and return("\x08\x08") # カーソルを左に戻す return(chr.chr) end def asc(str) str.ord end def usr(adr) adr == '$0F14' and print("\x07") # ビープ音を鳴らす end def color(c = nil) print(c ? ["\033[30m", "\033[34m", "\033[31m", "\033[35m", "\033[32m", "\033[36m", "\033[33m", "\033[37m"][c] : "\033[39m") end def restore @__dp = 0; @__data = nil end def read(data0) @__data or (@__data = []; data0.chomp.gsub(/\n?\s*data\s+/, ',').split(',').each {|d| @__data << d }) return(@__data[@__dp += 1]) end # 999 REM'** DEMO def gosub_10550d(__data0, f120 = 0.120, sound = nil, n_color = nil) __data = []; __data0.scan(/"([^"]+)"/) {|__d| __data << __d[0] } @bS = '■' + chrS(4) # @bS = "\033[33m♥\033[39m" + chrS(4) loop { @aS = __data.shift; @aS == '*' and break (1..len(@aS)).each {|i| sound and usr('$0F14') midS(@aS, i, 1) == '/' and (puts(' '); sleep(f120 * 8); break) n_color and color((n_color += 1) % 7 + 1) print(s = midS(@aS, i, 1)) s.ord & 0xFFF8 == 0x2660 and print ' ' print(@bS) sleep(f120) } } n_color and color end def gosub_999 gosub_10550d(<<-999, 0.012, nil, -1) data "♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦/" data "♣♠♥♦♣♠♥♦♥  不思議 の 国 の アリス  ♦♣♠♥♦♣♠♥♦♣♠♥/" data "♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦♣♠♥♦/","/","/","/","*" 999 gosub_10550d(<<-999, 0, nil) data "=======================================/","*" 999 gosub_10550d(<<-999, 0.120, true) data " Author -----------Lewes Carroll/" data " Iidashippe ---------H.Hasimoto/" data " Programmer ---------Akimasa Tako/" data " Debbuger -----------Hirofumi Kume/" data " Produced by --------arrosoft/" data " Distribeted by -----Micro Cabin/" data " Translated by ------Furutanian/","*" 999 gosub_10550d(<<-999, 0, true) data "=======================================/","*" 999 gosub_10550d(<<-999, 0.120, true) data "/","/","/","今日はとてもいいお天気です。/" data "アリスはおねえさまと一緒に大きな木の下に座っていました。/" data "おねえさまは難しい本を読んでいます。/" data "アリスは雲を見たり風の音を聴いたりしていろいろなことを考えていました。/" data "時々おねえさまの読んでいる本をのぞいてみました。/" data "が、ちっとも面白くありません。/" data "その時、向こうの丘の上を一匹のウサギが走っていくのが見えました。/" data "最初、アリスはそれを見て何とも思わなかったのですが、そのウサギ" data "がチョッキのポケットから時計を取り出してみて「大変だ、遅れ" data "てしまう!」と叫んだので、アリスはちょっと変だと思いました。/" data "何しろ、今までにアリスはチョッキのポケットから時計を出すウサギ" data "を見たことがなかったのですから。/" data "アリスは、そのウサギとお話がしたくなって、後を追って走り出しました。/" data "ウサギは丘を越えてどんどん走ってゆき、ふいに見えなくなてしまいました。/" data "アリスがウサギの消えたあたりへ走ってゆくと、そこには大きな穴が空いていました。/" data "ウサギはこの穴に飛び込んだに違いないと思って、アリスは穴に飛び込みました。/" data "穴はとても深くて、途中にはジャムの瓶や、ランプや、戸棚などが見えました。/" data "あんまり長い間、落ち続けているので、アリスはとても眠くなってきました。/" data "うとうととしているとドサッと地面に落ちました。/" data "そこにはワラが敷いてあったのでケガは全然していませんでした。/" data "あたりを見回すと、さっきのウサギが角を曲がってゆくのが" data "見えたので、アリスはまた後を追って走り出しました。/" data "角を曲がると、そこはとても広いホールでした....。/" data "                    /","*" 999 gosub_10550d(<<-999, 0, true) data "PUSH [F1] KEY!/" data "Ready/","*" 999 $stdin.gets.chomp gosub_10550d(<<-999, 0) data "RUN","ALICE/","*" 999 end # 1000 REM'** START def goto_1000 @co = 0; @a = 0 gosub_8620 gosub_1970 goto_1220 end # 1050 REM'** 10進-2進 def gosub_1060 @a = @h[0] gosub_1070; return end def gosub_1070 @aS = '' (0..26).each {|__b| b = 26 - __b @a >= @ta[b] and (@a = @a - @ta[b]; @aS = @aS + '1'; next) @aS = @aS + '0' } return end # 1130 REM'** LETTER def gosub_1140 @bS = @aS @aS = '' (1..len(@bS)).each {|i| @a = asc(midS(@bS, i, 1)) 96 < @a && @a < 123 and @a = @a - 32 @aS = @aS + chrS(@a) } return end # 1220 REM'*** MAIN def goto_1220 loop { __debug(1, 'scene = %d' % @no) puts puts('[ ENTER COMMAND ]') # gosub_10300 print('> '); @aS = $stdin.gets.chomp puts @aS == '' and next gosub_1140 # 1290 REM'** 動詞,名詞 @a = 1 unless(@luS == 'J') # 1320 loop { midS(@aS, @a, 1) == ' ' and (@a = @a - 1; @i2S = midS(@aS, @a + 2, len(@aS) - @a - 1); break) @a != len(@aS) and (@a = @a + 1; next) @i2S = '' and break } @i1S = leftS(@aS, @a) else # 1380 end __debug(1, '%s / %s' % [@i1S, @i2S]) # 1480 @c1 = 1 loop { __debug(0, ' vr:%2d: %s' % [@c1, @vrS[@c1]]) @i1S == @vrS[@c1] and break @c1 = @c1 + 1 @c1 < 27 and next break } @c1 == 27 and (puts('それはできません。'); next) __debug(1, 'vr:%2d: %s' % [@c1, @vrS[@c1]]) # 1530 (0..3).each {|i| @ch[i] = val(midS(@maS[@no], 2 * i + 1, 2)) @ch[i] == 0 and @ch[i] == 99 } # 1570 __goto1810 = false begin @a = 0 @fl = 0 @bt = 0 # 1600 loop { __debug(0, ' na:%d:%2d: %s' % [@fl, @bt, @naS[0][@bt]]) if(@bt == @ch[@a]) @a = @a + 1 else @i2S == @naS[0][@bt] and raise('1720') # 有効な名詞(移動しないもの) end @bt = @bt + 1 @bt < 27 and next break } @fl = 1 @bt = 0 # 1660 loop { __debug(0, ' na:%d:%2d: %s' % [@fl, @bt, @naS[1][@bt]]) @i2S == @naS[1][@bt] and raise('1720') # 有効な名詞(移動するもの) @bt = @bt + 1 @bt < 15 and next break } @i2S != '' and (puts(@i2S + ' ??'); next) # 知らない名詞 @co = @c1 # 1720 rescue __debug(1, 'na:%d:%2d: %s' % [@fl, @bt, @naS[@fl][@bt]]) @co = @c1 * 100 + @bt + @fl * 27 # 動詞No. x 100 + 名詞No. + フラグ * 27 __debug(1, 'common co = %d' % @co) @fl == 1 && @bt > 8 and (@fl = 3; __goto1810 = true) # 移動するもの end # 1740 unless(__goto1810) @c1 > 5 and __goto1810 = true # 動詞No. > 5 end unless(__goto1810) # 1750 @h[15] == 0 && @c1 == 1 and (puts('何にも見えない。'); next) # 1790 case(@c1) when 1; gosub_1970 # look when 2; gosub_2370 # take when 3; gosub_2510 # throw when 4; gosub_2620 # eat when 5; gosub_2980 # inventory else; raise('on gosub error.') end (@no != 5 || @co != 334) && (@no != 17 || @co != 230) and next end # 1810 @c1 == 19 and (gosub_9750; next) @c1 == 20 and (gosub_9970; next) @ol = @no case(@no) when 1; gosub_3100 when 2; gosub_3600 when 3; gosub_3860 when 4; gosub_4440 when 5; gosub_4740 when 6; gosub_4930 when 7; gosub_5120 when 8; gosub_5350 when 9; gosub_5460 when 10; gosub_5860 when 11; gosub_6050 when 12; gosub_6260 when 13; gosub_6480 when 14; gosub_6720 when 15; gosub_6820 when 16; gosub_7070 when 17; gosub_7180 when 18; gosub_7500 when 19; gosub_7740 when 20; gosub_8040 else; raise('on gosub error.') end @ol != @no and (gosub_10550(<<-1890); @co = 1; gosub_1970) data "/","場所が変わりました。/","*" 1890 } end def gosub_1910 puts('OK.'); return end def gosub_1920 usr('$0F14'); puts('ダメです。'); return end def gosub_1930 usr('$0F14'); puts('既に開いています。'); return end def gosub_1940 usr('$0F14'); puts('鍵は開いています。'); return end def gosub_1950 usr('$0F14'); puts('鍵がかかっています。'); return end def gosub_1960 usr('$0F14'); puts('鍵がありません。'); return end # 1970 REM'** LOOK def gosub_1970 @co > 1 and (gosub_2140; return) puts; print(' ここは ' + @noS[@no] + ' で') @e = 0 (0..1).each {|d| @a = @th[d][@no] gosub_1070 (1..27).each {|i| midS(@aS, i, 1) == '0' and next @e = @e + 1 @e > 1 and print(' と') print(' ' + @naS[d][27 - i]) } } @e > 0 and (puts(' が見えます。'); return) puts('す。') return end # 2140 REM'* LOOK def gosub_2140 unless(@fl == 0) gosub_1060 midS(@aS, 27 - @bt, 1) == '1' and (gosub_2220; return) end @a = @th[@fl][@no] gosub_1070 midS(@aS, 27 - @bt, 1) == '1' and (gosub_2230; return) gosub_1920; return end def gosub_2220 puts('*** CARRYING ***') gosub_2230; return end def gosub_2230 @b = val(leftS(@trS[@fl][@bt], 2)) puts(@fmS[@b] + ' ' + @naS[@fl][@bt] + ' です。') @a = 0 loop { @aS = midS(@trS[@fl][@bt], 3, 1) @aS == '*' and break @a = 1 @f = val(@aS) @b = val(midS(@trS[@fl][@bt], 4, 2)) print(' ' + @naS[@f][@b] + ' と') @th[@f][@no] = @th[@f][@no] + @ta[@b] @trS[@fl][@bt] = leftS(@trS[@fl][@bt], 2) + midS(@trS[@fl][@bt], 6, len(@trS[@fl][@bt]) - 5) } @a == 1 and puts(chrS(29) + 'がありました。') return end # 2370 REM'** TAKE def gosub_2370 @no == 1 && @co == 232 && @h[1] == 0 && @h[20] == 0 and (gosub_1920; return) @no == 3 && @co == 234 && @h[1] == 0 && @h[21] == 0 and (gosub_1920; return) @fl == 0 and (usr('$0F14'); puts('それは持てません!'); return) @a = @th[1][@no] gosub_1070 midS(@aS, 27 - @bt, 1) == '0' and (gosub_1920; return) gosub_1910 @th[1][@no] = @th[1][@no] - @ta[@bt] @h[0] = @h[0] + @ta[@bt] @no == 1 && @co == 232 and @h[20] = 1 @no == 3 && @co == 234 and @h[21] = 1 @co == 233 && @h[19] == 5 and @h[19] = 4 return end # 2510 REM'** THROW def gosub_2510 @fl == 0 and (gosub_2600; return) gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (gosub_2600; return) gosub_1910 @h[0] = @h[0] - @ta[@bt] @th[1][@no] = @th[1][@no] + @ta[@bt] @co == 329 and h[13] = 0 return end def gosub_2600 puts('持っていません。') return end # 2620 REM'** EAT def gosub_2620 @fl == 0 and (gosub_2680; return) gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (gosub_2680; return) @bt == 6 and (gosub_2720; return) gosub_2820; return end def gosub_2680 @a = @th[@fl][@no] gosub_1070 midS(@aS, 27 - @bt, 1) == '0' and (gosub_1920; return) gosub_2820; return end def gosub_2720 @h[19] == 5 and (gosub_2600; return) @h[19] == 0 and (puts('もう全部食べてしまいました。'); return) @h[19] = @h[19] - 1 @h[19] == 0 and @h[0] = @h[0] - 64 @h[10] == 0 and (puts('これはうまいよ。'); return) print('呪文は '); @aS = $stdin.gets.chomp @aS == 'ピピルマ' and (gosub_2840; return) @aS == 'パパレホ' and (gosub_2880; return) puts('おいしい。') return end def gosub_2820 puts('まずい...') return end # 2840 REM'* def gosub_2840 @h[1] == 0 and (gosub_1910; @h[1] = 1; return) puts('もう大きくなっています。') return end # 2880 REM'* def gosub_2880 @h[1] == 1 and (gosub_1910; @h[1] = 0; return) gosub_10550(<<-2910) data "「おーい! タコくん。アリスちゃんが突然いなくなってしまったぞ?」/" data "「ちがうんだCPUくん。アリスちゃんは小さくなりすぎて" data "キミの目に見えなくなっただけなんだ!」/" data "「まるでミクロ決死隊だなー... /" data "しかし見えなきゃゲームは続けられないなぁ....」/" data "というわけで サヨーナラーァァァァッ..../","*" 2910 goto_10660 end # 2980 REM'** INVENTORY def gosub_2980 @h[0] == 0 and (puts('何も持っていません。'); return) gosub_1060 print('あなたは') @e = 0 (16..27).each {|i| midS(@aS, i, 1) == '0' and next @e = @e + 1; @e > 1 and print(' と') print(' ' + @naS[1][27 - i]) } puts(' を持っています。') return end # 3100 REM'*** SCENE 1 def gosub_3100 @co == 7 and (puts('後には引き返せません。'); return) @co == 938 and (gosub_3210; return) @co == 1013 and (gosub_3310; return) @co == 1304 || @co == 1404 and (gosub_3340; return) @co == 1406 and (gosub_1960; return) @co == 1413 and (gosub_3410; return) @co == 1706 and (gosub_3450; return) @co == 1713 and (gosub_3500; return) gosub_1920; return end # 3200 REM'* def gosub_3210 gosub_1060 midS(@aS, 27, 1) == '0' and (gosub_1920; return) gosub_1910 gosub_10550(<<-3250) data "キャーーーーー..../" data "あなたはマイクロディスクぐらいの大きさになってしまい、" data "ジュースの入った瓶もどこかに飛んでいってしまいました。/","*" 3250 @h[1] = 0 @h[0] = @h[0] - 1 return end # 3310 REM'* def gosub_3310 @h[2] == 3 && @h[1] == 0 and (@no = 2; return) gosub_1920; return end # 3340 REM'* def gosub_3340 @h[2] != 0 and (gosub_1930; return) gosub_1910 @h[2] = 1 puts('カーテンの陰に ' + @naS[0][22] + ' がありました。') @th[0][1] = @th[0][1] + 8192 return end # 3410 REM'* def gosub_3410 case(@h[2] + 1) when 1; gosub_1920; return when 2; gosub_1950; return when 3; gosub_3430; return when 4; gosub_1930; return else; raise('on gosub error.') end end def gosub_3430 @h[2] = 3 gosub_1910; return end # 3450 REM'* def gosub_3450 gosub_1060 midS(@aS, 22, 1) == '0' and (gosub_1960; return) puts('鍵が違うようです。') return end # 3500 REM'* def gosub_3500 case(@h[2] + 1) when 1; gosub_1920; return when 2; gosub_3520; return when 3; gosub_1940; return when 4; gosub_1930; return else; raise('on gosub error.') end end def gosub_3520 @h[2] == 2 and (gosub_1940; return) gosub_1060 midS(@aS, 22, 1) == '0' and (gosub_1960; return) gosub_1910 @h[2] = 2 puts('開いた途端に鍵が消えてしまいました。') @h[0] = @h[0] - 32 return end # 3600 REM'*** SCENE 2 def gosub_3600 @co == 6 and (@no = 5; return) @th[0][2] == 0 and (gosub_4710; return) @co == 7 and (puts('通ってきたはずのドアが消えてしまって戻れません。'); return) @co == 1008 && @h[3] == 1 && @h[1] == 0 and (@no = 3; return) @co == 1416 and (gosub_3680; return) @co == 1612 and (gosub_3720; return) gosub_1920; return end # 3680 REM'* def gosub_3680 @h[3] == 1 and (gosub_1930; return) @h[3] = 1 gosub_1910; return end # 3720 REM'* def gosub_3720 usr('$0F14') gosub_10550(<<-3750) data "「はーい こんにちわ! ウサギさん!」/" data "するとウサギさん.../","*" 3750 @h[9] == 1 and (gosub_3830; return) @h[9] = 1 gosub_10550(<<-3800) data "「やあ いいところに来てくれた。実は煙突に何かが詰まって困っているんだ。" data "何とかしてそれを取り除いてください。」と言って家の方を指差しています。/","*" 3800 return end def gosub_3830 gosub_10550(<<-3840) data "「何度も話しかけないでくれ。私は忙しいのだ。」/","*" 3840 return end # 3860 REM'*** SCENE 3 def gosub_3860 @h[3] = 2 @co == 640 and (gosub_4270; return) @co == 938 and (gosub_3940; return) @co == 1139 and (gosub_4100; return) @co == 1829 and (gosub_4210; return) @co == 2103 and (gosub_4310; return) gosub_1920; return end # 3940 REM'* def gosub_3940 gosub_1060 midS(@aS, 27, 1) == '0' and (gosub_1920; return) @h[1] == 1 and (gosub_4030; return) gosub_10550(<<-3990) data "「ややっ あの少女がいなくなってしまったぞ。/さてはあのジュースを飲んだな...」/" data "というわけで あのジュースは小さくなる薬でした。/" data "そしてあなたは小さくなりすぎて、消えてなくなってしまったのでした。/めでたし めでたし。","*" 3990 goto_10660 end def gosub_4030 gosub_1910 @h[1] = 0 gosub_10550(<<-4060) data "あなたは元の体の大きさに戻ることができました。/" data "そのジュースの入った瓶は音もなく消えてしまいました。/","*" 4060 @h[0] = @h[0] - 1 return end # 4100 REM'* def gosub_4100 gosub_1060 midS(@aS, 26, 1) == '0' and (gosub_1920; return) @h[13] == 0 and (puts('涼しい...'); return) gosub_1910 gosub_10550(<<-4160) data "みるみるうちに体が大きくなって、部屋いっぱいになって、" data "手袋もうちわもどこかへ消えてしまいました。/","*" 4160 @h[1] = 1 @h[0] = @h[0] - 6 return end # 4210 REM'* def gosub_4210 gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (gosub_1920; return) @h[13] == 1 and (puts('もう入っています。'); return) @h[13] = 1 gosub_1910; return end # 4270 REM'* def gosub_4270 @h[1] == 1 and (gosub_1920; return) puts('なぜか外へ出られません。') return end # 4310 REM'* def gosub_4310 @h[1] == 1 and (gosub_1920; return) gosub_1060 midS(@aS, 20, 1) == '0' and (gosub_4380; return) puts('いつの間にか家が空に浮かんでいます。') @no = 4 return end def gosub_4380 @a = @th[1][3] gosub_1070 @bS = '何か' midS(@aS, 20, 1) == '1' and @bS = @naS[1][7] puts('中に ' + @bS + ' が詰まっていて登れません。') return end # 4440 REM'*** SCENE 4 def gosub_4440 @co == 2235 || @co == 1435 && @luS == 'E' and (gosub_4490; return) @co == 1003 and (@no = 3; return) @co == 23 and (gosub_4550; return) gosub_1920; return end # 4490 REM'* def gosub_4490 gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (gosub_1920; return) @h[14] == 1 and (gosub_1930; return) @h[14] = 1 gosub_1910; return end # 4550 REM'* def gosub_4550 gosub_1060 @h[14] == 1 && midS(@aS, 19, 1) == '1' and (gosub_4610; return) gosub_4580 end def gosub_4580 gosub_10550(<<-4590) data "地面に落ちてケガをして動けなくなってしまいました。/","*" 4590 goto_10660 end def gosub_4610 @no = 2 @noS[2] = 'ウサギの家のあったところ' gosub_10550(<<-4640) data "うまく降りることができました。/","/" data "ウサギの家は飛んでいってしまいました。/" data "ウサギも家を追いかけて、どこかへ行ってしまいました。/","/" data "傘は閉じておきましょう。/","*" 4640 @h[14] = 0 @th[0][2] = 0 return end # 4710 REM'* def gosub_4710 @co == 7 and (puts('戻れません。'); return) @co == 6 and (@no = 5; gosub_1910; return) end # 4740 REM'*** SCENE 5 def gosub_4740 @co == 6 and (gosub_4800; return) @co == 7 and (@no = 2; return) @co == 334 and (gosub_4840; return) @co == 2125 and (@no = 6; return) # BUG? goto 1860 gosub_1920; return end # 4800 REM'* def gosub_4800 @h[4] == 1 and (@no = 7; return) puts('大きな犬が尻尾を振って行く手に立っているので怖くて通れない。') return end # 4840 REM'* def gosub_4840 @a = @th[1][5] gosub_1070 midS(@aS, 20, 1) == '0' || @h[4] == 1 and return puts('大きな犬は棒切れをくわえてどこかへ行っちゃいました。') @th[0][5] = @th[0][5] - 32 @th[1][5] = @th[1][5] - 128 @h[4] = 1 return end # 4930 REM'*** SCENE 6 def gosub_4930 @co == 25 and (puts('うまく降りられない。'); return) @co == 2235 || @co == 1435 && @luS == 'E' and (gosub_5060; return) @co == 23 and (gosub_4980; return) gosub_1920; return end #TODO # 4980 REM'* def gosub_4980 gosub_1060 @h[14] == 0 && midS(@aS, 19, 1) == '0' and (gosub_4580; return) puts('着地成功。') @no = 5 puts('傘は閉じておきます。') @h[14] = 0 return end # 5060 REM'* def gosub_5060 gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (gosub_1920; return) @h[14] == 1 and (gosub_1930; return) @h[14] = 1 gosub_1910; return end # 5120 REM'*** SCENE 7 def gosub_5120 @co == 6 and (@no = 8; return) @co == 7 and (@no = 2; return) @co == 1602 and (gosub_5170; return) gosub_1920; return end # 5170 REM'* def gosub_5170 usr('$0F14') gosub_10550(<<-5200) data "「ハロー! アオムシさん!」/","*" 5200 @h[10] == 1 and (@h[10] = 2; gosub_5300; return) @h[10] == 2 and (gosub_1920; return) gosub_10550(<<-5240) data "するとマユを作りながら/" data "「いいことを教えてあげよう」とアオムシさん。/" data "「このキノコを食べて'ビビルマ'と唱えれば大きくなり" data "'パパレホ'と唱えれば小さくなれる。」と教えてくれました。/","*" 5240 @h[10] = 1 return end # 5300 REM'* def gosub_5300 gosub_10550(<<-5320) data "アオムシさんはモスラになって飛んでいってしまいました。/","*" 5320 @th[0][7] = 0 return end # 5350 REM'*** SCENE 8 def gosub_5350 @co == 6 and (@no = 9; @h[15] = 1; return) @co == 7 and (@no = 7; return) @co == 1019 && @h[5] == 1 && @h[1] == 0 and (@no = 11; return) @co == 1406 and (gosub_5420; return) @co == 1600 and (puts('ひとりでブツブツ言っています。'); return) gosub_1920; return end # 5420 REM'* def gosub_5420 @h[5] == 1 and (gosub_1930; return) @h[5] = 1 gosub_1910; return end # 5460 REM'*** SCENE 9 def gosub_5460 @co == 6 and (gosub_5530; return) @co == 7 and (gosub_5820; return) @co == 2123 and (gosub_5670; return) @co == 2441 and (gosub_5720; return) @co == 1441 and (gosub_5770; return) gosub_1920; return end # 5530 REM'* def gosub_5530 @h[15] == 2 and (@no = 12; return) @h[15] == 1 and (puts('壁に遮られて進めません。'); return) gosub_10550(<<-5570) data "「あれっ? 通り抜けちゃったー。」/" data "どうやらあれは暗示によって作り出された架空の壁だったようです。/" data "「さすがワンダーランドだわ!" data "この話を聞いたらSFファンのおねえさんがよろこぶでしょうねー、きっと。/","/" data "などと考えているうちに、その壁はなくなってしまいました。/" data "どうやら暗示が解けたようです。/","*" 5570 @th[0][9] = @th[0][9] - @ta[24] @h[15] = 2 @no = 12 return end # 5670 REM'* def gosub_5670 @h[15] == 0 and (puts('「目をつぶってなんて登れませんよ!」'); return) puts('なんとか3番目の枝まで登ることができました。') @no = 10 return end # 5720 REM'* def gosub_5720 @h[15] == 2 and (gosub_1920; return) @h[15] == 0 and (puts('既に閉じています。'); return) @h[15] = 0 gosub_1910; return end # 5770 REM'* def gosub_5770 @h[15] == 2 and (gosub_1920; return) @h[15] == 1 and (gosub_1930; return) @h[15] = 1 gosub_1910; return end # 5820 REM'* def gosub_5820 @h[15] == 1 and (@no = 8; gosub_1910; return) puts('周りの様子がよく見えないので動けません。') return end # 5860 REM'*** SCENE 10 def gosub_5860 @h[1] == 1 and (gosub_1920; return) @co == 23 and (gosub_5920; return) @co == 2235 || @co == 1435 && @luS == 'E' and (gosub_6010; return) @co == 25 and (puts('下を見たら怖くなって降りれない。'); return) gosub_1920; return end # 5920 REM'* def gosub_5920 gosub_1060 @h[14] == 0 || midS(@aS, 19, 1) == '0' and (gosub_4580; return) gosub_10550(<<-5790) data "またさっきのところに降りてきました。/" data "傘を閉じておきます。/","*" 5790 @no = 9 @h[14] = 0 return end # 6010 REM'* def gosub_6010 @h[14] == 1 and (gosub_1930; return) @h[14] = 1 gosub_1910; return end # 6050 REM'*** SCENE 11 def gosub_6050 @co == 640 && @h[1] == 0 and (@no = 8; return) @co == 1610 and (gosub_6090; return) gosub_1920; return end # 6090 REM'* def gosub_6090 usr('$0F14') gosub_10550(<<-6120) data "「あのー...」と控えめなアリスくんですが.../","*" 6120 @h[11] == 1 and (gosub_6230; return) gosub_10550(<<-6150) data "「あーうるさいうるさい。アンタこれ持ってトットとお行き!」" data "と言って公爵夫人は赤ん坊をアリスに向かって放り投げました。/" data "しばらくそこでうろうろしていたら、なんと赤ん坊がみるみる子豚へと、" data "そしてついには斧に変わってしまいました。/" data "不思議なことってあるもんですねぇ.../","*" 6150 @h[0] = @h[0] + 16 @h[11] = 1 return end def gosub_6230 gosub_10550(<<-6240) data "ピーピーキャーキャーで何を言っているのかサッパリわかりません。/","*" 6240 return end # 6260 REM'*** SCENE 12 def gosub_6260 @co == 6 and (@no = 13; return) @co == 7 and (@no = 9; return) @co == 1537 || @co == 1601 and (gosub_6330; return) @co == 1231 and (gosub_6350; return) gosub_1920; return end # 6320 REM'* def gosub_6330 puts('「ニャハハハハハハ!」ひょーきんな猫です。') return end # 6350 REM'* def gosub_6350 gosub_1060 midS(@aS, 27 - @bt, 1) == '0' and (puts('持っていません。'); return) gosub_1910 usr('$0F14') gosub_10550(<<-6410) data "「これ、あげますぅ。」とアリスちゃん。/" data "「どーもありがと。お礼にいいこと教えてやるよ。」と猫さん。/" data "「三月ウサギのところに行くと面白いよ。この先の森を" data "北,東,北,東,南の順に進むとそいつの家の前に出る。" data "くれぐれも森の中で迷うなよ、二度と抜けられなくなるぞ。/","*" 6410 @h[0] = @h[0] - 16 return end # 6480 REM'*** SCENE 13 def gosub_6480 gosub_10550(<<-6500) data "道が迷路のように入り組んでいるので、太陽を頼りに" data "N(北),S(南),W(西),E(東)で進みます。/","*" 6500 @dS = 'NENES'; @cS = '' # 6530 loop { print('どっちの方向'); @aS = $stdin.gets.chomp gosub_1140 unless(@aS == 'N' || @aS == 'S' || @aS == 'W' || @aS == 'E') puts('???') next end # 6580 @cS = @cS + @aS @cS == @dS and break len(@cS) < 59 and next gosub_10550(<<-6620) data "突然ですが、アリスが過労のため倒れてしまいました。/" data "したがって、このゲームもジエンドになるのでした。/","*" 6620 goto_10660 } # 6650 sleep(0.6001) gosub_10550(<<-6670) data "突然、体が光に包まれ、" data "落ち葉が舞い上がり、周りの景色が流れていきます。/","*" 6670 sleep(0.6001) @no = 14 return end # 6720 REM'*** SCENE 14 def gosub_6720 @co == 6 and (@no = 16; return) @co == 7 and (puts('もう戻れません。'); return) @co == 1020 && @h[6] == 1 && @h[1] == 0 and (@no = 15; return) @co == 1417 and (gosub_6780; return) gosub_1920; return end # 6780 REM'* def gosub_6780 @h[6] == 1 and (gosub_1930; return) @h[6] = 1 gosub_1910; return end # 6820 REM'*** SCENE 15 def gosub_6820 @co == 640 && @h[1] == 0 and (@no = 14; return) @co == 836 and (gosub_6870; return) @co == 1537 || @co == 1621 and (gosub_6950; return) gosub_1920; return end # 6870 REM'* def gosub_6870 @h[16] == 0 and (gosub_1920; return) @h[17] == 0 and (gosub_6920; return) gosub_6900; return end def gosub_6900 puts('誰かと熱心にしゃべっていて、話を聞いてくれません。') return end def gosub_6920 puts("「それは '月がとっても青いから' なのだ。」") @h[17] = 1 return end # 6950 REM'* def gosub_6950 usr('$0F14') gosub_10550(<<-6980) data "「こんにちは! 文化しませんか?」/","*" 6980 @h[16] == 1 and (gosub_6900; return) gosub_10550(<<-7010) data "「あはははは! ひとつ私が面白いクイズを出そう。」とウサギさん。/" data "「なぜ机は昼間にクシャミをするか? どうです、わからないでしょう。あはは!」/" data "うーん! わけのわからない人... 違った、ウサギさんだこと。" data "アリス、頭が痛くなっちゃう。/","*" 7010 @h[16] = 1 return end # 7070 REM'*** SCENE 16 def gosub_7070 @co == 6 and (puts('ここが行き止まりです '); return) @co == 7 and (@no = 14; return) @co == 1014 && @h[7] == 1 and (@no = 17; return) @co == 1418 and (gosub_7130; return) gosub_1920; return end # 7130 REM'* def gosub_7130 @h[7] == 1 and (gosub_1930; return) @h[1] == 0 and (puts('ドアが大きすぎて、開けることができません。'); return) @h[7] = 1 gosub_1910; return end # 7180 REM'*** SCENE 17 def gosub_7180 @co == 230 and (gosub_7300; return) @co == 640 and (@no = 16; return) @co == 1022 && @h[8] == 3 && @h[1] == 0 and (@no = 18; return) @co == 1330 and (gosub_7260; return) @co == 1422 and (gosub_7400; return) @co == 1722 and (gosub_7440; return) gosub_1920; return end # 7260 REM'* def gosub_7260 @a = @th[1][17]; gosub_1070 midS(@aS, 27 - @bt, 1) == '0' and (puts('そんなものは、ニャーだぎゃー。'); return) gosub_1910 gosub_7300; return end def gosub_7300 @h[8] == 1 and return gosub_10550(<<-7320) data "あっ! こんなところに ","*" 7320 print(@naS[0][22]) gosub_10550(<<-7350) data " があるぅー!!/" data " しかし、何でこんなところにドアがあるんでしょーねー! アリス、頭が痛ぁーいの!/","*" 7350 @h[8] = 1 @th[0][17] = @th[0][17] + 4194304 return end # 7400 REM'* def gosub_7400 case(@h[8] + 1) when 1; gosub_1920; return when 2; gosub_1950; return when 3; gosub_7420; return when 4; gosub_1930; return else; raise('on gosub error.') end end def gosub_7420 @h[8] = 3 gosub_1910; return end # 7440 REM'* def gosub_7440 case(@h[8] + 1) when 1; gosub_1920; return when 2; gosub_7460; return when 3; gosub_1940; return when 4; gosub_1930; return else; raise('on gosub error.') end end def gosub_7460 gosub_1060 midS(@aS, 22, 1) == '0' and (gosub_1960; return) @h[8] = 2 gosub_1910; return end # 7500 REM'*** SCENE 18 def gosub_7500 @co == 1626 and (gosub_7560; return) @co == 2626 || @h[18] == 1 and (gosub_7650; return) @co == 6 and (puts('どこへ行くのかわからない。'); return) @co == 7 and (puts('どこからきたのか忘れてしまいました。'); return) gosub_1920; return end # 7560 REM'* def gosub_7560 @h[18] == 1 and (puts('スミを吐きかけられました。'); return) gosub_10550(<<-7590) data "タ コ:「もうかりまっか?」/" data "アリス:「ま、まぁ、ぼちぼちですぅ。あんさんとこは、どないですか?」/" data "タ コ:「ソフトの売上がイマイチで... 宝ビルアドベンチャーもよろしく。/" data " などといいながら、タコは歩き出しました。/","*" 7590 @h[18] = 1 return end # 7650 REM'* def gosub_7650 gosub_10550(<<-7670) data " タコは、どんどん歩いてゆきます。/" data "遅れないように急ぎ足で付いて行きます。/" data "気がつくと、いつの間にか森の外に出ていました。/" data "辺り一面のお花畑で、タコはどこかに行ってしまいました。/","*" 7670 puts @no = 19 return end # 7740 REM'*** SCENE 19 def gosub_7740 @co == 6 and (gosub_1910; puts('あれっ! さっきと同じ場所だ!!'); return) @co == 1537 || @co == 1609 || @co == 1611 and (gosub_7780; return) gosub_1920; return end # 7780 REM'* def gosub_7780 @h[1] == 0 and (gosub_8020; return) gosub_10550(<<-7810) data "「こ、こんにちは...あははっ」アリスちゃん、なぜか上がっています。/","*" 7810 @h[12] == 1 and (gosub_10550(<<-7830); return) data "もう、相手にしてくれませんです。悲しい..../","*" 7830 @h[12] = 1 gosub_10550(<<-7860) data "「うーん! 見かけない顔だなー」と王様。「キミは何ていう名前だ?」/" data "なんて聞かれています。ここは答えておいたほうがよさそうですよ?/","*" 7860 print('名前は '); @aS = $stdin.gets.chomp gosub_1140 sleep(0.2000) unless(@luS == 'J' && @aS == 'アリス' || @aS == 'ALICE') gosub_10550(<<-7930) data "「あっ、そういえばそうだったな。近頃、記憶力が落ちてなー! あっはっは!!」/" data "な、なんと! 誰かと間違えられてしまいました。/","*" 7930 return else gosub_10550(<<-7970) data "「うーん! そんなまともな名前の者は知らないなー。ちょっと一緒に来たまえ。」" data "といって、引っ張られていきました。この王様、ロリコンでないでしょーねー..../","*" 7970 @no = 20 return end end def gosub_8020 puts('体が小さいので、ぜーんぜん気がつかないようです。') end # 8040 REM'*** SCENE 20 def gosub_8040 @co != 1609 and (gosub_1920; return) gosub_10550(<<-8070) data "「....ほほう、そうすると、おまえはこの国の住民ではないのだな。」/" data "「ええ、そうなの。ウサギさんを追いかけてきたら、いつの間にかここへ来てしまったんです。どうやったら" data " お家へ帰れるのか教えてくれないかしら。" data "お茶の時間に遅れるとおかあさまに叱られちゃう。」/" data "「うーん、ワシにはよくわからんが、ワシのところには" data " ものをよく知っている者がいるから、そいつに聞いてみよう。" data "おい OTOMIHSAH を呼んでこい。」/" data "「お呼びでしょうか。」/" data "「この娘が家に帰るには、どうしたらよいのか教えてやってくれ。」/" data "「それでは 'なぜ、机は昼間にクシャミをするか'。" data "このなぞなぞに答えられたら、おまえの住んでいた世界へ帰る道を教えてやろう。」/","*" 8070 print('答えは '); @aS = $stdin.gets.chomp @bS = '' (1..len(@aS)).each {|i| midS(@aS, i, 1) != ' ' and @bS = @bS + midS(@aS, i, 1) } unless(@bS == '月がとっても青いから') gosub_10550(<<-8250) data "「残念でした。もう知らない。」/" data "と、いうわけで、アリスちゃんは家へ帰れなくなってしまい、それを見た王様は" data "かわいそうに思って、アリスをお城のパン焼きにしてくれました。/" data " もともとアリスはパンを焼くのが好きだったので、パンを焼きながら幸せに暮らしました。/" data "木の葉の話し声が聞こえるような寂しい夜に、アリスはおかあさまやおねえさまの" data "ことを思い出して、そっと涙を流すのでした。/","*" 8250 goto_10660 else gosub_10550(<<-8330) data "「大当たり! それではキミの家の前まで送って行ってあげよう。こちらへ来なさい。」/" data "アリスはその OTOMIHSAH に付いてゆきました。すると突然白い布のような" data "ものが被さってきました。OTOMIHSAH はどんどん先へと行ってしまうので" data "「待ってーー!」呼んだのですが、聞こえないようです。" data "だんだん周りの景色が薄れてゆくように感じました。/","*" 8330 puts goto_final end end # 8390 REM'*** FINAL def goto_final sleep(0.8201) gosub_10550(<<-8420) data " アリスは土手の上でおねえさんのひざに頭を乗せて寝ていた自分に" data "気が付きました。おねえさんはアリスの髪の毛を優しくなでていました。/" data "「起きなさい、アリス!」おねえさんが、耳元で囁きます。「本当によく眠ったわねぇ!」/" data "「あ、おねえさん。私、とってもおかしな夢を見たの! " data "ウサギさんがいて、王様や、女王様がいて....","/" data " アリスはそう言って、おねえさんに思い出せるだけ、精一杯、今までに" data " 体験した彼女の不思議な冒険の話をして聞かせたのです。","/" data " アリスが話し終わるとおねえさんは彼女にキスして言いました。/" data "「本当に不思議な夢だったわね、でも、もう急いでお茶に行きなさい。" data "もう、遅く....」/" data " そこで、おねえさんは言葉を失いました。" data " アリスは、そのおねえさんの引きつった顔を見て、思わず後ろを振り返りました。/" data "なんとそこには、大きな白クジラがこちらを向いて手を振っているでは" data "ありませんか!! そしてゆっくりと口を開いてこう言いました。/","/" data "「一緒に散歩に出かけませんか?」/","*" 8420 puts sleep(0.6001) gosub_10550(<<-8600) data "今度はあなたが ADVENTURE を作る番ですよ!!","*" 8600 exit end # 8620 REM'*** INIT def gosub_8620 print(chrS(6)) @naS = [[], []]; @vrS = []; @maS = []; @ch = []; @ta = []; @h = [] @trS = [[], []]; @fmS = []; @th = [[], []]; @noS = []; @aS = [] puts; puts('(1)日本語(カタカナ) (2)英語') puts; puts(' 1 または 2 の数字を押してください。') puts; print(' ') @aS = $stdin.gets.chomp @luS = 'E'; puts('英語 ***この移植版は英語のみ対応です***'); sleep(1) restore; (1..26).each {|i| @vrS[i] = read(<<-8780) data LOOK,TAKE,THROW,EAT,INVENTORY,GO,BACK,ASK,DRINK data ENTER,FAN,GIVE,MOVE,OPEN,SAY,TALK,UNLOCK,WEAR data SAVE,LOAD,CLIMB,OPEN,JUMP,CLOSE,DOWN,FOLLOW 8780 } restore; (0..26).each {|i| @naS[0][i] = read(<<-8840) data BUTLER,CAT,CATAPILLAR,CHIMNEY,CURTAIN,DOG,DOOR,DRESSER,HOUSE data KING,MARCHIONESS,QUEEN,RABBIT,SMALL DOOR,STORE,TABLE data DOOR,DOOR,DOOR,HOUSE,HOUSE,RABBIT,SMALL DOOR,TREE,WALL data TREE,TAKO 8840 } restore; (0..14).each {|i| @naS[1][i] = read(<<-8920) data BOTTLE,FAN,GLOVE,HAT,HATCHET,KEY,MUSHROOM,STICK,PARASOL data ANSWER,HELLO,JUICE,MYSELF,OUT,EYE 8920 } restore; (0..35).each {|i| @fmS[i] = read(<<-9160) data 半分魚の格好をした,木に登って座っているニヤけ顔の data まるで橋本さんのような,赤いレンガ造りの,小さなスカイブルーの data 真っ白な丸っこい,木でできた頑丈そうな,少し大きいくらいの data 洒落た小さな,たくさんの家来を引き連れた data ヒステリックでデビルクイーンのような,背が高くて美しい data トンボメガネをかけ懐中時計を持った,5インチディスケットぐらいの data どうやら帽子屋のような,美しく透き通ったガラスの,洒落た造りの data 古風な,半円形をした,立派な造りをした data ウサギの耳のような煙突の立っている,三月ウサギと呼ばれている data 見たことのあるような,高いもみの,どこまでも続く銀色の,太い枝の,タコの data ラベルに「Drink_me\!」と書いてあるジュースの入った data HUDSONうちわ(知る人ぞ知る)に似た,片方だけのキッドの data ウサギ用に穴の空いた,元は赤ん坊の姿をしていた不思議な,金色の data 松茸にそっくりな,ミンキーステッキにそっくりな,白い 9160 } restore; (0..26).each {|i| @trS[0][i] = read(<<-9330) data 00*,01*,02*,03107*,04*,05*,06*,07100102*,08*,09*,10*,11* data 12*,13*,14*,15100105*,16*,17*,18105*,19*,20*,21*,22* data 23*,24*,25*,26* 9330 } restore; (0..9).each {|i| @trS[1][i] = read(<<-9390) data 27*,28*,29*,30*,31*,32*,33*,34*,35*,36* 9390 } restore; (1..20).each {|i| data9430 = <<-9430 data 32848,0,69888,0,136,2,8,0,33554464,0,0,256,4,64 data 524353,0,25165824,0,0,0,1024,0,2,0,0,0,1179648,0 data 2097152,0,278528,0,0,8,67108864,0,2560,0,2560,0 9430 @th[0][i] = read(data9430).to_i @th[1][i] = read(data9430).to_i } restore; (1..20).each {|i| @noS[i] = read(<<-9490) data 広いホール,ウサギの家の前,ウサギの家の中,ウサギの家の屋根の上 data 森の中,木の上,森の少し開けたところ data 森を出たところにある公爵夫人の家の前,湖のほとり data 湖のほとりにある木の上,鍋やフライパンの飛び交う家の中 data シャーウッドの森の入り口,うっそうとした森の中 data 三月ウサギの家の前,お茶会の最中の三月ウサギの家の中 data 大きな切り株の形をした帽子屋の前,帽子屋の店内 data タコツボの中,きれいなお花がたくさん咲いているお花畑 data 立派な宮殿の中 9490 } restore; (1..20).each {|i| @maS[i] = read(<<-9610) data 0,06,0,0,23,0,0,08,0,0,0,0,0,06081619,12,061617,13,0,0,0 9610 } restore; (0..26).each {|i| @ta[i] = read(<<-9650).to_i data 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384 data 32768,65536,131072,262144,524288,1048576,2097152,4194304 data 8388608,16777216,33554432,67108864 9650 } @no = 1 @ch[4] = 99 @h = Array.new(22, 0) @h[1] = 1 @h[15] = 1 @h[19] = 5 print(chrS(6)) return end # 9750 REM'*** SAVE def gosub_9750 puts; puts('今からゲームの途中経過を SAVE します。') # REM' puts; puts('何かキーを押すと SAVE が始まります。') @aS = $stdin.gets.chomp open('ALICE_DATA_%s' % @aS, 'w') {|fh| puts; puts('ただいま SAVE 中です。') (1..20).each {|i| fh.puts(@th[0][i]) } (1..20).each {|i| fh.puts(@th[1][i]) } (0..26).each {|i| fh.puts(@trS[0][i]) } (0..21).each {|i| fh.puts(@h[i]) } fh.puts(@no) } # REM' puts; puts('終了しました。'); puts @co = 1; gosub_1970 return end # 997 REM'*** LOAD def gosub_9970 puts; puts('今からゲームのデータを LOAD します。') # REM' puts; puts('何かキーを押すと LOAD が始まります。') @aS = $stdin.gets.chomp open('ALICE_DATA_%s' % @aS) {|fh| puts; puts('ただいま LOAD 中です。') (1..20).each {|i| @th[0][i] = fh.gets.chomp.to_i } (1..20).each {|i| @th[1][i] = fh.gets.chomp.to_i } (0..26).each {|i| @trS[0][i] = fh.gets.chomp } (0..21).each {|i| @h[i] = fh.gets.chomp.to_i } @no = fh.gets.chomp.to_i } # REM' puts; puts('終了しました。'); puts @co = 1; gosub_1970 return end # 10300 REM *** INPUT # 10550 REM'** CRT def gosub_10550(__data0, f120 = 0.120) __data = []; __data0.scan(/"([^"]+)"/) {|__d| __data << __d[0] } @bS = '♥' + chrS(4) loop { @aS = __data.shift; @aS == '*' and return (1..len(@aS)).each {|i| if(midS(@aS, i, 1) == '/') puts(' ') else print(midS(@aS, i, 1)) print(@bS) end sleep(f120) } } end # 10660 REM'** END def goto_10660 puts puts usr('$0F14') gosub_10550(<<-10710) data "ゲームオーバーです。もう一度するときは RUN してください。/","*" 10710 exit end end adventure = Alice.new ARGV[0] =~ /demo/i and adventure.gosub_999 adventure.goto_1000 __END__