Commit graph

4061 commits

Author SHA1 Message Date
7ebbe7da4c Eliminate a few pointless relations variables
Just to make the next few commits easier to review.
2011-02-16 07:48:30 +01:00
bb5cd07ce5 New relations_with()
Relations checking with getrel() often needs a special case for "is
same country".  If you forget, you get behavior appropriate for a
neutral foreign country, which is usually very wrong (see commit
16c68eb4 for an example).

Unlike getrel(), relations_with() considers countries allied to
themselves.  Less dangerous.  In fact, allied behavior is typically
just right, so the special case isn't even needed.
2011-02-13 17:48:58 +01:00
0c60e574a9 Permit sharebmap with yourself
Does nothing.  Before, it failed with a mildly bogus "does not have
friendly relations towards you" message.
2011-02-13 16:41:35 +01:00
58cbd4cc2e Make share_bmap() do nothing for sharing with oneself
Before, it overwrote '?', '.', ' ' in the bmap with the capitalized
country letter, but only for sectors the player owns.  Pretty
harmless, just weird.  It can't happen currently, because sharebmap
with self fails with "does not have friendly relations towards you".
2011-02-13 16:41:35 +01:00
de7657dd99 Permit flash to yourself
Flashing yourself failed with a bogus "not logged on" message for
deities, and a mildly bogus "not a deity or friendly with us" message
for mortals.

Fix by simply permitting it.  Not terribly useful, except perhaps for
empire-hub users, but why not.
2011-02-13 16:39:20 +01:00
0d4566847f Drop redundant chat(), sendmessage() parameter us
It can't be anything but the current player.
2011-02-13 16:39:20 +01:00
5eeac45b8d Clean up confusing control flow in sendmessage()
The second patch hunk fixes a latent bug.  Before, rejected deity
flashes led to a bogus "not logged on" message, now they lead to a
"not accepting" message.  But deity flashes can't be rejected, so this
doesn't matter.
2011-02-13 16:32:37 +01:00
e21f5035cb Optimize sendmessage() use of getnatp()
Don't call it when its value must be TO anyway.

While there, oops when it fails instead of recovering silently.
2011-02-13 16:06:23 +01:00
fc633a4f1f Fix racy detection of ally rejecting flashes
sendmessage() checked NF_FLASH on two places: when deciding whether to
send the message, and later when telling the player why it didn't send
a flash.  This can race with the toggle command as follows: if a flash
could not be sent because the recipient's NF_FLASH was off, and the
recipient toggled it on before the flag was checked again, the flash
command claimed the sender wasn't logged on.
2011-02-13 16:06:23 +01:00
53a4fc6e26 Change flash not to print "Flash sent" for deities
It's annoying.  It never did that for mortals.
2011-02-13 16:06:23 +01:00
2b3e11d35d Remove pointless variables from setrel() 2011-02-13 16:06:22 +01:00
985ec19f8b Make setrel() refuse to change relations to self
No current caller actually attempts that, but let's make it obvious.
2011-02-13 16:06:22 +01:00
d4f0cb3576 Change setrel(), setcont(), setrej() to return void
Nobody cares for their value anyway.
2011-02-13 16:06:22 +01:00
a302bde1fb Oops on invalid arguments in setrel(), setcont(), setrej()
Before, they recovered silently.
2011-02-13 16:06:22 +01:00
89bc9c4d5b Use feels_like_helping() in dosupport(), lnd_support()
feels_like_helping() case cn == foe is missing in the code it
replaces.  No difference in behavior, because:

* cn == foe && cn == friend can't happen.  Because you can't get into
  ground combat against yourself (assault, attack and paradrop don't
  let you), friend != foe for support.

* cn == foe && cn != friend behaves the same: no support.
  feels_like_helping() returns 0 because of the explicit case.  The
  replaced code doesn't support because cn can't be at war with
  itself.
2011-02-13 16:06:22 +01:00
c095ad285b Factor feels_like_helping() out of quiet_bigdef(), sd(), dd() 2011-02-13 16:06:22 +01:00
7374002fd7 Plug memory leaks in mission execution code
Mission execution first builds lists of eligible units, one list per
country.  These lists are passed to perform_mission() one by one,
where they get freed.

Bugs:

* unit_interdict() didn't pass the list for the submarine's owner, but
  build_mission_list_type() built one.  Any submarine movement within
  own submarine interdiction mission op areas leaked memory.

* dosupport() passed only lists for countries that actually support
  (ally at war with victim), but build_mission_list_type() built lists
  for all countries hostile to the victim.  Ground combat within
  support mission op areas countries that are hostile to one of the
  party without actually supporting the other leaked memory.

* perform_mission() failed to free missiles targeting units.

Fixing the latter is straightforward.

Fix the first two by deciding whether a country acts on a mission
trigger before building any lists, in ground_interdict(),
unit_interdict(), dosupport().  Remove the code dealing with that from
build_mission_list_type() and the loops around perform_mission().
2011-02-13 16:06:22 +01:00
6a35432346 Move code from def_support(), off_support() to dosupport() 2011-02-13 16:06:22 +01:00
723cc96d9c Eliminate nav_loadship() variables landown, shipown
Code is clearer without them.  Works because load_it() never changes
ship or sector owner.
2011-02-13 16:03:34 +01:00
4a142dd102 Drop redundant nav_loadship() parameter cnum 2011-02-13 16:03:34 +01:00
6d014e8069 Eliminate nav_ship() variable cnum
Code is clearer without it.
2011-02-13 16:03:34 +01:00
05b3e1b8d8 Oops on invalid actor and victim arguments in nreport()
Replaces the existing, silent recovery from invalid victim argument.
2011-02-13 16:03:34 +01:00
38e59474b1 Clean up use of current player in march code
lnd_mar() and lnd_mar_one_sector() take an actor argument.
Nevertheless, they sometimes used player->cnum.  Fortunately, they are
the same: all callers pass current player for actor.  Normalize to
actor for consistency.
2011-02-13 16:03:34 +01:00
98c5a92baa Fix land unit attack mobility cost out of allied sectors
Land units pay a mobility penalty when marching into a non-old-owned
sector without sector mobility, to slow them down in newly taken
sectors.  Attacking land units pay this penalty regardless of sector
mobility.

When attacking out of an allied sector, the penalty was computed as if
the land unit was owned by that ally.  Attacking sectors old-owned by
that ally was too cheap, and taking back one's own was too expensive.

Broken since attacking land units pay the "newly taken" mobility
penalty: commit 2e693275, v4.3.6.
2011-02-13 16:03:34 +01:00
13d9057bd8 Fix attack when attacking sector gets taken by ally
When an attacking sector got lost while the player was at a prompt,
and the new owner was allied to the player, the server got confused:

1. If the sector attacked with mil, the server let the ghost mil
attack, but not occupy.

2. If the sector was allied, the server reported the sector loss and
land units dropping out of the attack, but claimed the lost sector was
yours.

Fix 1. by dropping sectors from attack when they change owner away
from the player, regardless of relations.  Side effect: also drops any
surviving land units there.  Before, they dropped out only if the new
owner wasn't allied to the player.  That change's okay.

Fix 2. the obvious way: change the messages.

Broken in 4.0.0.
2011-02-13 16:03:34 +01:00
16c68eb403 Fix trade ships to pay off in own harbor
Broken in commit 3318e4e4, v4.3.17.
2011-02-13 16:03:34 +01:00
439f111f98 Remove option SLOW_WAR
SLOW_WAR has issues:

* The check whether the attacker old-owns the attacked sector is
  broken, because att_abort() uses sect.sct_oldown uninitialized.

  Spotted by the Clang Static Analyzer.

* Its implementation in setrel() is somewhat scary.  It's actually
  okay, because that part of setrel() only runs within decl().  Other
  callers don't reach it: update_main() because player->god != 0
  there, and the rest because they never pass a rel < HOSTILE.

* Documentation is a bit vague.

SLOW_WAR hasn't been used in a public game in years.  Fixing it is not
worth it, so remove it instead.
2011-02-13 15:59:49 +01:00
a94ae5f8c1 Fix nightly's sandbox cleanup not to hang when stdin is a tty
"rm -r" prompts for read-only files when stdin is a tty.  Probably
broken since we install builtin configuration read-only, in commit
b4161cd7, v4.3.0.

Move "done" message to the right place.  Broken in commit 70c03561,
v4.3.12.
2011-01-15 14:40:06 +01:00
c7d9d4fcf4 Fix nightly's check for existing sandbox
Broken in commit 70c03561, v4.3.12.
2011-01-15 14:40:06 +01:00
c77db95fad Clean up a useless use of cat 2011-01-15 14:40:06 +01:00
37589489c6 Fix make clean to remove info.ps
Missed in commit 9067d7a4.
2011-01-09 15:27:26 +01:00
217fe6dd16 Fix sail command to support full path length
Off-by-one in cmd_sail_ship() chopped off the last character of
full-length sail paths.
2011-01-09 15:27:26 +01:00
91302d36dd Remove unused plurize()
Unused since commit 44c36fa, v4.3.23.
2011-01-09 15:21:39 +01:00
13d236a1e0 Change ioq_dequeue() to return void
For symmetry with ioq_append().
2010-08-29 11:38:02 +02:00
2bb8923c6f Err, the race in io_output() doesn't double-free
The previous commit's message claims the race can lead to duplicated
output, use after free, then double-free.  That's correct only up to
the use after free.  There is no double-free.

Heap corruption (double-free?) has been observed in Changeling,
though.  Player logged in (still in sanctuary), map #, crashed within
removecc()'s free(io->data).  Partial backtrace:

    raise () from /lib64/libc.so.6
    abort () from /lib64/libc.so.6
    __libc_message () from /lib64/libc.so.6
    malloc_printerr () from /lib64/libc.so.6
    removecc (ioq=0x251fd10, cc=468) at ../src/lib/gen/ioqueue.c:350
    ioq_dequeue (ioq=0x251fd10, cc=468) at ../src/lib/gen/ioqueue.c:135
    io_output (iop=0x251fc90, wait=1) at ../src/lib/empthread/io.c:231
    recvclient (cmd=0x258d8e0 "", size=1024) at ../src/lib/player/recvclient.c:82
    getcommand (combufp=0x2557068 "map #1") at ../src/lib/player/empdis.c:84

I haven't been able to reproduce.

To hopefully catch ioqueue going south earlier, make ioq_dequeue()
oops when it can't dequeue as many bytes as requested.
2010-08-29 11:31:02 +02:00
d28fbbb186 Fix race in io_output() that can lead to double-free
Move call of ioq_makeiov() to its use, because calling it before
empth_select() is racy, as follows.

Player thread flushes output by calling io_output(player->iop, 1).
io_output() sets up iov[] to point to queued output.  empth_select()
blocks on output.

Another thread sends a C_FLASH or C_INFORM message to this player.
This calls io_output(p->iop, 0).  The output file descriptor has
become writable since the player thread blocked on it, so some output
gets written and dequeued.

The player thread resumes, writes out iov[] and dequeues.  Any output
already written by the other thread gets duplicated.  If the other
thread's dequeue operation freed struct io buffers, there's use after
free followed by double-free.
2010-07-25 18:24:00 +02:00
25115f4997 Document xundump() memory leak more clearly 2010-07-25 18:24:00 +02:00
a5c2a24db6 Planes get to sweep and sonar only after flak and interception
If defenders get to shoot before bombs are dropped, they surely get to
shoot before time-consuming missions like sweep and sonar.

Sweep and sonar used to happen after air defense, but before flak and
interception.  Air defense existed from Chainsaw 3 to v4.3.19.
2010-07-25 18:23:45 +02:00
ceee05eb7e Neater plane sonar contact output
plane_sona() prints an empty line to make sonar contacts stand out.
Move it so the contact is visually "attached" to the right sector,
like this:

    flying over sea at 15,-3
    Sonar contact in 15,-3
    sub #3 13,-3

    flying over sea at 13,-3

Before:

    flying over sea at 15,-3

    Sonar contact in 15,-3
    sb   submarine (#3) 13,-3
    flying over sea at 13,-3
2010-07-25 17:48:54 +02:00
10736cd157 Don't write garbage to unused trade destination in trade file
struct trdstr members trd_x, trd_y are used only for teleporting
trades.  For others, trad() wrote garbage coordinates to the trade
file.  They weren't used except by xdump.  Fortunately, even there
they're visible only to deities.

Write invalid coordinates instead.  Do that in set() as well, so that
coordinates are valid only when we have a teleport destination.

Spotted by the Clang Static Analyzer.
2010-07-25 17:48:53 +02:00
8c78b1188b Clean up dead store in skyw()
Dead since commit 38befcb4.  Spotted by the Clang Static Analyzer.
2010-07-25 17:48:53 +02:00
765bf06ab2 Make disabled recursive supply in s_commod() compile again
Untested.  Broken in commit 98f24d5c, v4.3.20.
2010-07-25 17:48:53 +02:00
a8a68287bb Remove unused variables in disabled lnd_fort_interdiction() 2010-07-25 17:48:53 +02:00
5eb337e232 Clean up unobvious coordinate system use in doland()
Use the obviously correct newown instead of sect->sct_own.  They're
actually equal here.
2010-07-25 17:48:53 +02:00
f0da4769dc Clean up unobvious coordinate system use in detonate()
Use the obviously correct player->cnum instead of own.  They're
actually equal here.
2010-07-25 17:48:53 +02:00
efd3940322 Clean up unobvious coordinate system use in pln_airbase_ok()
Use the obviously correct player->cnum instead of pp->pln_own.
They're actually equal here.
2010-07-25 17:48:53 +02:00
1fa06bd45f Clean up suspicious coordinate system use in unit_put()
It showed unit coordinates in unit's coordinate system instead of the
actor's.  Fortunately, they're the same, since it is reachable only
for non-zero actor, only shp_nav_one_sector(), lnd_mar_one_sector()
and sail_nav_fleet() pass that, and even deities can't navigate
foreign ships or march foreign land units.
2010-07-25 17:48:53 +02:00
eea0dfd133 Factor rad_char() out of radmap() and rad_map_set()
Code was duplicated in commit 0d477e5d.
2010-07-25 17:47:30 +02:00
e41762ca49 Compute radar range in one place, rad_range()
Before, a part was duplicated in radmap() and rad_map_set(), and
another part in their callers.
2010-07-25 17:45:14 +02:00
e49cb13480 Don't limit radar command's range to fit into world map
Limited since Chainsaw 2 so that the radar map fits into a world map
without clipping, i.e. its diameter neither exceeds WORLD_X / 2 nor
WORLD_Y.  Maybe range exceeding that triggered bugs then.  It doesn't
now, and it makes no sense.

The limit never applied to automatic bmap update from ship radar.
2010-07-25 17:40:52 +02:00