count


WeB DoRaMaシリーズ

 

WeB DoRaMa for PDX

Base Script By WeB DoRaMa Version 1.25+

はじめに

WeB DoRaMa for PDXは、CGI-StaTionのじゃわさんが作られたWeB DoRaMaのファイルをオープンネットコンテンツで閲覧、書込みができるツールです。
WeB DoRaMaは単純明快で、登場人物とセリフを書きこむことによってストーリーを進めていくというゲームです。

このプログラムについて

プログラム冒頭の、「ドラマのカスタマイズ項目」の部分をお使いいただく環境に合せてください。
その他の、設定はWeB DoRaMaと共通です。
特にWeB DoRaMa本体がなくても動作しますが、その場合、

の設定が必要になります。
また、内部処理として「pdxturn」を使用しているため、必ずWeB DoRaMa用にディレクトリを設けてください。「pdxturn」を使用ということから、IEやNNなどのブラウザー上からは表示がされません。
(直したほうがいいかも…)

プログラムはこちらです。

#!/usr/local/bin/perl

#| WeB DoRaMa for pdx ver 1.0
#|
#| typea (2000/3/8)
#| HomePageUrl http://www.digimaga.com/p/

####### Special thanks. ######
#| WeB DoRaMa Version 1.25+
#| This script is free.
#|
#| Author Shigeto Nakazawa.(1996/11/27)
#| HomePageUrl http://www7.big.or.jp/~jawa/
#|
#| Special Thanks おかぴ
#| HomePgaeUrl http://www.mediawars.or.jp/~okapin/

# //////////////////////////////////////////////////////////
# オプションの設定を変更することができます。
# 変更する場合は、readme.htm をご覧になってから行ってください。
# 設定変更には充分注意してください。
# //////////////////////////////////////////////////////////

# ----------------------------------------------------------
# ドラマのカスタマイズ項目です。
# ----------------------------------------------------------

$max = 150;  # 登録・表示最大数(あまりに多いと危険)
$view = 20;  # 初期画面で表示する数

$title = 'WeB DoRaMa';  # タイトル

# このプログラムの設置URL
$url = '//www.digimaga.com/p/dorama/index.cgi';

# ONCのトップページ(「戻る」の戻り先)
$back_url = '//www.digimaga.com/p/';

# ONCの切断ページ
$desc_url = '//www.digimaga.com/p/onc/desc.txt';

$actors[1] = 'だいすけ';   # ' ' の中だけを書き換え、
$actors[2] = 'ゆうこ';     # それ以外の記号は
$actors[3] = 'けんじ';     # 絶対に消したりしないこと!
$actors[4] = 'えり';
$actors[5] = '効果音';
$actors[6] = 'ナレーション';

# year:年 mon:月 day:日 hour:時 min:分 sec:秒
$date = "mon/day hour:min";

# 一桁のとき二桁に修正するか?
# 0:しない 1:する(時分秒) 2:する(全て)
$date_type = 2;

# IPアドレスの表示 (0:表示しない  1:表示する)
$ip_check = 0;

# リモートホストの表示 (0:表示しない  1:表示する)
$rh_check = 0;
                                    # ファイル関連の設定
$logfile   = './dorama.log';        # 記録用ファイル
$lock1     = './dorama1.lock';      # 鍵ファイル(1)
$lock2     = './dorama2.lock';      # 鍵ファイル(2)
$lock_flag = 1;                     # 鍵ファイルの 1:使用 0:不使用

# //////////////////////////////////////////////////////////
# オプションの設定はここまでです。
# 以下は CGI のプログラムです。
# 書き換えは個人の責任で行って下さい。
# //////////////////////////////////////////////////////////

&read_form;

# pdxturn = 1
if($FORM{'pdxturn'} == 1){
    @logs = &read_file($logfile);
    &sel_dorama;
    print<<"_EOF_";
Content-Type: text/plain

From: $url?no=$no
Content-Type: Text/X-PmailDX

<SEL=19;$back_url>
<SEL=20;$desc_url>
今ストーリーはこうなっています。
--------------
_EOF_
    &html_dorama($view-1,0);
print "--------------\n";
print "①";
print "$actors[1]\n";
print "②$actors[2]\n";
print "③$actors[3]\n";
print "④$actors[4]\n";
print "⑤$actors[5]\n";
print "⑥$actors[6]\n";
print "発言したい登場人物の番号を入力して下さい。\n";
print "⑲戻る\n";
print "⑳終了\n";
print "--------------\n";
print "Jawa,typea\n";
exit;
}

# pdxturn = 2
if($FORM{'pdxturn'} == 2){
    print<<"_EOF_";
Content-Type: text/plain

From: $url?actor=$FORM{'pdxdata'}&no=$FORM{'no'}
Content-Type: Text/X-PmailDX

<SEL=19;$back_url>
<SEL=20;$desc_url>
$actors[$FORM{'pdxdata'}]の
セリフを入力して下さい。
注意:改行は入力されません。
100文字以上も入力されません。
⑲戻る
⑳終了
--------------
Jawa,typea
_EOF_
exit;
}

#pdxturn = 3
if($FORM{'pdxturn'} == 3){
    @logs = &read_file($logfile);
    print<<"_EOF_";
Content-Type: text/plain

From: $back_url
Content-Type: Text/X-PmailDX

<SEL=20;$desc_url>
_EOF_
    &form_check;
    &get_date;
    $no = ($FORM{'no'} + 1) % 9999;
    $ipad = $FORM{'pdxfrom'};
    $rhost = $ENV{'REMOTE_HOST'};
    unshift(@logs,"$no<>$date<>$FORM{'pdxdata'}<>$FORM{'actor'}<>$rhost<>$ipad\n");
    while (@logs>$max) { pop(@logs); }
    &html_dorama($view-1,0);
    &write_file($logfile,@logs);
    print<<"_EOF_";

--------------
2回続けて書き込みできません。
また来てくださいね。
⑲戻る
⑳終了
--------------
Jawa,typea
_EOF_
exit;
}

# pdxturn > 3
print<<"_EOF_";
Content-Type: text/plain

From: $back_url
Content-Type: Text/X-PmailDX

<SEL=19;$back_url>
<SEL=20;$desc_url>
_EOF_
&error(0,"入力がおかしいか、バグです。");

###### subroutin ######

# [ $no出力 ]
#

sub sel_dorama {
    local($view,$flag) = @_;
    ($no,$date,$dorama,$actor,$rhost,$ipad) = split(/<>/,$logs[0]);
}

# [ ドラマ出力 ]
#

sub html_dorama {
    local($view,$flag) = @_;
    for ($i=$view;$i>-1;$i--) {
        ($no,$date,$dorama,$actor,$rhost,$ipad) = split(/<>/,$logs[$i]);
        print "[$no]$actors[$actor]\n";
        if ($flag) { print "$date\n"; }
        print "「$dorama」";
        if ($rh_check || $ip_check) {
            print "   [";
            if ($rh_check) { print $rhost; }
            print " ";
            if ($ip_check) { print $ipad; }
            print "]";
        }
        if (!$flag) { print "\n"; }
    }
}

# [ 日付取得 ]
#

sub get_date {
    $ENV{'TZ'} = "JST-9"; # TimeZone (日本時間 = 国際標準時(JST) - 9時間)
    local($sec,$min,$hour,$day,$mon,$year) = localtime();
    $mon++;
    if ($date_type) {
        if ($sec < 10)  { $sec = "0$sec";   } # 秒の修正
        if ($min < 10)  { $min = "0$min";   } # 分  〃
        if ($hour < 10) { $hour = "0$hour"; } # 時  〃
        if ($date_type > 1) {
            if ($mon < 10)  { $mon = "0$mon";   } # 月  〃
            if ($day < 10)  { $day = "0$day";   } # 日  〃
        }
    }
    if ($year > 99) { $year = $year - 100; }
    $date =~ s/year/$year/ig;
    $date =~ s/mon/$mon/ig;
    $date =~ s/day/$day/ig;
    $date =~ s/hour/$hour/ig;
    $date =~ s/min/$min/ig;
    $date =~ s/sec/$sec/ig;
}

# [ フォームチェック ]
#

sub form_check {
    local($ck_no,$date,$dorama,$ck_actor,$rhost,$ipa2) = split(/<>/,$logs[0]);
    chomp $ipa2;
    if ($ck_no ne $FORM{'no'}) {
        &error(0,"タイムオーバーだよ、きみぃ。もう、誰かが執筆しちゃったみたいだよ。一度戻って、再読み込みするといいだろう。");
    }
    if ($ck_actor == $FORM{'actor'}) {
        &error(0,"同じ人がセリフを言うのは駄目だよ。");
    }
    if (!$actors[$FORM{'actor'}]) {
        &error(0,"セリフを言う人を選ばないといけないなぁ。");
    }
    if (!$FORM{'pdxdata'} || length($FORM{'pdxdata'}) > 300) {
        &error(0,"そんなセリフは認められないなぁ。");
    }
# 独自に機能を追加しています。
# 下のコメントをはずした場合、同じ人が二度続けて書き込み出来ません。
#    if ($ipa2 eq $FORM{'pdxfrom'}) {
#        &error(0,"2回続けて書き込みできません。");
#    }
}

# [ フォームからデータ取得 ]
#

sub read_form {
    local($pair,$buffer);
    $buffer = $ENV{'QUERY_STRING'};
    $buffer =~ s/%0d%0a//g;
    local(@pairs) = split(/&/,$buffer);
    foreach (@pairs) {
        local($name,$value) = split(/=/,$_);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
#        $FORM{$name} = &change_code($value);
        $FORM{$name} = $value;
    }
}


# [ 記録ファイルの処理 ]
#

sub read_file {
    local($logfile) = $_[0];
    if (!open(IN,$logfile)) { &unlock_file; &error(1,"記録ファイルの読み込み不可"); }
    local(@files) = <IN>;
    close(IN);
    return @files;
}
sub write_file {
    local($logfile,@lines) = @_;
    &lock_file($lock1);&lock_file($lock2);
    if ($lock_error) { &error(1,"ロックファイルを検出しました。時間をおいてご利用下さい。"); }
    if (!open(OUT,">$logfile")) { &unlock_file; &error(1,"記録ファイルの書き込み不可"); }
    print OUT @lines;
    close(OUT);
    &unlock_file($lock2);&unlock_file($lock1);
    return @lines;
}

# [ ロック機構 ]
#

sub lock_file {
    local($lockfile) = $_[0];
    if (!$lock_flag) { return 1; }
    local($retry) = 5;
    while (-f $lockfile) {
        if ($retry-- <= 0) {
            local($mtime) = (stat($lockfile))[9];
            if ($mtime < time()-60*15) { &unlock_file($lockfile); }
            $lock_error = 1;
            return 1;
        }
        sleep 1;
    }
    open (LOCK,">$lockfile");
    close(LOCK);
    return 1;
}
sub unlock_file {
    local($lockfile) = $_[0];
    unlink($lockfile);
}

# [ エラー処理 ]
#

sub error {
    print<<"_EOF_";

$_[1]
⑲戻る
⑳終了
--------------
Jawa,typea
_EOF_
exit;
}

最後に

WeB DoRaMa for PDXの改造、再配布などは自由ですが、大元のWeB DoRaMaの著作権はじゃわさんが保持します。
また、WeB DoRaMa for PDXの移植にご了解をいただけましたじゃわさんに、感謝です。
WeB DoRaMa for PDXで不明な点があった場合は、くれぐれもじゃわさんに直接質問されないようにお願いします。

関連ページ


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
警告:くれぐれもまとめサイトに転載・記載するのだけはおやめください。