#!/usr/local/bin/perl ############################## # # # ギャルゲーヒロイン自動生成 # # # ############################## #製作 a-park @ 偏読日記 (http://www5e.biglobe.ne.jp/~mybook/) use strict; use lib ('/public_html/cgi-bin/lib'); use CGI; use HTML::Template; my $query = new CGI; #拡張モード判定 # $expand =1の場合拡張モード使用 my $expand = $query->param('expand'); #乱数のシード設定 srand( time() ^ ( $$ + ( $$ << 15 ) ) ); #最大生成数 my $max = 11; #生成人数 実際の生成人数は+1 my $nin = $query->param('nin'); $nin--; if ( $nin > $max ) { die "Too much!!"; } #ファイル場所指定 my $fdir = '/home5e/053/m7XjpDl0Lei52/public_html/cgi-bin/'; my $idir = "param('consistent'); if ( $consistent == 1 ) { splice( @file, 0, 2 ); } my $out = Create($nin,$query); Output($out); exit; sub FileFind { } #スペック設定 sub Spec { my %calc; my $q = shift; my %def, { age => { max => $q->param('age_max'), min => $q->param('age_min'), }, height => { max => $q->param('height_max'), min => $q->param('height_min'), }, bust => { max => $q->param('bust_max'), min => $q->param('bust_min'), }, waist => { max => $q->param('waist_max'), min => $q->param('waist_min'), }, hip => { max => $q->param('hip_max'), min => $q->param('hip_min'), }, }; #各スペックの[平均値,標準偏差] for ( keys(%def) ) { $calc{"$_"} = [ ( $def{$_}->{'max'} + $def{$_}->{'min'} ) / 2, ( $def{$_}->{'max'} - $def{$_}->{'min'} ) / 2 ]; } my %spec = ( '年齢' => $calc{age}, '身長' => $calc{height}, B => $calc{bust}, W => $calc{waist}, H => $calc{hip} ); return \%spec; } #平均値$m 標準偏差$sigmaの値を正規分布で返すサブルーチン #引数は上記2要素のリストとして渡す sub N_Distribution { my ( $m, $sigma ) = @_; my ( $r1, $r2 ) = ( rand(), rand() ); while ( $r1 == 0 ) { $r1 = rand(); } my $result = int( $sigma * sqrt( -2 * log($r1) ) * sin( 2 * 3.141592653589 * $r2 ) + $m ); if ( $result < ( $_[0] - $_[1] ) ) { $result = ( $_[0] - $_[1] ); return $result; } elsif ( $result > ( $_[0] + $_[1] ) ) { $result = ( $_[0] + $_[1] ); return $result; } else { return $result; } } #誕生日生成サブルーチン sub Birth { my $month = int( rand 12 ); my $day; if ( $month == 0 ) { $month++; } if ( $month == 2 ) { $day = int( rand 28 ); } elsif (( $month == 4 ) or ( $month == 6 ) or ( $month == 9 ) or ( $month == 11 ) ) { $day = int( rand 30 ); } else { $day = int( rand 31 ); } my $birth = "$month月$day日"; return $birth; } #生成開始 # $charIDはキャラクターID 0から開始 sub Create { #名前生成ループ my $max_create = shift; my $cgi = shift; my @narray; my @char; my $charID; for ( $charID = 0 ; $charID <= $max_create ; $charID++ ) { open( INPUT, "< $n1" ); rand($.) < 1 and my $line = $_ while ; $narray[$charID] = $line; chomp $narray[$charID]; close(INPUT); open( INPUT, "< $n2" ); rand($.) < 1 and $line = $_ while ; $narray[$charID] .= $line; chomp $narray[$charID]; close(INPUT); $char[$charID]{name} = "$narray[$charID]"; } #一般属性生成ループ my $tmp = 1; my @prop; foreach (@file) { open INPUT, "<$_"; @prop = ; for ( $charID = 0 ; $charID <= $max_create ; $charID++ ) { my $rnd = rand(@prop); $char[$charID]{prof}{"p$tmp"} = splice( @prop, $rnd, 1 ); } ++$tmp; close(INPUT); } #人間関係属性生成ループ for ( $charID = 0 ; $charID <= $max_create ; $charID++ ) { my $target = int rand($nin); if ( $target == $charID ) { next; } open( INPUT, "< $p01" ); @prop = ; my $rnd = rand(@prop); $char[$charID]{prof}{p01} = ( "$char[$target]{name}" . "$prop[$rnd]" ); close(INPUT); } #詳細設定生成ループ(拡張モード時のみ動作) if ( $expand == 1 ) { my $spec = Spec($cgi); for ( $charID = 0 ; $charID <= $max_create ; $charID++ ) { foreach ( keys(%$spec) ) { $char[$charID]{spec}{$_} = "$_" . ':' . "N_Distribution( @{ $$spec{$_} } )"; } $char[$charID]{spec}{birth} = "誕生日:Birth()"; } } #顔グラフィック生成 my @face = ( 1 .. 116 ); for ( my $i = @face ; --$i ; ) { my $j = int rand( $i + 1 ); next if $i == $j; @face[ $i, $j ] = @face[ $j, $i ]; } #表示用配列@showに名前、属性をそれぞれ代入 my @show; for ( $charID = 0 ; $charID <= $nin ; $charID++ ) { $show[$charID] = "$idir" . "$face[$charID].png'>\n

$char[$charID]{name}

"; #拡張設定代入 if ( $expand == 1 ) { $show[$charID] .= $char[$charID]{spec}{'年齢'} . '
'; $show[$charID] .= $char[$charID]{spec}{'身長'} . '
'; $show[$charID] .= $char[$charID]{spec}{B} . '
'; $show[$charID] .= $char[$charID]{spec}{W} . '
'; $show[$charID] .= $char[$charID]{spec}{H} . '
'; $show[$charID] .= $char[$charID]{spec}{birth} . '

'; } #使用する属性配列の数$N_of_arrayを決定 my $N_of_array; my $judge = int rand() * 3; if ( $judge <= 1 ) { $N_of_array = 3; } else { $N_of_array = 4; } # 属性ハッシュのキーを格納した配列 @pkey をランダムに並び替える my @pkey = keys( %{ $char[$charID]{prof} } ); for ( my $i = @pkey ; --$i ; ) { my $j = int rand( $i + 1 ); next if $i == $j; @pkey[ $i, $j ] = @pkey[ $j, $i ]; } #属性代入 for ( my $i = 0 ; $i <= $N_of_array ; $i++ ) { $show[$charID] .= $char[$charID]{prof}{ $pkey[$i] }; $show[$charID] =~ s/\n/
/g; } $show[$charID] .= '

'; } return \@show; } #html生成 sub Output { my $print = shift; print "Content-type: text/html\n\n"; print <<"eof"; 生成結果

キャラクター紹介(嘘)

eof #本文表示 foreach (@$print) { $_ .= "\n"; print; } print <<"eof"; 戻る eof }