dbref absolute_name(int need_pound) { dbref match; char *mname; mname = md.string; if (need_pound) { if (*md.string != NUMBER_TOKEN) { return NOTHING; } else { mname++; } if ((*mname == '_') && *(mname + 1)) { return absolute_nref(mname + 1); } } if (*mname) { match = parse_dbref(mname); if (Good_obj(match)) { return match; } } return NOTHING; }
/* * returns nnn if name = #nnn, else NOTHING */ static dbref absolute_name(bool bNeedPound) { UTF8 *mname = md.string; if (bNeedPound) { if (*mname != NUMBER_TOKEN) { return NOTHING; } else { mname++; } if ( '_' == mname[0] && '\0' != mname[1]) { return absolute_named_reference(mname + 1); } } if (*mname) { dbref match = parse_dbref(mname); if (Good_obj(match)) { return match; } } return NOTHING; }
void hs_move(dbref executor, char *arg_left, char *arg_right) { huniverse *uid; hcelestial *cel; hship *dship; hship *ship; int i, dx, dy, dz; dbref obj; dbref udb, ndb; char *r, *s; int len; dbref bot, top; obj = match_result(executor, arg_left, TYPE_THING, MAT_EVERYTHING); if (!IsShip(obj) && !IsCelestial(obj) && !IsConsole(obj)) { notify(executor, "HSPACE: Unable to move that object."); return; } s = arg_right; r = split_token(&s, '/'); if (!r || !*r) { notify(executor, "HSPACE: No destination specified."); return; } len = strlen(r); ndb = match_result(executor, r, TYPE_THING, MAT_EVERYTHING); if (!RealGoodObject(ndb)) { ndb = parse_dbref(r); } if (!RealGoodObject(ndb)) { bot = 0; top = db_top; } else { bot = ndb; top = bot + 1; } uid = NULL; /* cycle through the db and try to match a space object */ for (udb = bot; udb < top; udb++) { if (strncasecmp(Name(udb), r, len) && udb != ndb) continue; if (IsUniverse(udb)) { uid = find_universe(udb); } else if (IsCelestial(udb)) { cel = find_celestial(udb); if (cel) { uid = cel->uid; dx = cel->x; dy = cel->y; dz = cel->z; } } else if (IsShip(udb) || IsShipObj(udb)) { dship = find_ship(udb); if (dship) { dx = dship->x; dy = dship->y; dz = dship->z; uid = dship->uid; } } else { /* false positive */ continue; } break; } if (!uid) { notify(executor, "HSPACE: Unable to locate destination."); return; } if (s) { r = split_token(&s, ' '); if (r) { dx = parse_integer(r); r = split_token(&s, ' '); if (!r || !*r) { dy = 0; dz = 0; } else { dy = parse_integer(r); r = split_token(&s, ' '); if (!r || !*r) dz = 0; else dz = parse_integer(r); } } else { /* all blanks */ dx = 0; dy = 0; dz = 0; } } if (IsShip(obj) || IsConsole(obj)) { ship = find_ship(obj); move_ship(ship, uid, dx, dy, dz); } else if (IsCelestial(obj)) { cel = find_celestial(obj); move_celestial(cel, uid, dx, dy, dz); } notify(executor, "HSPACE: Moved."); }
/* leave a flying ship through the escape pod */ void emergency_eject(dbref player) { dbref nav, pad; hship *ship; hcelestial *cel, *min_cel; ATTR *a; char *r, *s; char buff[512]; double dist, min_dist; dbref min_pad; hship *sptr, *min_ship; /* check for a BAY */ a = atr_get(Location(player), "BAY"); if (!a) { /* no BAY, see if we're next to the nav console */ ship = find_ship(player); if (ship) { if (Location(ship->objnum) != Location(player)) { notify(player, "You can't eject from here."); return; } } } else { /* there's a BAY, see if the ship is valid */ nav = parse_dbref(atr_value(a)); if (!IsShip(nav)) { notify(player, "You can't eject from here."); return; } ship = find_ship_by_nav(nav); } if (!ship) { notify(player, "You can't eject from here."); return; } /* only eject when flying, not when landing or docking */ if (!ship->uid || ship->landed || ship->docked) { notify(player, "You may only eject while flying."); return; } /* find a planet with a drop pad */ min_pad = NOTHING; min_dist = 1000000.0; min_cel = NULL; for (cel = ship->uid->head_celestial; cel; cel = cel->next) { if (!HasFlag(cel->type, HS_PLANET)) continue; pad = atr_parse_dbref(cel->objnum, "DROPPADS"); if (!RealGoodObject(pad)) continue; dist = ship_celestial_distance(ship, cel); if (dist < min_dist) { min_dist = dist; min_pad = pad; min_cel = cel; } } min_ship = NULL; for (sptr = ship->uid->head_ship; sptr; sptr = sptr->next) { if (min_cel) break; if (!HasFlag(sptr->type, HS_STATION | HS_CAPITAL)) continue; pad = atr_parse_dbref(sptr->objnum, "BAY"); if (!RealGoodObject(pad)) continue; dist = ship_distance(ship, sptr); if (dist < min_dist) { min_cel = NULL; min_ship = sptr; min_dist = dist; min_pad = pad; } } if (!RealGoodObject(min_pad)) { notify(player, "There is nowhere to eject to!"); return; } /* finish up by setting HSPACE and notifying everybody of the move */ if (min_ship) { atr_add(player, "HSPACE", unparse_dbref(min_ship->objnum), hs_options.space_wiz, 0); } else if (min_cel) { atr_add(player, "HSPACE", unparse_dbref(min_cel->objnum), hs_options.space_wiz, 0); } else { SPACEWALL("Weird problem in eject."); notify(player, "Bad space object. Contact an administrator."); return; } notify_except(Location(player), Location(player), player, tprintf("%s ejects in an emergency escape pod!", Name(player)), 0); notify_except(min_pad, min_pad, player, tprintf("%s crash lands in an emergency escape pod!", Name(player)), 0); if (min_ship) { notify_consoles(min_ship, tprintf("%s%s-%s Emergency ejection pod automatically tractored into the docking back.", ANSI_HILITE, ANSI_GREEN, ANSI_NORMAL)); } moveto(player, min_pad, hs_options.space_wiz, NULL); }
/* leave a landed/docked ship through the hatch */ void disembark(dbref player) { dbref nav, obj, newobj; hship *ship; ATTR *a; int security; /* check if we can disembark from here */ a = atr_get(Location(player), "BAY"); if (!a) { /* no BAY, check if we're near the nav console */ ship = find_ship(player); if (ship) { if (Location(ship->objnum) != Location(player)) { notify(player, "You can't disembark from here."); return; } } } else { /* there's a BAY here, make sure it's a good one */ nav = parse_dbref(atr_value(a)); if (!IsShip(nav)) { notify(player, "You can't disembark from here."); return; } ship = find_ship_by_nav(nav); } if (!ship) { notify(player, "You can't disembark from here."); return; } /* no ditching in space, or early after launching, or prematurely when landing */ if ((ship->uid || ship->landing || ship->launching) && !ship->linked) { notify(player, "You can't disembark while in space."); return; } obj = atr_parse_dbref(ship->objnum, "SHIPOBJ"); if (!RealGoodObject(obj)) { notify(player, "This ship can not be disembarked."); return; } /* check whether we're docking or landing, save the new space object */ if (ship->landed) { newobj = ship->landed->objnum; } else if (ship->docked) { newobj = ship->docked->objnum; } else if (ship->linked) { newobj = ship->linked->objnum; } else { notify(player, "You can't disembark while in space."); return; } if (ship->linked) { /* check the boarding code, if necessary */ security = atr_parse_integer(ship->linked->objnum, "SECURITY", 0); if (security) { notify(player, "Unable to use boarding link while the other ship has security enabled."); return; } security = atr_parse_integer(ship->objnum, "SECURITY", 0); if (security) { notify(player, "Unable to use boarding link while security is enabled."); return; } obj = atr_parse_dbref(ship->linked->objnum, "BAY"); if (!RealGoodObject(obj)) obj = Location(ship->linked->objnum); moveto(player, obj, hs_options.space_wiz, NULL); } else { moveto(player, Location(obj), hs_options.space_wiz, NULL); } /* finish up by setting HSPACE attribute and notifying everybody about the move */ atr_add(player, "HSPACE", unparse_dbref(newobj), hs_options.space_wiz, 0); notify_except(obj, Location(player), player, tprintf("%s disembarks through the main hatch.", Name(player)), 0); notify_except(obj, Location(obj), player, tprintf("%s disembarks from the %s.", Name(player), Name(obj)), 0); return; }