#!/usr/bin/perl

require "../cgi-lib.pl";
print "Content-Type: text/html\n\n";
ReadParse(*params);

if($params{string}) {
    $string = decode($params{string});
    if($string eq "INVALID!") {
	print "<font color=red><b>Tsk tsk! No cheating, now!</b></font><br>\n";
	$string = get_rand_string();
    }
} else {
    $string = get_rand_string();
}
$estring = encode($string);

if($params{guessed}) {
    $guessed = decode($params{guessed});
    if($guessed eq "INVALID!") {
	print "<font color=red><b>Tsk tsk! No cheating, now!</b></font><br>\n";
	$guessed = '';
    }
} else {
    $guessed = '';
}
$known = '';
foreach $char (split //,$string) {
    if($char =~ /[A-Za-z]/) {
	if($guessed =~ /$char/i) {
	    $known .= $char;
	} else {
	    $known .= "_";
	}
    }
    else { $known .= $char; }
}

$body = qq`    ,---,  
    |   |
    |   h
    |  lbr
    |   b
    |  L R
  __|__`;

print "<table border=1><tr><td>\n";
foreach $char (split //,$guessed) {
    if($string !~ /$char/i) {
	$bodyparts++;
    }
}
if($bodyparts >= 1) { $body =~ s/h/O/g; }
if($bodyparts >= 2) { $body =~ s/b/\|/g; }
if($bodyparts >= 3) { $body =~ s/r/\\/g; }
if($bodyparts >= 4) { $body =~ s/l/\//g; }
if($bodyparts >= 5) { $body =~ s/R/\\/g; }
if($bodyparts >= 6) { $body =~ s/L/\//g; }
$body =~ s/[hbrlRL]/ /g;
print "<pre>$body</pre>\n";
print "</td><td>\n";
if($bodyparts >= 6) {
    $print = $string;
} else {
    $print = $known;
}
print "<table border=1>\n";
print "<tr>\n";
foreach $char (split //,$print) {
    print "<td".(($char =~ /\S/) ? ">$char" : " bgcolor=#CCCCCC>&nbsp;")."</td>\n";
}
print "</tr>\n";
print "</table>\n";

$letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
print "<br>\nAlready Guessed:\n";
print uc $guessed;
print "<br>\n";

if($known !~ /_/) {
    print "<br>\nYou won in ".length($guessed)." guesses!\n";
    print "<a href=\"$ENV{SCRIPT_NAME}\">Play Again?</a><br>\n";
} elsif($bodyparts >= 6) {
    print "<br>\nYou LOST!\n";
    print "<a href=\"$ENV{SCRIPT_NAME}\">Play Again?</a><br>\n";
} else {
    print "Guess:\n";
    foreach $char (split //,$letters) {
	next if($guessed =~ /$char/i);
	print "<a href=\"$ENV{SCRIPT_NAME}?string=$estring&guessed=".encode($guessed.$char)."\">$char</a>\n";
    }
}
print "</td></tr></table>\n";

sub get_rand_string {
    my(@strings) = (
		    "LEGO USERS GROUP NET",
		    "PEERON INVENTORIES",
		    "BRICKLINK",
		    "BRICKSHELF",
		    "CLASSIC-CASTLE",
		    "MOC PAGES",
		    "BZ POWER",
		    "FROM BRICKS TO BOTHANS",
		    "BRICKS ON THE BRAIN",
		    "STARFLEET VOYAGER",
		    "GALAXY EXPLORER",
		    "INSECTOIDS",
		    "BLACKTRON",
		    "SPACE POLICE",
		    "ALPHA-I ROCKET BASE",
		    "ICE PLANET",
		    "ROBOT COMMAND CENTER",
		    "KING'S CASTLE",
		    "CRUSADERS",
		    "BLACK FALCONS",
		    "FORESTMEN",
		    "FORESTMEN'S RIVER FORTRESS",
		    "CLASSIC YELLOW CASTLE",
		    "GUARDED INN",
		    "BLACKSMITH'S SHOP",
		    "BLACK FALCON'S FORTRESS",
		    "ROYAL KNIGHTS",
		    "WILLA THE WITCH",
		    "MAIN STREET",
		    "AIRPORT SHUTTLE",
		    "BLACK SEAS BARRACUDA",
		    "RED BEARD RUNNER",
		    "IMPERIAL TRADING OUTPOST",
		    "FORT LEGOREDO",
		    "PIRATE WENCH",
		    "IMPERIAL STAR DESTROYER",
		    "ULTIMATE COLLECTOR'S SERIES",
		    "HARRY POTTER",
		    "ESCAPE FROM PRIVET DRIVE",
		    "BIONICLE",
		    "THE MASK OF LIGHT",
		    "ADULT FAN OF LEGO",
		    "MY OWN CREATION",
		    "BIG UGLY ROCK PIECE",
		    "CRUMMY RAMP AND PIT PLATE",
		    "ERIC HARSHBARGER",
		    "HENRY LIM",
		    "TODD LEHMAN",
		    "TIM SAUPE",
		    "JAKE MCKEE",
		    "LEG GODT, PLAY WELL",
		    "ONLY THE BEST IS GOOD ENOUGH",
		    "AQUAZONE",
		    "NEPTUNE DISCOVERY LAB",
		    "TECHNIC SPACE SHUTTLE",
		    "SANTA FE",
		    "BLACK CAT GIANT TRUCK",
		    "MODEL TEAM",
		    "BELVILLE",
		    "LEGO LOCO",
		    "ROCK RAIDERS",
		    "TECHNIC SUPERCAR",
		    "KABAYA PROMO",
		    "FABULAND",
		    "DACTA EDUCATIONAL",
		    "ADVENTURERS",
		    "JOHNNY THUNDER",
		    "SAM SINISTER",
		    "BRAD JUSTUS",
		    "MINDSTORMS",
		    "ROBOTICS INVENTION KIT",
		    "BRICKFEST",
		    "PICK A BRICK",
		    "LEGOLAND DENMARK",
		    "LEGOLAND CALIFORNIA",
		    "MASTER BUILDER",
		    "BRIKWARS",
		    "THROWBOTS",
		    "MOONBASE MODULE",
		    "THE BRICK TESTAMENT",
		    "MY OWN TRAIN",
		    "MANIA MAGAZINE",
		    "LEGO SHOP AT HOME",
		    "CYBERSLAM",
		    "BOB THE BUILDER",
		    "THE ULTIMATE LEGO BOOK",
		    "REC TOYS LEGO",
		    "SAMSONITE",
		    "EXTREME TEAM",
		    "ALPHA TEAM",
		    "AQUASHARKS",
		    "BRICKSWEST",
		    "KJELD KIRK KRISTIANSEN",
		    "OLD KIRK CHRISTIANSEN",
		    "SUSAN WILLIAMS",
		    "IMPERIAL FLAGSHIP",
		    "EXPLORATION MARS",
		    "DATSVILLE",
		    "MOSAIC MAKER",
		    "FIRST LEGO LEAGUE",
		    );
    my($rand) = int(rand scalar(@strings));
    return $strings[$rand];
}

sub encode {
    my($string) = @_;
    my(@chars) = split //,$string;
    my($hex,$result,$char,$str);
    my($offset) = int(rand 10); #0 thru 9
    $result = "$offset";
    foreach $char (@chars) {
	$hex .= sprintf("%X",(ord($char)-$offset));
    }
    $hex = join("",(reverse(split //,$hex)));
    while($hex =~ /^(........)/) {
	$str = $1;
	$hex =~ s/^\Q$str\E//;
	$result .= add_check_digit($str);
    }
    $result .= $hex;
    return $result;
}

sub decode {
    my($string) = @_;
    my($offset) = substr($string,0,1);
    if($offset !~ /\d/) { return "INVALID!"; }
    my($sub,$check,$res,$hex,$result);
    $string =~ s/^.//;
    while($string =~ /^(........)(.)/) {
	$sub = $1;
	$check = $2;
	return "INVALID!" if(add_check_digit($sub) ne "$sub$check");
	$res .= $sub;
	$string =~ s/^\Q$sub$check\E//;
    }
    $res .= $string;
    $res = join("",(reverse(split //,$res)));
    while($res =~ /^(..)/) {
	$hex = $1;
	$result .= chr(hex($hex)+$offset);
	$res =~ s/^\Q$hex\E//;
    }
    return $result;
}

sub add_check_digit {
    if(length $_[0] == 8) {
	if($_[0] !~ /^[0-9a-zA-Z\*\@\#]{8}$/) { return $_[0]; }
        my(@d,$i,$val,%m);
        foreach(0..9,'a'..'z','*','@','#') { $m{$_} = $i++; }
        @d = split //,(lc $_[0]);
        for($i=0;$i<@d;$i++) {
            $d[$i] = int $m{$d[$i]};
            if($i%2) { $d[$i] *= 2; }
        }
        @d = split //,join("",@d);
        $val = 0;
        foreach (@d) { $val += $_; }
        return $_[0] . ((10 - $val % 10) % 10);
    } else {
	return $_[0];
    }
}
