#!/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
";
#拡張設定代入
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] .= '