/* * Search table @type for an element matching @name, return its index. * Accepts EF_BAD, but of course never finds anything then. * Return M_NOTFOUND if there are no matches, M_NOTUNIQUE if there are * several. */ int ef_elt_byname(int type, char *name) { switch (type) { case EF_BAD: return M_NOTFOUND; case EF_NATION: return cnumb(name); case EF_SECTOR_CHR: return sct_typematch(name); case EF_SHIP_CHR: return stmtch(name, mchr, offsetof(struct mchrstr, m_name), sizeof(mchr[0])); case EF_LAND_CHR: return stmtch(name, lchr, offsetof(struct lchrstr, l_name), sizeof(lchr[0])); case EF_PLANE_CHR: return stmtch(name, plchr, offsetof(struct plchrstr, pl_name), sizeof(plchr[0])); case EF_NUKE_CHR: return stmtch(name, nchr, offsetof(struct nchrstr, n_name), sizeof(nchr[0])); case EF_ITEM: return stmtch(name, ichr, offsetof(struct ichrstr, i_name), sizeof(ichr[0])); case EF_PRODUCT: return stmtch(name, pchr, offsetof(struct pchrstr, p_sname), sizeof(pchr[0])); case EF_TABLE: return stmtch(name, empfile, offsetof(struct empfile, name), sizeof(empfile[0])); default: if (ef_cadef(type) == symbol_ca) return stmtch(name, ef_ptr(type, 0), offsetof(struct symbol, name), sizeof(struct symbol)); } return M_NOTFOUND; }
int desi(void) { int n; char *p; int des; struct nstr_sect nstr; struct sctstr sect; struct natstr *natp; char prompt[128]; char buf[1024]; int changed = 0; int rc = RET_OK; if (!snxtsct(&nstr, player->argp[1])) return RET_SYN; natp = getnatp(player->cnum); while (nxtsct(&nstr, §)) { if (!player->owner) continue; if (!player->god && dchr[sect.sct_type].d_cost < 0) continue; sprintf(prompt, "%s %d%% %s desig? ", xyas(sect.sct_x, sect.sct_y, player->cnum), sect.sct_effic, dchr[sect.sct_type].d_name); if (!(p = getstarg(player->argp[2], prompt, buf))) { rc = RET_FAIL; break; } if (!check_sect_ok(§)) continue; des = sct_typematch(p); if (des < 0) { pr("No such designation\n" "See \"info Sector-types\" for possible designations\n"); rc = RET_FAIL; break; } if (!player->god) { if (des == SCT_WASTE) { pr("Only a nuclear device (or %s) can make a %s!\n", cname(0), dchr[des].d_name); rc = RET_FAIL; break; } if (dchr[des].d_cost < 0) { pr("Only %s can designate a %s!\n", cname(0), dchr[des].d_name); rc = RET_FAIL; break; } if (dchr[des].d_terrain != dchr[sect.sct_type].d_terrain) { pr("You can't change a %s into a %s\n", dchr[sect.sct_type].d_name, dchr[des].d_name); continue; } } if (sect.sct_type == des && sect.sct_newtype == des) continue; if ((des == SCT_HARBR || des == SCT_BHEAD) && !sect.sct_coastal) { pr("%s does not border on water.\n", xyas(nstr.x, nstr.y, player->cnum)); if (player->god) pr("But if it's what you want ...\n"); else continue; } if (sect.sct_type == SCT_SANCT && !player->god) continue; n = sect.sct_type; if ((sect.sct_newtype != des) && (sect.sct_type != des) && dchr[des].d_cost > 0) { if (natp->nat_money < player->dolcost + dchr[des].d_cost) { pr("You can't afford a %s!\n", dchr[des].d_name); rc = RET_FAIL; break; } player->dolcost += dchr[des].d_cost; } if (sect.sct_type != des && (sect.sct_effic < 5 || player->god)) { if (player->god) set_coastal(§, sect.sct_type, des); sect.sct_type = des; sect.sct_effic = 0; changed += map_set(player->cnum, sect.sct_x, sect.sct_y, dchr[des].d_mnem, 0); } sect.sct_newtype = des; putsect(§); if (!player->god && sect.sct_x == natp->nat_xcap && sect.sct_y == natp->nat_ycap && des != SCT_CAPIT && des != SCT_SANCT && des != SCT_MOUNT) pr("You have redesignated your capital!\n"); if (opt_EASY_BRIDGES == 0) { /* may cause a bridge fall */ if (n != SCT_BHEAD) continue; bridgefall(§); } } if (changed) writemap(player->cnum); return rc; }