import com.nttdocomo.ui.*; import com.nttdocomo.io.ConnectionException; public class iblox extends IApplication implements Runnable { Thread runner; bCanvas myCanvas; public void start() { myCanvas=new bCanvas(); Display.setCurrent(myCanvas); runner=new Thread(this); runner.start(); } public void run() { while (true) { try{ Thread.sleep(90); } catch(Exception e){} myCanvas.repaint(); } } } class bCanvas extends Canvas { int c1,c2,scState,lives,level,cou,seed,numEn,maxEn,coins; int map[]=new int[144]; char scC[]=new char[9],hiSc[]={'H','i','g','h','s','c','o','r','e',':',' ','0','0','0','0','0'}; boolean updSc; Image ims[]=new Image[20]; int w,h,i,uli,pi,fi,fj,fl,fm,co2,oi,oj,ok,si; int numBlox[]={25,5,8},stack[]=new int[100]; final int dX[]={0,0,0,-1,1},dY[]={0,-1,1,0,0},dP[]={0,-12,12,-1,1},intro[]={0,5,2,11}; boolean goUp,goDown,goLeft,goRight; int oX[]=new int[12],oY[]=new int[12],oT[]=new int[12],oL[]=new int[12],oD[]=new int[12], oC[]=new int[12]; public bCanvas() { setSoftLabel(SOFT_KEY_1, "Go"); setSoftLabel(SOFT_KEY_2, "Exit"); try{ for (i=0;i<20;i++) // Load all images { MediaImage mi = MediaManager.getImage( "resource:///ib"+i+".gif"); mi.use(); ims[i] = mi.getImage(); } }catch(Exception e){} c1=Graphics.getColorOfRGB(0,0,0); c2=Graphics.getColorOfRGB(255,255,255); w=getWidth(); h=getHeight(); for (i=0;i<9;i++) scC[i]='0'; scState=1; } public void fillMap() // Build a new level { level++; scC[8]++; fixDigs(); seed=cou&65535; if (level<10) numBlox[0]=26-level; if (level<8) numBlox[2]=6+level; coins=0; while (coins<5) { for (fi=0;fi<12;fi++) // Clear area for (fj=0;fj<12;fj++) { if (fj>0 && fj<11 && fi>0 && fi<11 && !(fj==1 && fi==1)) map[fi*12+fj]=4; else map[fi*12+fj]=11; } map[13]=11; for (fi=0;fi<3;fi++) // Randomly place blocks { fj=0; while (fj0) { while (scC[fi]>'9') { scC[fi]-=10; scC[fi-1]++; } fi--; } } public int randi() // Special pseudo-random function { seed=(seed*171)%30269; return seed; } public void spawn(int t, int x, int y, int l, int d) // Add new mobile object { si=0; while (oT[si]>0) si++; oT[si]=t; oX[si]=x; oY[si]=y; oL[si]=l; oD[si]=d; oC[si]=0; } public void updateScore(Graphics g) { g.setColor(c1); g.fillRect(0,0,50,10); g.setColor(c2); g.drawChars(scC,2,9,1,5); } public void updateLives(Graphics g) { g.setColor(c1); g.fillRect(50,0,w-50,10); for (uli=0;uli0) { oj=oX[oi]; ok=oY[oi]; if ((oj%12)>0) { oj=12*(oj/12+1); g.drawImage(ims[map[oj/12+12*(ok/12)]],oj-12,ok-2); oj-=12; } else if ((ok%12)>0) { ok=12*(ok/12+1); g.drawImage(ims[map[oj/12+12*(ok/12)]],oj-12,ok-2); ok-=12; } g.drawImage(ims[map[oj/12+12*(ok/12)]],oj-12,ok-2); } } public void manageObj(Graphics g) { if (oT[0]==1 && numEn53 && map[13+oi]==4) { spawn(4,0,12+oi,1,4); numEn++; } } for (oi=0;oi<12;oi++) switch(oT[oi]) { case 1: // Penguin if ((oX[oi]%12)==0 && (oY[oi]%12)==0) { oj=oX[oi]/12+oY[oi]; oD[oi]=0; if (goUp) { oL[oi]=13; if (map[oj-12]==4) oD[oi]=1; else checkBlock(oj,-12,1,g); } else if (goDown) { oL[oi]=0; if (map[oj+12]==4) oD[oi]=2; else checkBlock(oj,12,2,g); } else if (goLeft) { oL[oi]=14; if (map[oj-1]==4) oD[oi]=3; else checkBlock(oj,-1,3,g); } else if (goRight) { oL[oi]=15; if (map[oj+1]==4) oD[oi]=4; else checkBlock(oj,1,4,g); } } oX[oi]+=4*dX[oD[oi]]; oY[oi]+=4*dY[oD[oi]]; if (coins==5) { for (oj=1;oj<12;oj++) { oT[oj]=10; oX[oj]=0; } oT[oi]=7; scC[2]++; updSc=true; } break; case 2: // Moving block oX[oi]+=6*dX[oD[oi]]; oY[oi]+=6*dY[oD[oi]]; if ((oX[oi]%12)==0 && (oY[oi]%12)==0 && map[oX[oi]/12+oY[oi]+dP[oD[oi]]]!=4) { map[oX[oi]/12+oY[oi]]=oL[oi]; oT[oi]=10; } break; case 3: // Breaking block oL[oi]++; if (oL[oi]==8 || oL[oi]==11) { map[oX[oi]/12+oY[oi]]=4; if (oL[oi]==8) scC[5]+=5; else { scC[3]++; coins++; } oL[oi]=4; oT[oi]=10; updSc=true; } break; case 4: // Flame oX[oi]+=3*dX[oD[oi]]; oY[oi]+=3*dY[oD[oi]]; if ((oX[oi]%12)==0 && (oY[oi]%12)==0) { oj=oX[oi]/12+oY[oi]; if (oY[0]oX[oi]-15) oD[oi]=1; else if (oY[0]>oY[oi] && oX[0]oX[oi]-15) oD[oi]=2; else if (oX[0]oY[oi]-15) oD[oi]=3; else if (oX[0]>oX[oi] && oY[0]oY[oi]-15) oD[oi]=4; if (map[oj+dP[oD[oi]]]!=4) oD[oi]=0; if (oD[oi]==0) { ok=1+(randi()&3); if (map[oj+dP[ok]]==4) oD[oi]=ok; } } oL[oi]=1+(cou&1); for (oj=1;oj<12;oj++) if (oT[oj]==2 && oX[oi]9) { oT[oi]=10; numEn--; } break; case 6: // Dying penguin oC[oi]++; if (oC[oi]<10) oL[oi]=12*(oC[oi]&1); else if (oC[oi]>20) { lives--; if (lives>=0) { oT[oi]=1; oL[oi]=0; numEn=0; oC[oi]=0; updateLives(g); } else // Game over { g.setColor(c1); g.fillRect(20,60,80,20); g.setColor(c2); g.drawString("GAME OVER",35,76); co2=0; scState=5; } } break; case 7: // Happy penguin oC[oi]++; oL[oi]=16*(cou&1); if (oC[oi]>30) { fillMap(); updateScore(g); updateLives(g); co2=13; scState=4; } break; case 10: // Last stage before disappearing oT[oi]=0; break; default: break; } } public void checkBlock(int p, int o, int d, Graphics g) // Determine what to do with pushed block { if (map[p+o]==5 || map[p+o]==8) { if (map[p+o+o]==4) { spawn(2,12*((p+o)%12),12*((p+o)/12),map[p+o],d); g.drawImage(ims[4],12*((p+o)%12)-12,12*((p+o)/12)-2); map[p+o]=4; } else { spawn(3,12*((p+o)%12),12*((p+o)/12),map[p+o],0); map[p+o]++; } } } public void drawObj(Graphics g) // Draw all mobile objects { for (oi=0;oi<12;oi++) if (oT[oi]>0) g.drawImage(ims[oL[oi]],oX[oi]-12,oY[oi]-2); } public void paint(Graphics g) { cou++; g.lock(); switch(scState) { case 2: // Main game loop clearObj(g); manageObj(g); drawObj(g); if (updSc) { updSc=false; fixDigs(); updateScore(g); } break; case 1: // Prepare intro g.setColor(c1); g.fillRect(0,10,w,h-10); g.drawImage(ims[18],19,25); g.setColor(c2); g.drawString("By Karl Hornell",17,67); g.drawChars(hiSc,11,120,0,16); for (pi=0;pi<4;pi++) g.drawImage(ims[intro[pi]],30+16*pi,80); updateScore(g); updateLives(g); scState=0; break; case 3: // Prepare game for (pi=0;pi<9;pi++) scC[pi]='0'; lives=3; level=0; fillMap(); updateScore(g); updateLives(g); co2=13; scState=4; break; case 4: // Draw new level g.drawImage(ims[map[co2]],12*(co2%12)-12,12*(co2/12)-2); co2++; g.drawImage(ims[map[co2]],12*(co2%12)-12,12*(co2/12)-2); co2++; if (co2>131) { for (pi=0;pi<12;pi++) oT[pi]=0; spawn(1,12,12,0,0); scState=2; } break; case 5: // Game over, wait co2++; if (co2>40) { scState=1; pi=0; while (pi<5 && scC[1+pi]==hiSc[11+pi]) pi++; if (pi<5 && scC[1+pi]>hiSc[11+pi]) for (pi=0;pi<5;pi++) hiSc[11+pi]=scC[1+pi]; } break; default: break; } g.unlock(true); } public void processEvent(int type, int param) { if(type == Display.KEY_PRESSED_EVENT) { switch(param) { case Display.KEY_UP: goUp=true; break; case Display.KEY_DOWN: goDown=true; break; case Display.KEY_LEFT: goLeft=true; break; case Display.KEY_RIGHT: goRight=true; break; case Display.KEY_SOFT2: IApplication.getCurrentApp().terminate(); break; case Display.KEY_SOFT1: scState=3; break; default: break; } } else if (type==Display.KEY_RELEASED_EVENT) { switch(param) { case Display.KEY_UP: goUp=false; break; case Display.KEY_DOWN: goDown=false; break; case Display.KEY_LEFT: goLeft=false; break; case Display.KEY_RIGHT: goRight=false; break; default: break; } } } }