void npc::action_unit(environment ¤t) { 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); } } } } }
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(); }