void fatal (piece_info_t *obj, long loc, char *message, char *response) { if (getyn (message)) { info(response); kill_obj (obj, loc); } }
void user_dir_army (piece_info_t *obj, long loc) { int enemy_killed; enemy_killed = FALSE; if (user_map[loc].contents == 'O') /* attacking own city */ move_army_to_city (obj, loc); else if (user_map[loc].contents == 'T') /* transport full? */ fatal (obj, loc, "Sorry, sir. There is no more room on the transport. Do you insist? ", "Your army jumped into the briny and drowned."); else if (map[loc].contents == '.') { /* going for a swim? */ if (!getyn ( /* thanks to Craig Hansen for this next message */ "Troops can't walk on water, sir. Do you really want to go to sea? ")) return; if (user_map[obj->loc].contents == 'T') info("Your army jumped into the briny and drowned."); else if (user_map[loc].contents == '.') info("Your army marched dutifully into the sea and drowned."); else { /* attack something at sea */ enemy_killed = islower (user_map[loc].contents); attack (obj, loc); if (obj->hits > 0) /* ship won? */ info("Your army regretfully drowns after its successful assault."); } if (obj->hits > 0) { kill_obj (obj, loc); if (enemy_killed) scan (comp_map, loc); } } else if (isupper (user_map[loc].contents) && user_map[loc].contents != 'X') { /* attacking self */ if (!getyn ( "Sir, those are our men! Do you really want to attack them? ")) return; attack (obj, loc); } else attack (obj, loc); }
void user_dir_ship (piece_info_t *obj, long loc) { int enemy_killed; enemy_killed = FALSE; if (map[loc].contents == '*') { snprintf (jnkbuf, STRSIZE, "Your %s broke up on shore.", piece_attr[obj->type].name); fatal (obj, loc, "That's never worked before, sir. Do you really want to try? ", jnkbuf); } else if (map[loc].contents == '+') { /* moving ashore? */ if (!getyn ( "Ships need sea to float, sir. Do you really want to go ashore? ")) return; if (user_map[loc].contents == '+') info("Your %s broke up on shore.", piece_attr[obj->type].name); else { /* attack something on shore */ enemy_killed = islower (user_map[loc].contents); attack (obj, loc); if (obj->hits > 0) /* ship won? */ info("Your %s breaks up after its successful assault.", piece_attr[obj->type].name); } if (obj->hits > 0) { kill_obj (obj, loc); if (enemy_killed) scan (comp_map, loc); } } else if (isupper (user_map[loc].contents)) { /* attacking self */ if (!getyn ( "Sir, those are our men! Do you really want to attack them? ")) return; attack (obj, loc); } else attack (obj, loc); }
virtual void uninit() { //This needs to be done explicitly because set_edit_mode(false) //will not be called when the user quits directly from maxtool. i4_kernel.unrequest_events(this, i4_device_class::FLAG_DISPLAY_CHANGE| i4_device_class::FLAG_USER_MESSAGE); kill_obj(); if (menu) { delete menu; } menu=0; m1_info.uninit(); /*if (m1_info.r_font) delete m1_info.r_font; m1_info.r_font=0;*/ g1_cwin_man_class::uninit(); }
void piece_move (piece_info_t *obj) { int changed_loc; int speed, max_hits; int saved_moves; int need_input; long saved_loc; city_info_t *cityp; /* set func for piece if on city */ cityp = find_city (obj->loc); if (cityp != NULL) if (cityp->func[obj->type] != NOFUNC) obj->func = cityp->func[obj->type]; changed_loc = FALSE; /* not changed yet */ speed = piece_attr[obj->type].speed; max_hits = piece_attr[obj->type].max_hits; need_input = FALSE; /* don't require user input yet */ while (obj->moved < obj_moves (obj)) { saved_moves = obj->moved; /* save moves made */ saved_loc = obj->loc; /* remember starting location */ if (awake (obj) || need_input){ /* need user input? */ ask_user (obj); display_loc_u (obj->loc); /* let user see result */ need_input = FALSE; /* we got it */ } if (obj->moved == saved_moves) /* user set function? */ switch (obj->func) { /* handle preprogrammed function */ case NOFUNC: break; case RANDOM: move_random (obj); break; case SENTRY: obj->moved = speed; break; case FILL: move_fill (obj); break; case LAND: move_land (obj); break; case EXPLORE: move_explore (obj); break; case ARMYLOAD: move_armyload (obj); break; case ARMYATTACK:move_armyattack (obj); break; case TTLOAD: move_ttload (obj); break; case REPAIR: move_repair (obj); break; case WFTRANSPORT: move_transport (obj); break; case MOVE_N: case MOVE_NE: case MOVE_E: case MOVE_SE: case MOVE_S: case MOVE_SW: case MOVE_W: case MOVE_NW: move_dir (obj); break; default: move_path (obj); break; } if (obj->moved == saved_moves) need_input = TRUE; /* * handle fighters specially. If in a city or carrier, turn * is over and reset range to max. Otherwise, if * range = 0, fighter crashes and burns and turn is over. */ if (obj->type == FIGHTER && obj->hits > 0) { if ((user_map[obj->loc].contents == 'O' || user_map[obj->loc].contents == 'C') && obj->moved > 0) { obj->range = piece_attr[FIGHTER].range; obj->moved = speed; obj->func = NOFUNC; info("Landing confirmed."); } else if (obj->range == 0) { info("Fighter at %d crashed and burned.", obj->loc); kill_obj (obj, obj->loc); } } if (saved_loc != obj->loc) changed_loc = TRUE; } /* if a boat is in port, damaged, and never moved, fix some damage */ if (obj->hits > 0 /* still alive? */ && !changed_loc /* object never changed location? */ && obj->type != ARMY && obj->type != FIGHTER /* it is a boat? */ && obj->hits < max_hits /* it is damaged? */ && user_map[obj->loc].contents == 'O') /* it is in port? */ obj->hits++; /* fix some damage */ }
int diff_objs(Tcl_Interp *interp, const char *db1, const char *db2) { struct directory *dp1, *dp2; char *argv[4] = {NULL, NULL, NULL, NULL}; struct bu_vls s1_tcl = BU_VLS_INIT_ZERO; struct bu_vls s2_tcl = BU_VLS_INIT_ZERO; struct bu_vls vls = BU_VLS_INIT_ZERO; int has_diff = 0; /* look at all objects in this database */ FOR_ALL_DIRECTORY_START(dp1, dbip1) { char *str1, *str2; Tcl_Obj *obj1, *obj2; /* check if this object exists in the other database */ if ((dp2 = db_lookup(dbip2, dp1->d_namep, 0)) == RT_DIR_NULL) { kill_obj(dp1->d_namep); continue; } /* skip the _GLOBAL object */ if (dp1->d_major_type == DB5_MAJORTYPE_ATTRIBUTE_ONLY) continue; /* try to get the TCL version of this object */ bu_vls_trunc(&vls, 0); bu_vls_printf(&vls, "%s get %s", db1, dp1->d_namep); if (Tcl_Eval(interp, bu_vls_addr(&vls)) != TCL_OK) { /* cannot get TCL version, use bu_external */ Tcl_ResetResult(interp); has_diff += compare_external(dp1, dp2); continue; } obj1 = Tcl_NewListObj(0, NULL); Tcl_AppendObjToObj(obj1, Tcl_GetObjResult(interp)); bu_vls_trunc(&s1_tcl, 0); bu_vls_trunc(&s2_tcl, 0); bu_vls_strcpy(&s1_tcl, Tcl_GetStringResult(interp)); str1 = bu_vls_addr(&s1_tcl); Tcl_ResetResult(interp); /* try to get TCL version of object from the other database */ bu_vls_trunc(&vls, 0); bu_vls_printf(&vls, "%s get %s", db2, dp1->d_namep); if (Tcl_Eval(interp, bu_vls_addr(&vls)) != TCL_OK) { Tcl_ResetResult(interp); /* cannot get it, they MUST be different */ if (mode == HUMAN) printf("Replace %s with the same object from %s\n", dp1->d_namep, dbip2->dbi_filename); else printf("kill %s\n# IMPORT %s from %s\n", dp1->d_namep, dp2->d_namep, dbip2->dbi_filename); continue; } obj2 = Tcl_NewListObj(0, NULL); Tcl_AppendObjToObj(obj2, Tcl_GetObjResult(interp)); bu_vls_strcpy(&s2_tcl, Tcl_GetStringResult(interp)); str2 = bu_vls_addr(&s2_tcl); Tcl_ResetResult(interp); /* got TCL versions of both */ if ((dp1->d_flags & RT_DIR_SOLID) && (dp2->d_flags & RT_DIR_SOLID)) { /* both are solids */ has_diff += compare_tcl_solids(str1, obj1, dp1, str2, obj2); if (pre_5_vers != 2) { has_diff += compare_attrs(dp1, dp2); } continue; } if ((dp1->d_flags & RT_DIR_COMB) && (dp2->d_flags & RT_DIR_COMB)) { /* both are combinations */ has_diff += compare_tcl_combs(obj1, dp1, obj2); if (pre_5_vers != 2) { has_diff += compare_attrs(dp1, dp2); } continue; } /* the two objects are different types */ if (!BU_STR_EQUAL(str1, str2)) { has_diff += 1; if (mode == HUMAN) printf("%s:\n\twas: %s\n\tis now: %s\n\n", dp1->d_namep, str1, str2); else printf("kill %s\ndb put %s %s\n", dp1->d_namep, dp2->d_namep, str2); } } FOR_ALL_DIRECTORY_END;