Before Empire 2, nukes could be delivered only with bomb (special
mission 'n', airburst only) and launch (targeting sectors or
satellites only).
Empire 2 made nukes available for any kind of bombing, and for any
missile strike on sectors or ships. This included interdiction and
support missions. Nuclear-tipped anti-sats and bomb mission n were
removed.
Unfortunately, this was done in a messy way, which led to
inconsistencies and bugs. The problem is that ordinary damage affects
just the target, while nuke damage affects an area. Code dealing with
plane damage was designed for the former. Instead of rewriting it to
cope with area damage cleanly, nuke damage got shoehorned into
pln_damage(), the function to compute conventional plane damage, as a
side effect: computing damage blasted sectors in the area.
If the plane carried a nuke, pln_damage() returned zero (conventional)
damage. Without further logic, this simply bypassed the code to apply
damage to the target. This worked out okay when the target already
got damaged correctly by the side effect.
However, some targets are immune to the side effect: when interdicting
a move or explore command, the commodities being moved are not in any
sector.
For other targets, damage has effects other than damaging the target:
offensive and defensive support don't apply the (conventional) damage
to the target sector. Instead, they turn it into a combat bonus.
Without further logic, nuclear damage doesn't contribute to that.
To make all that work, pln_damage() returned the nuclear damage for
ground zero as well. Because a plane does either conventional or
nuclear damage, one of them is always zero.
Most callers simply ignored the nuclear damage, and applied only the
conventional damage.
Bug: land units and ships failed to retreat when pin-bombed or
missiled with a nuke. That's because they received zero conventional
damage.
The mission code flies planes and missiles and tallies their damage.
This mission damage included nuclear damage at ground zero (except for
missiles sometimes, see below), to make support and commodity
interdiction work. Unfortunately, this broke other things.
Bug: when bombers interdicted ships or land units, nukes first damaged
the ships or land units by the side effect, then again through mission
damage. Interdicting missiles had a special case to avoid this.
Bug: when interdicting move, explore or transport, nukes first damaged
the sector by the side effect, then again through mission damage's
collateral damage.
There may well be more bugs hiding in this mess.
The mess is not worth fixing. While the idea of interdicting and
supporting with nukes sounds kind of cool, I believe it's pretty
irrelevant in actual play.
Instead, go back to a variation of the original rules: nukes can be
delivered only through bomb mission 's' and launch at sectors.
Make arm reject marine missiles in addition to satellites, ABMs and
SAMs, and clear the mission. Make mission reject planes armed with
nukes. Oops when they show up in mission_pln_equip() anyway.
Make pln_equip() allow planes with nukes only for missions 's' and
't'.
Clean up pln_damage() to just compute damage, without side effect.
Change strat_bomb() and launch_missile() to detonate nukes. Simplify
the other callers. Parameter mission of msl_launch_mindam() is now
unused, remove it.
Missiles exploding on launch no longer set off their nukes. That was
pretty ridiculous anyway.
--- How to build the info pages ---
Make remakes info pages, table of contents and index automatically.
This requires Perl 5 and troff. To remake just formatted info pages,
run make info.
To remake HTML info, run make html. This is not done by default. The
recommended start page is TOP.html, but you may also like all.html.
--- How to add a new info page ---
To create a new info page, follow these steps:
1. Decide which chapter to put your info page in:
Commands - Empire Commands
Concepts - Game concepts
Introduction - General info about playing Empire
Server - Info about the server
2. Decide what to call your info page:
- If it's an Empire command, give it the same name as the command
as listed in lib/player/empmod.c
- Info names are case-insensitive. Make sure there isn't another
one that differs only in case.
- Make sure your info page doesn't have the same name as an existing
subject or chapter.
3. Format your info page.
The file name for a page NAME must be NAME.t. It's easiest to start
with an existing file.
The first line must be a title header:
.TH arg1 arg2
- arg1 should be the chapter, one of: Command, Concept,
Introduction, Server
- arg2 is the title of your page. If it contains more than one
word, make sure it's in double quotes
- if the info page is for an Empire command, then arg2 must be the
command name in ALL UPPERCASE.
The second line must be a name header:
.NA arg1 arg2
- arg1 must be the name
- arg2 is a one-line description of the info page which will be
put on the Subject page that your info page belongs to. It should
be in double quotes
The third line must be a level header:
.LV arg
- arg must be a level, one of Basic, Expert
The last line should be a see also:
.SA "item1, item2, ..., subject1, subject2"
- the stuff in quotes is a list of other info pages which are
related to this page and info Subjects to which this page belongs.
- the stuff in quotes must all be on the same line
- You must include at least one subject (see the Subjects
subdirectory) in the list (at the end of the list by convention).
The lines in between can contain troff requests. The following
additional requests are available:
Empire command syntax:
.SY "command <ARGS>"
An Empire command example:
.EX "command args"
No Formatting:
.NF
this stuff
won't be formatted
.FI
Begin paragraph:
.s1
Item in a description:
.L
Fancy troff magic is prone to break HTML output.
4. Format your info page, update table of contents and index
Run make info html. If it fails, peruse the error messages and fix
your info page.
==APPENDIX A - What exactly the Perl scripts do==
The scripts read all of the info pages and create a two-level table of
contents for them, organized by subject. An info page belongs to a
subject if that subject appears as an entry in the .SA ("SEE ALSO")
field of the info page _and_ that entry is not the name of another
info page.
For example, the .SA field of headlines.t contains the entries
"newspaper" and "Communication". Since there's already an info page
called "newspaper.t", but there is no "Communication" info page, then
the headlines info page is considered to be a member of the
Communication
subject.
The output of these script is a bunch of .t files. The file TOP.t is
the top-level table of contents and lists all of the subjects. Then
for each SUBJECT, a SUBJECT.t file is created, listing all of the info
pages that belong to it.
==APPENDIX B - The checklist.pl script==
FIXME This does not work at the moment
This little perl script compares the "list" of legal Empire commands
in your server with the Empire commands documented in info. To run
it, login to your game and type:
[##:##]% list > list.out
Then, move the list.out file to this directory and run checklist.pl.