/* * Permission to use, copy, modify and distribute this software and its * documentation without fee for NON-COMMERCIAL purposes is hereby granted * provided that this notice with a reference to the original source and * the author appears in all copies or derivatives of this software. * * THE AUTHOR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THIS SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY ANYBODY AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ import java.awt.*; import java.lang.*; /** * fire - A firelike display * Inspired by VangelisTeam's PC fire demo * * @version 1.0, 12/21/95 * @author Javier Rodriguez (jrodrig@data.net.mx) */ public class fire extends java.applet.Applet implements Runnable { boolean first=true; int ROWS = 50; int COLS = 64; int HIDDEN = 4; int ROWS_SEED = 4; int ROWS_RESEED = 48; int MAX_SEED = 8; int PALETTE_SIZE = 64; int COOLING_LIMIT = 32; int COOLING_ROWS = 42; int COOLING_FACTOR = 2; java.awt.Color palette[] = new java.awt.Color[PALETTE_SIZE]; byte Buffer[],Buffer2[]; String message,textfont; int textsize,textX,textY; Color textcolor; Image offScrImage=null; Graphics offScrGC; Dimension offScrSize; Thread kicker=null; public String getAppletInfo() { return "Fire applet by Javier Rodriguez "; } public String[][] getParameterInfo() { String[][] info = { {"coolingrows", "int", "number of rows to cool"}, {"coolingfactor", "int", "cooling factor"}, {"coolinglimit", "int", "cooling threshold"}, {"soundtrack", "url", "background sound"}, {"text", "String", "message"}, {"textcolor", "String", "text color"}, {"textfont", "String", "text font"}, {"textsize", "int", "text size"} }; return info; } public void init() { int r,i; String aux; // Set some constants COLS = size().width; ROWS = size().height + HIDDEN; // Get parameters aux=getParameter("coolinglimit"); if((aux!=null)&&(aux.endsWith("%"))) { aux=aux.substring(0,aux.length()-1); } COOLING_LIMIT = (aux==null)?(int)(PALETTE_SIZE*0.5):(int)(PALETTE_SIZE*(Integer.valueOf(aux).intValue())/100); aux=getParameter("coolingrows"); if((aux!=null)&&(aux.endsWith("%"))) { aux=aux.substring(0,aux.length()-1); } COOLING_ROWS = (aux==null)?(int)(ROWS*0.8):(int)(ROWS*(Integer.valueOf(aux).intValue())/100); aux=getParameter("coolingfactor"); COOLING_FACTOR= (aux==null)?2:(int)(Integer.valueOf(aux).intValue()); ROWS_RESEED = (int)(ROWS*0.96); // Get text parameters aux = getParameter("text"); message=(aux==null)?"":aux; aux = getParameter("textfont"); textfont=(aux==null)?"TimesRoman":aux; aux=getParameter("textsize"); textsize=(aux==null)?18:(Integer.valueOf(aux).intValue()); aux=getParameter("textcolor"); textcolor=hexColor(aux,Color.white); // Setup buffers; Buffer = new byte[COLS*ROWS]; Buffer2 = new byte[COLS*ROWS]; // Setup palette for(i=0; i<16; ++i) palette[i]= new Color(16*i,0,0); for(i=0; i<16; ++i) palette[16+i] = new Color(255, 16*i, 0); for(i=0; i<32; ++i) palette[32+i] = new Color(255,255,8*i); // Setup text Font myFont=new Font(textfont, Font.BOLD, textsize); FontMetrics myMetrix=getFontMetrics(myFont); int textH=myMetrix.getHeight(); int textW=myMetrix.stringWidth(message); textX=(int)((COLS-textW)/2); textY=ROWS-HIDDEN-(int)((ROWS-HIDDEN-textH)/2)-myMetrix.getDescent(); setFont(myFont); // Seed image for(r=COLS*(ROWS-ROWS_SEED); r<(ROWS*COLS); ++r) { Buffer[r]=(byte)(Math.random()*(PALETTE_SIZE-1)); } } void MainLoop() { int r,a,i; for(r=COLS+1;r<(COLS*(ROWS-1))-1;++r) { a=Buffer[r-COLS-1]+Buffer[r-COLS]+Buffer[r-COLS+1]+Buffer[r-1]+Buffer[r+1]+ Buffer[r+COLS-1]+Buffer[r+COLS]+Buffer[r+COLS+1]; // a=(a>>3)%PALETTE_SIZE; a=(a>>3); // Cool flames if(aCOOLING_FACTOR)) a-=COOLING_FACTOR; } Buffer2[r]=(byte)(a); } // Seed at base for(r=COLS*(ROWS_RESEED);r81) { Buffer[i]=(byte)255; Buffer[i-COLS]=(byte)255; Buffer[i+COLS]=(byte)255; Buffer[i-1]=(byte)255; Buffer[i+1]=(byte)255; } return true; } public Color hexColor(String hex, Color std) { try { Integer rgb=new Integer(0); hex.replace('#',' '); hex.trim(); rgb=Integer.valueOf(hex,16); return new Color(rgb.intValue()); } catch (Exception e) { return std; } } }