// ****************************************************************************
//
// Logic 247: Battle System
//
// ****************************************************************************

#include "defines.txt"
#define mordred o1
#define enemy o2
#define arrow o3
#define backg o4
#define bar o5


if (new_room) {
  load.pic(room_no);
  draw.pic(room_no);
  discard.pic(room_no);
  show.pic();

  set.horizon(0);
  load.sound(2);
  sound(2,f247);
  stop.motion(ego);
  erase(ego);
  prevent.input();
  key_pressed = 0;

  reset(m_turn); reset(f248); reset(f249); reset(f250); reset(f251);
  reset(f254); reset(f246); reset(fought);
  reset(f252);

  animate.obj(backg);
  load.view(11);
  set.view(backg,11);
  if (scenery == 1) {
    set.loop(backg,1);
    set.cel(backg,0);
  }

  if (scenery == 3) {
    set.loop(backg,3);
    set.cel(backg,0);
  }
  ignore.objs(backg);
  v255 = 3; cycle.time(backg,v255);
  start.cycling(backg);
  ignore.horizon(backg);
  set.priority(backg,4);
  position(backg,40,94);
  draw(backg);

  animate.obj(enemy);
  if (monster == 1) {
    m_health = 10;
    m_chance = 50;
    load.view(10);
    set.view(enemy,10);
    exp = 2;
  }

  if (monster == 4) {
    m_health = 5;
    m_chance = 60;
    load.view(28);
    set.view(enemy,28);
    exp = 1;
  }
  if (monster == 6) {
    m_health = 20;
    m_chance = 50;
    load.view(34);
    set.view(enemy,34);
    exp = 4;
  }
  set.loop(enemy,0);
  set.cel(enemy,0);
  v255 = 6;
  cycle.time(enemy,v255);
  ignore.objs(enemy);
  position(enemy,79,90);
  start.cycling(enemy);
  draw(enemy);

  animate.obj(mordred);
  load.view(7);
  load.view(6);
  load.view(5);
  if (has("shotgun") && ammo > 0) {
    set.view(mordred,7);
    damage = 4;
    set(weapon);
  }
  else {
    if (has("knife")) {
      set.view(mordred,6);
      damage = 2;
    }
    else {
      set.view(mordred,5);
      damage = 1;
    }
  }

  v254 = 11;
  set.loop(mordred,0);
  set.cel(mordred,0);
  cycle.time(mordred,v254);
  ignore.objs(mordred);
  position(mordred,69,90);
  start.cycling(mordred);
  draw(mordred);

  animate.obj(arrow);
  load.view(11);
  set.view(arrow,11);
  set.loop(arrow,0);
  ignore.objs(arrow);
  position(arrow,71,56);
  draw(arrow);

  animate.obj(bar);
  load.view(24);
  set.view(bar,24);
  ignore.objs(bar);
  position(bar,70,38);
  set.loop(bar,0);
  set.cel(bar,0);
  v252 = 1;
  cycle.time(bar,v252);
  start.cycling(bar);
  draw(bar);

  if (surprised) {
    print.at("Surprised!",13,14,20);
    set(f251);
  }

}

if (m_turn) {
  reposition.to(arrow,81,56);
  reset(fought);
}
else {
  reposition.to(arrow,71,56);
  reset(f246);
}

current.cel(bar,powerbar);

display(2,7,"MORDRED");
display(16,13,"F6 - Fight");
display(18,13,"F8 - Run");
if (has("sacred elixir")) {
  display(20,13,"F10 - Use Elixir");
}
else {
  display(20,13,"                ");
}
if (has("shotgun") && ammo > 0) {
  display(22,13,"CTRL-W - Switch Weapon");
}
else {
  display(22,13,"                      ");
}
if (weapon) {
  display(6,3,"AMMO");
  display(7,4,"%v49|2");
}
else {
  display(6,3,"    ");
  display(7,4,"  ");
}
display(3,9,"%v38|2");
display(3,29,"%v41|2");
if (monster == 1) {
  display(2,23,"     GHOUL");
}

if (monster == 4) {
  display(2,23,"    ZOMBIE");
}

if (monster == 6) {
  display(2,23,"  HEADLESS JOHN");
}


if (f247) {
  sound(2,f247);
}

if (health == 0) {
  load.view(1);
  set.view(mordred,1);
  set.loop(mordred,0);
  set.cel(mordred,0);
  if (scenery == 2) {
    set.cel(mordred,3);
  }
  stop.cycling(mordred);
  position(mordred,54,90);
  force.update(mordred);
  death_type = 3;
}
else {
  if (weapon) {
    set.view(mordred,7);
    damage = 4;
  }
  else {
    if (has("knife")) {
      set.view(mordred,6);
      damage = 2;
    }
    else {
      set.view(mordred,5);
      damage = 1;
    }
  }
}

if ((m_health == 0) && (!isset(f252))) {
  set.loop(enemy,3); set.cel(enemy,0); set(f252); v255 = 5;
  cycle.time(enemy,v255); reset(m_turn); set(fought);
  end.of.loop(enemy,f254);
}
else {
  if (controller(fight) && (!m_turn) && (!fought)) {
    set.loop(mordred,1); set.cel(mordred,0); v254 = 5; set(fought);
    stop.cycling(bar);
    if ((powerbar == 1 || powerbar == 2 || powerbar == 12 || powerbar == 13)) {
      hit_percent = 75; modifier = 2; modifier = modifier * damage;
    }
    else{
      if ((powerbar == 4 || powerbar == 10)) {
        hit_percent = 86; modifier = 4; modifier = modifier * damage;
      }
      else {
        if ((powerbar == 6 || powerbar == 8)) {
          hit_percent = 86; modifier = 3; modifier = modifier * damage;
        }
        else {
          hit_percent = 30; modifier = damage;
        }
      }
    }
    cycle.time(mordred,v254);
    if (weapon) {
      ammo = ammo - 1;
    }
    end.of.loop(mordred,f250);
  }
  if (controller(run) && (!m_turn) && (!fought)) {
    if (!isset(cant_run)) {
      set(m_turn);
      random(1,100,v253);
      if (v253 < 50) {
        print.at("You managed to escape this time.",18,4,26);
        reset(f254); reset(f252); accept.input(); player.control(); new.room.v(prev_room_no);
      }
      else {
        print.at("Your attempt to escape was a failure.",18,4,26);
      }
    }
    else {
      print("You can't run from this battle.");
    }
  }
  if (controller(heal) && (has("sacred elixir")) && (!m_turn) && (!fought)) {
    set(m_turn);
    drop("sacred elixir"); get("empty flask");
    print.at("You imbibe the life giving elixir.",18,4,26);
    health = health + 30;
    if (health > max_health) {
      health = max_health;
    }
  }
  if ((m_turn) && (!f246)) {
    set(f246); set.loop(enemy,1); set.cel(enemy,0);
    end.of.loop(enemy,f248);
  }
  if (controller(w_switch) && (ammo > 0) && has("shotgun") && (!m_turn) && (!fought)) {
    toggle(weapon);
  }
  if (ammo == 0 && (!m_turn) && (!fought)) {
    reset(weapon);
  }
}

if (f248) {
  reset(f248);
  set.loop(enemy,0); set.cel(enemy,0); start.cycling(enemy);
  random(1,100,v253);
    if (v253 < m_chance) {
      if (monster == 1) {
        m_damage = 5; m_hit_percent = 40;
      }

      if (monster == 4) {
        m_damage = 4; m_hit_percent = 60;
      }

      if (monster == 6) {
        m_damage = 10; m_hit_percent = 10;
      }
    }
    else {
      if (monster == 1) {
        m_damage = 3; m_hit_percent = 50;
      }

      if (monster == 4) {
        m_damage = 2; m_hit_percent = 50;
      }

      if (monster == 6) {
        m_damage = 4; m_hit_percent = 40;
      }
    }
  random(1,100,v253);
    if (v253 < m_hit_percent) {
      set.loop(mordred,2); set.cel(mordred,0);
      v254 = 4; cycle.time(mordred,v254);
      end.of.loop(mordred,f249);
    }
    else {
      reset(m_turn);
    }
    start.cycling(bar);
}

if (f249) {
  reset(f249);
  if (health < m_damage) {
    health = 0;
  }
  else {
    health = health - m_damage;
  }
  set.loop(mordred,0); set.cel(mordred,0); v254 = 11; cycle.time(mordred,v254);
  start.cycling(mordred);
  reset(m_turn);
}

if (f250) {
  reset(f250);
  set.loop(mordred,0); v254 = 11; set.cel(mordred,0); cycle.time(mordred,v254); start.cycling(mordred);
  random(1,100,v253);
  if (v253 < hit_percent) {
    if (m_health < modifier) {
      m_health = 0;
    }
    else {
      m_health = m_health - modifier;
    }
    if (m_health == 0) {
      set.loop(enemy,3); set.cel(enemy,0); set(f252); v255 = 3;
      cycle.time(enemy,v255); reset(m_turn); set(fought);
      end.of.loop(enemy,f254);
    }
    else {
      set.loop(enemy,2); set.cel(enemy,0); v255 = 3; cycle.time(enemy,v255);
      end.of.loop(enemy,f251);
    }
  }
  else {
    if (hit_percent < 50) {
      print.at("Missed!",13,16,20);
    }
    else {
      print.at("Blocked!",13,15,20);
    }
    set(m_turn);
  }
}

if (f251) {
  set(m_turn);
  reset(f251); reset(f252); v255 = 6; cycle.time(enemy,v255);
  set.loop(enemy,0); set.cel(enemy,0); start.cycling(enemy);
}

if (f254) {
  print.at("The corpse lies bloodied and dead at your feet.  You have triumphed.",14,8,26);
  score++;
  old_exp = experience;
  experience = experience + exp;
  if (experience > 3 && old_exp < 4) {
    print.at("Your maximum health has increased.",14,8,26);
    max_health = 35;
  }
  if (experience > 11 && old_exp < 12) {
    print.at("Your maximum health has increased.",14,8,26);
    max_health = 50;
  }
  if (experience > 27 && old_exp < 28) {
    print.at("Your maximum health has increased.",14,8,26);
    max_health = 65;
  }
  if (experience > 51 && old_exp < 52) {
    print.at("Your maximum health has increased.",14,8,26);
    max_health = 80;
  }
  exp = 0; monster = 0; reset(f254); reset(f252);
  reset(cant_run); reset(surprised);
  accept.input();
  player.control();
  new.room.v(prev_room_no);
}

return();