14 years agoUpdate change log for 4.3.18 v4.3.18
Markus Armbruster [Sat, 18 Oct 2008 18:40:27 +0000 (14:40 -0400)]
Update change log for 4.3.18

14 years agoOops when unit_carrier_change() arguments OLD or NEW are invalid
Markus Armbruster [Sat, 18 Oct 2008 18:21:45 +0000 (14:21 -0400)]
Oops when unit_carrier_change() arguments OLD or NEW are invalid

14 years agoAdd scrap and scuttle tests to nightly builds
Ron Koenderink [Fri, 10 Oct 2008 03:49:07 +0000 (21:49 -0600)]
Add scrap and scuttle tests to nightly builds

Also general improvements to economy for player 08.

14 years agoAdd land units tests to nightly builds and improve economy
Ron Koenderink [Wed, 8 Oct 2008 13:52:10 +0000 (07:52 -0600)]
Add land units tests to nightly builds and improve economy

Up the bar production.  Start education and tech for player 08
Improve the general economy for player 08.  Add land units building
tests to player 01, including ensuring the tech is high to build.

14 years agoFix initialization of new elements in plane, land and nuke tables
Ron Koenderink [Mon, 6 Oct 2008 23:58:59 +0000 (17:58 -0600)]
Fix initialization of new elements in plane, land and nuke tables

ef_init_srv() neglected to set struct empfile callback oninit.  This
made unit_carrier_change() crash or oops on freshly initialized
planes, land units and nukes, i.e. when build used an uid that hadn't
been used before.  Oops recovery worked.

Broken in commit 64a53c90, v4.3.17.

14 years agoAdd xdump tests to nightly builds
Ron Koenderink [Sun, 28 Sep 2008 15:03:50 +0000 (09:03 -0600)]
Add xdump tests to nightly builds

Add xdump meta test to Turn 00 Player 02 to verify player visibility.
Add xdump test to Turn 99 Player 00 to verify xdump output.
Add xdump test to Turn 99 Player 01 to player's version of xdump

14 years agoAdd xdump meta and table accessible tests to nightly builds
Ron Koenderink [Sat, 27 Sep 2008 23:41:06 +0000 (17:41 -0600)]
Add xdump meta and table accessible tests to nightly builds

14 years agoMove test scripts from nightlybuild.sh to separate files
Ron Koenderink [Sat, 27 Sep 2008 01:47:16 +0000 (19:47 -0600)]
Move test scripts from nightlybuild.sh to separate files

The test scripts are now in nightly/tests/TURN/PLAYER.  For each turn,
the update script is executed first (except for turn 00), and then all
the player scripts in the appropriate turn directory.  This runs
runfeed() in different directories; change it to accomodate for that.

The update script runs "report *" on all updates.  Before, it ran only
on some of them.

14 years agoAdd missing cd to patch step for nightlybuild.sh
Ron Koenderink [Fri, 26 Sep 2008 23:33:11 +0000 (17:33 -0600)]
Add missing cd to patch step for nightlybuild.sh

If the patch step is ran without the preceeding step, the cwd
is incorrect.

14 years agoCorrection for Ubuntu Conversion
Ron Koenderink [Fri, 26 Sep 2008 03:12:24 +0000 (21:12 -0600)]
Correction for Ubuntu Conversion

Change nightlybuild.sh to allow the setting of the pthread
option for ./configure.  Remove the incorrectly added xml
header line from the ubuntu-pthread.i386.config file.

14 years agoSwitch Linux nightly builds to Ubuntu and add pthread build.
Ron Koenderink [Thu, 25 Sep 2008 02:18:27 +0000 (20:18 -0600)]
Switch Linux nightly builds to Ubuntu and add pthread build.

Remove the cron file for SuSE.  Add cron file for Ubuntu.
Remove LWP config file for SuSE.  Add LWP and pthread config
files for Ubuntu.

14 years agoBump version to 4.3.18
Markus Armbruster [Tue, 23 Sep 2008 01:18:24 +0000 (21:18 -0400)]
Bump version to 4.3.18

14 years agoUpdate change log again for 4.3.17 v4.3.17
Markus Armbruster [Sat, 20 Sep 2008 16:08:41 +0000 (12:08 -0400)]
Update change log again for 4.3.17

14 years agoFix standalone client build for Windows
Markus Armbruster [Sat, 20 Sep 2008 15:57:59 +0000 (11:57 -0400)]
Fix standalone client build for Windows

Need to compile with -mthreads since commit f082ef9f, v4.3.11.

14 years agoDisable incorrect autmatic supply in load and lload
Markus Armbruster [Sat, 20 Sep 2008 13:16:46 +0000 (09:16 -0400)]
Disable incorrect autmatic supply in load and lload

load_land_ship() and load_land_land() automatically resupply the land
units they load.  This can draw supplies from the sector where the
land units are.  When load() and lload() later update the sector, they
wipe out the update made for drawing supplies, and we get a seqno
mismatch oops.  Highly abusable.  Disable for now.

14 years agoUpdate change log for 4.3.17
Markus Armbruster [Thu, 18 Sep 2008 01:31:07 +0000 (21:31 -0400)]
Update change log for 4.3.17

14 years agoUpdate example to current output
Markus Armbruster [Thu, 18 Sep 2008 01:17:52 +0000 (21:17 -0400)]
Update example to current output

14 years agoFix trailing whitespace
Markus Armbruster [Thu, 18 Sep 2008 01:09:14 +0000 (21:09 -0400)]
Fix trailing whitespace

14 years agoFix whitespace: space before tab
Markus Armbruster [Wed, 17 Sep 2008 23:29:42 +0000 (19:29 -0400)]
Fix whitespace: space before tab

14 years agoUpdate known contributors comments
Markus Armbruster [Wed, 17 Sep 2008 22:54:15 +0000 (18:54 -0400)]
Update known contributors comments

14 years agoMake unit_give_away() immune to infinite recursion
Markus Armbruster [Wed, 17 Sep 2008 01:47:55 +0000 (21:47 -0400)]
Make unit_give_away() immune to infinite recursion

Put the unit before recursing into its cargo.  This breaks cycles in
the "is loaded on" relations.  Such cycles exist only in a corrupt
game state.  Mildly inefficient, because callers typically put the
unit again.

14 years agoBelatedly remove DEMANDUPDATE from info Options
Markus Armbruster [Tue, 16 Sep 2008 23:14:41 +0000 (19:14 -0400)]
Belatedly remove DEMANDUPDATE from info Options

Option gone since commit 6ca5e47f, v4.3.10.

14 years agoMake trade show exactly what's on sale, remove option SHOW_PLANE
Markus Armbruster [Tue, 16 Sep 2008 23:11:18 +0000 (19:11 -0400)]
Make trade show exactly what's on sale, remove option SHOW_PLANE

Planes and land units on ships are sold along with the ship, but trade
showed them only when SHOWPLANE was enabled.  Show them always.

Planes on land units are not sold along with the land unit, but trade
showed them when SHOWPLANE was enabled.  Don't.

14 years agoGuard unit.h against multiple inclusion
Markus Armbruster [Tue, 16 Sep 2008 22:47:06 +0000 (18:47 -0400)]
Guard unit.h against multiple inclusion

14 years agoUse unit_wipe_orders() to simplify build.c
Markus Armbruster [Sun, 14 Sep 2008 23:53:14 +0000 (19:53 -0400)]
Use unit_wipe_orders() to simplify build.c

Simplify build_ship(), build_plane(), build_land() and build_nuke().

14 years agoStop ships, planes, land units and nukes on violent takeover
Markus Armbruster [Sun, 14 Sep 2008 23:34:16 +0000 (19:34 -0400)]
Stop ships, planes, land units and nukes on violent takeover

This is for consistency with sectors, and for the same reason: pause
before spending money on stuff taken in the heat of battle.

14 years agoWipe orders when ship, plane, land unit or nuke changes owner
Markus Armbruster [Sun, 14 Sep 2008 23:32:34 +0000 (19:32 -0400)]
Wipe orders when ship, plane, land unit or nuke changes owner

Use new unit_wipe_orders() for violent takeover (takeover_unit() on
behalf of assault, attack, board, lboard, paradrop and pboard), and
peaceful takeover (unit_give_away() on behalf of arm, disarm, load,
unload, lload, lunload, scrap, scuttle, tend, trade).

Before, takeover_unit() cleared only group, mission and ship retreat
orders, and unit_give_away() only group and mission.  Orders that
weren't cleared:

* Mission op area (visible in xdump)

* Ship autonav orders

* Ship sail path including ship to follow and mobility quota

* Plane range limit

* Land unit retreat orders and retreat percentage

14 years agoRefactor and fix takeover.c
Markus Armbruster [Sun, 14 Sep 2008 19:13:16 +0000 (15:13 -0400)]
Refactor and fix takeover.c

Factor new takeover_unit() out of takeover_ship(), takeover_plane(),
takeover_land().  This fixes the following bugs in assault, attack,
board, lboard, paradrop and pboard:

* When the "land unit loaded on land unit" relation had a cycle,
  takeover_land() went into an infinite recursion.  Such cycles exist
  only in a corrupt game state.

* Nukes armed on planes weren't taken over along with their plane.
  Broken in commit 2e40a4bb, v4.3.3.

* Taking over land units with negative mobility increased mobility to
  zero.  Ditto planes embarked on ships or land units.

* Taking over planes embarked on ships or land units didn't clear
  their wing.

* Taking over planes and land units updated their MOB_ACCESS timestamp
  (pln_access, lnd_access), except for planes not embarked on
  anything.  This had no effect.

14 years agoFix marking of unused trade slots
Markus Armbruster [Sun, 14 Sep 2008 16:04:32 +0000 (12:04 -0400)]
Fix marking of unused trade slots

Trade code can't quite decide whether negative trd_unitid or zero
trd_owner marks unused slots.  The former is a bad idea, because blank
slots have a zero trd_unitid.

Make sure to zero trd_owner when setting trd_unitid to negative value
in trad() and check_trade().  This fixes recognition of unused slots
in set (broken in commit e16e38df, v4.2.18) and xdump (never worked).

14 years agoRemove takeover_ship() and takeover_land() parameter hostile
Markus Armbruster [Sun, 14 Sep 2008 15:30:55 +0000 (11:30 -0400)]
Remove takeover_ship() and takeover_land() parameter hostile

All callers pass non-zero.  Simplify accordingly.

14 years agoFix and simplify check_trade()
Markus Armbruster [Sun, 14 Sep 2008 15:12:45 +0000 (11:12 -0400)]
Fix and simplify check_trade()

Use unit_drop_cargo() to drop a sold land unit's cargo.

Use unit_give_away() to transfer ownership.  This fixes the following
bugs and misfeatures:

* Sold nuke wasn't taken off its plane.  Could not happen before
  commit 2e40a4bb, v4.3.3.

* Nuke on a plane wasn't sold along with the plane.  Broken in commit
  2e40a4bb, v4.3.3.

* Planes and land units on sold ships got their mobility zeroed.

* Planes on sold ships didn't get their wing reset.

14 years agoFix cargo giveaway in load, lload, unload, lunload and tend
Markus Armbruster [Sun, 14 Sep 2008 12:03:11 +0000 (08:03 -0400)]
Fix cargo giveaway in load, lload, unload, lunload and tend

Use unit_give_away() in gift().  This fixes a number of bugs:

* Nukes on planes weren't given away along with the plane.

* Likewise for land units on land units (can't happen in the stock

* Mission was not cleared by unload land/plane, lunload land/plane,
  and lload plane, except for planes on land units.

* Wing and army were never cleared.

It also happens to suppress information on planes given away along
with their land unit carriers.  Shrug.

14 years agoFix cargo giveaway in scrap and scuttle
Markus Armbruster [Sun, 14 Sep 2008 02:06:44 +0000 (22:06 -0400)]
Fix cargo giveaway in scrap and scuttle

When giving away cargo by scrapping or scuttling its carrier, the
cargo's cargo wasn't given away.  Happened for instance when a ship
carrying a land unit carrying a SAM got scrapped.

Also, wing, army and mission weren't cleared.

To fix, create unit_give_away() and use it in unit_drop_cargo().

14 years agoRefactor and fix scuttle and scrap code
Markus Armbruster [Sat, 13 Sep 2008 22:35:50 +0000 (18:35 -0400)]
Refactor and fix scuttle and scrap code

Factor unit_drop_cargo() out of scra(), scuttle_ship(),
scuttle_land(), fix it up:

* Some messages were sent as bulletins instead of printing them.

* Nukes were always destroyed.  They're now treated exactly like other

* scuttle destroyed some cargo silently, and listed other cargo as
  "scuttled".  It now simply lets unit_update_cargo() running from
  carrier prewrite callbacks list all cargo "lost".

Simplify its callers.  scuttle_ship() and scuttle_land() are now
trivial, inline and remove.

14 years agoRequire friendly relations for trade ship to pay off
Markus Armbruster [Sat, 13 Sep 2008 22:05:58 +0000 (18:05 -0400)]
Require friendly relations for trade ship to pay off

14 years agoRefuse to auto-scuttle where it doesn't pay
Markus Armbruster [Sat, 13 Sep 2008 19:57:36 +0000 (15:57 -0400)]
Refuse to auto-scuttle where it doesn't pay

When called from the scuttle command, scuttle_tradeship() asks for
confirmation when scuttling doesn't pay.  When called from the autonav
code, it can't ask.  Change it to fail then, and use that in
nav_ship() to avoid scuttle where it doesn't pay.  Also simplify some.

14 years agoFix when scuttle_tradeship() asks for confirmation
Markus Armbruster [Sat, 13 Sep 2008 21:07:15 +0000 (17:07 -0400)]
Fix when scuttle_tradeship() asks for confirmation

Fix scuttle to ask for confirmation when scuttling a tradeship in an
unsuitable sector even when the tradeship is pirated.  Broken when
commit a99bc3be (v4.2.13) suppressed that for pirated tradeships
wholesale because it let pirates ferret out where the ship was built.

14 years agoFix scuttle_tradeship() to require 2% efficiency
Markus Armbruster [Sat, 13 Sep 2008 20:47:10 +0000 (16:47 -0400)]
Fix scuttle_tradeship() to require 2% efficiency

14 years agoClean up rules on where you can scrap stuff
Markus Armbruster [Sat, 13 Sep 2008 19:27:42 +0000 (15:27 -0400)]
Clean up rules on where you can scrap stuff

You can now scrap ships in own or friendly, efficient harbors, planes
in own or allied, efficient airfields, and land units in any own or
allied sector.

When something can't be scrapped because of these rules, print a
suitable message.

Before, you could scrap ships regardless of relations to sector owner
(info claimed friendly was required), land units regardless of
relations, but not while on ships, and planes even in friendly
airfields (info claimed allied was required).

When scrapping in a deity sector, scrap claimed it gave the cargo to
POGO, which is somewhat bogus, as POGO can't own such stuff.

14 years agoFix scrap and scuttle output when there's output about cargo
Markus Armbruster [Sat, 13 Sep 2008 13:45:26 +0000 (09:45 -0400)]
Fix scrap and scuttle output when there's output about cargo

scra() and scut() printed their "scrapped in" / "scuttled in" message
in two parts.  Messages for scrapped / scuttled cargo were printed
between the parts.  Fix by printing in one go, after the cargo

14 years agoFix missing include in cargo.c
Markus Armbruster [Sun, 14 Sep 2008 16:04:58 +0000 (12:04 -0400)]
Fix missing include in cargo.c

14 years agoRemove take_plane_off_ship(), take_plane_off_land()
Markus Armbruster [Sun, 14 Sep 2008 14:02:17 +0000 (10:02 -0400)]
Remove take_plane_off_ship(), take_plane_off_land()

Commit 3e370da5 left them pretty trivial.  Inline, simplify, remove.

14 years agoNo need to take dead planes off carrier anymore
Markus Armbruster [Sun, 14 Sep 2008 13:53:08 +0000 (09:53 -0400)]
No need to take dead planes off carrier anymore

Until commit 3e370da5, dead planes had to be explicitely taken off
their carrier to update load counters.  This is no longer necessary;
simplify pln_put1() and scut().  scut() got it wrong, by the way: it
failed to take planes off land units.

14 years agoIndentation fix
Markus Armbruster [Sun, 14 Sep 2008 13:39:25 +0000 (09:39 -0400)]
Indentation fix

14 years agoFix cargo list shutdown oops
Markus Armbruster [Sun, 14 Sep 2008 13:37:26 +0000 (09:37 -0400)]
Fix cargo list shutdown oops

EF_PLANE is closed before EF_LAND: if a land unit carries a plane, the
plane goes away before its carrier, and unit_onresize() oopses.  Fix
by not checking cargo list consistency there when the file is already

unit_cargo_init() has a similar issue, at least theoretically: it
rebuilds cargo lists one after the other.  Zap them all first.

14 years agoFix commit 738fb28f's screwy line endings
Markus Armbruster [Sun, 14 Sep 2008 14:19:24 +0000 (10:19 -0400)]
Fix commit 738fb28f's screwy line endings

14 years agoDo not update player's bank balance when the change is zero
Ron Koenderink [Sat, 13 Sep 2008 23:33:24 +0000 (17:33 -0600)]
Do not update player's bank balance when the change is zero

Hackish work around for a race condition in the nightly build's
regression tests: sometimes the update starts right after the
force command yields, sometimes a bit later.  If it is late, we
use one random number here, for the bye, and throwing off the
random sequence.

14 years agoMake prewrite callbacks more robust
Markus Armbruster [Sat, 13 Sep 2008 17:21:12 +0000 (13:21 -0400)]
Make prewrite callbacks more robust

Treat zero owner just like efficiency below minimum.  Before, cargo
was taken off carriers only when efficiency fell below minimum, not
when owner changed to zero.

Run item_prewrite() unconditionally, for simplicity.

14 years agoRename llp to lp in lnd_postread() and lnd_prewrite()
Markus Armbruster [Sat, 13 Sep 2008 17:00:16 +0000 (13:00 -0400)]
Rename llp to lp in lnd_postread() and lnd_prewrite()

14 years agoAllow any length RW lock names for WIN32
Ron Koenderink [Sat, 13 Sep 2008 22:39:45 +0000 (16:39 -0600)]
Allow any length RW lock names for WIN32

Dynamically allocate the string space for RW
lock names for WIN32 (ntthread.c).  This
makes the WIN32 more consistent with the other

14 years agoAllow any length thread names for WIN32
Ron Koenderink [Sat, 13 Sep 2008 21:18:29 +0000 (15:18 -0600)]
Allow any length thread names for WIN32

Dynamically allocate the string space for thread
name in WIN32 (ntthread.c) thread space.  This
makes the WIN32 more consistent with the other
environments.  It also addresses WIN32 issue of
the print width of 17 being used and only having
space for 16 characters in the fixed allocation.

14 years agoUse new snxtitem_cargo() to simplify a couple of loops
Markus Armbruster [Sat, 13 Sep 2008 01:22:14 +0000 (21:22 -0400)]
Use new snxtitem_cargo() to simplify a couple of loops

Change snxtitem_all() loops that skip everything but a carrier's cargo
to use snxtitem_cargo() in scra(), scuttle_ship(), scuttle_land(),
takeover_ship(), takeover_land(), trade_desc(), feed_ship().

14 years agoRewrite the broken code to move cargo with its carrier
Markus Armbruster [Fri, 12 Sep 2008 23:31:48 +0000 (19:31 -0400)]
Rewrite the broken code to move cargo with its carrier

The old code did not move a carrier's cargo (planes, land units,
nukes) when the carrier moved.  Instead, it fixed up the location in
the postread callback.  Anything not going through ef_read(), in
particular the update, saw it in its old, incorrect location, until a
fixed up copy got written back.

Moreover, the timestamp did not change when cargo moved, so
incremental dumps did not pick up the movement.

The new code moves the cargo along with the carrier.

New unit_update_cargo() moves or destroys a carrier's cargo (planes,
land units, nukes) along with the carrier.  Call it from
shp_prewrite(), pln_prewrite() and lnd_prewrite() when the carrier
moves or gets destroyed.

Remove the code to destroy cargo from shp_prewrite(), pln_prewrite(),

Remove the code to fix up cargo location from pln_postread(),
lnd_postread(), nuk_postread().

This changes the message for ship and land unit cargo getting
destroyed from "sunk" and "MIA" to "lost".

14 years agoMake the item iterator capable of iterating over a cargo list
Markus Armbruster [Fri, 12 Sep 2008 22:46:54 +0000 (18:46 -0400)]
Make the item iterator capable of iterating over a cargo list

New snxtitem_cargo() initializes an iterator for a cargo list, with
new enum ns_seltype member NS_GROUP and new struct nstr_item member
next.  Extend nxtitem() and nxtitemp() to step through the list.

14 years agoClean up struct nstr_sect and struct nstr_item a bit
Markus Armbruster [Fri, 12 Sep 2008 22:41:55 +0000 (18:41 -0400)]
Clean up struct nstr_sect and struct nstr_item a bit

Members read were always set to ef_read, remove and call directly.

Member flag was only assigned to, never used, remove.

Change member group to char to match struct empobj.

14 years agoZap next uid in clink_rem(), check it in clink_add()
Markus Armbruster [Fri, 12 Sep 2008 02:10:14 +0000 (22:10 -0400)]
Zap next uid in clink_rem(), check it in clink_add()

The former ensures that next links are valid even for uids not on any
list.  The latter oopses on adding an uid to a list when it is already
on a list, unless it is at the tail.

14 years agoExpire lost items at the update instead of continuously
Markus Armbruster [Wed, 10 Sep 2008 11:30:48 +0000 (07:30 -0400)]
Expire lost items at the update instead of continuously

Replace thread DeleteItems running delete_lostitems() by simple
function delete_old_lostitems(), and call it from update_main().

14 years agoReplace econfig key lost_items_timeout by lost_keep_hours
Markus Armbruster [Wed, 10 Sep 2008 11:23:46 +0000 (07:23 -0400)]
Replace econfig key lost_items_timeout by lost_keep_hours

14 years agoFix commit d46b0b72 (didn't even compile with pthreads)
Markus Armbruster [Fri, 12 Sep 2008 22:05:25 +0000 (18:05 -0400)]
Fix commit d46b0b72 (didn't even compile with pthreads)

14 years agoFix journal_entry() to separate thread and event by space
Markus Armbruster [Fri, 12 Sep 2008 21:52:40 +0000 (17:52 -0400)]
Fix journal_entry() to separate thread and event by space

Broken in commit effc1b18.

14 years agoAdd missing error check for thread creation for WIN32
Ron Koenderink [Fri, 12 Sep 2008 01:14:35 +0000 (19:14 -0600)]
Add missing error check for thread creation for WIN32

_beginthread() call in empth_create() has two error
return values 0L and 1L.  Add the missing check for 0L.

14 years agoEnsure the empth_sleep() always yields for WIN32
Ron Koenderink [Fri, 12 Sep 2008 01:06:10 +0000 (19:06 -0600)]
Ensure the empth_sleep() always yields for WIN32

The WIN32 version did not block when the sleep was
already reached by the time empth_sleep() did the
time remaining calculation.  The other versions
of empth_sleep() do always yield.

14 years agoMake empth_name() and empth_set_name() take a thread argument
Markus Armbruster [Thu, 11 Sep 2008 23:25:34 +0000 (19:25 -0400)]
Make empth_name() and empth_set_name() take a thread argument

14 years agoUse empty schedule file for the nightly build
Ron Koenderink [Thu, 11 Sep 2008 20:58:32 +0000 (14:58 -0600)]
Use empty schedule file for the nightly build

This ensures that no unplanned updates occur
during the nightly build sequence.  Remove
unnecesary enables and disables from the script.
Remove unnecessary argument for force command.

14 years agoChange the thread name in play_cmd() to show country number
Ron Koenderink [Thu, 11 Sep 2008 20:50:08 +0000 (14:50 -0600)]
Change the thread name in play_cmd() to show country number

This makes the journal easier to read.  We can't use the country
number earlier, because it is not unique then.

14 years agoUse the thread name to identify threads in the journal
Ron Koenderink [Thu, 11 Sep 2008 20:49:28 +0000 (14:49 -0600)]
Use the thread name to identify threads in the journal

This makes the journal easier to read, and makes journals
from the nightly build easier to diff.

Since we use only the 10 first characters of the name,
abridge existing thread names to make them unique within
that many characters.

14 years agoNew empth_name() and empth_set_name()
Ron Koenderink [Thu, 11 Sep 2008 20:46:31 +0000 (14:46 -0600)]
New empth_name() and empth_set_name()

14 years agoRemove bogus comment from empthread.h
Markus Armbruster [Thu, 11 Sep 2008 11:51:03 +0000 (07:51 -0400)]
Remove bogus comment from empthread.h

Became bogus in commit d500a707.

14 years agoFix double free() in unit_onresize()
Markus Armbruster [Thu, 11 Sep 2008 11:50:18 +0000 (07:50 -0400)]
Fix double free() in unit_onresize()

Introduced in commit 64a53c90.

14 years agoSimplify tests for presence of load
Markus Armbruster [Mon, 8 Sep 2008 00:37:52 +0000 (20:37 -0400)]
Simplify tests for presence of load

Instead of counting the load with lnd_nland() / lnd_nxlight(), check
whether there's at least one loaded with lnd_first_on_land() /

14 years agoGet rid of ship and land unit load counters
Markus Armbruster [Sun, 7 Sep 2008 15:10:53 +0000 (11:10 -0400)]
Get rid of ship and land unit load counters

Load counters are redundant; they can be computed from the carrier
uids.  Keeping them up-to-date as the carriers change is a pain, and
we never got that quite complete.

Computing load counters straight from the carrier uids every time we
need them would be rather inefficient, but computing them from cargo
lists is not.  So do that.

Remove the load counters: struct shpstr members shp_nplane,
shp_nchoppers, shp_nxlight, shp_nland, and struct lndstr members
lnd_nxlight and lnd_nland.

Don't compute/update load counters in build_ship(), build_land(),
land(), ldump(), load_plane_ship(), load_land_ship(),
load_plane_land(), load_land_land(), lstat(), sdump(), shi(), sstat(),
tend_land(), check_trade(), put_combat(), pln_oneway_to_carrier_ok),
pln_newlanding(), fit_plane_on_ship(), fit_plane_on_land(),

Nothing left in fit_plane_off_ship(), fit_plane_off_land(), so remove

load_land_ship(), load_land_land(), check_trade(), pln_newlanding(),
put_plane_on_ship(), take_plane_off_ship(), put_plane_on_land(),
take_plane_off_land() no longer change the carrier, so don't put it.

Remove functions to recompute the load counters from carrier uids:
count_units(), lnd_count_units(), count_planes(), count_land_planes(),
pln_fixup() and lnd_fixup(), along with the latter two's private
copies of fit_plane_on_ship() and fit_plane_on_land().

New cargo list functions to compute load counts: unit_cargo_count()
and unit_nplane(), with convenience wrappers shp_nplane(),
shp_nland(), lnd_nxlight(), lnd_nland().

Use them to make ship selectors nplane, nchoppers, nxlight, nland
virtual.  They now reflect what is loaded, not how the load uses the
available slots.  This makes a difference when x-light planes or
choppers use plane slots.

Use them to make land unit selectors nxlight and nland virtual.

Use them to get load counts in land(), ldump(), load_plane_ship(),
load_land_ship(), load_plane_land(), load_land_land(), sdump(), shi(),
tend_land(), fit_plane_on_land(), trade_desc(), unit_list().

Rewrite fit_plane_on_ship() and could_be_on_ship() to use
shp_nplane().  could_be_on_ship() now takes load count arguments, as
computed by shp_nplane(), so it can be used for checking against an
existing load as well.

14 years agoGet rid of struct plnstr member pln_nuktype
Markus Armbruster [Sun, 7 Sep 2008 02:15:41 +0000 (22:15 -0400)]
Get rid of struct plnstr member pln_nuktype

pln_nuktype is redundant; it can be computed from the nuke's

Make plane selector nuketype virtual and NSC_EXTRA.  It should have
been NSC_EXTRA all along.  This changes xdump plane.

Don't set it in arm(), disarm(), build_plane(), pln_damage() and
nuk_fixup().  The latter no longer does anything, remove it.

Deprecate edit key 'n' in doplane(), and don't show it in pr_plane().
The key never made much sense.

eff_bomb(), comm_bomb(), ship_bomb(), plane_bomb(), land_bomb(),
strat_bomb(), mission_pln_equip(), air_damage(), msl_hit(),
pln_equip() tested pln_nuketype to check whether a plane carries a
nuke.  Test nuk_on_plane() instead.

pdump(), plan(), trade_desc() print whether and what kind of nuke a
plane carries.  Adapt that to use nuk_on_plane().

14 years agoEnable the new nuk_on_plane(), replacing the old one
Markus Armbruster [Sat, 6 Sep 2008 23:22:56 +0000 (19:22 -0400)]
Enable the new nuk_on_plane(), replacing the old one

Callers changed, as the new one isn't a drop-in replacements.

14 years agoCargo lists storing lists of cargo for each carrier
Markus Armbruster [Sat, 6 Sep 2008 22:40:58 +0000 (18:40 -0400)]
Cargo lists storing lists of cargo for each carrier

Persistent game state encodes "who carries what" by storing the
carrier uid in the cargo.  Cargo lists augment that: they store lists
of cargo for each carrier.  They are not persistent.

New unit_cargo_init() to compute the cargo lists from game state.
Call it in ef_init_srv() and at the end of update_main().

New unit_onresize() to resize the cargo list data structure.
Installed as units' struct empfile callback onresize to make them
resize automatically with the unit files.

New unit_carrier_change() to update cargo lists when carriers change
in game state.  Convenience wrappers pln_carrier_change(),
lnd_carrier_change() and nuk_carrier_change().  Call them from
prewrite callbacks to keep cargo lists in sync with game state.

To make that work, unused units must not point to a carrier.  Add new
pln_oninit(), lnd_oninit() and nuk_oninit() take care of newly created
units.  Change lnd_prewrite() and nuk_prewrite() to take dead land
units and nukes off their carrier.  pln_prewrite() did that already.

New unit_cargo_first(), unit_cargo_next() to traverse cargo lists.
Convenience wrappers lnd_first_on_ship(), lnd_first_on_land(),
lnd_next_on_unit(), pln_first_on_ship(), pln_first_on_land(),
pln_next_on_unit() and nuk_on_plane().  The latter is disabled for now
because it clashes with an existing function.

14 years agoNew struct empfile callback onresize
Markus Armbruster [Sat, 6 Sep 2008 17:58:15 +0000 (13:58 -0400)]
New struct empfile callback onresize

14 years agoRevive struct empfile callback init as oninit
Markus Armbruster [Sun, 7 Sep 2008 15:27:18 +0000 (11:27 -0400)]
Revive struct empfile callback init as oninit

Commit a71f0158 removed unused callback init.  Bring it back renamed
to oninit, and without the redundant first argument.

14 years agoFix up filetable.c's file comment after rename.
Markus Armbruster [Sat, 6 Sep 2008 17:56:25 +0000 (13:56 -0400)]
Fix up filetable.c's file comment after rename.

14 years agoMove selector code from src/lib/global to src/lib/common
Markus Armbruster [Sat, 6 Sep 2008 17:56:08 +0000 (13:56 -0400)]
Move selector code from src/lib/global to src/lib/common

Future virtual selectors will need to access game state.  This depends
on common/file.c, which can't be used from global without creating a
cyclic dependency between libglobal.a and libcommon.a.

Move nsc.c to src/lib/common.  file.c depends on it, so move it as
well, renamed to filetable.c so it doesn't clash with the existing

14 years agoNew lost_and_found() to record ownership changes.
Markus Armbruster [Sat, 6 Sep 2008 15:48:49 +0000 (11:48 -0400)]
New lost_and_found() to record ownership changes.

Factors out the common makelost()/makenotlost() pattern.

14 years agoUpdate lost file from prewrite callbacks
Markus Armbruster [Sat, 6 Sep 2008 15:21:32 +0000 (11:21 -0400)]
Update lost file from prewrite callbacks

Losses of sectors, ships, planes, land units and nukes are tracked in
the lost file.  To keep it current, makelost() and makenotlost() were
called whenever one of these changed owners.  Cumbersome and
error-prone.  In fact, the lost file was never perfectly accurate.

Detect the ownership change in the prewrite callback and call
makelost() / makenotlost() from there.  Remove lost file updates from
where they're no longer needed: right before a put.  takeover() is a
bit more involved: it doesn't put the sectors, but all callers do,
except for guerrilla().  So remove the lost file update from
takeover(), but add it to guerrilla().

This takes care of lost file update for all ownership changes that go
through ef_write().  It can't take care of any missing updates for
changes that don't go through it.

14 years agoPass old element to empfile callback prewrite()
Markus Armbruster [Sat, 6 Sep 2008 13:15:18 +0000 (09:15 -0400)]
Pass old element to empfile callback prewrite()

Change sct_prewrite(), shp_prewrite(), pln_prewrite(), lnd_prewrite(),
nuk_prewrite() accordingly.  New argument isn't used for anything,

14 years agoFix comments added in commit bf436a44.
Markus Armbruster [Sat, 6 Sep 2008 12:55:45 +0000 (08:55 -0400)]
Fix comments added in commit bf436a44.

14 years agoRemove bogus correction of sct_mobil from sct_prewrite()
Markus Armbruster [Sat, 6 Sep 2008 12:09:59 +0000 (08:09 -0400)]
Remove bogus correction of sct_mobil from sct_prewrite()

It used literal 127 instead of sect_mob_max, it didn't check the lower
bound, and it didn't report the corruption.  From Chainsaw 3.

Having *working* sanity checks there would be nice.  Left for another

14 years agoDon't execute pre-write checks from sct_postread()
Markus Armbruster [Sat, 6 Sep 2008 12:03:08 +0000 (08:03 -0400)]
Don't execute pre-write checks from sct_postread()

Chainsaw 3 factored out most checks from sct_prewrite() into
checksect(), and called that from sct_postread() as well.  Revert
this, because it was a bad idea: whenever checksect() called from
ef_read() found something to change, it was actually a bug, and
changing it just hid the bug from whatever called ef_read().  But it
couldn't hide it from code going through ef_ptr().  So, instead of
having bugs visible everywhere, including census and such, they were
hidden in hard to observe places.  For instance, the previous commit
fixed one that was visible to the path finder, but not the actual path
user, which led to the path user choking on an incorrect path in a
rather obscure manner.

Things no longer "corrected" on read: excessive mobility, low work
despite no civilians present, sector owned despite neither civilians,
military nor land units.  The latter had a scary-looking caploss(),
but NF_SACKED should have rendered that harmless.

14 years agoDon't revert sectors without military to old owner
Markus Armbruster [Thu, 4 Sep 2008 00:00:30 +0000 (20:00 -0400)]
Don't revert sectors without military to old owner

Change checksect() not to abandon occupied sectors to the old owner
when there is no military and no land units.  This effectively
restores pre-Chainsaw 3 behavior.  Matching change to would_abandon().

Rationale.  Traditional ways to change sector owner:

(1) Attack, assault, paradrop can transfer a sector to the attacker,
    in take_def().

(2) Guerrilla warfare at the update can transfer a sector to the old
    owner, in guerilla().  This happens when che kill all military and
    the sector is sufficiently disloyal to the owner.

(3) Whenever all civilians, military and land units are removed from a
    sector, no matter how, it silently reverts to the deity, in

Chainsaw 3 added:

(4) Whenever all military and land units are removed from an occupied
    sector, no matter how, it silently reverts to the old owner, in

This addition isn't seamless.  Funnies include:

* When che kill all military and land units, but the sector is loyal,
  (3) doesn't transfer to the old owner.  But since there's no
  military and land units left, (4) transfers it anyway, only without
  telling the lucky old owner.  The latter transfer is buggy:
  checksect() runs only on ef_read() and ef_write(), not the update
  (bug#1010856), so the silent transfer is delayed until the next
  ef_write().  But code using ef_read() sees it right away.  For
  instance, the path finder, which doesn't use ef_read(), can route a
  path through a sector lost that way.  The actual move, which does
  use ef_read(), then chokes on that path.

* When you attack a sector, and get defeated with the help of reacting
  land units, but succeed in killing the *local* defenders, (4) makes
  the sector silently revert to the old owner.  Which might be
  somebody who wasn't involved in the fight, and gets no notification
  whatsoever of his windfall.

* You can abandon a sector to the old-owner by removing all military
  and land units from it, in a myriad of ways.  Some ways ask you for
  confirmation (move, march, load), many don't (navigate, plane
  construction, delivery; arguably bugs), and others simply don't let
  you (paradrop, fly, distribution).

  This problem also exists for abandoning to deity, i.e. through (3)
  instead of (4).  Some ways to move out civilians don't let you do
  that (distribute), but most do.  However, accidentally abandoning an
  empty sector to deity is less serious than a populated one to
  another player.

In my opinion, (4) doesn't add much to the game, and fixing the
funnies isn't worth the effort.

14 years agoFix execution of nightly build econfig patch script
rkoenderink@gmail.com [Thu, 4 Sep 2008 01:30:11 +0000 (19:30 -0600)]
Fix execution of nightly build econfig patch script

This is required for non-Windows environment as the files do not
have permission to execute.

14 years agoRemove pointless getFOO() from prewrite callbacks
Markus Armbruster [Tue, 2 Sep 2008 23:12:06 +0000 (19:12 -0400)]
Remove pointless getFOO() from prewrite callbacks

Empire3's C_SYNC code added these to sct_prewrite(), shp_prewrite(),
pln_prewrite(), lnd_prewrite() and nuk_prewrite().  They weren't
removed when C_SYNC was ripped out in 4.0.0.

14 years agoMake ef_close() clear baseid, cids and fids
Markus Armbruster [Mon, 1 Sep 2008 16:42:24 +0000 (12:42 -0400)]
Make ef_close() clear baseid, cids and fids

14 years agoMove view open/close into src/lib/common/file.c
Markus Armbruster [Mon, 1 Sep 2008 14:38:48 +0000 (10:38 -0400)]
Move view open/close into src/lib/common/file.c

Really belongs there, because it manipulates empfile[].

New ef_open_view() to replace ef_init_view().  Make ef_close() cope
with views, and remove ef_fina_view().  Make ef_extend() and
ef_truncate() oops on views.

14 years agoFix misuse of ef_cadef(EF_BAD)
Markus Armbruster [Mon, 1 Sep 2008 14:29:01 +0000 (10:29 -0400)]
Fix misuse of ef_cadef(EF_BAD)

ef_elt_by_name(), xdprval_sym() and symval() checked whether a file
type T is a symbol table by comparing ef_cadef(T) to symbol_ca, even
though T may be EF_BAD.  Before commit 50cfdcb5, ef_cadef(EF_BAD)
accessed empfile[] out of bounds, which could conceivably crash or
somehow happen to yield symbol_ca.  Since then, it oopses and returns

Fix by testing the file type before calling ef_cadef().

14 years agoCheck argument of ef_cadef(), ef_nelem(), ef_flags(), ef_mtime()
Markus Armbruster [Mon, 1 Sep 2008 13:34:16 +0000 (09:34 -0400)]
Check argument of ef_cadef(), ef_nelem(), ef_flags(), ef_mtime()

This removes any need for calling ef_check() outside of file.c.
Remove its only occurence, from symval(), and give it internal

14 years agoClean up maintenance of config table sentinels
Markus Armbruster [Mon, 1 Sep 2008 13:20:08 +0000 (09:20 -0400)]
Clean up maintenance of config table sentinels

Xundump had special hackery to maintain configuration tables'
sentinels: xubody() and getobj() added a sentinel element when
initializing or growing a table, which xubody() stripped off again
before returning.  The latter was an unclean hack.

Replace this by building knowledge of sentinels into struct empfile:
new flag EFF_SENTINEL, set for the appropriate members of empfile[],
obeyed by ef_extend() and ef_truncate().

14 years agoFix empfile[EF_VERSION].flags and .csize
Markus Armbruster [Mon, 1 Sep 2008 01:08:55 +0000 (21:08 -0400)]
Fix empfile[EF_VERSION].flags and .csize

csize was 0 instead of 1, and flags was 0 instead of EFF_STATIC.
xdump didn't care.

14 years agostruct empfile doc fixes
Markus Armbruster [Mon, 1 Sep 2008 00:28:07 +0000 (20:28 -0400)]
struct empfile doc fixes

14 years agoChange empfile members postread() and prewrite() to return void
Markus Armbruster [Sun, 31 Aug 2008 18:44:16 +0000 (14:44 -0400)]
Change empfile members postread() and prewrite() to return void

Callers ignore the value, and callees always return 1.  Pointless.

14 years agoFix/improve logging in ef_close(), ef_extend(), ef_truncate()
Markus Armbruster [Sun, 31 Aug 2008 18:24:53 +0000 (14:24 -0400)]
Fix/improve logging in ef_close(), ef_extend(), ef_truncate()

Change ef_close() to log ep->file instead of ep->name, to match

Fix ef_extend() to log ep->name instead of ep->file, which could be
null.  Also fix ef_ensure_space()'s function comment.  Both broken in
commit 2eb8672b.

ef_truncate()'s error logging lacked detail when ef_realloc_cache()
failed, fix.

14 years agoSimplify mapdist()
Markus Armbruster [Sun, 31 Aug 2008 13:53:33 +0000 (09:53 -0400)]
Simplify mapdist()

It became needlessly complicated in 4.0.1 to fix a "bug in mapdist not
taking world edges into account nicely enough."  That "fix" had no
effect, which was good, because it wasn't broken.

14 years agoUse MAPWIDTH() to allocate map buffers
Markus Armbruster [Sun, 31 Aug 2008 13:26:50 +0000 (09:26 -0400)]
Use MAPWIDTH() to allocate map buffers

sona(), radmap2() and satmap() used WORLD_X + 1, which equals
MAPWIDTH(1).  Using MAPWIDTH() is somewhat clearer and cleaner.

14 years agoSimplify routech[]
Markus Armbruster [Thu, 28 Aug 2008 01:30:56 +0000 (21:30 -0400)]
Simplify routech[]

routech[][1] hasn't been used in living memory.  Drop it, and simplify
to routech[].

14 years agoInclude destination in interception and plane mission messages
Markus Armbruster [Wed, 27 Aug 2008 01:33:48 +0000 (21:33 -0400)]
Include destination in interception and plane mission messages

Interception and missions launch planes automatically.  The plane
owner (and for missions, the base sector owner) gets a message.
Destination coordinates are often obvious from the context, but not
always, e.g. when flying in support of allies, or when the mission
gets interepted and aborts.  Include the destination coordinates in
the messages.  Reported by Ulrich Hannemann.