void AAIGroup::UpdateRallyPoint() { AAISector *sector = ai->Getmap()->GetSectorOfPos(&rally_point); // check if rally point lies within base (e.g. AAI has expanded its base after rally point had been set) if(sector->distance_to_base <= 0) GetNewRallyPoint(); // check if rally point is blocked by building }
AAIGroup::AAIGroup(AAI *ai, const UnitDef *def, UnitType unit_type, int continent_id) { this->ai = ai; attack = 0; rally_point = ZeroVector; category = ai->Getbt()->units_static[def->id].category; combat_category = ai->Getbt()->GetIDOfAssaultCategory(category); // set unit type of group group_unit_type = unit_type; // set movement type of group (filter out add. movement info like underwater, floater, etc.) group_movement_type = ai->Getbt()->units_static[def->id].movement_type & MOVE_TYPE_UNIT; continent = continent_id; // now we know type and category, determine max group size if(cfg->AIR_ONLY_MOD) { maxSize = cfg->MAX_AIR_GROUP_SIZE; } else if(group_unit_type == ANTI_AIR_UNIT) maxSize = cfg->MAX_ANTI_AIR_GROUP_SIZE; else { if(category >= GROUND_ARTY && category <= HOVER_ARTY) maxSize = cfg->MAX_ARTY_GROUP_SIZE; else if(category == AIR_ASSAULT) maxSize = cfg->MAX_AIR_GROUP_SIZE; else if(category == SEA_ASSAULT) maxSize = cfg->MAX_NAVAL_GROUP_SIZE; else if(category == SUBMARINE_ASSAULT) maxSize = cfg->MAX_SUBMARINE_GROUP_SIZE; else maxSize = cfg->MAX_GROUP_SIZE; } size = 0; task_importance = 0; task = GROUP_IDLE; lastCommand.id = CMD_STOP; lastCommand.params.resize(3); lastCommandFrame = 0; target_sector = 0; // get a rally point GetNewRallyPoint(); // get speed group (if necessary) if(cfg->AIR_ONLY_MOD) { if(category == AIR_ASSAULT) { speed_group = floor((ai->Getbt()->GetUnitDef(def->id).speed - ai->Getbt()->min_speed[1][ai->Getside()-1])/ai->Getbt()->group_speed[1][ai->Getside()-1]); } else speed_group = 0; } else { if(category == GROUND_ASSAULT) speed_group = floor((ai->Getbt()->GetUnitDef(def->id).speed - ai->Getbt()->min_speed[0][ai->Getside()-1])/ai->Getbt()->group_speed[0][ai->Getside()-1]); else if(category == SEA_ASSAULT) speed_group = floor((ai->Getbt()->GetUnitDef(def->id).speed - ai->Getbt()->min_speed[3][ai->Getside()-1])/ai->Getbt()->group_speed[3][ai->Getside()-1]); else speed_group = 0; } avg_speed = ai->Getbt()->GetUnitDef(def->id).speed; //ai->Log("Creating new group - max size: %i move type: %i speed group: %i continent: %i\n", maxSize, group_movement_type, speed_group, continent); }
AAIGroup::AAIGroup(IAICallback *cb, AAI *ai, const UnitDef *def, UnitType unit_type) { this->cb = cb; this->ai = ai; this->bt = ai->bt; attack = 0; rally_point = ZeroVector; category = bt->units_static[def->id].category; combat_category = bt->GetIDOfAssaultCategory(category); // set unit type of group group_unit_type = unit_type; // set movement type of group (filter out add. movement info like underwater, floater, etc.) group_movement_type = bt->units_static[def->id].movement_type & MOVE_TYPE_UNIT; // now we know type and category, determine max group size if(cfg->AIR_ONLY_MOD) { maxSize = cfg->MAX_AIR_GROUP_SIZE; } else if(group_unit_type == ANTI_AIR_UNIT) maxSize = cfg->MAX_ANTI_AIR_GROUP_SIZE; else { if(category >= GROUND_ARTY && category <= HOVER_ARTY) maxSize = cfg->MAX_ARTY_GROUP_SIZE; else if(category == AIR_ASSAULT) maxSize = cfg->MAX_AIR_GROUP_SIZE; else if(category == SEA_ASSAULT) maxSize = cfg->MAX_NAVAL_GROUP_SIZE; else if(category == SUBMARINE_ASSAULT) maxSize = cfg->MAX_SUBMARINE_GROUP_SIZE; else maxSize = cfg->MAX_GROUP_SIZE; } size = 0; task_importance = 0; task = GROUP_IDLE; lastCommand.id = CMD_STOP; lastCommand.params.resize(3); lastCommandFrame = 0; target_sector = 0; // get a rally point GetNewRallyPoint(); // get speed group (if necessary) if(cfg->AIR_ONLY_MOD) { if(category == AIR_ASSAULT) { speed_group = floor((bt->unitList[def->id-1]->speed - bt->min_speed[1][ai->side-1])/bt->group_speed[1][ai->side-1]); } else speed_group = 0; } else { if(category == GROUND_ASSAULT) speed_group = floor((bt->unitList[def->id-1]->speed - bt->min_speed[0][ai->side-1])/bt->group_speed[0][ai->side-1]); else if(category == SEA_ASSAULT) speed_group = floor((bt->unitList[def->id-1]->speed - bt->min_speed[3][ai->side-1])/bt->group_speed[3][ai->side-1]); else speed_group = 0; } avg_speed = bt->unitList[def->id-1]->speed; //fprintf(ai->file, "Creating new group - max size: %i move type: %i speed group: %i\n", maxSize, (int)move_type, speed_group); //fprintf(ai->file, "speedgroup: %i, min: %f, avg: %f, this: %f\n", speed_group, val1, val2, bt->unitList[def->id-1]->speed); }