String lines[];
String gun = "";
int linecount;
invader i ;
HashSet invaders = new HashSet();
HashSet deads = new HashSet();
HashSet killers = new HashSet();
float counter = 0;

float timeToNext = 200;
float timer = timeToNext;

void setup(){
  size(400,400);
    textFont(loadFont("Arial-Black-14.vlw"),14);
  lines = loadStrings("words.txt"); 
  linecount = lines.length;

frameRate(30);

  
 
}

boolean virgin = true;

void mousePressed(){
  virgin = false;
 if(lives <= 0){
    lives = 3;
   timeToNext = 200;
   timer = timeToNext;
 invaders = new HashSet();
 deads = new HashSet();
 killers = new HashSet();
counter = 0;
invader newinv = new invader();
    invaders.add(newinv);
 } 
  score = 0;
}



int score = 0;
int lives = 0;



void draw(){
 counter++; 
  background(128);

if(virgin){
  fill(255);
   text("click to play",10,100);
   text("PHONEME INVADERS",80,150); 
      text("type the word that is sounded out",100,200); 
            text("before it destroys your planet",100,220); 
                  text("or whatever",100,240); 
}

  fill(0);
   text(gun,10,390);
   

fill(255);
  Iterator i = invaders.iterator();

  while(i.hasNext()){
     invader inv = (invader)i.next();

    if(lives > 0) {inv.move();}
     inv.show();
          if(inv.y > 375){
        lives--;
        i.remove();
killers.add(inv);        
     } 
     
  }
  
   i = killers.iterator();
  while(i.hasNext()){
  fill(255);
    invader inv = (invader)i.next();
     inv.show();
fill(128,0,0);
    inv.killershow();
  }
  
fill(0);   
   i = deads.iterator();
  while(i.hasNext()){
     invader inv = (invader)i.next();
     inv.deadmove();
     if(inv.y > 400){
       //println("deader");
        i.remove(); 
     }
     inv.show();
  }
  
  timer--;
    if(timer == 0){
           if(timeToNext > 50) {timeToNext-= 10;}
            timer = timeToNext;
     invaders.add(new invader()); 

   }
   
   line(0,350,400,350);
      text("score:"+score+" lives:"+lives,200,390);

  if(invaders.size() == 0){
     invaders.add(new invader()); 
  } 
}

void tryToKill(String s){
     if(lives>0){
      
       Iterator i = invaders.iterator();
  while(i.hasNext()){
     invader inv = (invader)i.next();
     if(inv.word.equals(s)){
       i.remove();
       inv.kill();
      deads.add(inv); 
       //println("kill"); 
       score++;
      
     }
  }
     
  }
  
}


void keyPressed(){
  if(keyCode == ENTER || keyCode == RETURN){
      tryToKill(gun);
     gun = "";
     return;
  }  if(keyCode == BACKSPACE || keyCode == DELETE){
      if(gun.length() > 0){
         gun = gun.substring(0,gun.length()-1); 
      }
    
    return;
  }
  if(key >= 'a' && key <= 'z'){
    gun += key;

  }
}



class invader{
  String word; String[] parts;

  float x ,y;
  float xs[];float xp[];
float fat;
float speed;
  invader(){
   String line = lines[int(random(linecount))] ;
     word = digWord(line);
     //println(word);

     parts = digParts(line);


          xp = new float[parts.length];
          calcfat();
          x = random(400 - fat);
              for(int i = 0 ; i < parts.length; i++){
                 xp[i] += x; 
              }
          y = 0;
          speed = 1 + random(.3);
  }
 
  void move(){
     y += speed; 
  }
  void calcfat(){
    fat = 0;
    for(int i = 0 ; i < parts.length; i++){
      xp[i] = fat;
      fat += textWidth(parts[i])+5;
    }
    //println("fat is "+fat);
  }
  
  void killershow(){
   text(word,x,y); 
  }
  
  void kill(){
     speed -= 1; 
          xs = new float[parts.length];
         for(int i = 0; i < parts.length; i++){
           xs[i] = random(-.5,.5);  
         }
         

  }
  
  void deadmove(){
  for(int i = 0; i < parts.length; i++){
     xp[i] += xs[i];
  } 
    speed += .1; 
     y += speed;
  }
  
  void show(){  

    for(int i = 0 ; i < parts.length; i++){
      
     text(parts[i],xp[i],y); 

    }
    
  }
  
  
  String digWord(String full){
  String[] tabsplit = full.split("\t");
    return tabsplit[0];
}


String [] digParts(String full){
  String[] tabsplit = full.split("\t");
  String[] spacesplit = tabsplit[1].split(" ");
  return spacesplit;
}

}