home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-10 | 3.8 KB | 167 lines | [TEXT/R*ch] |
- #!/usr/local/bin/perl
- eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
- if $running_under_some_shell;
-
- require "getopts.pl";
- &Getopts('o:');
- die "Usage: scn2g [-o outfile] [infile]\n" if @ARGV > 1;
-
- #
- # Get stdout set up and the default module name
- #
- if ( $opt_o ) {
- #
- # If they give us an output file name, open it
- # and use it as the module name (minus path and extension).
- #
- open(STDOUT, ">$opt_o") || die "Couldn't open $opt_o for output: $!\n";
- ($m = $opt_o) =~ s#(.*/)?(.*)\.g$#$2#;
- } elsif (@ARGV) {
- #
- # If they give us an input file,
- # use it as the output file name (minus path and extension plus .g)
- # and use it as the module name (minus path and extension).
- #
- ($m = $ARGV[0]) =~ s#(.*/)?(.*)\.scn$#$2#;
- unless ( -e "$m.g" ) {
- open(STDOUT, ">$m.g") || die "Couldn't open $m.g for output: $!\n";
- }
- } else {
- #
- # OK, we got nothin', output is stdout and module name is junk.
- #
- $m = 'xxx';
- }
-
- $\ = "\n"; # terminate every print with a newline.
-
- @types = ( 'pt_value', 'units', 'resources', 'unit_at' );
-
- LINE:
- while (<>) {
- # strip trailing whitespace (and the newline).
- s/\s*$//;
-
- if (/^Xconq (\d+) [\+-]* ([^;]*)(;?)$/) {
- local($n) = $1;
- print qq/(game-module "$m"\n (blurb "$2")/;
- if ( $3 ) {
- print " (game-module (notes (";
- COMMENT:
- while (<>) {
- last COMMENT if /^\.$/;
- chop;
- print;
- }
- print " ))";
- }
- while ( $n-- ) {
- chop($f = <>);
- print(qq/ (base-module "$1")/), next if $f =~ /^(\S*)\.per$/;
- push(@incfiles, $f);
- }
- print ")\n";
- foreach $f ( @incfiles ) {
- print qq/(include "$f")/;
- }
- next LINE;
- } elsif (/^Globals/) {
- split;
- &read_globs(@_[1..5]);
- next LINE;
- } elsif (/^Sides/) {
- split;
- &read_sides(@_[1], @_[2]);
- next LINE;
- } elsif (/^Units/) {
- split;
- ($num, $detail) = @_[1,2];
- &read_unit($detail) while ($num--);
- next LINE;
- }
-
- s/^/;/;
- print;
- }
-
- sub read_globs {
- local($first_turn, $last_turn, $set_prod, $leave, $conds) = @_;
- local($n);
-
- print "; fixed production" if $set_prod;
- print "; leave from edges" if $leave;
- print "(set turn $first_turn)" if $first_turn;
- print "(set last-turn $last_turn)";
-
- print "";
- for ($n = 1; $n <= $conds; ++$n) {
- chop($_ = <>);
- local($w, $t, $st, $end, $s) = split;
- $w = ($w = 0)? 'lose' : 'win';
- $s++;
- print qq/(scorekeeper |cond$n| (title "$types[$t]")/;
- print " (applies-to $s)" unless ($s == -1);
- print "; (trigger if turn > $st and turn < $end)";
-
- chop($_ = <>);
- print "; (do if ($types[$t] $_) $w)";
-
- print ")";
- }
- }
-
- sub read_sides {
- local($num, $detail) = @_;
- local($n);
-
- print "";
- for ($n = 1; $n <= $num; ++$n) {
- $_ = <>;
- chop($_);
- push(@sides, $_);
- print qq/(side $n (name "$_")/;
-
- if ( $detail > 1 ) {
- local(@t);
- $_ = <>;
- split;
- for ($i = 1; $i < $num + 1; ++$i) {
- push(@t, (@_[$i] == 100)? 'true' : 'false');
- }
- print " (trusts @t)";
- }
- if ( $detail > 2 ) {
- print STDERR "Oh, shit, I don't know what to do with all this";
- }
- print ")";
- }
- print "(set sides-min $num) (set sides-max $num)\n";
- }
-
- sub read_unit {
- local($detail) = @_;
-
- chop($_ = <>);
- local($char, $name, $loc, $owner) = split;
- $loc =~ s/,/ /;
- ++$owner;
- $name =~ s/\*/ /g;
- print "($char $loc $owner";
- print qq/ (name "$name")/ unless $name eq ' ';
-
- if ( $detail > 1 ) {
- chop($_ = <>);
- split;
- local($no, $hp, $qual, $prod, $tl, $before, $trans) = @_[1,3,4,7..10];
- local(@res) = splice(@_, 11);
- print " (nm $no) (hp $hp) (m @res)";
- print " (in $trans)" if $trans != -1;
- print " (cxp $qual)" if $qual != 0;
- # no handling of production type, turns left in build or made before.
- }
- if ( $detail > 2 ) {
- print STDERR "Oh, shit, I don't know what to do with all this";
- }
- print ")";
- }
-