home *** CD-ROM | disk | FTP | other *** search
/ com!online 2002 April / comcd0402.iso / homepage / javaspecial / 05_01 / pharaoh / Pharaoh.java < prev    next >
Encoding:
Java Source  |  1999-08-19  |  23.7 KB  |  884 lines

  1. //
  2. // Pharaoh
  3. //
  4. // Author: Michael Kraus
  5. // Version: 0.1
  6. // Date: 1999/6/22
  7. // JDK Version: 1.0.2
  8. //
  9. // Email: michael.kraus@informatik.uni-muenchen.de
  10. // Homepage: www.informatik.uni-muenchen.de/~_michael.kraus/pharaoh.html
  11. //
  12. // This applet is dedicated to PHARAOHS CURSE, the
  13. // best computer game the world has seen so far.
  14. //
  15. // <!--
  16. // Example HTML code:
  17. // <APPLET code="Pharaoh.class" width=640 height=400>
  18. // </APPLET>
  19. // -->
  20. //
  21.  
  22. import java.applet.*;
  23. import java.awt.*;
  24. import java.net.*;
  25. import java.util.*;
  26.  
  27. class Teleport extends Rectangle
  28. {
  29.     private Point target;
  30.  
  31.     public Teleport(int x,int y,int width,int height,int targetx,int targety)
  32.     {
  33.         super(x,y,width,height);
  34.         target=new Point(targetx,targety);
  35.     }
  36.  
  37.     public Point getTarget()
  38.     {
  39.         return target;
  40.     }
  41. }
  42.  
  43. class Link extends Rectangle
  44. {
  45.     public static AppletContext appletContext;
  46.     public static Softstick softstick;
  47.  
  48.     private URL url;
  49.     private Image image;
  50.  
  51.     public Link(URL url,Image image,int x,int y)
  52.     {
  53.         super(x,y,image.getWidth(null),image.getHeight(null));
  54.  
  55.         this.url=url;
  56.         this.image=image;
  57.     }
  58.  
  59.     public void follow()
  60.     {
  61.         softstick.reset();
  62.         appletContext.showDocument(url);
  63.     }
  64.  
  65.     public void draw(Graphics graphics)
  66.     {
  67.         graphics.drawImage(image,x,y,null);
  68.     }
  69. }
  70.  
  71. class Wall extends Rectangle
  72. {
  73.     private Color color;
  74.  
  75.     public Wall(int x,int y,int width,int height,Color color)
  76.     {
  77.         super(x,y,width,height);
  78.  
  79.         this.color=color;
  80.     }
  81.  
  82.     public void draw(Graphics graphics)
  83.     {
  84.         graphics.setColor(color);
  85.         graphics.fillRect(x,y,width,height);
  86.     }
  87. }
  88.  
  89. class Ladder extends Rectangle
  90. {
  91.     private Color color;
  92.  
  93.     public Ladder(int x,int y,int width,int height,Color color)
  94.     {
  95.         super(x,y,width,height);
  96.  
  97.         this.color=color;
  98.     }
  99.  
  100.     public void draw(Graphics graphics)
  101.     {
  102.         graphics.setColor(color);
  103.         graphics.fillRect(x,y,width,height);
  104.     }
  105. }
  106.  
  107. class Chamber extends Rectangle
  108. {
  109.     private static final int X=0;
  110.     private static final int Y=1;
  111.     private static final int WIDTH=2;
  112.     private static final int HEIGHT=3;
  113.     private static final int TARGETX=4;
  114.     private static final int TARGETY=5;
  115.  
  116.     private Link link[];
  117.     private Wall wall[];
  118.     private Ladder ladder[];
  119.     private Teleport teleport[];
  120.  
  121.     private Rectangle leftWall[];
  122.     private Rectangle rightWall[];
  123.     private Rectangle topWall[];
  124.  
  125.     private Vector manVector;
  126.     private Vector bulletVector;
  127.  
  128.     public static Applet applet;
  129.  
  130.     public Chamber(Rectangle bounds,String linkUrl[],Image linkImage[],int linkPosition[][],int wallBounds[][],int ladderBounds[][],int teleportData[][])
  131.     {
  132.         super(bounds.x,bounds.y,bounds.width,bounds.height);
  133.  
  134.         createLinks(linkUrl,linkImage,linkPosition);
  135.         createWalls(wallBounds);
  136.         createLadders(ladderBounds);
  137.         createTeleports(teleportData);
  138.  
  139.         manVector=new Vector();
  140.         bulletVector=new Vector();
  141.     }
  142.  
  143.     private void createLinks(String linkUrl[],Image linkImage[],int linkPosition[][])
  144.     {
  145.         int n;
  146.  
  147.         link=new Link[linkUrl.length];
  148.  
  149.         try
  150.         {
  151.             for(n=0;n<link.length;n++)
  152.                 link[n]=new Link(new URL(applet.getCodeBase(),linkUrl[n]),linkImage[n],linkPosition[n][X],linkPosition[n][Y]);
  153.         }
  154.         catch(MalformedURLException exception)
  155.         {
  156.             System.err.println(exception);
  157.         }
  158.     }
  159.  
  160.     private void createWalls(int wallBounds[][])
  161.     {
  162.         int n;
  163.  
  164.         wall=new Wall[wallBounds.length];
  165.  
  166.         leftWall=new Rectangle[wall.length];
  167.         rightWall=new Rectangle[wall.length];
  168.         topWall=new Rectangle[wall.length];
  169.  
  170.         for(n=0;n<wall.length;n++)
  171.         {
  172.             wall[n]=new Wall(wallBounds[n][X],wallBounds[n][Y],wallBounds[n][WIDTH],wallBounds[n][HEIGHT],Color.blue);
  173.  
  174.             leftWall[n]=new Rectangle(wallBounds[n][X],wallBounds[n][Y],1,wallBounds[n][HEIGHT]);
  175.             rightWall[n]=new Rectangle(wallBounds[n][X]+wallBounds[n][WIDTH],wallBounds[n][Y],1,wallBounds[n][HEIGHT]);
  176.             topWall[n]=new Rectangle(wallBounds[n][X],wallBounds[n][Y]-1,wallBounds[n][WIDTH],1);
  177.         }
  178.     }
  179.  
  180.     private void createLadders(int ladderBounds[][])
  181.     {
  182.         int n;
  183.  
  184.         ladder=new Ladder[ladderBounds.length];
  185.  
  186.         for(n=0;n<ladder.length;n++)
  187.             ladder[n]=new Ladder(ladderBounds[n][X],ladderBounds[n][Y],ladderBounds[n][WIDTH],ladderBounds[n][HEIGHT],Color.magenta);
  188.     }
  189.  
  190.     private void createTeleports(int teleportData[][])
  191.     {
  192.         int n;
  193.  
  194.         teleport=new Teleport[teleportData.length];
  195.  
  196.         for(n=0;n<teleport.length;n++)
  197.             teleport[n]=new Teleport(teleportData[n][X],teleportData[n][Y],teleportData[n][WIDTH],teleportData[n][HEIGHT],teleportData[n][TARGETX],teleportData[n][TARGETY]);
  198.     }
  199.  
  200.     public void addMan(Man man)
  201.     {
  202.         manVector.addElement(man);
  203.     }
  204.  
  205.     public void removeMan(Man man)
  206.     {
  207.         manVector.removeElement(man);
  208.     }
  209.  
  210.     public void move()
  211.     {
  212.         int n;
  213.  
  214.         for(n=0;n<bulletVector.size();n++)
  215.             moveBullet((Bullet)bulletVector.elementAt(n));
  216.  
  217.         for(n=0;n<manVector.size();n++)
  218.             moveMan((Man)manVector.elementAt(n));
  219.     }
  220.  
  221.     private void moveMan(Man man)
  222.     {
  223.         int n;
  224.         boolean contact;
  225.         boolean ladderContact;
  226.         Bullet bullet;
  227.  
  228.         for(n=0;n<teleport.length;n++)
  229.         {
  230.             if(teleport[n].intersects(man))
  231.             {
  232.                 man.x=teleport[n].getTarget().x;
  233.                 man.y=teleport[n].getTarget().y;
  234.  
  235.                 return;
  236.             }
  237.         }
  238.  
  239.         if(man.mode2())
  240.         {
  241.             for(n=0;n<link.length;n++)
  242.                 if(link[n].intersects(man))
  243.                     link[n].follow();
  244.         }
  245.  
  246.         contact=false;
  247.         ladderContact=false;
  248.  
  249.         for(n=0;n<ladder.length;n++)
  250.             if(ladder[n].intersects(man))
  251.                 contact=ladderContact=true;
  252.  
  253.         for(n=0;n<wall.length;n++)
  254.         {
  255.             if(topWall[n].intersects(man))
  256.             {
  257.                 contact=true;
  258.  
  259.                 if(!ladderContact)
  260.                     man.y=topWall[n].y-man.height+1;
  261.             }
  262.             else if(leftWall[n].intersects(man))
  263.                 man.x=leftWall[n].x-man.width;
  264.             else if(rightWall[n].intersects(man))
  265.                 man.x=rightWall[n].x+rightWall[n].width;
  266.         }
  267.  
  268.         man.move(contact,ladderContact);
  269.  
  270.         if((bullet=man.shoot())!=null&&bulletVector.isEmpty())
  271.             bulletVector.addElement(bullet);
  272.     }
  273.  
  274.     private void moveBullet(Bullet bullet)
  275.     {
  276.         int n;
  277.  
  278.         for(n=0;n<wall.length;n++)
  279.             if(wall[n].intersects(bullet)||!this.intersects(bullet))
  280.                 bullet.kill();
  281.  
  282.         bullet.move();
  283.     }
  284.  
  285.     public void draw(Graphics graphics,Color background)
  286.     {
  287.         int n;
  288.  
  289.         for(n=0;n<link.length;n++)
  290.             link[n].draw(graphics);
  291.  
  292.         for(n=0;n<wall.length;n++)
  293.             wall[n].draw(graphics);
  294.  
  295.         for(n=0;n<ladder.length;n++)
  296.             ladder[n].draw(graphics);
  297.  
  298.         graphics.setXORMode(background);
  299.  
  300.         for(n=0;n<manVector.size();n++)
  301.             ((Man)manVector.elementAt(n)).draw(graphics);
  302.  
  303.         for(n=0;n<bulletVector.size();n++)
  304.             ((Bullet)bulletVector.elementAt(n)).draw(graphics);
  305.     }
  306.  
  307.     public void redraw(Graphics graphics,Color background)
  308.     {
  309.         int n;
  310.         Bullet bullet;
  311.  
  312.         graphics.setXORMode(background);
  313.  
  314.         for(n=0;n<manVector.size();n++)
  315.             ((Man)manVector.elementAt(n)).redraw(graphics);
  316.  
  317.         for(n=0;n<bulletVector.size();n++)
  318.         {
  319.             (bullet=(Bullet)bulletVector.elementAt(n)).redraw(graphics);
  320.  
  321.             if(bullet.isKilled())
  322.                 bulletVector.removeElement(bullet);
  323.         }
  324.     }
  325. }
  326.  
  327. class Man extends Rectangle
  328. {
  329.     private static final int WIDTH=28;
  330.     private static final int HEIGHT=26;
  331.  
  332.     private static final int FRAME_FRONT=0;
  333.     private static final int FRAME_JUMPUP=1;
  334.     private static final int FRAME_HANDSUP=2;
  335.     private static final int FRAME_LEFT1=3;
  336.     private static final int FRAME_LEFT2=4;
  337.     private static final int FRAME_LEFT3=5;
  338.     private static final int FRAME_LEFT4=6;
  339.     private static final int FRAME_RIGHT1=7;
  340.     private static final int FRAME_RIGHT2=8;
  341.     private static final int FRAME_RIGHT3=9;
  342.     private static final int FRAME_RIGHT4=10;
  343.     private static final int FRAME_JUMPLEFT1=11;
  344.     private static final int FRAME_JUMPLEFT2=12;
  345.     private static final int FRAME_JUMPLEFT3=13;
  346.     private static final int FRAME_JUMPLEFT4=14;
  347.     private static final int FRAME_JUMPRIGHT1=15;
  348.     private static final int FRAME_JUMPRIGHT2=16;
  349.     private static final int FRAME_JUMPRIGHT3=17;
  350.     private static final int FRAME_JUMPRIGHT4=18;
  351.     private static final int FRAME_UP1=19;
  352.     private static final int FRAME_UP2=20;
  353.     private static final int FRAME_UP3=21;
  354.  
  355.     private static final int NEXTFRAME[]=
  356.     {
  357.         FRAME_JUMPUP,FRAME_FRONT,
  358.         FRAME_HANDSUP,
  359.         FRAME_LEFT2,FRAME_LEFT3,FRAME_LEFT4,FRAME_LEFT1,
  360.         FRAME_RIGHT2,FRAME_RIGHT3,FRAME_RIGHT4,FRAME_RIGHT1,
  361.         FRAME_JUMPLEFT2,FRAME_JUMPLEFT3,FRAME_JUMPLEFT4,FRAME_JUMPLEFT1,
  362.         FRAME_JUMPRIGHT2,FRAME_JUMPRIGHT3,FRAME_JUMPRIGHT4,FRAME_JUMPRIGHT1,
  363.         FRAME_UP2,FRAME_UP3,FRAME_UP1
  364.     };
  365.  
  366.     private static final int IMAGE_FRONT=0;
  367.     private static final int IMAGE_HANDSUP=1;
  368.     private static final int IMAGE_JUMPUP=2;
  369.     private static final int IMAGE_LEFT1=3;
  370.     private static final int IMAGE_LEFT2=4;
  371.     private static final int IMAGE_LEFT3=5;
  372.     private static final int IMAGE_RIGHT1=6;
  373.     private static final int IMAGE_RIGHT2=7;
  374.     private static final int IMAGE_RIGHT3=8;
  375.     private static final int IMAGE_UP1=9;
  376.     private static final int IMAGE_UP2=10;
  377.     private static final int IMAGE_UP3=11;
  378.  
  379.     private static final int IMAGE[]=
  380.     {
  381.         IMAGE_FRONT,IMAGE_JUMPUP,
  382.         IMAGE_HANDSUP,
  383.         IMAGE_LEFT1,IMAGE_LEFT2,IMAGE_LEFT3,IMAGE_LEFT2,
  384.         IMAGE_RIGHT1,IMAGE_RIGHT2,IMAGE_RIGHT3,IMAGE_RIGHT2,
  385.         IMAGE_LEFT1,IMAGE_LEFT2,IMAGE_LEFT3,IMAGE_LEFT2,
  386.         IMAGE_RIGHT1,IMAGE_RIGHT2,IMAGE_RIGHT3,IMAGE_RIGHT2,
  387.         IMAGE_UP1,IMAGE_UP2,IMAGE_UP3
  388.     };
  389.  
  390.     private static final int X=0;
  391.     private static final int Y=1;
  392.  
  393.     private static final int OFFSET[][]=
  394.     {
  395.         {0,0},{0,0},
  396.         {0,0},
  397.         {8,0},{4,0},{0,0},{4,0},
  398.         {4,0},{4,0},{-4,0},{4,0},
  399.         {8,0},{4,0},{0,0},{4,0},
  400.         {4,0},{4,0},{-4,0},{4,0},
  401.         {4,0},{0,0},{-4,0}
  402.     };
  403.  
  404.     private static final int FRONTDELAY=64;
  405.     private static final int JUMPUPDELAY=4;
  406.     private static final int HANDSUPDELAY=1;
  407.     private static final int WALKDELAY=2;
  408.     private static final int JUMPDELAY1=16;
  409.     private static final int JUMPDELAY2=2;
  410.     private static final int CLIMBDELAY=4;
  411.  
  412.     private static final int DELAY[]=
  413.     {
  414.         FRONTDELAY,JUMPUPDELAY,
  415.         HANDSUPDELAY,
  416.         WALKDELAY,WALKDELAY,WALKDELAY,WALKDELAY,
  417.         WALKDELAY,WALKDELAY,WALKDELAY,WALKDELAY,
  418.         JUMPDELAY2,JUMPDELAY2,JUMPDELAY1,JUMPDELAY2,
  419.         JUMPDELAY2,JUMPDELAY2,JUMPDELAY1,JUMPDELAY2,
  420.         CLIMBDELAY,CLIMBDELAY,CLIMBDELAY
  421.     };
  422.  
  423.     private static final int VELOCITY=4;
  424.  
  425.     private static final int MOVEMENT[][]=
  426.     {
  427.         {0,0},{0,-VELOCITY},
  428.         {0,0},
  429.         {-VELOCITY,0},{-VELOCITY,0},{-VELOCITY,0},{-VELOCITY,0},
  430.         {VELOCITY,0},{VELOCITY,0},{VELOCITY,0},{VELOCITY,0},
  431.         {-VELOCITY,0},{-VELOCITY,0},{-VELOCITY,-VELOCITY},{-VELOCITY,0},
  432.         {VELOCITY,0},{VELOCITY,0},{VELOCITY,-VELOCITY},{VELOCITY,0},
  433.         {0,-VELOCITY},{0,-VELOCITY},{0,-VELOCITY}
  434.     };
  435.  
  436.     private static final int FALLING_Y=4;
  437.  
  438.     public static Image image[];
  439.  
  440.     private int frame;
  441.     private int delay;
  442.  
  443.     private int undrawFrame;
  444.     private Point undrawLocation;
  445.  
  446.     private int previousDirection;
  447.     private boolean previousContact;
  448.  
  449.     private Softstick softstick;
  450.  
  451.     public Man(int x,int y,Softstick softstick)
  452.     {
  453.         super(x,y,WIDTH,HEIGHT);
  454.  
  455.         setFrame(FRAME_FRONT);
  456.  
  457.         undrawLocation=new Point(0,0);
  458.  
  459.         previousDirection=Softstick.CENTERED;
  460.         previousContact=false;
  461.  
  462.         this.softstick=softstick;
  463.     }
  464.  
  465.     private void setFrame(int frame)
  466.     {
  467.         this.frame=frame;
  468.         delay=0;
  469.     }
  470.  
  471.     public boolean mode2()
  472.     {
  473.         return frame==FRAME_FRONT&&softstick.getFire();
  474.     }
  475.  
  476.     private void moveFrame(boolean ladderContact)
  477.     {
  478.         int direction;
  479.  
  480.         if((direction=softstick.getDirection())==previousDirection)
  481.         {
  482.             if(++delay==DELAY[frame])
  483.                 setFrame(NEXTFRAME[frame]);
  484.         }
  485.         else if(direction==Softstick.LEFT||direction==Softstick.LEFTDOWN)
  486.             setFrame(FRAME_LEFT1);
  487.         else if(direction==Softstick.RIGHT||direction==Softstick.RIGHTDOWN)
  488.             setFrame(FRAME_RIGHT1);
  489.         else if(direction==Softstick.UP)
  490.         {
  491.             if(ladderContact)
  492.                 setFrame(FRAME_UP1);
  493.             else
  494.                 setFrame(FRAME_HANDSUP);
  495.         }
  496.         else if(direction==Softstick.LEFTUP)
  497.             setFrame(FRAME_JUMPLEFT1);
  498.         else if(direction==Softstick.RIGHTUP)
  499.             setFrame(FRAME_JUMPRIGHT1);
  500.         else
  501.             setFrame(FRAME_FRONT);
  502.  
  503.         previousDirection=direction;
  504.     }
  505.  
  506.     public void move(boolean contact,boolean ladderContact)
  507.     {
  508.         moveFrame(ladderContact);
  509.  
  510.         if((contact=contact||DELAY[frame]==JUMPDELAY1&&previousContact))
  511.             translate(MOVEMENT[frame][X],delay==0?MOVEMENT[frame][Y]:0);
  512.         else
  513.             translate(0,FALLING_Y);
  514.  
  515.         previousContact=contact;
  516.     }
  517.  
  518.     public Bullet shoot()
  519.     {
  520.         Bullet bullet;
  521.  
  522.         bullet=null;
  523.  
  524.         if(softstick.getFire())
  525.         {
  526.             if((previousDirection&Softstick.LEFTMASK)!=0)
  527.                 bullet=new Bullet(x,y+height/2,Softstick.LEFT);
  528.             else if((previousDirection&Softstick.RIGHTMASK)!=0)
  529.                 bullet=new Bullet(x+width,y+height/2,Softstick.RIGHT);
  530.         }
  531.  
  532.         return bullet;
  533.     }
  534.  
  535.     public void draw(Graphics graphics)
  536.     {
  537.         graphics.drawImage(image[IMAGE[frame]],x+OFFSET[frame][X],y+OFFSET[frame][Y],null);
  538.  
  539.         undrawLocation.move(x+OFFSET[frame][X],y+OFFSET[frame][Y]);
  540.         undrawFrame=frame;
  541.     }
  542.  
  543.     public void redraw(Graphics graphics)
  544.     {
  545.         if(x+OFFSET[frame][X]!=undrawLocation.x||y+OFFSET[frame][Y]!=undrawLocation.y||frame!=undrawFrame)
  546.         {
  547.             graphics.drawImage(image[IMAGE[undrawFrame]],undrawLocation.x,undrawLocation.y,null);
  548.             draw(graphics);
  549.         }
  550.     }
  551. }
  552.  
  553. class Bullet extends Rectangle
  554. {
  555.     public static Image image;
  556.  
  557.     private static final int VELOCITY=32;
  558.  
  559.     private int xvelocity;
  560.     private Point undrawLocation;
  561.  
  562.     private static final int NODRAW=0;
  563.     private static final int DRAW=1;
  564.     private static final int UNDRAW=2;
  565.  
  566.     private int drawState;
  567.  
  568.     public Bullet(int x,int y,int direction)
  569.     {
  570.         super(x,y,image.getWidth(null),image.getHeight(null));
  571.         translate(0,-height/2);
  572.  
  573.         if(direction==Softstick.LEFT)
  574.         {
  575.             translate(-width,0);
  576.             xvelocity=-VELOCITY;
  577.         }
  578.         else if(direction==Softstick.RIGHT)
  579.         {
  580.             xvelocity=VELOCITY;
  581.         }
  582.  
  583.         undrawLocation=new Point(0,0);
  584.         drawState=DRAW;
  585.     }
  586.  
  587.     public void move()
  588.     {
  589.         translate(xvelocity,0);
  590.     }
  591.  
  592.     public void draw(Graphics graphics)
  593.     {
  594.         graphics.drawImage(image,x,y,null);
  595.  
  596.         undrawLocation.move(x,y);
  597.         drawState|=UNDRAW;
  598.     }
  599.  
  600.     public void redraw(Graphics graphics)
  601.     {
  602.         if((drawState&UNDRAW)!=0)
  603.             graphics.drawImage(image,undrawLocation.x,undrawLocation.y,null);
  604.  
  605.         if((drawState&DRAW)!=0)
  606.             draw(graphics);
  607.     }
  608.  
  609.     public void kill()
  610.     {
  611.         drawState&=~DRAW;
  612.     }
  613.  
  614.     public boolean isKilled()
  615.     {
  616.         return (drawState&DRAW)==0;
  617.     }
  618. }
  619.  
  620. public class Pharaoh extends Applet implements Runnable
  621. {
  622.     private static final int DELAY=50;
  623.  
  624.     private static final String manimage[]=
  625.     {
  626.         "images/man/front.gif",
  627.         "images/man/handsup.gif",
  628.         "images/man/jumpup.gif",
  629.         "images/man/left1.gif",
  630.         "images/man/left2.gif",
  631.         "images/man/left3.gif",
  632.         "images/man/right1.gif",
  633.         "images/man/right2.gif",
  634.         "images/man/right3.gif",
  635.         "images/man/up1.gif",
  636.         "images/man/up2.gif",
  637.         "images/man/up3.gif"
  638.     };
  639.  
  640.     private static final String bulletimage="images/bullet.gif";
  641.  
  642.     private static final String linkurl[]=
  643.     {
  644.         "../double.html",
  645.         "../kubik.html",
  646.         "../uhr.html",
  647.         "../countdown.html",
  648.         "../pharaoh.html",
  649.         "../webcom.html",
  650.         "../contents.html",
  651.         "../introduction.html",
  652.         "../photos.html",
  653.         "../links.html",
  654.         "../curriculum_vitae.html",
  655.         "../list_of_subjects.html",
  656.         "../contact.html"
  657.     };
  658.  
  659.     private static final String linkimage[]=
  660.     {
  661.         "images/links/double_link.gif",
  662.         "images/links/kubik_link.gif",
  663.         "images/links/uhr_link.gif",
  664.         "images/links/countdown_link.gif",
  665.         "images/links/pharaoh_link.gif",
  666.         "images/links/webcom_link.gif",
  667.         "images/links/contents_link.gif",
  668.         "images/links/introduction_link.gif",
  669.         "images/links/photos_link.gif",
  670.         "images/links/links_link.gif",
  671.         "images/links/curriculum_vitae_link.gif",
  672.         "images/links/list_of_subjects_link.gif",
  673.         "images/links/contact_link.gif"
  674.     };
  675.  
  676.     private static final int WIDTH=640;
  677.     private static final int HEIGHT=400;
  678.     private static final int WALLSIZE=10;
  679.     private static final int LADDERWIDTH=5;
  680.     private static final int STAIRSWIDTH=100;
  681.     private static final int PLATEAUWIDTH=100;
  682.     private static final int STAIRSSTEP=15;
  683.     private static final int CONTENTSWIDTH=68;
  684.     private static final int INTRODUCTIONWIDTH=96;
  685.     private static final int PHOTOSWIDTH=51;
  686.     private static final int LINKSWIDTH=38;
  687.     private static final int CONTACTWIDTH=60;
  688.     private static final int LISTWIDTH=117;
  689.     private static final int CVWIDTH=124;
  690.     private static final int TEXTHEIGHT=15;
  691.     private static final int RIGHTBLOCKWIDTH=200;
  692.     private static final int PERSONALBLOCKHEIGHT=180;
  693.     private static final int FLOORHEIGHT=40;
  694.     private static final int SHAFTWIDTH=40;
  695.     private static final int DOUBLEWIDTH=128;
  696.     private static final int DOUBLEHEIGHT=32;
  697.     private static final int KUBIKWIDTH=111;
  698.     private static final int KUBIKHEIGHT=38;
  699.     private static final int UHRWIDTH=49;
  700.     private static final int UHRHEIGHT=49;
  701.     private static final int COUNTDOWNWIDTH=105;
  702.     private static final int COUNTDOWNHEIGHT=36;
  703.     private static final int PHARAOHWIDTH=112;
  704.     private static final int PHARAOHHEIGHT=34;
  705.     private static final int WEBCOMWIDTH=70;
  706.     private static final int WEBCOMHEIGHT=22;
  707.     private static final int SOFTWAREPLATEAUWIDTH=80;
  708.  
  709.     private static final int linkposition[][]=
  710.     {
  711.         // software block
  712.  
  713.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-DOUBLEWIDTH/2,WALLSIZE+2*(HEIGHT-2*WALLSIZE)/7-DOUBLEHEIGHT-WALLSIZE/2},
  714.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-KUBIKWIDTH/2,WALLSIZE+3*(HEIGHT-2*WALLSIZE)/7-KUBIKHEIGHT-WALLSIZE/2},
  715.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-UHRWIDTH/2,WALLSIZE+4*(HEIGHT-2*WALLSIZE)/7-UHRHEIGHT-WALLSIZE/2},
  716.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-COUNTDOWNWIDTH/2,WALLSIZE+5*(HEIGHT-2*WALLSIZE)/7-COUNTDOWNHEIGHT-WALLSIZE/2},
  717.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-PHARAOHWIDTH/2,WALLSIZE+6*(HEIGHT-2*WALLSIZE)/7-PHARAOHHEIGHT-WALLSIZE/2},
  718.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-WEBCOMWIDTH/2,WALLSIZE+7*(HEIGHT-2*WALLSIZE)/7-WEBCOMHEIGHT-WALLSIZE/2},
  719.  
  720.         // contents
  721.  
  722.         {WIDTH/2-CONTENTSWIDTH/2,WALLSIZE+FLOORHEIGHT-TEXTHEIGHT},
  723.  
  724.         // personal block
  725.  
  726.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH/2-INTRODUCTIONWIDTH/2,HEIGHT-WALLSIZE-PERSONALBLOCKHEIGHT+(PERSONALBLOCKHEIGHT-FLOORHEIGHT)/6},
  727.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH/2-PHOTOSWIDTH/2,HEIGHT-WALLSIZE-PERSONALBLOCKHEIGHT+3*(PERSONALBLOCKHEIGHT-FLOORHEIGHT)/6},
  728.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH/2-LINKSWIDTH/2,HEIGHT-WALLSIZE-PERSONALBLOCKHEIGHT+5*(PERSONALBLOCKHEIGHT-FLOORHEIGHT)/6},
  729.  
  730.         // official block
  731.  
  732.         {WIDTH-WALLSIZE-CVWIDTH-WALLSIZE/2,HEIGHT-5*WALLSIZE-PERSONALBLOCKHEIGHT-3*FLOORHEIGHT-TEXTHEIGHT},
  733.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH+WALLSIZE/2,HEIGHT-4*WALLSIZE-PERSONALBLOCKHEIGHT-2*FLOORHEIGHT-TEXTHEIGHT},
  734.         {WIDTH-WALLSIZE-CONTACTWIDTH-WALLSIZE/2,HEIGHT-3*WALLSIZE-PERSONALBLOCKHEIGHT-FLOORHEIGHT-TEXTHEIGHT}
  735.     };
  736.  
  737.     private static final int wallbounds[][]=
  738.     {
  739.         // bounding rectangle
  740.  
  741.         {0,0,WALLSIZE,HEIGHT-WALLSIZE-FLOORHEIGHT},
  742.         {0,HEIGHT-WALLSIZE,WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH,WALLSIZE},
  743.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2,HEIGHT-WALLSIZE,WALLSIZE+RIGHTBLOCKWIDTH/2+WALLSIZE/2,WALLSIZE},
  744.         {WALLSIZE,0,WIDTH-WALLSIZE,WALLSIZE},
  745.         {WIDTH-WALLSIZE,WALLSIZE+FLOORHEIGHT,WALLSIZE,HEIGHT-2*WALLSIZE-FLOORHEIGHT},
  746.  
  747.         // stairs & contents plateau
  748.  
  749.         {WIDTH/2-STAIRSWIDTH/2,HEIGHT-2*WALLSIZE,STAIRSWIDTH,WALLSIZE},
  750.         {WIDTH/2-STAIRSWIDTH/2+STAIRSSTEP,HEIGHT-3*WALLSIZE,STAIRSWIDTH-2*STAIRSSTEP,WALLSIZE},
  751.         {WIDTH/2-STAIRSWIDTH/2+2*STAIRSSTEP,HEIGHT-4*WALLSIZE,STAIRSWIDTH-4*STAIRSSTEP,WALLSIZE},
  752.         {WIDTH/2-PLATEAUWIDTH/2,WALLSIZE+FLOORHEIGHT,PLATEAUWIDTH,WALLSIZE},
  753.         {WIDTH/2-PLATEAUWIDTH/2-2*WALLSIZE,2*WALLSIZE,WALLSIZE,FLOORHEIGHT-WALLSIZE},
  754.  
  755.         // personal block
  756.  
  757.         {WIDTH-2*WALLSIZE-RIGHTBLOCKWIDTH,WALLSIZE,WALLSIZE,HEIGHT-2*WALLSIZE-FLOORHEIGHT},
  758.         {WIDTH-2*WALLSIZE-SHAFTWIDTH,HEIGHT-WALLSIZE-PERSONALBLOCKHEIGHT,WALLSIZE,PERSONALBLOCKHEIGHT-FLOORHEIGHT},
  759.         {WIDTH-WALLSIZE-WALLSIZE/2-RIGHTBLOCKWIDTH/2,HEIGHT-2*WALLSIZE-PERSONALBLOCKHEIGHT,RIGHTBLOCKWIDTH/2+WALLSIZE/2,WALLSIZE},
  760.  
  761.         // official block
  762.  
  763.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH,HEIGHT-2*WALLSIZE-PERSONALBLOCKHEIGHT,RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH,WALLSIZE},
  764.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH+SHAFTWIDTH,HEIGHT-3*WALLSIZE-PERSONALBLOCKHEIGHT-FLOORHEIGHT,RIGHTBLOCKWIDTH-SHAFTWIDTH,WALLSIZE},
  765.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH,HEIGHT-4*WALLSIZE-PERSONALBLOCKHEIGHT-2*FLOORHEIGHT,RIGHTBLOCKWIDTH-SHAFTWIDTH,WALLSIZE},
  766.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH+SHAFTWIDTH,HEIGHT-5*WALLSIZE-PERSONALBLOCKHEIGHT-3*FLOORHEIGHT,RIGHTBLOCKWIDTH-SHAFTWIDTH,WALLSIZE},
  767.  
  768.         // software block
  769.  
  770.         {WALLSIZE+SHAFTWIDTH,WALLSIZE+(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE},
  771.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH,WALLSIZE+2*(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE},
  772.         {WALLSIZE+SHAFTWIDTH,WALLSIZE+3*(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE},
  773.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH,WALLSIZE+4*(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE},
  774.         {WALLSIZE+SHAFTWIDTH,WALLSIZE+5*(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE},
  775.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH,WALLSIZE+6*(HEIGHT-2*WALLSIZE)/7,SOFTWAREPLATEAUWIDTH,WALLSIZE}
  776.     };
  777.  
  778.     private static final int ladderbounds[][]=
  779.     {
  780.         // contents plateau
  781.  
  782.         {WIDTH/2-LADDERWIDTH/2,2*WALLSIZE+FLOORHEIGHT,LADDERWIDTH,HEIGHT-6*WALLSIZE-FLOORHEIGHT},
  783.  
  784.         // personal block
  785.  
  786.         {WIDTH-WALLSIZE-SHAFTWIDTH/2-LADDERWIDTH/2,HEIGHT-WALLSIZE-PERSONALBLOCKHEIGHT,LADDERWIDTH,PERSONALBLOCKHEIGHT},
  787.  
  788.         // official block
  789.  
  790.         {WIDTH-WALLSIZE-SHAFTWIDTH-SHAFTWIDTH/2-LADDERWIDTH/2,HEIGHT-2*WALLSIZE-PERSONALBLOCKHEIGHT-FLOORHEIGHT,LADDERWIDTH,FLOORHEIGHT},
  791.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH+SHAFTWIDTH+SHAFTWIDTH/2-LADDERWIDTH/2,HEIGHT-3*WALLSIZE-PERSONALBLOCKHEIGHT-2*FLOORHEIGHT,LADDERWIDTH,FLOORHEIGHT},
  792.         {WIDTH-WALLSIZE-SHAFTWIDTH-SHAFTWIDTH/2-LADDERWIDTH/2,HEIGHT-4*WALLSIZE-PERSONALBLOCKHEIGHT-3*FLOORHEIGHT,LADDERWIDTH,FLOORHEIGHT},
  793.  
  794.         // software block
  795.  
  796.         {WALLSIZE+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH+SHAFTWIDTH+SOFTWAREPLATEAUWIDTH/2-LADDERWIDTH/2,2*WALLSIZE+6*(HEIGHT-2*WALLSIZE)/7,LADDERWIDTH,HEIGHT-3*WALLSIZE-6*(HEIGHT-2*WALLSIZE)/7}
  797.     };
  798.  
  799.     private static final int teleportData[][]=
  800.     {
  801.         {WIDTH-WALLSIZE-RIGHTBLOCKWIDTH/2-WALLSIZE/2-SHAFTWIDTH,HEIGHT,SHAFTWIDTH,FLOORHEIGHT,WALLSIZE+SHAFTWIDTH/2+SOFTWAREPLATEAUWIDTH/2,WALLSIZE},
  802.         {-SHAFTWIDTH,HEIGHT-WALLSIZE-FLOORHEIGHT,SHAFTWIDTH,FLOORHEIGHT,WIDTH-SHAFTWIDTH,WALLSIZE},
  803.         {WIDTH,WALLSIZE,SHAFTWIDTH,FLOORHEIGHT,0,HEIGHT-WALLSIZE-FLOORHEIGHT}
  804.     };
  805.  
  806.     private ImageProvider imageprovider;
  807.     private Chamber chamber;
  808.     private Softstick softstick;
  809.     private Thread thread;
  810.  
  811.     public void init()
  812.     {
  813.         imageprovider=new ImageProvider(this);
  814.         Chamber.applet=this;
  815.  
  816.         chamber=new Chamber(bounds(),linkurl,imageprovider.getArray(linkimage),linkposition,wallbounds,ladderbounds,teleportData);
  817.         softstick=new Softstick();
  818.         chamber.addMan(new Man(teleportData[0][4],teleportData[0][5],softstick));
  819.         thread=null;
  820.  
  821.         Link.appletContext=getAppletContext();
  822.         Link.softstick=softstick;
  823.         Man.image=imageprovider.getArray(manimage);
  824.         Bullet.image=imageprovider.get(bulletimage);
  825.  
  826.         setBackground(Color.black);
  827.     }
  828.  
  829.     public void start()
  830.     {
  831.         if(thread==null)
  832.         {
  833.             thread=new Thread(this);
  834.             thread.start();
  835.         }
  836.     }
  837.  
  838.     public void stop()
  839.     {
  840.         if(thread!=null)
  841.         {
  842.             thread.stop();
  843.             thread=null;
  844.         }
  845.     }
  846.  
  847.     public boolean handleEvent(Event event)
  848.     {
  849.         return softstick.handleEvent(event);
  850.     }
  851.  
  852.     public void paint(Graphics graphics)
  853.     {
  854.         chamber.draw(graphics,getBackground());
  855.     }
  856.  
  857.     public void update(Graphics graphics)
  858.     {
  859.         chamber.redraw(graphics,getBackground());
  860.     }
  861.  
  862.     public void run()
  863.     {
  864.         requestFocus();
  865.  
  866.         for(;;)
  867.         {
  868.             try
  869.             {
  870.                 Thread.sleep(DELAY);
  871.             }
  872.             catch(InterruptedException exception)
  873.             {
  874.                 System.err.println(exception);
  875.             }
  876.  
  877.             chamber.move();
  878.  
  879.             repaint();
  880.         }
  881.     }
  882. }
  883.  
  884.