Esempio n. 1
0
		void npc::action_unit(environment &current)
		{
			person::action_unit(current);

			point dest = current.player()->position();

			if (m_ai_state == ai_state::idle)
			{
				if (current.distance(dest, position()) <= alert_distance || !health().full())
				{
					m_ai_state = ai_state::alert;
					current.broadcast({ "!", 0xff0000, position(), 1.0 });
				}
			}
			else if (m_ai_state == ai_state::alert)
			{
				auto scene = current.scene();
				auto path = path::find(position(), dest, 50, [&](const point &p) { return scene->traversable(p); });
				if (path)
				{
					auto step = path->begin();
					if (step != path->end())
					{
						auto blocking = scene->blocking(*step);
						if (blocking && !blocking->invincible())
						{
							for (auto &skill : m_skills)
							{
								if (skill.targeted() && skill.useable(this, blocking))
								{
									skill.use(this, blocking);
									break;
								}
								else if (skill.useable(this, dest))
								{
									skill.use(this, dest);
									break;
								}
							}
						}
						else
						{
							scene->move(*this, *step);
						}
					}
				}
			}
		}
Esempio n. 2
0
void worldSpace::moveChar(int dir)
{
  //Move left / west
  if(dir == 0)
    {
      if(cYpos == 0)
        return;
      if(traversable(cdir))
        cYpos -= 1;
      else if(!traversable(cdir) && canPush(cdir))
        {
          push(cdir);
          cYpos -= 1;
        }
    }
  //Move right / east
  else if(dir == 1)
    {
      if(cYpos >= COL-1)
        return;
      if(traversable(cdir))
        cYpos += 1;
      else if(!traversable(cdir) && canPush(cdir))
        {
          push(cdir);
          cYpos += 1;
        }
    }
  //Move down / south
  else if(dir == 2)
    {
      if(cXpos >= ROW-1)
        return;
      if(traversable(cdir))
        cXpos += 1;
      else if(!traversable(cdir) && canPush(cdir))
        {
          push(cdir);
          cXpos += 1;
        }
    }
  //move up / north
  else if(dir == 3)
    {
      if(cXpos == 0)
        return;
      if(traversable(cdir))
        cXpos -= 1;
      else if(!traversable(cdir) && canPush(cdir))
        {
          push(cdir);
          cXpos -= 1;
        }
    }

  if(onPortal() == 'd')
    teleportal(0);
  else if(onPortal() == 'u')
    teleportal(1);

  /*
  if(lvl1 == lvl2)
    std::cout << "Level 1 is equal to level 2." << std::endl;
  else
    std::cout << "Level 1 and level 2 are different." << std::endl;
  */

  update();
  emit moved();
}