rect_t* PlayerAI::findNearObject( int ent_type, int attr_id, value_t min_value, value_t max_value) { assert( ent_type < n_entity_types && attr_id < entity_types[ ent_type ]->n_attr ); rect_t* closest_r = NULL; int min_dist = 1000000; elem_t* pos; pentity_set_t* pe_set = worldmap_get_entities( &cl.view_r, 1 << ent_type ); pentity_set_for_each( pos, pe_set ) { entity_t* ent = ((pentity_t*)pos)->ent; if( entity_is_eq( ent, cl.pl ) ) continue; if( ent->attrs[attr_id] < min_value || max_value < ent->attrs[attr_id] ) continue; int dist = rect_distance( &cl.pl->r, &ent->r ); if( dist < min_dist ){ min_dist = dist; closest_r = &ent->r; } }
/** Repelling charge force, ala Coulomb's law. */ inline Vector repel_force(const Region& a, const Region& b) { static const double MIN_DIST = 1.0; Vector vec; double dist = rect_distance( &vec, a.pos.x - (a.area.x / 2.0), a.pos.y - (a.area.y / 2.0), a.pos.x + (a.area.x / 2.0), a.pos.y + (a.area.y / 2.0), b.pos.x - (b.area.x / 2.0), b.pos.y - (b.area.y / 2.0), b.pos.x + (b.area.x / 2.0), b.pos.y + (b.area.y / 2.0)); if (dist <= MIN_DIST) { dist = MIN_DIST; vec = vec_sub(a.pos, b.pos); } return vec_mult(vec, (CHARGE_KE * 0.5 / (vec_mag(vec) * dist * dist))); }