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
Last-modified: 2020-12-15 (火) 18:20:42
警告:くれぐれもまとめサイトに転載・記載するのだけはおやめください。