Commit graph

1212 commits

Author SHA1 Message Date
17ad9fc5f2 Simplify load() and lload()
Also make them more similar.  No functional change.
2009-01-06 18:54:44 +01:00
2e6f971b6c Make load, unload, lload and lunload usable for deities
Fix ownership tests in load(), lload(), load_plane_ship(),
load_land_ship(), load_plane_land(), load_land_land().
2009-01-06 18:51:27 +01:00
c4c7cac6fe Check for unit on trading block last in load() and lload()
This is to make them more similar, and to get the market code out of
the way.
2009-01-06 18:49:39 +01:00
5cbab82dcf Factor move_amount() out of load_comm_ship() and load_comm_land() 2009-01-06 18:48:26 +01:00
a78f71ff99 Fix loopholes that let you load and unload foreign commodities
The Chainsaw 3 feature to let you load/unload to a specific amount
through a negative amount argument created loopholes: it let you load
your ships in friendly sectors with the unload command, and unload
friendly ships with the load command.  Likewise for land units, with
allied instead of friendly, of course.

Empire 4.0.0 fixed that for the case of loading a land unit from an
allied sector.  Get rid of that check, and fix it for good in
load_comm_ok().
2009-01-06 18:48:04 +01:00
92a366ce24 Fix load, unload, lload, lunload not to give away civilians
The game generally doesn't let you give away civilians.  But the check
in load_comm_ok() for that compared the sector old owner to the player
instead of the ship's or land unit's owner, which is incorrect for
foreign ships or land units.  Fix that.

Also make fix the message there not to assume that the civilians are
owned by the player.  This can't currently happen, but will when these
commands support use by deities properly.
2009-01-06 18:48:04 +01:00
430ce903d3 Factor load_comm_ok() out of load_comm_ship() and load_comm_land()
Functional change: attempting to load or unload foreign civilians no
longer fails command.
2009-01-06 18:48:04 +01:00
bf2fd042ab Make lload require own sector and lunload own land unit
This is for consistency with load and unload.

Before, you could use lunload for allied land units and lload in
allied sectors, but the command failed when stuff was loaded in allied
sectors.  Doing that with lload no longer fails the command, because
the check that does that in load_comm_land() is now masked by the new
checks in lload().  Note that loading with lunload still fails the
command; that inconsistency will be removed in a later commit.

load_plane_land() already refused to load planes from foreign sectors.
This commit makes that check redundant, so remove it.  Functional
change: lload now refuses to load foreign planes silently, unless both
land unit and plane were named by number.  This is consistent with
load.
2009-01-06 18:43:07 +01:00
17d19266dc Make lload and lunload work on foreign lands only when named
load and unload work on foreign ships only when their argument
explicitely names them, i.e. you have to ask for them by number.  When
any other syntax is used, load() ignores foreign ships.  This makes
sense.  Change lload() to work just like that.
2009-01-06 16:02:51 +01:00
afb512fad7 Fix relation checks in load, unload, lload, lunload
The check for ship owner's relations to the player was backward: it
checked the player's relations to the ship's owner instead.  Abusable:
you could load and unload any ship by declaring friendly to its owner.
Broken since Chainsaw let you load and unload friendly ships.

The check for land unit owner's relations to the player was similarly
backward, similarly abusable, and also broken since day one.

lload and lunload checked sector owner's relations to the land unit's
owner instead of to the player.  Harmless, because the two must be the
same to reach the check.
2009-01-06 14:59:01 +01:00
1c547f9b42 Don't warn deities about capital redesignation 2009-01-02 09:09:09 +01:00
a4b0aae1e5 Change info not to prepend a header line to the info page
The contents of the line was partly useless (repetition of the command
argument) and partly misleading (modification time of the formatted
info file, ifndef _WIN32).
2008-12-28 19:54:16 +01:00
9115c03949 Simplify type coercion in condition evaluation
Change nstr_mkselval() to generate values with promoted types only,
and replace nstr_coerce_val() by new and simpler nstr_optype() in
nstr_comp().

Replace the only remaining use of nstr_coerce_val() in surv() by
nstr_promote(), and remove nstr_coerce_val().

This loses one half of the unimplemented sketch of coercions to
NSC_STRING.  Drop the other half from nstr_exec_val().
2008-12-27 16:59:53 +01:00
d2fba584e8 Fix reporting of shot spies in news
Broken in commit 89e33f62, v4.3.16.
2008-12-25 13:55:58 +01:00
08bc09443d Land units with zero reaction radius can't go on reserve mission 2008-12-25 11:47:33 +01:00
3a1577a6b5 Remove econfig key mission_mob_cost
Questionable feature, and hasn't been used in a long time.
2008-12-25 11:47:33 +01:00
d5f371cc1d Remove oprange()'s mission parameter
Use the current mission instead.  Make mission() set it before calling
oprange(), and clean up somewhat.
2008-12-25 11:47:32 +01:00
ca9af92523 Check capabilities required for mission before range
Checking range first could complain about range when the mission
couldn't work regardless of range.  Not helpful.
2008-12-25 11:47:32 +01:00
820faedb99 Drop checks whether we can get the op-sector from mission()
getsect() can fail here only when the coordinates are invalid.  The
first check uses coordinates from a successful sarg_xy(), so they
can't be invalid.  The second check uses coordinates of an object to
be put on the mission.  If these are invalid, game state is corrupt,
and failing the mission command doesn't improve the situation a bit.
2008-12-25 11:47:32 +01:00
77e3a8fe31 Simplify mission() by separating off clear_mission() 2008-12-25 11:47:32 +01:00
49e8b3c64b Streamline signature of show_mission()
Remove unused parameter, and return status.
2008-12-25 11:47:32 +01:00
7ac151acac Move show_mission() to sole caller, give it internal linkage 2008-12-25 11:47:32 +01:00
c1b76a1a2f All missions now have op areas, simplify mission() 2008-12-25 11:47:32 +01:00
a9b2d9c7f3 Make escort mission obey op-area
Before, the escort mission didn't support an op-area, and planes on
escort mission escorted anywhere.  Change mission() to define the
op-area for escort missions as well.  Show it in mission() and
show_mission().  Check it in find_escorts().
2008-12-25 11:47:32 +01:00
bf89453f8a Remove non-mission land unit reaction
Land unit reactions are overly complex because we have two different
concepts controlling them: reaction radius (set with lrange) and
reserve mission (set with mission).  You need to deal with both to set
up or query reactions.

Commit 8d0e1af5 "fixed" this by making reserve missions meaningless.

The previous commit made reserve missions meaningful again: they
support an op-area now.  This brought back the problem of having to
deal with two separate commands to accomplish one thing.

Fix this for good by removing non-mission land unit reaction
alltogether.  The only feature we lose by that is the ability to order
land units to react until the order is explicitely cancelled.  That's
because missions are implicitely cleared by many commands and events,
while non-mission reaction wasn't.  Closes #858121 and #858122.

Remove the non-mission reaction case from att_reacting_units().

Don't limit reserve missions to the land unit's reaction radius: make
lnd_reaction_range() return the type's maximum radius instead of
lnd_rad_max.

The reaction radius is now useless.  Remove the lrange command, and
struct lndstr member lnd_rad_max along with its selector react.
Remove land command's column rd.  Make ldump show column react as
zero.  Deprecate edit key 'P' in dounit(), and don't show it in
pr_land().
2008-12-25 11:47:05 +01:00
8e527b6cff Make land units on reserve mission react within op-area
Before, they always reacted to their maximum range, and the op-area
was unused.  Change mission() to define the op-area for reserve
missions as well.  Remove the special-case for showing reserve
missions from mission() and show_mission().  New lnd_reaction_range()
factored out of att_reacting_units().  Use it in oprange() to cover
reserve missions.  Pass the mission as separate parameter to oprange()
for now, because miss() doesn't set it in the object until later.
2008-12-17 12:30:43 -05:00
439fa2eadc Don't reduce mission op area when range shrinks
The mission command limits op area radius to the possible range.
That's okay, as it doesn't actually restrict possible op areas.  When
the mission is executed, it was limited again.  Don't do that; remove
the limiting code from build_mission_list_type() and show_mission().

The removed limiting had no effect, except when the range shrunk.
Then limiting reduced the op area more than necessary.  For instance,
consider an object O with initial range 3 on a mission around M with
range 3:

    - - - y - - -
     - - z y - -
    - - z x y - -
     - O x x M -
    - - z x y - -
     - - z y - -
    - - - y - - -

Initially, all sectors not marked - are in range and in the op area.
If the range drops to two, sectors marked O, x and z are still in
range of O.  But only the x are still in range of M.  The O and z got
excluded.

Range can currently shrink when plane range is reduced (range
command), or a ship, plane or land unit somehow loses tech (deity
intervention).
2008-12-17 11:36:49 -05:00
8d0e1af5b7 Remove reserve mission's reaction radius bonus
Reserve missions are now useless.  They'll become useful again in a
later commit.
2008-12-14 10:45:35 -05:00
1417a3442d Remove commented out logerror() calls
Probably ancient debug cruft.
2008-12-14 10:45:34 -05:00
de2651efa1 Don't let ships double-retreat first on 'i' and then on 'h'
When a ship is shelled, retreat condition 'i' (injured) applies.  When
there's no return fire, 'h' (helpless) applies as well.  Ships
retreated twice in that case.  Fix that.
2008-12-07 09:26:26 -05:00
b27298d4c5 New option RAILWAYS
With RAILWAYS, highway-like sectors double as rail.  They need to be
at least 5% efficient to be operational, and then they additionally
extend rail into adjacent sectors that are at least 60% efficient.

New opt_RAILWAYS, SCT_HAS_RAIL(), sct_rail_track().  Update
sector_mcost(), bp_neighbors(), lnd_mar_one_sector() for RAILWAYS
mobility rules.  Update sinfra(), spyline(), satdisp_sect() to show
rail track instead of rail infrastructure for RAILWAYS.

New virtual sector selector track, implemented by nsc_sct_track().
2008-11-01 11:40:15 -04:00
3376589007 New concept sector terrain
A sector type's terrain (struct dchrstr member d_terrain) is the
sector type of its underlying terrain.  Sector types occuring in
d_terrain are terrain types, and must have their own type in
d_terrain.  Players can change sector types only to those with the
same terrain.

The builtin configuration defines terrain types sea, mountain,
wasteland, wilderness and plains.  It gives bridge span and tower
terrain sea, and everything else terrain wilderness.  Hence, the stock
game remains unchanged.

Deities can use terrain to create sector types that can be developed
only in limited ways.
2008-10-28 19:35:51 -04:00
Ron Koenderink
14319b89ec Represent logged in time in seconds rather than minutes
This simplifies things.  In particular, it gets rid of random rounding
in getcommand(), which created a variation in the nightly build
depending on whether the update starts before or after the deity logs
out.

Replace struct natstr member nat_minused by nat_timeused, and update
cou_ca[] accordingly (this affects xdump nat).  Replace player member
minleft by timeleft, and getminleft() by gettimeleft().  Update
getcommand(), daychange(), player_main(), status() accordingly, taking
care not to change player output.  Change edit country key 'u' to work
in seconds.
2008-10-28 08:48:25 -06:00
65410d16fd 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.
2008-09-20 09:16:46 -04:00
d702068457 Fix trailing whitespace 2008-09-17 21:31:40 -04:00
a9653c475b Fix whitespace: space before tab 2008-09-17 19:29:42 -04:00
db4770426e Update known contributors comments 2008-09-17 18:54:15 -04:00
60000b1a42 Use unit_wipe_orders() to simplify build.c
Simplify build_ship(), build_plane(), build_land() and build_nuke().
2008-09-15 19:40:44 -04:00
e7ce50405e 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
2008-09-15 19:40:44 -04:00
94a3108b23 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).
2008-09-15 19:40:44 -04:00
b8ab065a6e 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.
2008-09-15 19:40:43 -04:00
8cf32c4854 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
  game).

* 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.
2008-09-15 19:40:43 -04:00
f3651f17e5 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
  cargo.

* 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.
2008-09-15 19:40:13 -04:00
3318e4e4e5 Require friendly relations for trade ship to pay off 2008-09-15 19:04:17 -04:00
faca0eeac5 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.
2008-09-15 18:59:26 -04:00
693c1a64c3 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.
2008-09-15 18:48:33 -04:00
96796dc756 Fix scuttle_tradeship() to require 2% efficiency 2008-09-15 07:49:24 -04:00
221324cc10 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.
2008-09-15 07:49:24 -04:00
06dd3d80ac 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
messages.
2008-09-15 07:49:24 -04:00
b024d57b38 Remove take_plane_off_ship(), take_plane_off_land()
Commit 3e370da5 left them pretty trivial.  Inline, simplify, remove.
2008-09-14 10:21:27 -04:00