京都理す

これまでのあらすじ

西暦200x年、世界は核の炎に包まれた…、じゃなくて。 人類(の一部)は未曾有の危機に瀕していた。 一辺がおよそ1メートルある立方体が4つ繋がった謎の物体が、突如として日本の古都に降り注いだのである。 平安の時代から千二百年もの間、日本の伝統と文化を育み続けた京都。 その美に満ち溢れた都に、無秩序に積み上がっていく謎のブロックたち。 人々は恐怖した。

「このままでは京都の景観が損なわれてしまう…」

京都市市街地景観整備条例により、京都の市街地において高さが20メートルを超える物体はその存在自体がタブーなのである。 積み重なる謎の物体が20段を超えようとし、皆が絶望に打ちひしがれたまさにその時、空から真っ直ぐに連なったブロックが降りてきて(以下次週)

内容

京ポン向けテ○リスもどきです。 俗に言う「落ちゲー」です。 どの辺が「落ちゲー」かと申しますと、Operaが落ちます(爆)。 長くプレイできるかは運次第です(^^; 8段消すごとにレベルが上がり、ブロックの落下速度が速くなります(最高でレベル20)。

遊び方

フルスクリーンモードもしくはスモールスクリーンモードの100%表示で遊んで下さい。 基本は両手オペレーションです。当初は片手で遊ぶことを念頭においてましたが、 レベルが上がると到底ついていけなくなるので両手持ちにしました。 [♯]キーがブロックの回転、[4],[5]キーがブロックの左右移動、 [8]キーがブロックの下移動、[7]キーがブロックを一気に落とす、 [*]キーがゲームスタートおよびゲーム中の一時中断ボタンです。 右手親指を端末右下のポッチにグリップしつつ[#]キーに添え、 左手親指を[4],[5]キーの間に置くのが一応のホームポジションとなります。

片手プレイの方は[5]でブロックの回転、[4],[6]キーがブロックの左右移動、 [8]キーがブロックの下移動、[2]キーがブロックを一気に落とす、 [*]キーがゲームスタートおよびゲーム中の一時中断ボタンになります。 こちらは16段消すごとにレベルが上がるようにしましたので、 まったりお楽しみ下さい。

攻略法

ブロックの回転判定処理が単純なので俗に言う回転入れが可能です。 レベルによって点数が変動するわけではないのでハイスコアを狙うなら 序盤のレベルが低いうちに4段消しを連発しましょう。 先行入力が可能なので、これを駆使することが高レベルで粘るコツになります。

使用上の注意

自己責任で遊んでみる

片手でまったりプレイ(レベルがゆっくり上がります)

右手の京ポンをサディスティックにいじめちゃうプレイ(いきなりレベル20)

注…レベル20を本気でプレーすると京ポンのボタンが傷みかねないのでほどほどに。京ポンはデリケートなので優しく扱って下さい。 あとキーが入力されっぱなしになって京ポンが壊れた!という人、ボタンがめり込んで縁に引っかかってます(^^;。 ボタンの反対側の縁の方を押してやれば元に戻ります。[4]キーで一生懸命左に動かしているとたまになるので注意。 ていうか京ポンは電話機であってゲーム機ではないのでその辺を気をつけてまったりめのプレイをお願いします。

京都理すお持ち帰り用

圏外でも京都理すで遊びたい、そもそも落ちる度に再アクセスするのが面倒だ、 つなぎ放題コースじゃないので遊ぶ度にパケット代がかかるのは洒落にならない、 といったようなご要望もあるかと思い、京都理すお持ち帰りバージョンをご用意しました。 パソコンをお持ちでない方のことも考えて、端末のみで保存できるようにしています。

お持ち帰り方法

  1. 下のイメージファイル保存用のリンク先に飛ぶ。
  2. 読み込みが完了したらF2キー(右上の丸いキー)を押してメニューを出す。
  3. 保存→ページ(全体)と進み、保存ページ名はそのまま(kti)でページを保存する。
  4. ゲーム画面保存用のリンク先へ飛んで読み込み完了まで待つ。
  5. 読み込みが完了したら先程と同じ手順でページを保存します。画面中央でリンク切れの画像が点滅してるけど気にせずに。
  6. 保存すると「ページの構成上、このページは完全に保存できませんでした」と言われるけど気にしない。
  7. これで保存完了。オフライン時でも保存ページ「京都理す.html」からゲームをプレイ出来るようになります。
イメージファイル保存用
ゲーム画面保存用
片手向けゲーム画面保存用
片手用も追加しました。イメージファイル保存用のページは共用です。

ツッコミ

「お前はテ○リスより先に作らんといかんものがあるだろう!」という方、 お叱りごもっともです(^^;。いずれ作りたいとは思っています。 ただ今回は早い段階できららさんが製作を発表しており、 現在京ポンに向けられているであろう開発リソースの量から考えて、 同じジャンルのものを複数の人間が開発するのはリソースが勿体無いと考え、 先に別のものを作ることにしました。お察し下さい。

ご感想、ツッコミなどは掲示板まで

#! /usr/local/bin/perl ;# ↑ ◎ Perl処理系の[パス] 分からない場合はプロバイダに確認。 ;# ;# 画像/テキスト対応アクセスカウンタ [SSIカウンタ] ver.1.01 (Free) ;# Copyright(C)2001 WiS. All Rights Reserved. ;# #-----------------------------------------------------------------------------# # ここから初期設定(サーバーへの設置方法は同梱の'readme.txt'をご覧ください) # #-----------------------------------------------------------------------------# # # ●印の項目は必ず変更してください。 # ○印の項目は主にレイアウト関連です。基本的に変更不要です。 # △印の項目は上の項目を有効にしている場合のみ設定してください。 # ◎印の項目はサーバー環境によって変更する必要があります。(1行目も含みます) # # ・ ''内に記述しますが、'を入れたい場合は 中の'は \'にしてください。 # ・ 行の頭に"#"を付けると、その行は無効になります。(コメントアウト) # ・ "$"、";"、"="等は間違って消さないようにしてください。エラーになります。 # ・ 詳しくは本サイトの解説/FAQ等を参照してください。 # ○ ファイルロック [1:使う/0:使わない] # * 通常は使うを設定しておく。(mkdir方式ロック) $uselock = 1; # ○ 同一IPから一定時間カウントしない場合の有効[時間] # * 同一IP排除を使わない場合は0にする $expires = 1; # ○ 時間帯 (GMT=英国ロンドンとの時差 日本は9時間) $time_zone = 9; # ○ 日計カウンタを [1:取る/0:取らない] # * "*.count.daily"の名前で保存されます。 $daily_count = 1; #---<パスについて>------------------------------------------------------------- # # ・ パスとはサーバー内での場所です。httpで始まるURIとは違うものです。 # ・ 相対パスとはスクリプトの場所を基準としたパスの指定です。 # ../ => 1つ上のディレクトリ ./ => 同じディレクトリ # ・ 絶対パスとはサーバー内の一番上のディレクトリを基準としたパスの指定です。 # /usr/lib/sendmail /home/foo/public_html/cgi-bin/script.cgi # ・ 仮想アドレスとはURIの一部分(ドメイン名以降)を指します。 # http://www.domain.com/~foo/cgi-bin/script.cgi # ^ ドメイン名の後のスラッシュ"/"以降の部分 # (/~foo/cgi-bin/script.cgi のこと) # ○ 画像ファイルのあるディレクトリの[パス]or[アドレス] $imag_dir = 'images1/'; # ○ カウンタ値を保存するファイルのディレクトリの[パス] $data_dir = 'data/'; #-----------------------------------------------------------------------------# # 初期設定ここまで (以下、修正不要。変更した場合は動作未保証&サポート対象外) # #-----------------------------------------------------------------------------# $expires *= 3600; onError('OK') if ($ENV{'QUERY_STRING'} eq ""); # 今日の日付を取得 { local(@time) = gmtime(time + 3600 * $time_zone); $now_date = sprintf("%04d/%02d/%02d", $time[5]+1900, $time[4]+1, $time[3]); } # クエリー文字列を取得 foreach (split /;/, $ENV{'QUERY_STRING'}) { local($key, $val) = split /=/, $_, 2; $STDIN{$key} = $val; } # セキュリティー対策 &onError('パラメーターの値が不正です') if ($STDIN{'ID'} =~ /(^\/|\.\.|[^\w\-\.\/])/); &onError('パラメーターの値が不正です') if ($STDIN{'IMG'} =~ /(^\/|\.\.|[^\w\-\.\/])/); $STDIN{'ID'} = 'default' if ($STDIN{'ID'} eq ""); $file = $data_dir . $STDIN{'ID'} . ".count"; $imag_dir .= $STDIN{'IMG'}; # クッキー取得 foreach (split /;/o, $ENV{'HTTP_COOKIE'}) { local($key, $val) = split /=/o, $_, 2; $key =~ s/ //g; if ($key eq $STDIN{'ID'}) { $visit = $val; last; } } count: { last count if ($STDIN{'TYPE'} eq 'visit'); if (-f $file) { if ($STDIN{'TYPE'} eq 'today' || $STDIN{'TYPE'} eq 'ysday') { onError('busy') if (!&lockCheck($file, $uselock)); } elsif (!&lock($file, $uselock)) { onError('busy'); } onError('ファイルの読み込みに失敗しました') if (!open(IN, $file)); ($total, $today, $ysday, $save_date) = split /\t/, ; last count if ($STDIN{'TYPE'} eq 'today' || $STDIN{'TYPE'} eq 'ysday'); if ($expires) { last count if (!&logicalLock("$file.adr", $expires, $ENV{'REMOTE_ADDR'}, $ENV{'HTTP_USER_AGENT'})); } # カウント $total ++; if ($save_date ne $now_date) { $ysday = $today; $today = 1; if ($daily_count) { if (open(OUT, ">>$file.daily")) { print OUT "$save_date\t$ysday\n"; close(OUT); } } } else { $today ++; } # 初めてのカウント } else { $total = $today = 1; $ysday = 0; onError('busy') if (!&lock($file, $uselock)); } # ファイル更新 onError('ファイルの書き込みに失敗しました') if (!open(OUT, ">$file")); print OUT "$total\t$today\t$ysday\t$now_date"; close(OUT); } &unlock($uselock); if ($visit =~ /\d+/ || $visit < 0 || $visit > 1000000) { $visit ++ if ($STDIN{'TYPE'} ne 'today' && $STDIN{'TYPE'} ne 'ysday' && $STDIN{'TYPE'} ne 'visit') } else { $visit = 1; } print "Content-Type: text/html\n"; print "\n"; if ($STDIN{'TYPE'} eq 'today') { $count = $today; } elsif ($STDIN{'TYPE'} eq 'ysday') { $count = $ysday; } elsif ($STDIN{'TYPE'} eq 'visit') { $count = $visit; } else { $count = $total; print <<_EOF_; _EOF_ } $count = sprintf("%0$STDIN{'FIG'}d", $count) if ($STDIN{'FIG'} > 4 && $STDIN{'FIG'} < 12); if ($STDIM{'IMG'} eq 'hidden') { exit(0); } elsif ($STDIN{'IMG'} eq 'text') { if ($STDIN{'FIG'} == -1) { 1 while $count =~ s/(\d+)(\d{3})/$1,$2/; } print $count; exit(0); } if ($STDIN{'FIG'} == -1) { 1 while $count =~ s/(\d+)(\d{3})/$1c$2/; } $suffix = $STDIN{'FIX'} eq "" ? 'gif' : $STDIN{'FIX'}; $width = " width=$STDIN{'WID'}" if ($STDIN{'WID'} ne ""); $height = " height=$STDIN{'HEI'}" if ($STDIN{'HEI'} ne ""); foreach (split //, $count) { print qq|$_|; } exit(0); sub onError #($_) { local($_) = $_[0]; print "Content-Type: text/html\n"; print "\n"; print; exit(0); } sub lockCheck #($file_name, $use_lock) { local($file_name, $use_lock) = @_; local($lockFlag) = $file_name . ".lock"; local($i) = 0; return 1 if (!$use_lock); rmdir($lockFlag) if (-d $lockFlag && time - (stat($lockFlag))[9] > 60); while (-d $lockFlag) { select(undef, undef, undef, 1); return 0 if (++ $i >= 3); } return 1; } sub lock #($file_name, $use_lock) { local($file_name, $use_lock) = @_; local($lock_flag) = $file_name . ".lock"; if ($use_lock) { local($i) = 0; return -1 if (!-d $file_name); rmdir($lock_flag) if (-d $lock_flag && time - (stat($lock_flag))[9] > 60); while(!mkdir($lock_flag, 0755)) { select(undef, undef, undef, 1); return 0 if (++ $i >= 3); } return 1; } return 1; } sub unlock { rmdir("$_[0].lock") if (-d "$_[0].lock"); } sub logicalLock #($file_name, $timeout, @recode) { local($file_name, $timeout, @record) = @_; local($flag) = 1; local(@array); if (!-s $file_name || time - (stat($file_name))[9] > $timeout) { $flag = 1; } elsif (-s $file_name && open(IN, $file_name)) { while () { s/\r\n|\r|\n//; local($time, @field) = split /\t/o; if ($flag) { for (0 .. $#record) { if ($record[$_] eq $field[$_]){ $flag = 0; } else { $flag = 1; last; } } if (!$flag && time - $time > $timeout) { $flag = 1; } } elsif (time - $time > $timeout) { $timeout = 1; next; } push(@array, "$_\n"); } close(IN); } unshift(@array, time . "\t" . join("\t", @record) . "\n") if ($flag); if ($flag || $timeout) { return -1 if (!open(OUT, ">$file_name")); print OUT join "", @array; close(OUT); } return $flag; }