--- deliantra/server/utils/cfutil.in 2007/12/17 08:50:15 1.64 +++ deliantra/server/utils/cfutil.in 2009/10/28 04:10:46 1.74 @@ -14,21 +14,24 @@ my $PNGNQ = "@PNGNQ@"; use Getopt::Long; -use Coro::Event; +use File::Temp; +use POSIX (); +use Carp; + +use Coro::EV; use AnyEvent; -use YAML::Syck (); +use YAML::XS (); use JSON::XS (); use IO::AIO (); -use File::Temp; -use Crossfire; -use Coro; + +use Coro 5.12; use Coro::AIO; use Coro::Util; -use POSIX (); -use Carp; use Coro::Channel; use Coro::Storable; $Storable::canonical = 1; +use Deliantra; + $SIG{QUIT} = sub { Carp::cluck "QUIT" }; sub usage { @@ -69,8 +72,8 @@ END { system "rm", "-rf", $TMPDIR } -Event->signal (signal => "INT", cb => sub { exit 1 }); -Event->signal (signal => "TERM", cb => sub { exit 1 }); +my $s_INT = EV::signal INT => sub { exit 1 }; +my $s_TERM = EV::signal TERM => sub { exit 1 }; mkdir $TMPDIR, 0700 or die "$TMPDIR: $!"; @@ -275,7 +278,8 @@ system $OPTIPNG, "-i0", "-q", "$other~"; # reduce smoothfaces >10000 bytes - if ($stem =~ /_S\./ && (-s "$other~") > 10000) { + # obsolete, no longer required + if (0 && $stem =~ /_S\./ && (-s "$other~") > 10000) { my $ncolor = 256; while () { system "<\Q$other~\E $PNGNQ -s1 -n$ncolor >\Q$other~~\E"; @@ -535,7 +539,12 @@ if (my $filter = $meta->{cfutil_filter}) { if ($filter eq "yaml2json") { - $data = JSON::XS::encode_json YAML::Syck::Load $data; + $data = JSON::XS::encode_json YAML::XS::Load $data; + } elsif ($filter eq "json2json") { + $data = JSON::XS::encode_json JSON::XS->relaxed->utf8->decode ($data); + } elsif ($filter eq "perl2json") { + $data = eval $data; die if $@; + $data = JSON::XS::encode_json $data; } else { warn "$dir/$file: unknown filter $filter, skipping\n"; } @@ -576,7 +585,7 @@ if ($file =~ /\.(jpg|png)$/) { $c_res->put ([$path, $file, 0]) # FT_FACE } elsif ($file =~ /\.(res)$/) { - $c_res->put ([$path, $file, 7]) # FT_RSRC + $c_res->put ([$path, $file, 6]) # FT_RSRC } else { $c_res->put ([$path, $file, undef]); } @@ -597,6 +606,31 @@ }; } + sub generate_plurals { +# use Lingua::EN::Inflect (); +# Lingua::EN::Inflect::classical; +# Lingua::EN::Inflect::def_noun '(.*)staff' => '$1staves'; # policy +# Lingua::EN::Inflect::def_noun '(.*)boots' => '$1boots'; # hack +# +# for my $a (@ARC) { +# my $name = $a->{name} || $a->{_name}; +# +# next unless $a->{name_pl}; +# next if $a->{invisible}; +# next if $a->{is_floor}; +# next if $a->{no_pick}; +# +# my $test = Lingua::EN::Inflect::PL_N_eq $name, Lingua::EN::Inflect::PL $name; +# my $pl = $test =~ /^(?:eq|p:.)$/ +# ? $name +# : Lingua::EN::Inflect::PL $name; +# +# if ($pl ne $a->{name_pl}) { +# warn "$a->{_name}: plural differs, $pl vs $a->{name_pl}\n"; +# } +# } + } + sub inst_arch($) { my (undef, $path) = @_; @@ -627,9 +661,9 @@ IO::AIO::flush; - $c_res->put (undef) for @a_res; - $c_arc->put (undef) for @a_arc; - $c_trs->put (undef) for @a_trs; + $c_res->shutdown; + $c_arc->shutdown; + $c_trs->shutdown; print "start file scan, arc, res processing...\n" if $VERBOSE; @@ -637,8 +671,8 @@ print "end arc, start png processing...\n" if $VERBOSE; - # four png crunchers work fine for my 2x smp machine - my @a_png = map +(async \&process_png), 1..4; + # eight png crunchers work fine for my 4x smp machine + my @a_png = map +(async \&process_png), 1..8; $_->join for (@a_trs, @a_res, @a_png); @@ -684,10 +718,13 @@ # remove base classes (by naming scheme, should use something like "baseclass xxx" to inherit @ARC = grep $_->{_name} !~ /^(?:type|class)_/, @ARC; + print "generating plurals...\n" if $VERBOSE; + generate_plurals; + print "writing archetypes...\n" if $VERBOSE; open my $fh, ">:utf8", "$DATADIR/archetypes~" or die "$DATADIR/archetypes~: $!"; - print $fh Crossfire::archlist_to_string [sort { $a->{_name} cmp $b->{_name} } @ARC]; + print $fh Deliantra::archlist_to_string [sort { $a->{_name} cmp $b->{_name} } @ARC]; } { @@ -703,7 +740,7 @@ length $v->{data32} or warn "$k: face has no png32. this will not work (shoddy gcfclient will crash of course).\n"; length $v->{data64} or warn "$k: face has no png64. this will not work very well.\n"; - length $v->{data32} <= 10000 or warn "$k: face32 larger than 10000 bytes, will not work with crossfire client.\n"; + #length $v->{data32} <= 10000 or warn "$k: face32 larger than 10000 bytes, will not work with crossfire client.\n"; #length $v->{data64} <= 10000 or warn "$k: face64 larger than 10000 bytes.\n"; if (my $magicmap = $v->{magicmap}) {