URL:
<http://gna.org/bugs/?19821>
Summary: Numerous issues with wipe_unit() wiping transporter
with cargo
Project: Freeciv
Submitted by: jtn
Submitted on: Sun Jun 17 23:56:36 2012
Category: None
Severity: 3 - Normal
Priority: 5 - Normal
Status: None
Assigned to: None
Originator Email:
Open/Closed: Open
Release: 2.2.7, 2.3.2, S2_4
Discussion Lock: Any
Operating System: Any
Planned Release: 2.3.3, 2.4.0, 2.5.0
_______________________________________________________
Details:
Noticed in passing, found through code review, some confirmed through testing
(S2_4):
0 S2_4 only: when looking for noble cargo (gameloss/undisbandable) to save, it
mistakenly calls unit_transported(punit) where punit is the recently destroyed
transporter. Could lead to nobility not saved before proletariat (seen in
testing) or, presumably, a crash.
0 On S2_4 with recursive transports, if cargo was itself carrying cargo and is
to be lost, there are assertion failures (confirmed in testing) and other bad
things, as unit_lost_with_transport() calls server_remove_unit() which expects
cargo to have been removed first.
0 Units that go down with the transport don't get a "unit_lost" script signal,
only the transporter does. (tested)
0 Nor do they get counted in units_lost or units_killed (wipe_unit() doesn't
handle this at all, callers do, but callers don't and can't account for
cargo). Affects scores.
0 Cosmetic: calls city_units_upkeep() unnecessarily after removing
transporter; server_remove_unit() did it already.
0 Cosmetic: the variable 'drowning' is improperly maintained, being
incremented twice for every decrement. It's used to bail out of iterations
early, so the worst effect is that time will be wasted in rare circumstances.
(This is what drew my eye to this area.)
I believe issues 3, 4, 5, 6 apply on S2_3 as well.
Issues 3, 5, and 6 affect S2_2, FWIW.
On S2_4, the right fix to some of this clearly involves recursion of
wipe_unit(). That may be true for previous branches too.
Moving units_{lost,killed} accounting and signal generation into wipe_unit()
seems like the only answer given the possibility of transport on allied
vessels. But it will need careful handling, with different behaviour depending
on unit_loss_reason (e.g., unit_change_owner() calls wipe_unit(), as does the
editor). But we don't have unit_loss_reason on S2_3 :( -- it came in in patch
#2548.
May also need to pass in aggressor player to wipe_unit() to update their
units_killed.
There are so many issues here, some with different solutions, that this may
become a metaticket...
_______________________________________________________
Reply to this item at:
<http://gna.org/bugs/?19821>
_______________________________________________
Message sent via/by Gna!
http://gna.org/
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev