package project;
import Collection.*;

public class Church extends Location implements Item {
 
  private boolean print;
  
  public Church(ManageText t, Player1 p) {
	player = p;
	text = t;
	StageClear = false;
	count = new countMonsterV();
  } //method Church
  
  public void acceptVisitor(Visitor v) { v.visitMe(this); }
  
  public void start() { 
    GameState = true;
	player.setLocation(1,1);   //starting position
	player.Restore();
    initStage();
	StageIntro();
  } //method start
  
  public void initStage() {
    monsters = new ListC();
	items = new ListC();
	
	Monster zombie1 = new Zombie(player, 1, 10);
	Monster zombie2 = new Zombie(player, 1, 4);
	Monster draculaBat = new DraculaBat (player, 1, 8);
	Monster blackDragon1 = new BlackDragon (player, 1, 11);
	Monster blackDragon2 = new BlackDragon (player, 1, 17);
	Monster flyZombie = new FlyingZombie (player, 1, 19);
	monsters.add(zombie1);
	monsters.add(zombie2);
	monsters.add(blackDragon1);
	monsters.add(blackDragon2);
	monsters.add(draculaBat);
	monsters.add(flyZombie);
	
	Weapon rocket = new RocketLauncher (player, 1, 15);
	Weapon shotgun = new Shotgun (player, 1, 6);
	food apple1 = new PoisonApple (player, 1, 12);
	food orange = new Orange (player, 1, 14);
	items.add(shotgun);
	items.add(apple1);
	items.add(orange);
	items.add(rocket);
  } //method initStage
  
  public void update() {
	if (GameState) {
	  try {
	    acceptVisitor(count);
	    count.getCount();
	  } catch (StageClearException exception) {
	     StageClear = true;
		 GameState = false;
	     if (!print) text.println ("You've walked out the church...");
	     print = true;   //prevents overprinting messages
	  } //catch
	  updateMonster();
	  updateItem();
      if (!player.Alive) GameState = false;
	} //if
  } //method StageUpdate
   
  public void updateMonster() {
	 monsters.start();
     while(monsters.more()) {
	   Monster currentMonster = (Monster)monsters.get();
       currentMonster.update();
     } //while
  } //method updateMonster
  
  public void updateItem() {
    items.start();
	while(items.more()) {
	  StageItem currentItem = ( StageItem ) items.get();
	  currentItem.update();
    } //while
  } //method updateItem
  
  public void StageIntro() { 
   text.println ("~~As you exited the garden...An old abandoned church appeared... "); 
   text.println ("You could see nothing but the shadows of ruins..You walked in~~");
   text.println ("Second Episode: ~~Church~~");
  } 
  
  public boolean StageCleared() { return StageClear; }
  public boolean getGameState() { return GameState; }
  
  public void AttackMe(Player1 p) {
    Monster monster = ( Monster )p.target;
    MonsterAttack = new MonsterBattleMode( monster );
	try { MonsterAttack.Attack();
	} catch (NullTargetException exception) {}
  } //method AttackMe
 
} // class Church