/* lemons -- they follow your every whim * by Dale Wick * 2000 08 29 */ import java.applet.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class Lemons extends Applet implements Runnable { final int BGTILE=0; final int HTILE=1; final int VTILE=2; final int SQTILE=3; final int HEROTILE=4; final int BADTILE=5; final int ENTERANCE=6; final int EXITDOOR=7; final int TILECOUNT=8; final int TILEWIDTH=20; final int TILEHEIGHT=20; final int TILESACROSS=32; final int TILESDOWN=16; final int MAXLEMON=50; Image tileImage[]=new Image[8]; final char tile[][] = { { /* BGTILE */ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, },{ /* HTILE */ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3, 3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3, 3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3, 3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, },{ /* VTILE */ 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, },{ /* SQTILE */ 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0, 0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0, 0,0,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,0,0, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 0,0,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,0,0, 0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0, 0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, 0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0, },{ /* HEROTILE */ 0,0,0,0,0, 0,0,0,5,5, 5,5,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,5,5, 5,5,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,5,5,5, 5,5,5,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,5,5,5,5, 5,5,5,5,0, 0,0,0,0,0, 0,0,0,0,0, 5,5,5,5,5, 5,5,5,5,5, 0,0,0,0,0, 0,0,0,0,5, 5,5,5,5,5, 5,5,5,5,5, 5,0,0,0,0, 0,0,0,5,5, 1,1,5,5,5, 5,1,1,5,5, 5,5,0,0,0, 0,0,0,5,5, 1,1,1,5,5, 5,1,1,1,5, 5,5,0,0,0, 0,0,0,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,0,0,0, 0,0,0,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,0,0,0, 0,0,0,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,0,0,0, 0,0,0,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,0,0,0, 0,0,0,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,0,0,0, 0,0,0,5,5, 1,1,5,5,5, 5,5,5,1,1, 5,5,0,0,0, 0,0,0,0,5, 5,1,1,1,1, 1,1,1,1,5, 5,0,0,0,0, 0,0,0,0,0, 5,5,1,1,1, 1,1,1,5,5, 0,0,0,0,0, 0,0,0,0,0, 0,5,5,5,5, 5,5,5,5,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,5,5,5, 5,5,5,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,5,5, 5,5,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,5,5, 5,5,0,0,0, 0,0,0,0,0, },{ /* BADGTILE */ 0,0,0,0,0, 0,0,0,4,4, 4,4,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,4,4, 4,4,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,4,4,4, 4,4,4,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,4,4,4,4, 4,4,4,4,0, 0,0,0,0,0, 0,0,0,0,0, 4,4,4,4,4, 4,4,4,4,4, 0,0,0,0,0, 0,0,0,0,4, 4,4,4,4,4, 4,4,4,4,4, 4,0,0,0,0, 0,0,0,4,4, 7,7,4,4,4, 4,7,7,4,4, 4,4,0,0,0, 0,0,0,4,4, 7,7,7,4,4, 4,7,7,7,4, 4,4,0,0,0, 0,0,0,4,4, 4,4,4,4,4, 4,4,4,4,4, 4,4,0,0,0, 0,0,0,4,4, 4,4,4,4,4, 4,4,4,4,4, 4,4,0,0,0, 0,0,0,4,4, 4,4,4,4,4, 4,4,4,4,4, 4,4,0,0,0, 0,0,0,4,4, 4,4,4,4,4, 4,4,4,4,4, 4,4,0,0,0, 0,0,0,4,4, 4,4,4,4,4, 4,4,4,4,4, 4,4,0,0,0, 0,0,0,4,4, 7,7,4,4,4, 4,4,4,7,7, 4,4,0,0,0, 0,0,0,0,4, 4,7,7,7,7, 7,7,7,7,4, 4,0,0,0,0, 0,0,0,0,0, 4,4,7,7,7, 7,7,7,4,4, 0,0,0,0,0, 0,0,0,0,0, 0,4,4,4,4, 4,4,4,4,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,4,4,4, 4,4,4,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,4,4, 4,4,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,4,4, 4,4,0,0,0, 0,0,0,0,0, },{ /* ENTERANCE */ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,6,6,6, 6,6,6,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,6,6,6,6, 6,6,6,6,0, 0,0,0,0,0, 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 0,0,0,0,0, 0,0,0,0,6, 6,6,6,6,6, 6,6,6,6,6, 6,0,0,0,0, 0,0,0,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,0,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,0,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,0,0,0, 0,0,0,0,6, 6,6,6,6,6, 6,6,6,6,6, 6,0,0,0,0, 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 0,0,0,0,0, 0,0,0,0,0, 0,6,6,6,6, 6,6,6,6,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,6,6,6, 6,6,6,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, },{ /* EXITDOOR */ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,6,6,6, 6,6,6,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,6,6,6,6, 6,6,6,6,0, 0,0,0,0,0, 0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 0,0,0,0,0, 0,0,0,0,6, 6,6,6,6,6, 6,6,6,6,6, 6,0,0,0,0, 0,0,0,6,6, 6,6,6,6,6, 6,1,1,6,6, 6,6,0,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,1,1,1,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, 0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0, } }; final int BACK=0; final int HORI=1; final int VERT=2; final int SQUA=3; final int HERO=4; final int BADG=5; final int ENTE=6; final int DOOR=7; final String maze0[]={ "+------------------------------+", "|i + + |", "| + + |", "|----+ + --+--+ +--|", "|ll llll l l ll l l lll|", "|l l ll ll l l l l l |", "|l lll l l l l l ll l ll |", "|l l l l l l l ll l|", "+l l l l l l l l l|", "|llll llll l l ll l l lll |", "| ---+ --+-- |", "| o |", "|+ +-----+--------+------|", "| + + |++++++++| |", "| +---+ |++++++++| |", "+------------------------------+", }; final String maze1[]={ "+------------------------------+", "|i + + |", "| + + |", "|----+ + --+--+ +--|", "| + | | |", "| + | | o |", "| __ | | ----------|", "| +---+-- | |", "+-- | | ---|", "| | | |", "| ---+ --+-- |", "| |", "|+ +-----+--------+------|", "| + + | | |", "| +---+ | | |", "+------------------------------+", }; final String maze2[]={ "+------------------------------+", "| |", "| o |", "|----+ + ++ +--|", "| + | +-+ |", "| + | | |", "| __ | +--------------|", "| +---+-- | i |", "+-- | | ---|", "| | | |", "| ---+ --+-- - |", "| |", "|+ +-----+--+ +------|", "| + + | + | |", "| + + | + | |", "+--- ------------------------+", }; char maze[] = new char[TILESACROSS*TILESDOWN]; int enterX,enterY,doorX,doorY; int selected=-1; void resetmaze(String [] template) { int i,j; active=0; next=0; rescued=0; for(j=0;j=4 && lemonType[id]!=S_PARACHUTE && lemonType[id]!=S_PARACLIMB) { /* Splat! */ //System.out.println("..splat"); active--; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; return; } lemonFallen[id]=0; } } } else { /* Death to the opposition! */ active--; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; //System.out.println("..death to the opposition!"); return; } if(dir==0) { lemonDir[id]=1; return; } switch(lemonType[id]) { case S_EXPLODE: lemonExplode[id]++; if(lemonExplode[id]>10) { lemonType[id]=S_INACTIVE; active--; invalid[y*TILESACROSS+x]=true; int dx,dy; //System.out.println("..E: kaboom!"); for(dy=y-1;dy<=y+1;dy++) { for(dx=x-1;dx<=x+1;dx++) { maze[dy*TILESACROSS+dx]=BACK; invalid[dy*TILESACROSS+dx]=true; } } return; } /* fallthorugh */ case S_STOP: //System.out.println("..S: still"); break; case S_WALK: case S_PARACHUTE: switch(maze[y*TILESACROSS+x+dir]) { case BACK: case ENTE: lemonX[id]+=dir; //System.out.println("..W: walk"); break; case DOOR: active--; rescued++; invalid[y*TILESACROSS+x]=true; lemonType[id]=S_INACTIVE; //System.out.println("..W: exit"); break; default: switch(maze[(y-1)*TILESACROSS+x+dir]) { case BACK: case ENTE: lemonX[id]+=dir; lemonY[id]--; //System.out.println("..W: walk"); return; case DOOR: active--; rescued++; invalid[y*TILESACROSS+x]=true; lemonType[id]=S_INACTIVE; //System.out.println("..W: exit"); return; } //System.out.println("..W: @"+x+","+y+" looking "+dir+"; about face"+lemonDir[id]+"!"); lemonDir[id]=-lemonDir[id]; //System.out.println("..W: about face"+lemonDir[id]+"!"); break; } return; case S_CLIMB: case S_PARACLIMB: switch(maze[y*TILESACROSS+x+dir]) { case BACK: case ENTE: lemonX[id]+=dir; //System.out.println("..C: walk"); return; case DOOR: active--; rescued++; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; //System.out.println("..C: exit"); return; default: switch(maze[(y-1)*TILESACROSS+x+dir]) { case BACK: case ENTE: lemonX[id]+=dir; lemonY[id]--; //System.out.println("..W: walk"); break; case DOOR: active--; rescued++; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; //System.out.println("..W: exit"); break; } /* if in doubt, climb it */ if(y==1) { lemonDir[id]=-dir; //System.out.println("..C: About face!"); return; } switch(maze[(y-1)*TILESACROSS+x]) { case BACK: case ENTE: lemonY[id]--; //System.out.println("..C: up we go"); break; case DOOR: active--; rescued++; //System.out.println("..C: exit"); invalid[y*TILESACROSS+x]=true; lemonType[id]=S_INACTIVE; break; default: /* if in doubt fall */ lemonDir[id]=-dir; //System.out.println("..C: about face!"); break; } return; } // break; case S_BUILD: switch(maze[y*TILESACROSS+x+dir]) { case BACK: case ENTE: if(y>0) { maze[y*TILESACROSS+x+dir]=SQUA; invalid[y*TILESACROSS+x+dir]=true; switch(maze[(y-1)*TILESACROSS+x+dir]) { case BACK: case ENTE: break; case DOOR: active--; rescued++; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; //System.out.println("..B: exit"); return; default: lemonType[id]=S_WALK; //System.out.println("..B: to walker"); return; } lemonX[id]+=dir; lemonY[id]--; //System.out.println("..B: walk"); } else { lemonType[id]=S_WALK; } return; case DOOR: active--; rescued++; lemonType[id]=S_INACTIVE; invalid[y*TILESACROSS+x]=true; //System.out.println("..B: exit"); return; default: switch(maze[(y-1)*TILESACROSS+x+dir]) { case BACK: case ENTE: lemonX[id]+=dir; lemonY[id]--; //System.out.println("..W: walk"); return; case DOOR: active--; rescued++; invalid[y*TILESACROSS+x]=true; lemonType[id]=S_INACTIVE; //System.out.println("..W: exit"); return; } dir=-dir; lemonDir[id]=dir; //System.out.println("..B: about face!"); return; } // break; } } final int palette[]={ 0,0xff,0xff00,0xffff,0xff0000,0xffff00,0xff00ff,0xffffff }; final int PALETTECOUNT=8; boolean appletActive; boolean endRun; boolean titleScreen=true; int tileData[]=new int[TILEWIDTH*TILEHEIGHT*8]; public void init() { int i,j; resetmaze(maze0); titleScreen=true; for(i=0;i