Mushroom Field Simulator Source Code:
<?
header('Content-Type: text/html; charset=utf-8');
$imgs = array("dirt",
"spore","spore","spore",
"knoll","knob","spooky",
"spore","spore","spore",
"warm","cool","pointy",
"spore","spore","spore",
"flaming","frozen","stinky",
"spore","moon1","moon1",
"gloomy","moon1","moon1");
$names = array("nothing",
"a Knoll mushroom spore","a Knob mushroom spore","a spooky mushroom spore",
"a Knoll mushroom","a Knob mushroom","a spooky mushroom",
"a warm mushroom spore","a cool mushroom spore","a pointy mushroom spore",
"a warm mushroom","a cool mushroom","a pointy mushroom",
"a flaming mushroom spore","a frozen mushroom spore","a stinky mushroom spore",
"a flaming mushroom","a frozen mushroom","a stinky mushroom",
"a gloomy black mushroom spore","something unknown","something unknown",
"a gloomy black mushroom","something unknown","something unknown");
$types = array(0,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,2,2,2);
$moons1 = array(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8);
$moons2 = array(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8);
$moondesc = array(1=>"new", 2=>"waxing crescent", 3=>"first quarter", 4=>"waxing gibbous", 5=>"full", 6=>"waning gibbous", 7=>"third quarter", 8=>"waning crescent");
// fetches a field from the posted form, trims whitespace
function getFormVar ($var, $default = '')
{
if (isset($_REQUEST[$var]))
{
if (is_array($_REQUEST[$var]))
return key($_REQUEST[$var]);
else return trim($_REQUEST[$var]);
}
else return $default;
}
// fetches an array from the posted form
function getFormArr ($var, $default = array())
{
if (isset($_REQUEST[$var]))
return $_REQUEST[$var];
else return $default;
}
$curgen = getFormVar('curgen', 0);
$moons = getFormVar('moons', 0);
$spore = getFormVar('spore', 1);
$w = getFormVar('w', 4);
$h = getFormVar('h', 4);
$p = getFormArr('p');
for ($y = 0; $y < $h; $y++)
{
if (!isset($p[$y]))
$p[$y] = array();
for ($x = 0; $x < $w; $x++)
{
if (!isset($p[$y][$x]))
$p[$y][$x] = 0;
}
}
$l = getFormVar('l');
$action = getFormVar('action');
if (strlen($l) > 0)
{
list($lx,$ly) = explode('-', $l);
if ($action == 'plant')
$p[$ly][$lx] = $spore;
if ($action == 'pick')
{
$oldp = $p[$ly][$lx];
$p[$ly][$lx] = 0;
}
}
else $lx = $ly = 0;
if (getFormVar('phase'))
{
$moons++;
if ($moons >= 16)
$moons = 0;
}
function breed ($a, $b, $moon)
{
if ($a > $b) { $c = $a; $a = $b; $b = $c; }
if (($a == 4) && ($b == 4)) return 1; // Knoll
if (($a == 5) && ($b == 5)) return 2; // Knob
if (($a == 6) && ($b == 6)) return 3; // spooky
if (($a == 5) && ($b == 6)) return 7; // warm
if (($a == 4) && ($b == 5)) return 8; // cool
if (($a == 4) && ($b == 6)) return 9; // pointy
if (($a == 10) && ($b == 10)) return 7; // warm
if (($a == 11) && ($b == 11)) return 8; // cool
if (($a == 12) && ($b == 12)) return 9; // pointy
if (($a == 10) && ($b == 12)) return 13; // flaming
if (($a == 11) && ($b == 12)) return 14; // frozen
if (($a == 10) && ($b == 11)) return 15; // stinky
if (($a == 16) && ($b == 16)) return 13; // flaming
if (($a == 17) && ($b == 17)) return 14; // frozen
if (($a == 18) && ($b == 18)) return 15; // stinky
if (($a == 6) && ($b == 17) && ($moon == 0)) return 19; // gloomy black
return 0;
}
function isvalid ($x, $y)
{
global $w, $h;
if (($x >= 0) && ($x < $w) && ($y >= 0) && ($y < $h))
return true;
else return false;
}
function getneighbor (&$neighbors, $x, $y, $p)
{
global $types;
if (isvalid($x,$y) && ($types[$p[$y][$x]] == 2))
$neighbors[] = $p[$y][$x];
}
function clearcell ($x, $y, &$old, &$new)
{
global $types;
if (isvalid($x,$y))
{
if ($types[$old[$y][$x]] == 1) // if we just wiped out a spore
{
$old[$y][$x] = 0; // clear it from the old generation
$new[$y][$x] = 0; // so it doesn't grow up
}
if ($types[$old[$y][$x]] == 2) // otherwise, only remove a mushroom from
$new[$y][$x] = 0; // the new generation
}
}
if (getFormVar('evolve'))
{
$curgen++;
$moons++;
if ($moons >= 16)
$moons = 0;
$oldp = array();
for ($y = 0; $y < $h; $y++)
$oldp[] = $p[$y];
// first pass - attempt to breed mushrooms
for ($y = 0; $y < $h; $y++)
for ($x = 0; $x < $w; $x++)
{
$neighbors = array();
// step 0 - make sure there's room for a spore
if ($types[$oldp[$y][$x]] == 2)
continue; // mushroom there - skip it
// step 1 - count neighbors
getneighbor($neighbors,$x,$y-1,$oldp);
getneighbor($neighbors,$x,$y+1,$oldp);
getneighbor($neighbors,$x-1,$y,$oldp);
getneighbor($neighbors,$x+1,$y,$oldp);
if (count($neighbors) != 2)
continue;
// step 2 - make sure the recipe is valid
$newtype = breed($neighbors[0],$neighbors[1],$moons);
if ($newtype == 0)
continue;
// step 3 - destroy old mushrooms (and spores)
clearcell($x,$y-1,$oldp,$p);
clearcell($x,$y+1,$oldp,$p);
clearcell($x-1,$y,$oldp,$p);
clearcell($x+1,$y,$oldp,$p);
// step 4 - place new spore (deleting any old spore present)
$oldp[$y][$x] = 0;
$p[$y][$x] = $newtype;
}
// second pass - cause any old spores to mature
for ($y = 0; $y < $h; $y++)
for ($x = 0; $x < $w; $x++)
if ($types[$oldp[$y][$x]] == 1)
$p[$y][$x] = $oldp[$y][$x] + 3;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Kingdom of Loathing Degrassi Knoll Mushroom Field Simulator</title>
</head>
<body>
<div>
Generation: <?=$curgen?> <form method="get" action="?"><div><input type="submit" value="Reset" /></div></form><br />
Moons: <img src="moon<?=$moons1[$moons]?>.gif" alt="<?=$moondesc[$moons1[$moons]]?>" /><img src="moon<?=$moons2[$moons]?>.gif" alt="<?=$moondesc[$moons2[$moons]]?>" /><br />
<form method="post" action="?">
<div>Actions:<br />
<label><input type="radio" name="action"<?if ($action == 'view') print ' checked="checked"';?> value="view" /> View location</label><br />
<label><input type="radio" name="action"<?if ($action == 'plant') print ' checked="checked"';?> value="plant" /> Plant</label> <select name="spore"><option value="1"<?if ($spore == '1') print ' selected="selected"';?>>Knoll</option><option value="2"<?if ($spore == '2') print ' selected="selected"';?>>Knob</option><option value="3"<?if ($spore == '3') print ' selected="selected"';?>>Spooky</option></select> spore<br />
<label><input type="radio" name="action"<?if ($action == 'pick') print ' checked="checked"';?> value="pick" /> Pick mushroom</label><br />
Field: (click a square to perform the requested action)<br />
<?
for ($y = 0; $y < $h; $y++)
for ($x = 0; $x < $w; $x++)
{
print '<input type="image" src="'.$imgs[$p[$y][$x]].(($imgs[$p[$y][$x]] == 'dirt') ? rand(1,6) : '').'.gif" alt="'.$names[$p[$y][$x]].'" name="l['.$x.'-'.$y.']" />';
if ($x == $w-1)
print "<br />\n";
else print "\n";
}
?>
<input type="submit" name="evolve" value="Rollover" />
<input type="submit" name="phase" value="Adjust moon phase" /><br />
<input type="text" name="w" value="<?=$w?>" size="1" />x<input type="text" name="h" value="<?=$h?>" size="1" /><input type="submit" value="Refresh" />
<input type="hidden" name="moons" value="<?=$moons?>" />
<input type="hidden" name="curgen" value="<?=$curgen?>" />
<?
for ($y = 0; $y < $h; $y++)
for ($x = 0; $x < $w; $x++)
print '<input type="hidden" name="p['.$y.']['.$x.']" value="'.$p[$y][$x].'" />'."\n";
?>
</div>
</form>
<br />
<?
if (strlen($l) > 0)
{
if ($action == 'view')
print "The location you selected contains ".$names[$p[$ly][$lx]].".<br />";
if ($action == 'plant')
print "You plant ".$names[$p[$ly][$lx]].".<br />";
if ($action == 'pick')
print "You pick ".$names[$oldp].".<br />";
}
?>
<br />
<br />
Kingdom of Loathing Degrassi Knoll Mushroom Field Simulator, written by Quietust (#763168)<br>
Patched for browser compatibility by JaAchan (#1861933)<br />
Based on the Kingdom of Loathing Degrassi Knoll Mushroom Fields, copyright © 2004-2012 <a href="http://asymmetric.net/">Asymmetric Publications, LLC</a><br />
For the record, Jick thinks this interface is "convoluted", and "interesting, as a toy".
</div>
</body>
</html>
Return