Commit graph

3058 commits

Author SHA1 Message Date
1f7d8879ca Document delivery of civilians and military
People can be delivered since v4.0.0 (the check that disabled that was
commented out), and cutoff shows these deliveries since v4.0.2.  The
change was documented in info Empire4, but info pages weren't updated.
Do that, and remove the commented out code.
2008-06-02 07:02:26 +02:00
6e998a46e2 Replace commented out code in coll() by a suitable comment 2008-05-31 18:25:35 +02:00
64f44e9904 Fix ground combat to report defending land units
Commit 092a52f2 (v4.3.4) removed the code to estimate defense, because
the use of the estimate had been disabled since v4.0.0.  This
accidentally removed the reporting of defending units, because
get_dlist() reported them when called for an estimate, and not when
called for real.

Fix by removing the unused estimate capability from get_dlist().  It
now reports defending units always.
2008-05-31 17:30:20 +02:00
aacd0fb754 Avoid seqno mismatch oops in recursive land unit supply
Before s_commod() attempts to recursively supply a supply unit it
wants to use as supply source, it zaps the unit's load.  When
actually_doit is false, it later restores the old load by overwriting
the change with a saved copy of the unit.  That triggers a seqno
mismatch oops.

Avoid that by copying the new sequence number to the saved copy.
2008-05-28 22:30:36 +02:00
7f17369491 Don't run supply machinery to get zero units
Change supply_commod() and try_supply_commod() not to call s_commod()
when zero units are wanted.

This isn't just for efficiency, it's also for limiting exposure to
supply bugs a bit.
2008-05-28 07:35:22 +02:00
84c4ddd994 Bump version to 4.3.16 2008-05-27 22:24:40 +02:00
c7ac4ced21 Improve info on anti, bomb, lookout, starvation and sweep
Add command anti to subject Occupation, bomb to Combat, lookout to
Detection, and starvation to Updates.

Cross-reference recon from sweep.
2008-05-18 11:41:53 +02:00
ebf50dce54 Update change log for 4.3.15 2008-05-18 11:41:51 +02:00
8d85979a82 Update known contributors comments 2008-05-18 10:59:04 +02:00
5942bbb6fb Remove edit country key 'U' deprecated in 4.3.10 2008-05-18 08:51:22 +02:00
536ef0b0a2 Add sequence numbers to game state
This oopses on output dependency violations, e.g. two threads doing a
read-modify-write without synchronization, or the one thread nesting
several read-modify-writes.  Such bugs are difficult to spot, and tend
to be abusable.  I figure we have quite a few of them.

New struct emptypedstr member seqno.  Make sure all members of unit
empobj_storage share it.  Initialize it in files: main() and
file_sct_init().  Set it in ef_blank() and new ef_set_uid() by calling
new get_seqno().  Use ef_set_uid() when copying objects: swaps(),
doland(), doship(), doplane(), dounit(), delete_old_news().  Step it
in ef_write() by calling new new_seqno().

Factor do_read() out of fillcache() to make it available for
get_seqno().
2008-05-17 22:50:30 +02:00
087c0aae36 Simplify write_sects() sector loop nest
No functional change.
2008-05-17 22:24:27 +02:00
ba1a320ce2 Make fairland obey file locks
Do that by making it use file.h instead of stdio.

This doesn't overwrite the sector file completely anymore, it just
sets sct_type, sct_newtype, sct_elev and sct_coastal.  You really need
to run files first now.
2008-05-17 20:10:45 +02:00
d2a7bb6b6f Make fairland finish argument parsing before reading econfig 2008-05-17 19:52:38 +02:00
967122ae0b Fix files utility not to set timestamps
Commit f33b96b1 (v4.3.12) made files again set timestamps.  That was
intentionally suppressed in commit 990eb46b (v4.3.10), because it
facilitates attacks against the PRNG.  Commit 8f98e53a (v4.3.0) had
added it as a feature.

Fix by making files's main() pass new flag EFF_NOTIME to ef_open().
Implement the flag in do_write().
2008-05-17 19:35:22 +02:00
2a125c5463 Simplify empfile timestamping
do_write() sets the timestamp from a parameter.  All callers pass
time(), and don't use that value themselves.  Call time() in do_write
and remove the parameter.
2008-05-17 19:01:59 +02:00
d39a1f11cc Update timestamps in privately mapped tables, too
Commit f33b96b1 made ef_flush(), ef_write() and ef_extend() update
timestamps automatically.  Change ef_write() and ef_extend() to do
that even when table is privately mapped, by making do_write() cope
with privately mapped tables.  Current users don't care, but it's a
saner interface.
2008-05-17 18:56:38 +02:00
c3d5771054 Fix ef_write() for privately mapped non-file-backed table
Commit f8dcb7b0 promised that combination to work, but got it wrong.
It hasn't been used, so no real harm done.
2008-05-17 18:48:48 +02:00
5750107b65 Make server check game state file sizes on startup
Certain tables have a fixed size depending on configuration: EF_SECTOR
has WORLD_SZ() elements, EF_NATION, EF_MAP and EF_BMAP have MAXNOC
elements, and EF_REALM has MAXNOC * MAXNOR elements.  Bad things
happen if the files backing them are shorter.

Pass expected size to ef_open(), and make it fail when the actual size
differs.
2008-05-17 17:00:57 +02:00
b37ebbbde3 Fix starvation not to starve one more than it should
Commit 109dad1b (v4.3.5) promised to round victim fractions down, but
got it wrong for odd population when exactly half of it rounded down
could be fed.  This could starve the last man on a boat or land unit.
Fix famine_victims().
2008-05-17 08:50:56 +02:00
9a7628f05b Add command test to info subject Transportation 2008-05-15 19:41:32 +02:00
0cc474bd6d Fix crash bug in satellite maps
The value of diffx() had the wrong sign when the arguments differed by
WORLD_X / 2.  Same for diffy() and WORLD_Y / 2.  satmap() used them to
find the vector from map center to ship or land unit to put on the
map, and got incorrect values for ships and land units directly
opposite to the center in x or y.  The bug made satmap() read a
pointer out bounds of its malloced radbuf[], and then write through
that with unpredictable consequences.

Broken in 4.2.12.  The original bug was in Empire 1.1: it
miscalculated where to put ships on the map (no crash).  An incomplete
fix for radmap() and satmap() appeared in Chainsaw 2 (still no crash).
radmap() got fixed correctly in Chainsaw 3, but satmap() was
forgotten.  That one got "fixed" in 4.2.7, and again in 4.2.12, but
both "fixes" were flawed and could crash.

Fix by backing out the flawed fixes and adopting the fix from radmap()
instead.
2008-05-13 08:36:06 +02:00
7680acc39f Fix XNORM() and YNORM()
Broken in commit 5f764285 (v4.3.12) for negative multiples of WORLD_X
and WORLD_Y, respectively.

This could theoretically lead to buffer overruns and other
unpleasantness.  None have been reproduced, though.
2008-05-12 18:45:11 +02:00
238b9afc3b Catch selectors that make xundump oops early
Oops in new verify_ca(), which runs during initialization.
2008-05-12 12:39:38 +02:00
a38625d9a4 Make xundump oops on virtual selectors
Commit da8a1dae (v4.3.12) introduced virtual selectors, but neglected
to update xundump.  Xundump can't work for them, because they don't
provide a setter method.

This didn't actually break anything, because all virtual selectors
have flag NSC_EXTRA set, or are in table EF_VERSION, which xundump
refuses to touch.

Make deffld() oops on virtual selector, just to be safe.
2008-05-12 11:26:41 +02:00
3b4de2feb1 Remove option FUEL
The abstract idea of tying ships and land units to a logistical tether
is sound, the concrete implementation as option FUEL is flawed.  It
adds too much busy-work to the game to be enjoyable.  It hasn't been
enabled in a public game for years.  The code implementing it is ugly,
repetitive, and a burden to maintain.

Remove selector fuel from ship_ca[] and land_ca[], and selectors
fuelc, fuelu from mchr_ca[] and lchr_ca[].  Remove fields fuelc, fuelu
from ship.config and land.config.

Remove command fuel from player_coms[].

Deprecate edit key 'B' in doship(), dounit(), and don't show it in
pr_ship(), pr_land().

Drop opt_FUEL code from build_ship(), shi(), sdump(), ship_damage(),
show_ship_stats(), do_mob_ship(), nav_ship(), build_land(), land(),
ldump(), land_damage(), show_land_stats(), do_mob_land(),
resupply_all(), resupply_commod(), get_minimum(), has_supply(),
unit_list(), vers().

Remove opt_FUEL, fuel_mult, struct shpstr member shp_fuel, struct
mchrstr members m_fuelc and m_fuelu, M_OILER, struct lndstr member
lnd_fuel, struct lchrstr members l_fuelc and l_fuelu, fuel(), and
auto_fuel_ship().
2008-05-12 09:25:20 +02:00
3cc80e83c3 Remove unused num_shipsatxy() 2008-05-11 13:45:30 +02:00
286388dcdc Fix pin bomb not to report subs when there are none
pin_bomb() computed the number of foreign subs as number of ships less
number of foreign surface ships.  This counted own surface ships as
subs.

Change it to count foreign subs directly.  Closes #906040.

However, shipsatxy(), the function for counting foreign ships, also
lists them.  Add a parameter to suppress that, and change its callers.
2008-05-11 13:44:29 +02:00
221e88f106 Distinguish between sacking and obliterating a capital
Make caploss() transfer money, loans and market lots to the player
only if he actually took the capital, not if he obliterated it to
deity.

To make this work, caploss() needs to be called after the sector is
updated for damage and change of ownership.  Change callers
accordingly.

Closes #914049.
2008-05-11 10:48:30 +02:00
f6308422c3 Fix transfer of loans and market lots on sack of capital
Fix caploss() to transfer only signed loans.  Before, it transferred
any loan with a non-zero duration, which included loan offers, and
could claim to tranfer nonexistent loans.

Fix caploss() not to claim transfer of nonexistant market lots when
country 0 sacks a capital.
2008-05-11 10:30:32 +02:00
a16af46af9 Fix test for capital in caploss() to check country status
Test for STAT_ACTIVE instead of non-zero country number.  Inactive
countries have no capital they could lose!
2008-05-11 10:20:40 +02:00
ba5c360ca7 Remove useless call of caploss() from detonate()
The call has no effect, because by that time caploss() already ran
from sct_prewrite().
2008-05-11 10:05:25 +02:00
bb7c8665e4 Start the Empire clock on first break or update
Before, the Empire clock started at the epoch, which effectively made
it not tick before the first update.
2008-05-10 21:52:19 +02:00
dc8a7fe3ef Remove useless sanctuary break logic from designate
Don't call bsanct() when desi() is redesignating a sanctuary.  It's
pointless, because only deities can redesignate sanctuaries, and
bsanct() does nothing for them.
2008-05-10 19:09:20 +02:00
0a61f8eb78 Fix some argument prompts to end in one space
Corrects first argument of collect and show, and second argument of
assault, follow, mine, lmine and mobquota.
2008-05-10 18:52:29 +02:00
a1f4dc9592 Fix edit l, s, u, p not to wipe out concurrent updates
Make edit() bail out if the edited object changed while edit() slept
for input.
2008-05-10 08:40:48 +02:00
3dbb4dbb93 Fix xdump nat for relations
Commit ee863c5d (v4.3.12) got opt_HIDDEN backwards in nstr_exec_val().
2008-05-10 08:36:45 +02:00
27c3466aa5 Fix origin command not to prompt twice for its argument
Broken in commit b69173ee, v4.3.0.
2008-05-07 22:05:22 +02:00
db031971aa Bump version to 4.3.15 2008-05-07 21:58:15 +02:00
13d0fc7077 Avoid compiler warning 2008-05-05 21:54:02 +02:00
abd64835c7 Update change log again for 4.3.14 2008-05-05 06:57:42 +02:00
fe5b26658d Fix fire not to disclose retreat and wipe out target shell use
multifire() clobbered any changes to the target ship or sector made by
defend().  This let the target fire back for free.

multifire() retreated the target ship before reporting its location to
the player.  This disclosed its new location.

Fix by damaging and retreating the target after calling defend().
2008-05-05 06:53:33 +02:00
aae77430bf Change fire to always fire guns when the target is beyond range
multifire() drops depth charges if the target is a submarine, else it
fires guns.  It fails if the target is out of range.  But players
could still find out whether the target is a sub then, because depth
charge shell use differs from gun fire shell use.  This loophole
existed before 4.0.6, and was reopened by commit a3ad623b (v4.3.12).

Change multifire() to always use guns if the target is out of range.

While there, treat failure from shp_dchrg() and shp_fire() the same,
so that the player can't distinguish the two cases.  Failure there
should not happen.
2008-05-05 06:52:15 +02:00
cd6d12c4fb Make depth charges work with just one shell
Commit a3ad623b (v4.3.12) made depth charging fail when there's just
one shell.  This let players find all submarine uids.  It basically
reopened the loophole closed in commit aa26c53e (v4.2.20).

Fix by making shp_dchrg() with just one shell succeed and return
damage like fire from one gun.
2008-05-04 19:27:31 +02:00
66165f34cb Fix fire command to detect when the firing object changes
multifire() failed to take into account that the firing firing sector,
ship or land unit can change while it is getting the target argument.
It thus clobbered any updates made to the firing object while it was
sleeping for the target argument.  Abusable.  Broken when Chainsaw
introduced MULTIFIRE.
2008-05-04 16:44:26 +02:00
bf2fd6cb82 Fix parsing of anchor-relative time in update schedule
Commit 16b811d4 (v4.3.13) broke parse_time().
2008-05-04 09:52:46 +02:00
e8f82d34a7 Update change log again for 4.3.14. 2008-04-29 22:08:03 +02:00
a433320125 Journal input of special cookies "ctld" and "aborted"
The latter is necessary to interpret the journal correctly.  The
former isn't, as it should always lead to a logout straight away, but
treating it just the same is simple and doesn't hurt.
2008-04-29 21:42:17 +02:00
f3202225f2 Rewrite recvclient() for clarity
Behavior differs for the following scenario: if, while the thread
sleeps in io_input() called from recvclient(), at least one line of
input arrives and the thread gets awakened by the update aborting
commands, then the old code throws away the first line of input, but
the new code doesn't.
2008-04-29 21:35:02 +02:00
8209b88a54 Fix launch not to report the same ship sunk twice
This happened when a marine missile with a conventional warhead sunk
its target.
2008-04-29 21:10:33 +02:00