Dragon Quest

The legendary Char has been terrorizing your village. You, a novice adventurer set out to kill it.

Player AiPlayer;
Player AiPlayer2;
Player AiPlayer3;
Player Neutral;
Player P1;
Entity adventurer;
Entity ship;
Entity Seedling1;
Entity Seedling2;
Entity Manticore;
Entity Totem;
bool flies = false;
bool swims = false;
bool trapclear = false;

void configGame()
{
   //setNumPlayers(4);
   setMapSize(17,17);
   setMapSeed( 10213 );
   setNumFluxWells(0);
   addAIPlayer("Evil Fish","Crypt Doctor",0);
   //addAIPlayer("Evil Fish2","Crypt Doctor2",0);
   //addAIPlayer("Evil Fish3","Crypt Doctor3",0);
   dontNeedDecks();
	setTurnTime(121);
}
void beforeStart()
{
   fogMap();
   AiPlayer = getAIPlayer(0); 
   AiPlayer2 = getAIPlayer(0); 
   AiPlayer3 = getAIPlayer(0); 
   P1 = getHumanPlayer(0); 
   int ds=P1.deckSize();
   for(int n=0; n<ds; n++) P1.removeDeckCard(0);
   int ds2=AiPlayer.deckSize();
   for(int n=0; n<ds2; n++) AiPlayer.removeDeckCard(0);

   // players stuff
   adventurer = createEntity("Novice Adventurer",2,14,P1);
   Entity Throne = createEntity("Hadarck's Throne",2,15,P1);
   enchantEntity(Throne , "Vines of Dellen", P1);
   createEntity("Imperial Stronghold",2,16,P1);
   createEntity("Imperial Keep",0,14,P1);
   createEntity("Imperial Keep",1,16,P1);
   createEntity("Imperial Stronghold",0,13,P1);
   createEntity("Treetop Dominion",-1,-1,P1);
   P1.addToHand("Bindweed Poultice");
   P1.addToHand("Bindweed Poultice");

   // goblin area
   createEntity("Goblin Soldier",8,15,AiPlayer2);
   createEntity("Kobold Warparty",10,10,AiPlayer2);
   createEntity("Glub Bird",8,13,AiPlayer2);
   createEntity("Wasteland Yurt",7,14,AiPlayer2);
   createEntity("Quorum Stone",9,12,AiPlayer2);
   createEntity("Ord Stone",6,11,AiPlayer2);

   //desert
   Entity Corpse;
   Corpse = createEntity("Soldier",9,9,Neutral);
   Corpse.destroy();
   Corpse = createEntity("Soldier",7,7,Neutral);
   Corpse.destroy();
   Totem = createEntity("Desolation Totem",8,8,Neutral);
   //createEntity("Haunt",10,8,AiPlayer2);

   //small forest
   createEntity("Bamboo Watch Tower",0,8,AiPlayer2);
   Entity temple = createEntity("Temple of Zorn",3,5,AiPlayer2);
   enchantEntity(temple, "Vines of Dellen", AiPlayer2);
   createEntity("Tenderfoot Archer",3,1,AiPlayer3);
   createEntity("Trunk Hermit",2,9,AiPlayer3);
   createEntity("Valedune Arborist",1,5,AiPlayer3);

   //big forest
   createEntity("Kithil'aa Treehouse",2,1,AiPlayer3);
   Seedling1 = createEntity("Seedling",1,1,AiPlayer3);
   Seedling2 = createEntity("Seedling",4,2,AiPlayer3);

   //ocean
   createEntity("Chambered Reef",9,0,AiPlayer3);
   createEntity("Mogi Nest",9,2,AiPlayer3);

   //special stuff
   createEntity("Mysterious Cube",16,9,Neutral);
   createEntity("The Nothing",15,9,Neutral);
   createEntity("The Nothing",14,10,Neutral);
   createEntity("The Nothing",13,10,Neutral);
   createEntity("The Nothing",13,11,Neutral);
   createEntity("The Nothing",12,12,Neutral);
   createEntity("The Nothing",11,12,Neutral);
   createEntity("The Nothing",10,13,Neutral);
   createEntity("The Nothing",10,14,Neutral);
   createEntity("The Nothing",9,14,Neutral);
   createEntity("The Nothing",9,15,Neutral);
   createEntity("The Nothing",9,16,Neutral);
   Manticore = createEntity("Dimwitted Manticore",11,0,AiPlayer2);

//custom map made with custom map editor

setTerrain(createLocation(0,0),4,3);
setTerrain(createLocation(0,1),4,3);
setTerrain(createLocation(0,2),4,3);
setTerrain(createLocation(0,3),5,3);
setTerrain(createLocation(0,4),4,3);
setTerrain(createLocation(0,5),4,3);
setTerrain(createLocation(0,6),3,3);
setTerrain(createLocation(0,8),3,3);
setTerrain(createLocation(0,12),4,3);
setTerrain(createLocation(0,13),5,3);
setTerrain(createLocation(0,15),4,3);
setTerrain(createLocation(1,0),5,3);
setTerrain(createLocation(1,1),4,3);
setTerrain(createLocation(1,2),4,3);
setTerrain(createLocation(1,3),5,3);
setTerrain(createLocation(1,4),4,3);
setTerrain(createLocation(1,5),3,3);
setTerrain(createLocation(1,6),3,3);
setTerrain(createLocation(1,7),3,2);
setTerrain(createLocation(1,8),3,2);
setTerrain(createLocation(1,13),3,3);
setTerrain(createLocation(1,14),3,2);
setTerrain(createLocation(1,15),3,2);
setTerrain(createLocation(1,16),4,3);
setTerrain(createLocation(2,0),5,3);
setTerrain(createLocation(2,1),5,3);
setTerrain(createLocation(2,2),4,3);
setTerrain(createLocation(2,3),5,3);
setTerrain(createLocation(2,4),4,3);
setTerrain(createLocation(2,5),3,3);
setTerrain(createLocation(2,6),4,3);
setTerrain(createLocation(2,7),3,3);
setTerrain(createLocation(2,11),1,1);
setTerrain(createLocation(2,14),3,2);
setTerrain(createLocation(2,15),4,4);
setTerrain(createLocation(3,0),2,3);
setTerrain(createLocation(3,1),4,3);
setTerrain(createLocation(3,2),5,3);
setTerrain(createLocation(3,3),5,3);
setTerrain(createLocation(3,4),4,3);
setTerrain(createLocation(3,5),3,3);
setTerrain(createLocation(3,10),3,2);
setTerrain(createLocation(3,12),3,2);
setTerrain(createLocation(3,13),2,2);
setTerrain(createLocation(3,14),3,2);
setTerrain(createLocation(3,16),3,3);
setTerrain(createLocation(4,1),2,3);
setTerrain(createLocation(4,2),3,3);
setTerrain(createLocation(4,3),1,1);
setTerrain(createLocation(4,4),2,3);
setTerrain(createLocation(4,5),3,3);
setTerrain(createLocation(4,6),3,3);
setTerrain(createLocation(4,7),1,1);
setTerrain(createLocation(5,0),1,1);
setTerrain(createLocation(5,1),1,1);
setTerrain(createLocation(5,2),1,1);
setTerrain(createLocation(5,3),1,1);
setTerrain(createLocation(5,4),3,3);
setTerrain(createLocation(5,8),3,2);
setTerrain(createLocation(5,10),3,2);
setTerrain(createLocation(5,11),3,2);
setTerrain(createLocation(5,12),4,1);
setTerrain(createLocation(5,13),3,2);
setTerrain(createLocation(5,15),4,1);
setTerrain(createLocation(6,2),2,3);
setTerrain(createLocation(6,3),3,2);
setTerrain(createLocation(6,4),1,1);
setTerrain(createLocation(6,6),3,2);
setTerrain(createLocation(6,7),3,2);
setTerrain(createLocation(6,8),1,1);
setTerrain(createLocation(6,9),5,1);
setTerrain(createLocation(6,11),4,2);
setTerrain(createLocation(6,14),4,2);
setTerrain(createLocation(7,1),2,2);
setTerrain(createLocation(7,2),2,3);
setTerrain(createLocation(7,3),1,1);
setTerrain(createLocation(7,4),1,1);
setTerrain(createLocation(7,6),3,1);
setTerrain(createLocation(7,7),3,1);
setTerrain(createLocation(7,8),3,1);
setTerrain(createLocation(7,9),3,1);
setTerrain(createLocation(7,12),4,2);
setTerrain(createLocation(7,13),4,2);
setTerrain(createLocation(7,14),5,2);
setTerrain(createLocation(7,15),4,2);
setTerrain(createLocation(7,16),4,2);
setTerrain(createLocation(8,0),2,2);
setTerrain(createLocation(8,1),1,1);
setTerrain(createLocation(8,2),1,1);
setTerrain(createLocation(8,3),1,1);
setTerrain(createLocation(8,4),1,1);
setTerrain(createLocation(8,5),1,1);
setTerrain(createLocation(8,6),3,1);
setTerrain(createLocation(8,7),3,1);
setTerrain(createLocation(8,8),3,1);
setTerrain(createLocation(8,9),3,1);
setTerrain(createLocation(8,10),3,1);
setTerrain(createLocation(8,11),2,2);
setTerrain(createLocation(8,12),4,2);
setTerrain(createLocation(9,0),1,1);
setTerrain(createLocation(9,1),1,1);
setTerrain(createLocation(9,2),5,2);
setTerrain(createLocation(9,3),1,1);
setTerrain(createLocation(9,4),1,1);
setTerrain(createLocation(9,5),1,1);
setTerrain(createLocation(9,6),1,1);
setTerrain(createLocation(9,7),3,1);
setTerrain(createLocation(9,8),3,1);
setTerrain(createLocation(9,9),4,1);
setTerrain(createLocation(9,10),3,1);
setTerrain(createLocation(9,11),1,1);
setTerrain(createLocation(9,14),3,1);
setTerrain(createLocation(9,15),3,1);
setTerrain(createLocation(9,16),3,1);
setTerrain(createLocation(10,0),1,1);
setTerrain(createLocation(10,1),1,1);
setTerrain(createLocation(10,2),1,1);
setTerrain(createLocation(10,3),1,1);
setTerrain(createLocation(10,4),2,2);
setTerrain(createLocation(10,5),1,1);
setTerrain(createLocation(10,6),1,1);
setTerrain(createLocation(10,7),5,1);
setTerrain(createLocation(10,8),4,1);
setTerrain(createLocation(10,9),3,1);
setTerrain(createLocation(10,10),3,1);
setTerrain(createLocation(10,11),1,1);
setTerrain(createLocation(10,12),1,1);
setTerrain(createLocation(10,13),3,1);
setTerrain(createLocation(10,14),3,1);
setTerrain(createLocation(10,15),3,2);
setTerrain(createLocation(11,0),2,3);
setTerrain(createLocation(11,1),1,1);
setTerrain(createLocation(11,2),1,1);
setTerrain(createLocation(11,3),1,1);
setTerrain(createLocation(11,4),1,1);
setTerrain(createLocation(11,5),1,1);
setTerrain(createLocation(11,6),1,1);
setTerrain(createLocation(11,7),1,1);
setTerrain(createLocation(11,8),1,1);
setTerrain(createLocation(11,9),1,1);
setTerrain(createLocation(11,10),1,1);
setTerrain(createLocation(11,11),1,1);
setTerrain(createLocation(11,12),3,1);
setTerrain(createLocation(12,0),1,1);
setTerrain(createLocation(12,1),1,1);
setTerrain(createLocation(12,2),1,1);
setTerrain(createLocation(12,3),1,1);
setTerrain(createLocation(12,4),1,1);
setTerrain(createLocation(12,7),1,1);
setTerrain(createLocation(12,8),1,1);
setTerrain(createLocation(12,12),3,1);
setTerrain(createLocation(12,14),4,1);
setTerrain(createLocation(13,0),2,3);
setTerrain(createLocation(13,2),2,2);
setTerrain(createLocation(13,3),2,2);
setTerrain(createLocation(13,10),3,1);
setTerrain(createLocation(13,11),3,1);
setTerrain(createLocation(13,12),4,1);
setTerrain(createLocation(13,14),4,2);
setTerrain(createLocation(14,0),2,3);
setTerrain(createLocation(14,1),2,2);
setTerrain(createLocation(14,2),2,2);
setTerrain(createLocation(14,3),2,2);
setTerrain(createLocation(14,4),2,3);
setTerrain(createLocation(14,8),3,2);
setTerrain(createLocation(14,10),3,1);
setTerrain(createLocation(14,13),4,2);
setTerrain(createLocation(14,14),5,2);
setTerrain(createLocation(14,15),5,2);
setTerrain(createLocation(14,16),5,2);
setTerrain(createLocation(15,0),2,2);
setTerrain(createLocation(15,1),2,2);
setTerrain(createLocation(15,2),1,1);
setTerrain(createLocation(15,3),2,2);
setTerrain(createLocation(15,4),2,3);
setTerrain(createLocation(15,6),3,3);
setTerrain(createLocation(15,9),3,1);
setTerrain(createLocation(15,11),4,2);
setTerrain(createLocation(15,12),5,2);
setTerrain(createLocation(15,13),5,2);
setTerrain(createLocation(15,14),5,2);
setTerrain(createLocation(15,15),5,2);
setTerrain(createLocation(15,16),5,2);
setTerrain(createLocation(16,0),1,1);
setTerrain(createLocation(16,2),2,2);
setTerrain(createLocation(16,3),2,2);
setTerrain(createLocation(16,4),2,2);
setTerrain(createLocation(16,7),5,2);
setTerrain(createLocation(16,8),5,2);
setTerrain(createLocation(16,9),3,1);
setTerrain(createLocation(16,10),3,2);
setTerrain(createLocation(16,11),5,2);
setTerrain(createLocation(16,12),5,2);
setTerrain(createLocation(16,13),5,2);
setTerrain(createLocation(16,14),5,2);
setTerrain(createLocation(16,15),5,1);
setTerrain(createLocation(16,16),5,1);


   infoBox("The Beginning", "You, a novice adventurer are beginning your journey out into the wilds.  Bring back the head of the mighty Char to save your city from destruction.  You brought some herbs with you but it wont last long, hopefully you'll be able to loot more useful items from some buildings." );

}

void afterStart(){
   AiPlayer3.addFlux(- AiPlayer3.getFlux());
   P1.addFlux(-5);
}

void onNewRound()
{
   //game over if you lose the adventurer
   if(!adventurer.doesExist() && !ship.doesExist()){
      endGame(getAIPlayer(0));
   }

   Entity tree;
   P1.addFlux(-2);
   AiPlayer3.addFlux(-3);
   trapclear=true;
   forEachEntity();
   if(Totem.doesExist() && adventurer.getLoc() == Totem.getLoc()){
      Totem.remove();
      infoBox("The Desert","You notice a ominous totem in the middle of the desert.  Ignoring your better instincts you approach it and touch it with one hand.  As soon as you do it sinks into the ground and some nearby corpses come to life.  It seems that this place is cursed and you will have to fight your way out.");  
   }

   if(trapclear){
      Entity Corpse = createEntity("Soldier",14,15,Neutral);
      Corpse.destroy();
      P1.addToHand("Shield of Faith");
   }



   //player has wandered into the deep forest
   Location advLoc = adventurer.getLoc();
   if((advLoc.getY() < 4) && Seedling1.doesExist() && Seedling2.doesExist()){
   infoBox("The Trees", "As you venture into the dark forest something seems amiss.  It is eeriely quiet and the trees seem to be swaying as if there were a large gale.  Suddenly you realize that the trees are moving toward you and your presence is not welcome." );

   Seedling1.remove();
   tree = createEntity("Pine Ent",1,1,AiPlayer3);
   tree.setDim(false);
   Seedling2.remove();
   tree = createEntity("Sapling",4,2,AiPlayer3);
   tree.setDim(false);
   AiPlayer3.addFlux(10);
   }

}

bool entityCallback(Entity ent){
   Location entloc;
   if(ent.isType(5)){
      string name = ent.otherName();
      if(name == "Novice Adventurer"){
         endGame(getAIPlayer(0));
      } else if(name == "Ord Stone"){
         P1.addFlux(5);
         ent.remove();
      } else if (name == "Quorum Stone"){
         P1.addToHand("Experience");
         ent.remove();
      }else if (name == "Mogi Nest"){
         P1.addToHand("Training");
         ent.remove();
      }else if (name == "Temple of Zorn"){
         P1.addToHand("Bindweed Poultice");
         ent.remove();
      }else if (name == "Wasteland Yurt"){
         P1.addToHand("Manipulation");
         ent.remove();
      }else if (name == "Kithil'aa Treehouse"){
//at this point allows the player to fly over to the next area, various later monsters/buildings are seeded here
         ent.remove();
         Manticore.remove();
         createEntity("Planar Intersection, Air",0,1,P1);
         createEntity("Mud Mogi",14,3,AiPlayer3);
         createEntity("Seething Archosaur",16,1,AiPlayer3);
         createEntity("Earthworks",14,6,AiPlayer3);
      }else if (name == "Chambered Reef"){
         ent.remove();
         createEntity("Alearwyn Barque",9,0,AiPlayer3);
         infoBox("The Reef","There seems to have been a ship hiding in the reef, perhaps you can comandeer it in order to cross this ocean.");
      }else if (name == "Alearwyn Barque"){
         entloc = ent.getLoc();
         ship = createEntity("Cargo Fluyt",entloc,P1);
         ent.remove();
      }else if (name == "Earthworks"){
         P1.addToHand("Rune of Shielding");
         ent.remove();
      }else if (name == "Mysterious Cube"){
         entloc = ent.getLoc();
         ent.remove();
         createEntity("Athal The Horrible",entloc,AiPlayer3);
         createEntity("Gruult Caverns",15,15,AiPlayer3);
         infoBox("The Cube","You see the mountains up ahead and a spot a large cave in one of them; that must be where the dragon resides.  There was a large strange object blocking your path but once you destroyed it you discovered that you awoke the titan inside.");  
      }else if (name == "Athal The Horrible"){
         P1.addToHand("Experience");
         P1.addFlux(2);
         ent.remove();
      }else if (name == "Gruult Caverns"){
         ent.remove();
         Entity dragon = createEntity("Char",15,15,AiPlayer3);
         dragon.addTokens("attack",3);
         dragon.addTokens("speed",3);
         dragon.addTokens("range",3);
         dragon.addTokens("maxhp",3);
         dragon.addTokens("vision",3);
      }else if (name == "Char"){
         infoBox("Congratulations","After a long battle the legendary Char lies dead in front of you.  You took some serious injuries in the fight but you know your home will finally be safe.  The End.");
         endGame(P1);
      }else if (name == "Soldier"){
         trapclear = false;
         if(adventurer.getLoc() == Totem.getLoc()){
            entloc = ent.getLoc();
            ent.remove();
            createEntity("Zombie",entloc,AiPlayer3);
         }
      }
   }

   if(ent.getName() == "Zombie"){
      trapclear = false;
   }

   return true;
}