void ship_select::OnSelchangeShipList() { int i, j, k, count; if (activity) return; activity = ACTIVITY_SHIP; for (i=0; i<wlist_size; i++) { count = 0; for (j=0; j<Wings[wing_index[i]].wave_count; j++) for (k=0; k<list_size; k++) if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) { if (m_ship_list.GetSel(k)) count++; break; } if (count == Wings[wing_index[i]].wave_count) wing_sel_last[i] = 1; else wing_sel_last[i] = 0; m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE); } for (i=wlist_size; i<wplist_size; i++) { waypoint_list *wp_list = find_waypoint_list_at_index(wing_index[i]); Assert(wp_list != NULL); SCP_list<waypoint>::iterator jj; count = 0; for (j = 0, jj = wp_list->get_waypoints().begin(); jj != wp_list->get_waypoints().end(); ++j, ++jj) { for (k=0; k<list_size; k++) { if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == calc_waypoint_instance(wing_index[i], j))) { if (m_ship_list.GetSel(k)) count++; break; } } } if ((uint) count == wp_list->get_waypoints().size()) wing_sel_last[i] = 1; else wing_sel_last[i] = 0; m_wing_list.SetSel(i, wing_sel_last[i] ? TRUE : FALSE); } activity = 0; }
waypoint *find_waypoint_with_instance(int waypoint_instance) { if (waypoint_instance < 0) return NULL; waypoint_list *wp_list = find_waypoint_list_at_index(calc_waypoint_list_index(waypoint_instance)); if (wp_list == NULL) return NULL; return find_waypoint_at_index(wp_list, calc_waypoint_index(waypoint_instance)); }
void ship_select::OnSelchangeWingList() { int i, j, k, z; if (activity) return; activity = ACTIVITY_WING; for (i=0; i<wlist_size; i++) { z = (m_wing_list.GetSel(i) > 0) ? 1 : 0; if (z != wing_sel_last[i]) { for (j=0; j<Wings[wing_index[i]].wave_count; j++) for (k=0; k<list_size; k++) if (OBJ_INDEX(obj_index[k]) == wing_objects[wing_index[i]][j]) { m_ship_list.SetSel(k, z ? TRUE : FALSE); break; } wing_sel_last[i] = z; } } for (i=wlist_size; i<wplist_size; i++) { z = (m_wing_list.GetSel(i) > 0) ? 1 : 0; if (z != wing_sel_last[i]) { waypoint_list *wp_list = find_waypoint_list_at_index(wing_index[i]); Assert(wp_list != NULL); SCP_list<waypoint>::iterator jj; for (j = 0, jj = wp_list->get_waypoints().begin(); jj != wp_list->get_waypoints().end(); ++j, ++jj) { for (k=0; k<list_size; k++) { if ((obj_index[k]->type == OBJ_WAYPOINT) && (obj_index[k]->instance == calc_waypoint_instance(wing_index[i], j))) { m_ship_list.SetSel(k, z ? TRUE : FALSE); break; } } } wing_sel_last[i] = z; } } activity = 0; }
waypoint_list *find_waypoint_list_with_instance(int waypoint_instance, int *waypoint_index) { if (waypoint_instance < 0) { if (waypoint_index != NULL) *waypoint_index = -1; return NULL; } waypoint_list *wp_list = find_waypoint_list_at_index(calc_waypoint_list_index(waypoint_instance)); if (wp_list == NULL) { if (waypoint_index != NULL) *waypoint_index = -1; return NULL; } if (waypoint_index != NULL) { *waypoint_index = calc_waypoint_index(waypoint_instance); Assert(*waypoint_index >= 0 && (uint) *waypoint_index < wp_list->get_waypoints().size()); } return wp_list; }
void ShipGoalsDlg::update_item(int item, int multi) { char *docker, *dockee, *subsys; int mode; char buf[512], save[80]; waypoint_list *wp_list; if (item >= MAX_AI_GOALS) return; if (!multi || m_priority[item] >= 0) goalp[item].priority = m_priority[item]; if (m_behavior[item] < 0) { if (multi) return; else m_behavior[item] = 0; } mode = (int)m_behavior_box[item] -> GetItemData(m_behavior[item]); switch (mode) { case AI_GOAL_NONE: case AI_GOAL_CHASE_ANY: case AI_GOAL_UNDOCK: case AI_GOAL_KEEP_SAFE_DISTANCE: case AI_GOAL_PLAY_DEAD: case AI_GOAL_PLAY_DEAD_PERSISTENT: case AI_GOAL_WARP: // these goals do not have a target in the dialog box, so let's set the goal and return immediately // so that we don't run afoul of the "doesn't have a valid target" code at the bottom of the function MODIFY(goalp[item].ai_mode, mode); return; case AI_GOAL_WAYPOINTS: case AI_GOAL_WAYPOINTS_ONCE: case AI_GOAL_DISABLE_SHIP: case AI_GOAL_DISARM_SHIP: case AI_GOAL_IGNORE: case AI_GOAL_IGNORE_NEW: case AI_GOAL_EVADE_SHIP: case AI_GOAL_STAY_NEAR_SHIP: case AI_GOAL_STAY_STILL: case AI_GOAL_CHASE_SHIP_CLASS: break; case AI_GOAL_DESTROY_SUBSYSTEM: subsys = NULL; if (!multi || (m_data[item] && (m_subsys[item] >= 0))) subsys = (char *) m_subsys_box[item]->GetItemDataPtr(m_subsys[item]); //MODIFY(goalp[item].ai_submode, m_subsys[item] + 1); if (!subsys) { sprintf(buf, "Order #%d doesn't have valid subsystem name. Order will be removed", item + 1); MessageBox(buf, "Notice"); MODIFY(goalp[item].ai_mode, AI_GOAL_NONE); return; } else { if (!goalp[item].docker.name || (goalp[item].docker.name && !stricmp(goalp[item].docker.name, subsys))) set_modified(); goalp[item].docker.name = subsys; } break; case AI_GOAL_CHASE | AI_GOAL_CHASE_WING: switch (m_data[item] & TYPE_MASK) { case TYPE_SHIP: case TYPE_PLAYER: mode = AI_GOAL_CHASE; break; case TYPE_WING: mode = AI_GOAL_CHASE_WING; break; } break; case AI_GOAL_DOCK: docker = NULL; if (!multi || (m_data[item] && (m_subsys[item] >= 0))) docker = (char *) m_subsys_box[item] -> GetItemDataPtr(m_subsys[item]); dockee = NULL; if (!multi || (m_data[item] && (m_dock2[item] >= 0))) dockee = (char *) m_dock2_box[item] -> GetItemDataPtr(m_dock2[item]); if (docker == (char *) SIZE_T_MAX) docker = NULL; if (dockee == (char *) SIZE_T_MAX) dockee = NULL; if (!docker || !dockee) { sprintf(buf, "Order #%d doesn't have valid docking points. Order will be removed", item + 1); MessageBox(buf, "Notice"); MODIFY(goalp[item].ai_mode, AI_GOAL_NONE); return; } else { if (!goalp[item].docker.name) set_modified(); else if (!stricmp(goalp[item].docker.name, docker)) set_modified(); if (!goalp[item].dockee.name) set_modified(); else if (!stricmp(goalp[item].dockee.name, dockee)) set_modified(); goalp[item].docker.name = docker; goalp[item].dockee.name = dockee; } break; case AI_GOAL_GUARD | AI_GOAL_GUARD_WING: switch (m_data[item] & TYPE_MASK) { case TYPE_SHIP: case TYPE_PLAYER: mode = AI_GOAL_GUARD; break; case TYPE_WING: mode = AI_GOAL_GUARD_WING; break; } break; default: Warning(LOCATION, "Unknown AI_GOAL type 0x%x", mode); MODIFY(goalp[item].ai_mode, AI_GOAL_NONE); return; } MODIFY(goalp[item].ai_mode, mode); *save = 0; if (goalp[item].target_name) strcpy_s(save, goalp[item].target_name); switch (m_data[item] & TYPE_MASK) { int not_used; case TYPE_SHIP: case TYPE_PLAYER: goalp[item].target_name = ai_get_goal_target_name(Ships[m_data[item] & DATA_MASK].ship_name, ¬_used); break; case TYPE_WING: goalp[item].target_name = ai_get_goal_target_name(Wings[m_data[item] & DATA_MASK].name, ¬_used); break; case TYPE_PATH: wp_list = find_waypoint_list_at_index(m_data[item] & DATA_MASK); Assert(wp_list != NULL); goalp[item].target_name = ai_get_goal_target_name(wp_list->get_name(), ¬_used); break; case TYPE_WAYPOINT: goalp[item].target_name = ai_get_goal_target_name(object_name(m_data[item] & DATA_MASK), ¬_used); break; case TYPE_SHIP_CLASS: goalp[item].target_name = ai_get_goal_target_name(Ship_info[m_data[item] & DATA_MASK].name, ¬_used); break; case 0: case -1: case (-1 & TYPE_MASK): if (multi) return; sprintf(buf, "Order #%d doesn't have a valid target. Order will be removed", item + 1); MessageBox(buf, "Notice"); MODIFY(goalp[item].ai_mode, AI_GOAL_NONE); return; default: Error(LOCATION, "Unhandled TYPE_X #define %d in ship goals dialog box", m_data[item] & TYPE_MASK); } if (stricmp(save, goalp[item].target_name)) set_modified(); }
int waypoint_add(vec3d *pos, int waypoint_instance) { Assert(pos != NULL); waypoint_list *wp_list; waypoint *wpt; int i, wp_list_index, wp_index; // find a new list to start if (waypoint_instance < 0) { // get a name for it char buf[NAME_LENGTH]; waypoint_find_unique_name(buf, Waypoint_lists.size() + 1); // add new list with that name waypoint_list new_list(buf); Waypoint_lists.push_back(new_list); wp_list = &Waypoint_lists.back(); // set up references wp_list_index = Waypoint_lists.size() - 1; wp_index = wp_list->get_waypoints().size(); } // create the waypoint on the same list as, and immediately after, waypoint_instance else { calc_waypoint_indexes(waypoint_instance, wp_list_index, wp_index); wp_list = find_waypoint_list_at_index(wp_list_index); // theoretically waypoint_instance points to a current waypoint, so advance past it wp_index++; // it has to be on, or at the end of, an existing list Assert(wp_list != NULL); Assert((uint) wp_index <= wp_list->get_waypoints().size()); // iterate through all waypoints that are at this index or later, // and edit their instances so that they point to a waypoint one place higher for (object *objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp)) { if ((objp->type == OBJ_WAYPOINT) && (calc_waypoint_list_index(objp->instance) == wp_list_index) && (calc_waypoint_index(objp->instance) >= wp_index)) objp->instance++; } } // so that masking in the other function works // (though if you actually hit this Assert, you have other problems) Assert(wp_index < 0x10000); // create the waypoint object waypoint new_waypoint(pos, wp_list); // add it at its appropriate spot, which may be the end of the list SCP_vector<waypoint>::iterator ii = wp_list->get_waypoints().begin(); for (i = 0; i < wp_index; i++) ++ii; wp_list->get_waypoints().insert(ii, new_waypoint); wpt = find_waypoint_at_index(wp_list, wp_index); // apparently we create it in-game too; this is called by both scripting and FRED waypoint_create_game_object(wpt, wp_list_index, wp_index); return wpt->get_objnum(); }