package Data; ####################################### # pretty.pl用データファイル # (C) 2003 makamaka [at] donzoko.net # http://www.donzoko.net/ # __DATA__ 以降はWindows用はShift_JIS # すきに改造してかいません。 ####################################### use strict; our $DEBUG = 0; our $Data = read_data(); ####################################### # ####################################### sub new{ my $class = shift; my $self = {}; bless($self,$class); $self->_init(@_); return $self; } sub _init{ my $self = shift; my %hash = @_; %{$self} = ( curt => undef, prev => undef, mes => '' , icon => undef, type => undef, wait => 200, title=> '', ); $self->{curt} = $hash{start} if(defined $hash{start}); $self->{title} = $hash{title} if(defined $hash{title}); } ####################################### # ####################################### sub go{ my $self = shift; my $ret = $_[0]; my ($curt,$prev,$data) = ($self->{curt},$self->{prev}); if(defined $prev){ if (defined $ret) { $ret = lc($ret); } $data = $Data->{$prev}; my @eval = @{$data->{eval}} if(defined $data->{eval}); my $wait = $data->{choice}->{$ret}->{wait}; $curt = $data->{choice}->{$ret}->{num}; $curt = translate(shift @eval) if($curt eq '*'); $wait = translate(shift @eval) if($wait eq '*'); $self->{wait} = $wait; } $data = $Data->{$curt}; $self->{mes} = $data->{message}; $self->{icon} = convert_icon($data->{icon}) || die "Error Name:$curt no icon"; $self->{type} = $data->{type} || die "Error Name:$curt no type"; $self->{title} = $data->{title} || $self->{title}; $self->{prev} = $curt; } ####################################### # ####################################### sub translate{ my $code = $_[0]; $code =~ s/\$([_a-zA-Z]\w*)/\$Special::$1/g; my $str = eval qq{ $code }; if($@){ die $@; } return $str; } ####################################### # ####################################### sub convert_icon{ ($_[0] eq 'i') ? 'info' : ($_[0] eq 'e') ? 'error' : ($_[0] eq '!' or $_[0] eq 'w') ? 'warning' : ($_[0] eq '?' or $_[0] eq 'q') ? 'question' : undef; } ####################################### # ####################################### sub read_data{ my $file = shift; my $data = {}; my $name; if(defined $file){ open(DATA,$file) or die "$!"; } my $fh = *DATA; return process_data($fh); } ####################################### # ####################################### sub process_data{ my $fh = $_[0]; my $data = {}; my $name = undef; while(my $line = <$fh>){ chomp($line); next if($line eq ''); next if($line =~ /^\s*#/); $line =~ s/^\s+//; $name = set_data($data,$name,$line); } get_name($data,$name); close($fh) if(defined $fh); return $data; } ####################################### # ####################################### sub set_data{ my ($data,$name,$line) = @_; if($line =~ /^:(\w+)\s+([!?ieqw])\s+(.*)/){ return get_name($data,$name,$1,$2,$3); } elsif($line =~ /^\|\s*(.*)/){ get_eval($data->{$name},$1); } elsif(!defined $name and $line =~ /^=(\w+)\s+(.*)/){ get_init($data,$1,$2); } elsif($line =~ /^=\s+(.*)/){ get_copy($data->{$name},$data->{$1}); } elsif($line =~ /^\^\s+(.*)?/){ get_title($data->{$name},$1); } else{ get_choice($data->{$name},$line); } return $name; } ####################################### # ####################################### sub get_eval{ push @{$_[0]->{eval}}, $_[1]; } sub get_name{ my ($data,$name,$new,$icon,$mes) = @_; if(defined $name){ $data->{$name}->{type} = get_type($data->{$name}->{choice}) or die "Invalid Format Data"; } $name = $new; $data->{$name}->{icon} = $icon; $data->{$name}->{message} = $mes; return $name; } sub get_init{ my ($data,$name,$str) = @_; translate($str); $data->{special}->{$name} .= $str; print $name, "\t", $str, "\n" if($DEBUG); } sub get_copy{ my ($data,$origin) = @_; for my $type (keys %{ $origin->{choice} }){ $data->{choice}->{$type}->{num} = $origin->{choice}->{$type}->{num}; $data->{choice}->{$type}->{wait} = $origin->{choice}->{$type}->{wait}; @{$data->{eval}} = @{$origin->{eval}}; $data->{title} ||= $origin->{title}; } print "set routine $1\n" if($DEBUG); } sub get_title{ $_[0]->{title} = $_[1]; } sub get_choice{ my ($type,$num,$wait) = split_line($_[1]); $_[0]->{choice}->{$type}->{num} = $num; $_[0]->{choice}->{$type}->{wait} = $wait || 500; } sub split_line{ $_[0] =~ s/^\s+//; my($type,$num,$wait) = split(/\s+/,$_[0]); if ($type =~ /^y/i){ $type = 'yes' } elsif($type =~ /^n/i){ $type = 'no' } elsif($type =~ /^o/i){ $type = 'ok' } elsif($type =~ /^c/i){ $type = 'cancel'} elsif($type =~ /^r/i){ $type = 'retry' } elsif($type =~ /^a/i){ $type = 'abort' } elsif($type =~ /^i/i){ $type = 'ignore'} else{ die "Invalid Format Data"; } return ($type,$num,$wait); } sub get_type{ return if(!defined $_[0]); my %tag = %{ $_[0] }; if(defined $tag{yes} and defined $tag{no}){ return (defined $tag{cancel}) ? 'yesnocancel' : 'yesno'; } elsif(defined $tag{ok}){ return (defined $tag{cancel}) ? 'okcancel' : 'ok'; } elsif(defined $tag{retry}){ (defined $tag{abort} and defined $tag{ignore}) ? 'abortretryignore' : (defined $tag{cancel}) ? 'retrycancel' : undef; } else{ return undef; } } #============================================================================== 1; __DATA__ # =init $joke_num = 12; # 生暖かく見守る台詞の数 =init $joke_offset = 21; # その開始番号 =init $wait_range = 6; # 待ち時間 (1〜$wait_range) * $wait_const =init $wait_const = 15000; # 基本待ち時間(ms) # :sub_routine_joke i 生暖かく見守るモード用サブルーチン | int( rand($joke_num) ) + $joke_offset | int( rand($wait_range) + 1 ) * $wait_const ok * * :0 i ハイ、僕はJohnny。こんなところで君に遭えて、なんて僕はHappyんだんろう!君も嬉しいだろう? ^ Johnny y 1 n 2 800 :1 ? ハハハ!肝もそう思う会?じゃあ、友情の証に握手をしようとしようじゃないか! y 3 1500 n 2 800 :2 i ハハハ!そんなに照れなくても大丈夫だよ!君と僕の仲じゃないか! y 1 n 4 1800 :3 ! 友情の証にWindowsをフォーマットします。全てのデータは消去されます。 ok 15 3000 cancel 16 3000 :4 i ……ハッtまいったネ!(両手を高く掲げるポーズ) ok 5 800 :5 ! 君に最後のチャンスをあげるYO!僕と友情をはぐぐみたいよね?(微妙に震えておりやす) a 6 1000 r 0 3000 i 8 4000 :6 ? ちゅうし?ああ、チュウしたいんだね!ハハハ!しかたないなあ! ok 7 800 :7 i 君がそこまで言うなら、友情をはぐくもうじゃないですか! ok 3 :8 i ……シカトですか?マジきrマスヨ? ok 9 1000 :9 w ……だいたい君はいつもそうじゃないカ。いつだって、もめ事が起こと僕のせいにしてサ。 ok 10 800 :10 w たまには、気の抜けた炭酸ソーダのように、 ok 11 800 :11 w 晴れ晴れとした日本晴れのような偏西風に乗ぅて ok 12 800 :12 w 楽しく時を忘れようと必死になってみたいと思わないのデスカ? ok 13 2500 :13 i ……オー シツレイ シマシタ。ワタシ ニホンゴ ヨクワカリマセーン ノデ ナニカ アナタニ 無礼ヲ 働イテイタラ 若気の至り故 何卒 御容赦 御願い奉り候 ok 14 1000 :14 i ……というわけで ok 5 1800 :15 e フォーマットに失敗しました。レジストリを微妙に弄ってアプリケーションを再起動します。 ok 0 3500 :16 e キャンセルに失敗しました。致命的なエラーでごわす。 ok 17 800 :17 ? ハハハ、It's アメリカンジョークだよ!気に入ってもらえたかな? y 18 n 19 1200 :18 ! じゃあ、この調子でここから君のことを生暖かく見守っているよ! | int( rand($joke_num) ) + $joke_offset | int( rand(3) + 1 ) * 10000 ok * * :19 i おかしいなあ?ニューヨーカーの間では大流行なのに? ok 20 2000 :20 ! よし、こうなったら最初から槍なお嘘としようジャないか! Are you ready? ok 0 2500 # # ここから生暖かく見守る台詞 # :21 i ふとんがふっとんだ = sub_routine_joke :22 i 隣の空き地に囲いができたってねえ。kakoii :-) = sub_routine_joke :23 i あ、今地球の裏側で誰かがくしゃみをしたよ! = sub_routine_joke :24 i おや?君、何だかイライラしていないかい?ストレスの原因を探した方がいいYo! = sub_routine_joke :25 i ……なんだか退屈だねぇ。 = sub_routine_joke :26 i 今、Windowsの方から重要なお知らせが来たんだけど、間違えてゴミ箱に捨てちゃった! = sub_routine_joke :27 i フンフンフンフン、フンフンフンフン、フンフンフンフンフン〜フフン〜(第九) = sub_routine_joke :28 i 君と僕の関係をドラえもんに例えるとさ、僕がドラえもんで、君がコロ助って感じ? = sub_routine_joke :29 i ここだけの話、実は僕、人間じゃなんだ……驚いた?ハハハ、ジョークだよ、ジョーク! = sub_routine_joke :30 i 電話に誰もでんわ。 = sub_routine_joke :31 i 健康にちょっといい話・その第26回:みそ汁に緑茶を入れよう! = sub_routine_joke :32 i そろそろ、トイレに行きたくなる頃じゃないの?いいんだよ、無理しなくて。僕は気にしないから。 = sub_routine_joke