// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // hujiko.hsp // Last Modified:2006/08/30-00:03. // ふじこ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // 定数定義 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ブール #const TRUE 1 #const FALSE 0 // ウィンドウ #const MAIN_WINDOW_WIDTH 640 #const MAIN_WINDOW_HEIGHT 480 // イメージ #const WIDTH_PER_IMAGE 16 #const WIDTH_PER_IMAGE_MIN1 WIDTH_PER_IMAGE - 1 #const HEIGHT_PER_IMAGE 16 #const NUM_IMAGES 8 #const IMAGE_TOTAL_WIDTH WIDTH_PER_IMAGE * NUM_IMAGES #const IMAGE_TOTAL_HEIGHT HEIGHT_PER_IMAGE #const IMAGE_TOTAL_AREA IMAGE_TOTAL_WIDTH * IMAGE_TOTAL_HEIGHT #const COMPRESSED_DATA_LENGTH IMAGE_TOTAL_AREA / 4 #const CHAR_WIDTH WIDTH_PER_IMAGE #const CHAR_HEIGHT HEIGHT_PER_IMAGE / 4 * 5 // マップ #const NUM_TIPS_ALONG_HORIZON 16 #const NUM_TIPS_ALONG_VERTICAL 12 #const NUM_TIPS NUM_TIPS_ALONG_VERTICAL * NUM_TIPS_ALONG_HORIZON #const IMG_WIDTH WIDTH_PER_IMAGE * NUM_TIPS_ALONG_HORIZON #const IMG_HEIGHT HEIGHT_PER_IMAGE * NUM_TIPS_ALONG_VERTICAL #const MAP_POS_X ( MAIN_WINDOW_WIDTH + IMAGE_TOTAL_WIDTH ) / 2 #const MAP_POS_Y ( MAIN_WINDOW_HEIGHT + IMAGE_TOTAL_HEIGHT ) / 2 // ウィンドウID #enum MAIN_BUFFER_ID=0 #enum MAP_BUFFER_ID=2 // プログラム情報 #packopt name "Hujiko" #packopt runtime "hsp3c.hrt" /** デバッグ用フラグ。画像をファイルから読み込ませたいとき用。あまり気にしなくていい。 #define DEBUG /**/ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // メイン // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // まずはデータを解凍 #ifdef DEBUG // こっちはデバッグ用 exist "out" if( strsize == -1 ) { dialog "file not found" end } sdim compressedData, strsize bload "out", compressedData, strsize #else // こっちが提出用。 // まずはデータを放り込んで compressedData = "3JBC'\"$$\"a\"EabF@\"@`%$#E$@`%@\"#EAbFA%&BBFBC'.UR%$$`@\"\"&DHcHDH@BHDHDHDH@BHDF%`\"$&*20-mmeem1-m1-eemmm0)RBRRRBRRRBRRRBRNRFF$*BC`@@CCB@CCB@CA(#BABCEBCA@\"\"CIBFB#+FFRFRFJS''EFdCCCIDgFEfACFF(-FJP-a+@@.@$E`.@$E`DE`.@$E`DE`.@$E`DE`/+@-ma+@@.@\"CB`BCB`BCB`BCB`@@@A@@`BCB`BCB`BCB`BCB`BCB`/+@-" #endif // 圧縮フォーマットの詳細は割愛させていただきます // 設計段階でちょっと失敗しちゃってる気もしますし、あまり価値は無いかと。 // 微調整 coordinate-- // 解凍する buffer MAP_BUFFER_ID repeat 488 // 魔法の数値 chanks = peek( compressedData, cnt ) - 0x20 if( cnt & 1 ) { color } else { pget 3200 } if( chanks >= 0x20 ) { poke compressedData, cnt, ( chanks \ 0x20 ) + 0x20 compressedData = " " + compressedData chanks = ( chanks - 0x20 ) / 0x20 } repeat chanks + 1 pset coordinate / IMAGE_TOTAL_HEIGHT, coordinate \ IMAGE_TOTAL_HEIGHT coordinate++ loop loop // 拡大コピー gmode 0, WIDTH_PER_IMAGE, HEIGHT_PER_IMAGE gzoom CHAR_WIDTH, CHAR_HEIGHT, MAP_BUFFER_ID // キャラ画像の背景を赤く染める repeat CHAR_HEIGHT y = cnt repeat pget cnt, y if( ginfo_r ) : else { break } color 0xff pset cnt, y pset WIDTH_PER_IMAGE_MIN1 - cnt, y loop loop /*/ ; 1234567890123456 map = "6666666266666666" ;1 map += "3333333333333333" ;2 map += "7777733333333333" ;3 map += "3333333333333334" ;4 map += "3333333333333334" ;5 map += "3333333333333334" ;6 map += "3333333133333334" ;7 map += "3333333333333334" ;8 map += "3333333333333334" ;9 map += "3333333333333334" ;0 map += "3533333333333334" ;1 map += "3333333333333334" ;2 /*/ // 上の代入を一括でやったVer map = "666666626666666633333333333333337777733333333333333333333333333433333333333333343333333333333334333333313333333433333333333333343333333333333334333333333333333435333333333333343333333333333334" /**/ // キャラ座標初期化 charPosX = 112 charPosY = 16 // 初期メッセージ message = "もう何日になるだろうか?", "体がギシギシと音を立てている", "何故監禁されているのか分からない", "何故自由を欲していたのかも分からない", "このまま私は朽ち果ててしまうのだろうか", "・・・", "とにかく出口を探すか", "" // ファイルサイズ削減用変数 kamikirewo = "紙切れを手に入れた" naniga = "破れていて何が書いてあるか分からない" redrawable++ repeat // - - - - 画面初期化 - - - - // gsel redraw redrawable : await 30 : redraw 0 // マップ描き gmode 0, WIDTH_PER_IMAGE, HEIGHT_PER_IMAGE gcopy MAP_BUFFER_ID repeat NUM_TIPS pos WIDTH_PER_IMAGE * ( cnt \ NUM_TIPS_ALONG_HORIZON ), HEIGHT_PER_IMAGE * ( cnt / NUM_TIPS_ALONG_HORIZON ) gmode 0, WIDTH_PER_IMAGE, HEIGHT_PER_IMAGE gcopy MAP_BUFFER_ID, ( peek( map, cnt ) - '0' ) * WIDTH_PER_IMAGE loop if( charMovePotential ) : else { // 移動中じゃないとき stick key, ( message.messageIndex == "" ) * 15 // カーソル // 押された if( key & 15 ) { messageIndex++ // とりあえずメッセージ進めてみる redrawable = TRUE direction = key if( message.messageIndex == "" ) { // メッセージが空っぽなら移動する charMovePotential = 4 dim messageIndex sdim message, 320, 8 } } // アレが押されたとき getkey shift, 16 getkey f7, 118 if( redrawable ) : else : if( shift & f7 ) { redrawable = TRUE dim messageIndex sdim message, 320, 8 message = "どこかでガチャリと音がした" doorOpend++ } ;* この辺り、よく見たら無駄だらけだなぁ } if( charMovePotential > 0 ) { if( charMovePotential == 4 ) { // キー押し下げ直後 // 目標座標設定 goalPosXIndex = ( charPosX / WIDTH_PER_IMAGE ) - ( direction == 1 ) + ( direction == 4 ) // 実はもっと小さく出来たりして・・・ goalPosYIndex = ( charPosY / HEIGHT_PER_IMAGE ) - ( direction == 2 ) + ( direction == 8 ) // こっちも goalPosIndex = goalPosYIndex * NUM_TIPS_ALONG_HORIZON + goalPosXIndex } charMovePotential-- // メッセージ用 // 滅茶苦茶ベタな書き方だらけで醜いけど、ショートですから・・・ // あと、itemsにマジックナンバー使いまくりだけど許して・・・ if( goalPosYIndex ) : else { message = "特に変わった本は無い" if( goalPosXIndex ) : else { if( numInvestigated == 2 ) { message.1 = "・と思いきや、本の間から紙切れがすり落ちた\n", kamikirewo, naniga items |= 16 } numInvestigated++ } if( goalPosXIndex == 7 ) { if( doorOpend ) { message = "扉は重々しい音を立てて開かれた" escaped++ } else { message = "扉は硬く閉ざされている" } } } if( 32 <= goalPosIndex && goalPosIndex <= 36 ) { message = "何も入っていない" if( direction == 8 ) { message = "裏側だった" } else : if( direction == 1 ) { if( items & 4 ) { message = "もう何も無い" } else { message = "???\nタンスの下に何かが挟まっている", "紙だ", kamikirewo, naniga items |= 4 } } else : if( ( items & 8 ) + goalPosXIndex ) : else { message = "鍵がかかっている" if( items & 1 ) { message.1 = "鍵を使って開けてみる", "中には紙切れが入っていた", kamikirewo, naniga items ^= 8 } } } if( goalPosXIndex == 15 && 3 <= goalPosYIndex ) { message = "枯れてる・・・" if( ( goalPosYIndex == 8 ) * ( ( items & 1 ) == 0 ) ) { message.1 = "よく見ると枝には鍵がぶら下がっていた", "鍵を手に入れた" items |= 1 } } if( goalPosIndex == 103 ) { message = "邪魔な机だ" if( items == 31 ) { message = "手に入れた紙切れを張り合わせてみた", "机上に文字が形成される", "「見えざるは真実へ導けり」", "d2s52uuふじこ", "???何のことだ" } } if( ( ( items & 2 ) == 0 ) * ( goalPosIndex == 161 ) ) { message = kamikirewo, naniga items |= 2 poke map, 161, '3' // 床にする } if( message != "" || goalPosXIndex < 0 || NUM_TIPS_ALONG_HORIZON <= goalPosXIndex || NUM_TIPS_ALONG_VERTICAL <= goalPosYIndex ) { // 壁とか dim charMovePotential // 止める } else { // 動けるなら動かす charPosX = charPosX - ( direction == 1 ) * 4 + ( direction == 4 ) * 4 // もっと小さく出来たり charPosY = charPosY - ( direction == 2 ) * 4 + ( direction == 8 ) * 4 } } // キャラを描く gmode 4, CHAR_WIDTH, CHAR_HEIGHT, 255 color 0xff pos charPosX, charPosY - 5 gcopy MAP_BUFFER_ID // メッセージ表示 dup _message, message.messageIndex if( _message != "" ) { // まずは枠線 // 一回目のループで中身を白く塗りつぶし // 二回目のループで周りの線を描く color repeat 2 if( cnt ) { pget 3200 } boxf 16 + cnt, 140 + cnt, 236 - cnt, 180 - cnt loop color font "MS ゴシック", 10 pos 20, 144 if( cnt & 8 ) { // 点滅用分岐 mes _message + " ▼" } else { mes _message } if( instr( _message, 0, "d" ) ) : else { // ふじこなら dim redrawable // 画面更新しない } } // 今の画面を拡大コピー pos 0, 0 gmode 0, IMG_WIDTH, IMG_HEIGHT gzoom MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT // 脱出したなら if( escaped ) { // フェードアウト count += 3 gmode 6, MAIN_WINDOW_WIDTH, MAIN_WINDOW_HEIGHT, count gcopy if( count > 255 ) { // フェードアウト終了 break } } loop // 締めのメッセージ redraw font "MS ゴシック", 32 pos 260, 220 pget 3200 color 0xff, 0xff, 0xff mes "脱出成功" wait 50 dialog "おつかれさま" end ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ; 攻略方法 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ; ; 1.まずは紙切れ4つを集める。以下条件。 ; 1.左下に見えてるので拾う ; 2.一番左端の本棚を4回調べる ; 3.一番左端のタンスを調べる ; (下から四番目の植木鉢から鍵を入手していることが条件) ; 4.一番右端のタンスを右側から調べる ; ; 2.紙切れをつなぎ合わせる。 ; 画面中央に置いてある机を調べれば自動的に暗号解読のイベント?発生 ; ; 3.「見えざるは真実へ導けり」 ; 「見えざる」というのは、ウィンドウが見えていない状態を表している。 ; メッセージを一つ勧めてキャレットの点滅が止まったのを確認したら ; ウィンドウを適当な場所に隠せば、謎の暗号"d2s52uuふじこ"が見える。 ; (つか、これって殆どの人が偶発的に見ちゃうんだろうね。 ; 再絵画してくれって頼めばいいだけだから) ; ; ; 4.「d2s52uuふじこ」 ; これは「ふじこ」に惑わされなければ簡単。 ; 表記されている記号に対応する仮名(キーボードの)を書き出していくと ; 「しふとえふなな」 ; 「シフトF7」 ; その場でシフトとF7を同時押しすれば扉の鍵が開く ; 金田一少年が多分元祖のアレ ; ; 5.最後 ; 後は扉を開くだけ ; ; ; ・ネタバレは計画的に! ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -