The work required for building sea sectors is zero in sect.config.
When a deity runs neweff or production on a sea sector, e.g. with
"neweff *", buildeff() divides by zero. Same when a player or deity
runs work with an engineer in a sea sector. Broken in commit
2ffd7b948 "config: Make work to build sectors configurable", v4.4.0
Fix buildeff() to avoid the division. Change the required work to 100
in sect.config for good measure.
Cover deity use of neweff and production in tests/update.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Each point of gold resource is worth 5d. Except for mountains, where
it's just 3.75d. This is because a mountain's process efficiency is
only 75%. Has been that way since Empire 3 made mountains mine gold.
This is actually a needless complication: a sector with 75% process
efficiency produces just like one with 100% process efficiency and 75%
of the resource.
Increase mountain process efficiency to 100%. Deities may want to
compensate by adjusting mountains' gold resources.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
The work required for a product is traditionally the amount of raw
materials, plus 1 for resource usage, or 1 if using neither. Make it
independently configurable instead, via new product selector bwork,
backed by new struct pchrstr member p_bwork. Keep the required work
exactly the same in the default configuration.
Clients that compute work from materials need to be updated. Easy,
since build work is now exposed in xdump.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
External use of prod_materials_cost(), prod_resource_limit() went away
in commit 4a714a37d "production: Use update code instead of
duplicating it", v4.4.0.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
We reject satellites, ABMs, anti-ship missiles, and SAMs. That's
enumerating badness. More robust replacement: accept only bomber,
tactical, cargo, except for anti-ship missiles.
Throw in PLN_LAUNCHED sanity checking while there.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Any plane may have capabilities VTOL, helo, light.
Capability missile requires VTOL.
Anti-ballistic missiles have capabilities missile, SDI.
Anti-satellite missiles have capabilities missile, satellite.
Surface-to-air missiles have capabilities missile, intercept.
Anti-ship missiles have capabilities missile, marine, and may have
tactical.
Surface-to-surface missiles have capability missile, and may have
tactical.
Satellites have capability satellite, and may have spy, image.
Ordinary planes may have capabilities bomber, tactical, intercept,
cargo, spy, image, ASW, para, escort, mine, sweep. Capability para
requires cargo; see para().
Only "missile requires VTOL" is enforced. Enforce the rest.
Excluding P_O when asking for P_N is now redundant. Drop that from
msl_abm_intercept().
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Their impact on the target does not depend on shell load (it sometimes
did for a-sats until commit cf960a573 "Make anti-sat launch consistent
with interception", v4.3.23). The shell use is logistical busy-work,
and economically irrelevant. Remove it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
The asat's impact on the target does not depend on its shell load (it
sometimes did until commit cf960a573 "Make anti-sat launch consistent
with interception", v4.3.23). The shell use is logistical busy-work,
and economically irrelevant. Remove it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Marine missiles can't actually support, see perform_mission(). Make
the mission command reject them.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
The mission code doesn't treat SAMs specially: they take off, fly out,
maybe fight, fly home, and land. Landing triggers the oops in
pln_put1().
Letting SAMs escort makes no sense. Fix the mission command to reject
them.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Option DEFENSE_INFRA was replaced in commit 4d1dd6fa6, v4.3.6. Point
to the replacement instead.
Options SHIPCHOPPERS and XLIGHT were made non-optional in Empire 2.
Don't mention them.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Unused since commit beedf8dce "retreat: Rewrite automatic retreat code
to fix its many bugs", v4.3.33.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Stale since commit 6ac9ad66e (v4.3.20) silently dropped dead code for
supply of military. Dead since commit 689f435af (v4.2.14) dropped
option GRAB_THINGS.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
get_dlist() collects defending land units in a list, and resupplies
them. Bug: it uses a local copy instead of the one in the list. When
att_fight() writes back the list, the commodities supplied get wiped
out, triggering a seqno oops. Broken in commit 62b9399cd "subs:
Factor lnd_insque() out of lnd_sel(), ask_olist(), ...", v4.3.33.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Commit 555de3100 (v4.3.0) added these macros so xdump tables loan and
treaty can share an agreement_statuses table. Treaties are gone since
commit a109de948 (v4.3.33). Drop the macros.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Portability issue: prototypes.h uses enum ns_seltype, defined in
nsc.h. GCC is fine with that; it supports incomplete enum types as an
extension. Broken in commit 157ae8ec2 "Clean up superfluous include
of nsc.h in prototypes.h", v4.3.27. Moving sarg.c stuff to nsc.h
fixes it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
C99 requires at least one argument for the "..." in a variadic macro.
GCC and Clang don't care, but warn with -pedantic. Solaris cc warns.
The warning is easy to avoid, so do it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
MY_LIB_READLINE tries each readline-compatible library with a sequence
of additional libraries, starting with none. If the check with none
fails, all the others checks reuse the cached result, and also fail.
Broken in commit 1cbda2c7d "client: Rewrite readline configuration",
v4.4.0.
Avoid the unwanted chaching.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
The test scripts need a POSIX-compliant Bourne shell. /bin/sh isn't
on some systems, such as Solaris. Run them with $(SHELL).
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
The default SHELL isn't POSIX on some systems, such as Solaris. Use
the one Autoconf chooses instead of the default.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Solaris 10's nroff can't deal with the lengthy .NF ... .FI: it
complains, writes truncated output, and terminates
successfully (*boggle*). Split the .NF ... .FI in two.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Commit 23373d01d "configure: Test compiler flags" (v4.4.0) made
configure test whether compiler flags work, to let us use flags that
work only for some compilers.
Unfortunately, the Sun C compiler accepts invalid options with a
warning, breaking the test. Observed on Solaris 10.
Fix by testing the compiler flags only when AC_PROG_CC detected GCC.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
plane damage() prints @noisy with snprintf() even when it's null. It
doesn't actually use the output then. Some systems (GNU, Windows)
deal gracefully with printing null strings, others crash. @noisy is
null when bombers or missiles miss and do collateral damage. Affects
bomb, launch, and interdiction missions. Broken in commit 820d755e5
"subs: Change pln_damage()'s parameter noisy to string prefix",
v4.3.33.
Fix by guarding the snprintf().
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Document the need for the XSI Extension. Don't list curses as
required, it's actually optional. Correct advice for Solaris. Add
advice for AIX. Drop references to C89; we actually require C99, and
POSIX.1-2001 provides it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
We require POSIX.1-2001. Some systems provide it only with feature
test macro _POSIX_C_SOURCE defined to 200112L. Since we don't define
it, the build fails there. Observed on Solaris 10.
We actually require the XSI extension. The GNU C Library provides it
by default. With _POSIX_C_SOURCE 200112L, however, you have to define
feature test macro _XOPEN_SOURCE to get it. But then _POSIX_C_SOURCE
is redundant.
Make configure put #define _XOPEN_SOURCE 600 into config.h. Drop the
two existing #define _XOPEN_SOURCE 500 in .c files.
Now Solaris cc refuses to play ball unless switched to C99. Replace
AC_PROG_CC by AC_PROG_CC_STDC to mollify it.
Unfortunately, use of _XOPEN_SOURCE exposes bugs in AIX libc and old
versions of GNU libc:
* AIX defines struct in6_addr's member s6_addr as a macro expanding
into the actual member. Without _ALL_SOURCE (the default), the
expansion is wrong and doesn't compile. Observed with AIX V7.2.
* GNU lib's IN6_IS_ADDR_V4MAPPED() is unusable without
_DEFAULT_SOURCE (default) or _GNU_SOURCE. Observed with Debian 8.
Tracked at <https://sourceware.org/bugzilla/show_bug.cgi?id=16421>,
fixed in version 2.25.
Affects just sockaddr_ntop()'s special case from commit 372cdb136 "Use
IPv4 format for IPv4-mapped addresses", v4.3.31. Disable the special
case and use IPv6 format on such systems. This is a very minor
usability regression. Could be avoided, I guess, but it's not worth
the trouble.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
getpass() is traditional Unix, but has been withdrawn from POSIX. We
still use it when it's available, and fall back to portable code only
when it's not.
The portable code behaves differently: it reads stdin instead of
/dev/tty, and in noncanonical mode.
Simplify things: always use the replacement.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
getpass() is traditional Unix, but has been withdrawn from POSIX. We
provide a replacement in case it's missing. The one for Windows
suppresses echo, like getpass() does. Implement that for POSIX. The
other differences to getpass() remain.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
I'm going to drop use of getpass(). As a first step, weaken the bond
by hiding it in a separate function.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
lwpSigWait() was designed to resemble sigwait(). It doesn't anymore.
Drop the awkward argument, and use the return value instead.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
LWP's use of sigset_t is problematic.
To iterate over a sigset_t, it uses NSIG, which is not portable: BSD
and System V provide it, but it's not POSIX.
To record signals caught, it updates a sigset_t variable from a signal
handler. The variable isn't volatile, because we'd have to cast away
volatile for sigaddset().
Replace sigset_t by an array of signal numbers terminated with 0.
Since lwpInitSigWait() needs to store the signal set for
lwpCatchAwaitedSig() anyway, there is no need to pass it to
lwpSigWait(). Drop its parameter.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
lwpSigWait() clears LwpSigCheck even when signals remain in
LwpSigCaught. The next empth_wait_for_signal() will then wait until
another one gets caught. Broken in commit fe2de3d74, v4.3.10.
Fix by clearing it only when LwpSigCaught is empty.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
sigismember() fails when passed an invalid or unsupported signal
number. lwpInitSigWait() and lwpGetSig() treat sigismember() failure
like "is a member". lwpInitSigWait() will then sigaction()
unsuccessfully. Harmless. lwpGetSig() returns the bad signal number
when it's greater than any caught signal's number. The bad signal
number then gets returned to main(), which shuts down the server.
Fix by treating failure like "is not a member".
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
lwpCatchAwaitedSig() is not reentrant. lwpInitSigWait() attempts to
protect it by setting an appropriate signal mask, but screws up. This
could conceivably lose signals. Messed up when it got added in commit
7183516d9, v4.3.6. Fix it.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
lwpSigWait()'s contract specifies failure, which means oopsing is
wrong. Harmless, as its only caller empth_wait_for_signal() oopses on
failure. Drop it anyway.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>