public void move(SyrianGraph g) throws AgentHasNoMoveException,
			AgentIsDoneException {

		// evacuate all possible chemicals
		if (this.hasChemicals() && this.getLocation() == this.getTarget()) {
			System.out.println("Agent " + this.getName()
					+ " evacuated chemicals to it's target");
			this.setChemicalsEvacuated(this.getChemicalsEvacuated() + 1);
			// chemicals are now safe, erase them
			this.hasChemicals = false;
		}

		SyrianEdge path = this.getMove(g);
		System.out.println("Agent " + this.getName() + " is moving from "
				+ this.getLocation().getNumber() + " to "
				+ path.getOther(this.getLocation()).getNumber());
		SyrianVertex destination = path.getOther(this.getLocation());

		// calculate score
		int factor = 1;

		if (path.hasTerrorists()) {

			// entered hostile territory
			if (!this.hasEscort()) {
				if (this.hasChemicals()) {

					// major factor for going unescorted through
					// hostile territory!
					factor *= SyrianSimulation.CROSSING_TERRORISTS_WITH_CHEMICALS_PENALTY;
				} else {
					// driving unescorted through terrorists
					// this is OK according to mission description
					// TODO: ask

				}
			} else { // has escort
				if (this.hasChemicals()) {
					// TODO: ask if that's the right behaviour
					// driving escorted through edge
					// ** doesn't clear edge **
					// nothing happens (but regular side-effects)
				} else {
					// clear path
					System.out.println("Agent " + this.getName()
							+ " busted some terrorists!");
					this.setTerroristsBusted(this.getTerroristsBusted() + 1);
					path.clearTerrorists();
				}
			}

		}

		// multipliers
		factor *= this.hasChemicals() ? 2 : 1;
		factor *= this.hasEscort() ? 2 : 1;

		// regular side effects of traversing
		int totalCost = factor * path.getWeight();

		this.addScore(totalCost);

		// move agent
		this.setLocation(destination);
		System.out.println("After moving, agent " + this.getName()
				+ "'s score is: " + this.getScore());
	}