void bsanct(void) { int count; struct sctstr s; struct nstr_sect nstr; if (player->god) return; count = 0; snxtsct_all(&nstr); while (nxtsct(&nstr, &s)) { if (!player->owner) continue; if (s.sct_type != SCT_SANCT) continue; pr("%s is no longer a sanctuary.\n", xyas(s.sct_x, s.sct_y, player->cnum)); if (s.sct_newtype == SCT_SANCT) s.sct_newtype = SCT_CAPIT; s.sct_type = s.sct_newtype; game_tick_to_now(&s.sct_access); (void)putsect(&s); count++; } if (count > 0) { game_note_bsanct(); nreport(player->cnum, N_BROKE_SANCT, 0, 1); } }
int check_trade(void) { int n; struct natstr *natp; struct trdstr trade; union empobj_storage tg; time_t now; int price; int saveid; natid seller; for (n = 0; gettrade(n, &trade); n++) { if (trade.trd_unitid < 0) continue; if (!trade_getitem(&trade, &tg)) continue; if (tg.gen.own == 0) { trade.trd_owner = 0; trade.trd_unitid = -1; puttrade(n, &trade); continue; } if (tg.gen.own != trade.trd_owner) { logerror("Something weird, tg.gen.own != trade.trd_owner!\n"); trade.trd_owner = 0; trade.trd_unitid = -1; puttrade(n, &trade); continue; } if (trade.trd_owner == trade.trd_maxbidder) continue; (void)time(&now); if (trade.trd_markettime + TRADE_DELAY > now) continue; saveid = trade.trd_unitid; seller = trade.trd_owner; trade.trd_owner = 0; trade.trd_unitid = -1; if (!puttrade(n, &trade)) { logerror("Couldn't save trade after purchase; get help!\n"); continue; } price = trade.trd_price; natp = getnatp(trade.trd_maxbidder); if (natp->nat_money < price) { nreport(trade.trd_maxbidder, N_WELCH_DEAL, seller, 1); wu(0, seller, "%s tried to buy a %s #%d from you for $%.2f\n", cname(trade.trd_maxbidder), trade_nameof(&trade, &tg.gen), saveid, price * tradetax); wu(0, seller, " but couldn't afford it.\n"); wu(0, seller, " Your item was taken off the market.\n"); wu(0, trade.trd_maxbidder, "You tried to buy %s #%d from %s for $%d\n", trade_nameof(&trade, &tg.gen), saveid, cname(seller), price); wu(0, trade.trd_maxbidder, "but couldn't afford it.\n"); continue; } /* If we get this far, the sale will go through. */ natp->nat_money -= price; putnat(natp); natp = getnatp(seller); natp->nat_money += roundavg(price * tradetax); putnat(natp); switch (trade.trd_type) { case EF_NUKE: tg.nuke.nuk_x = trade.trd_x; tg.nuke.nuk_y = trade.trd_y; tg.nuke.nuk_plane = -1; break; case EF_PLANE: if (!pln_is_in_orbit(&tg.plane)) { tg.plane.pln_x = trade.trd_x; tg.plane.pln_y = trade.trd_y; } if (opt_MOB_ACCESS) { tg.plane.pln_mobil = -(etu_per_update / sect_mob_neg_factor); game_tick_to_now(&tg.plane.pln_access); } else { tg.plane.pln_mobil = 0; } tg.plane.pln_harden = 0; tg.plane.pln_ship = -1; tg.plane.pln_land = -1; break; case EF_SHIP: break; case EF_LAND: tg.land.lnd_x = trade.trd_x; tg.land.lnd_y = trade.trd_y; if (opt_MOB_ACCESS) { tg.land.lnd_mobil = -(etu_per_update / sect_mob_neg_factor); game_tick_to_now(&tg.land.lnd_access); } else { tg.land.lnd_mobil = 0; } tg.land.lnd_harden = 0; unit_drop_cargo(&tg.gen, 0); tg.land.lnd_ship = -1; tg.land.lnd_land = -1; break; default: logerror("Bad trade type %d in trade\n", trade.trd_type); break; } unit_give_away(&tg.gen, trade.trd_maxbidder, 0); put_empobj(trade.trd_type, saveid, &tg.gen); nreport(seller, N_MAKE_SALE, trade.trd_maxbidder, 1); wu(0, seller, "%s bought %s #%d from you for $%.2f\n", cname(trade.trd_maxbidder), trade_nameof(&trade, &tg.gen), saveid, price * tradetax); wu(0, trade.trd_maxbidder, "The bidding is over & you bought %s #%d from %s for $%d\n", trade_nameof(&trade, &tg.gen), saveid, cname(seller), price); } return RET_OK; }
void takeover(struct sctstr *sp, natid newown) { struct plnstr *pp; struct lndstr *lp; int civ; int che_count; int oldche; int n; struct nstr_item ni; struct plnstr p; struct lndstr land; /* Wipe all the distribution info */ memset(sp->sct_dist, 0, sizeof(sp->sct_dist)); memset(sp->sct_del, 0, sizeof(sp->sct_del)); if (sp->sct_own == 0) sp->sct_off = 0; else sp->sct_off = 1; sp->sct_dist_x = sp->sct_x; sp->sct_dist_y = sp->sct_y; pp = &p; /* Take over planes */ snxtitem_xy(&ni, EF_PLANE, sp->sct_x, sp->sct_y); while (nxtitem(&ni, pp)) { if (pp->pln_own != sp->sct_own) continue; takeover_plane(pp, newown); } /* Take over land units */ lp = &land; snxtitem_xy(&ni, EF_LAND, sp->sct_x, sp->sct_y); while (nxtitem(&ni, lp)) { if ((lp->lnd_own == newown) || (lp->lnd_own == 0)) continue; if (lp->lnd_own != sp->sct_own) continue; if (lp->lnd_ship >= 0 || lp->lnd_land >= 0) continue; /* Spies get a chance to hide */ if (lchr[(int)lp->lnd_type].l_flags & L_SPY) { if (!(chance(LND_SPY_DETECT_CHANCE(lp->lnd_effic)))) continue; } n = lp->lnd_effic - (29 + roll(100)); if (n < 0) n = 0; lp->lnd_effic = n; if (lp->lnd_effic < LAND_MINEFF) { lp->lnd_effic = 0; mpr(newown, "%s blown up by the crew!\n", prland(lp)); wu(0, lp->lnd_own, "%s blown up by the crew when %s took %s!\n", prland(lp), cname(newown), xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own)); } else { mpr(newown, "We have captured %s!\n", prland(lp)); wu(0, lp->lnd_own, "%s captured when %s took %s!\n", prland(lp), cname(newown), xyas(lp->lnd_x, lp->lnd_y, lp->lnd_own)); } takeover_land(lp, newown); } sp->sct_avail = 0; civ = sp->sct_item[I_CIVIL]; oldche = sp->sct_che; /* * create guerrillas from civilians * how spunky are these guys? * n: random number from -25:75 + (50 - loyalty) */ n = (50 - sp->sct_loyal) + (roll(100) - 26); if (n > 0 && sp->sct_own == sp->sct_oldown) { che_count = (civ * n / 3000) + 5; if (che_count * 2 > civ) che_count = civ / 2; che_count /= hap_fact(getnatp(newown), getnatp(sp->sct_own)); if (che_count + oldche > CHE_MAX) che_count = CHE_MAX - oldche; if (che_count > 0) { civ -= che_count; che_count += oldche; } else che_count = oldche; } else che_count = oldche; sp->sct_che = che_count; if (newown != sp->sct_oldown) sp->sct_che_target = newown; if (sp->sct_che_target == 0) sp->sct_che = 0; sp->sct_item[I_CIVIL] = civ; if (sp->sct_oldown == newown || civ == 0) { /* * taking over one of your old sectors */ sp->sct_loyal = 0; sp->sct_oldown = newown; } else { /* * taking over someone else's sector */ sp->sct_loyal = 50; } sp->sct_own = newown; if (opt_MOB_ACCESS) { game_tick_to_now(&sp->sct_access); sp->sct_mobil = -(etu_per_update / sect_mob_neg_factor); } else { sp->sct_mobil = 0; } }