edit, setresource and setsector report change in three ways:
* Print a message.
* Send a bulletin to the changed object's owner. This should be done
if and only if the change is visible to the owner, e.g. in census or
xdump.
* Report divine aid in news. This should be done if and only if a
bulletin was sent, except for changes that are neither negative nor
positive, such as changing the distribution sector.
Fix the places that don't get it right for sectors:
cmd key sctstr member before after notes
-------------------------------------------------
edit l O sct_oldown -- B-
edit l F sct_fallout -- BN 1
edit l M sct_mines -- BN 2 3
edit l D sct_dist_x,y -- B- 1
edit l s sct_type -- B- 1
edit l S sct_newtype -- B- 1
setse ow sct_own B- BN
setse ol sct_oldown -- B-
setse e sct_effic -- BN 2
setse mo sct_mobil -- BN 2
setse a sct_avail -- BN 2
setse w sct_work -- BN 2
The two characters in columns before, after show whether the command
sends a bulletin (B) or not (-), and whether it reports news (N) or
not (-).
Notes:
1. Printed message massaged slightly for consistency with other keys.
2. Printed message improved to show the old value, too. Necessary to
give the deity a chance to catch unexpected changes, e.g. a player
laying mines right before the deity edits them. Watching out for
such changes is especially important with non-interactive edit.
3. Bulletin and news suppressed for occupied sectors.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
setsector() reads the first two characters unconditionally. Wrong if
the first character is NUL. The second character read isn't actually
used then. Screwed up in Chainsaw.
When getstarg() returns an empty string, it's always in the buffer
passed as third argument. Thus, reading the second character is
actually safe.
Clean it up anyway.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
When the deity sets the number of mines with setsector, the sector
owner (if any) is told the resulting number of mines. Even for
occupied sectors, where mines belong to the old owner, and thus
shouldn't be disclosed. Oops.
Fix setsector not to tell the sector owner anything then.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Fails to print actual change for occupied sectors. Broken in v4.3.31.
This reverts commit eb4adc93ff.
Conflicts:
src/lib/commands/setsect.c
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Deities get bulletins when they use edit, give, setsector and
setresource on stuff they own. Except for POGO, who can't own
anything.
The bulletins are annoying; suppress them.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Option GODNEWS is documented to be about deities giving or taking
things from players. Nevertheless, edit, give, setsector and
setresource report news of deities meddling with things owned by
deities other than POGO. Don't.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
give already suppresses when the new value equals the old one, but
edit, setresource and setsector don't. Make them.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
In the beginning, all bulletins came from POGO. Chainsaw changed edit
and give to send them from the deity using the command. Its new
command setresource sent from POGO regardless. Its new command
setsector did both.
Go back to sending them only from POGO.
Some of the affected bulletins don't mention the acting deity. Reword
them so they do.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
setsector() and setres() continue after check_sect_ok() fails.
Clobbers the updates that made check_sect_ok() fail, triggering a
seqno mismatch oops.
Commit 04a332a8 (v4.3.27) claimed to fix this, but actually only
suppressed the generation oops.
When the deity sets the number of mines with setsector, the sector
owner (if any) is told the resulting number of mines. Even for
occupied sectors, where mines belong to the old owner, and thus
shouldn't be disclosed. Oops.
Fix setsector not to tell the sector owner anything then.
setsector() reads the sector, prompts for input, then writes back the
sector, triggering a generation oops. Any updates made by other
threads while setsector() waits for input are wiped out, triggering a
seqno mismatch oops.
Same for setres().
Why upgrade? I'm not a lawyer, but here's my take on the differences
to version 2:
* Software patents: better protection against abuse of patents to
prevent users from exercising the rights under the GPL. I doubt
we'll get hit with a patent suit, but it's a good move just on
general principles.
* License compatibility: compatible with more free licenses, i.e. can
"steal" more free software for use in Empire. I don't expect to steal
much, but it's nice to have the option.
* Definition of "source code": modernization of some details for today's
networked world, to make it easier to distribute the software. Not
really relevant to us now, as we normally distribute full source code.
* Tivoization: this is about putting GPL-licensed software in hardware,
then make the hardware refuse to run modified software. "Neat" trick
to effectively deny its users their rights under the GPL. Abuse was
"pioneered" by TiVo (popular digital video recorders). GPLv3 forbids
it. Unlikely to become a problem for us.
* Internationalization: more careful wording, to harden the license
outside the US. The lawyers tell us it better be done that way.
* License violations: friendlier way to deal with license violations.
This has come out of past experience enforcing the GPL.
* Additional permissions: Probably not relevant to us.
Also include myself in the list of principal authors.
Pinpointed assignments within if conditionals with spatch -sp_file
tests/bad_assign.cocci (from coccinelle-0.1.4). Cherry-picked diff
hunks affecting conditionals split over multiple lines, and cleaned
them up.
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.
other. Ensure headers in include/ can be included in any order
(except for econfig-spec.h, which is special). New header types.h to
help avoid inclusion cycles. Sort include directives. Remove some
superflous includes.
(doland, mine, landmine, setsector, pln_dropoff): Use it. With
variables, mining beyond the capacity of variables (65535) was
ignored. Now the mines saturate at MINES_MAX.
To save space, the ancients invented `variables': a collection of
key-value pairs, missing means zero value, space for `enough' keys.
This complicates the code, as assigning to a `variable' can fail for
lack of space. Over time, `enough' increased, and for quite some time
now `variables' have been *wasting* space. This changeset replaces
them, except in struct mchrstr, struct lchrstr and struct pchrstr,
where they are read-only, and will be replaced later. It is only a
first step; further cleanup is required. To simplify and minimize
this necessarily huge changeset, the new item[] arrays have an unused
slot 0, and the old variable types V_CIVIL, ... are still defined, but
must have the same values as the item types I_CIVIL, ...