On Fri, Mar 05, 2010 at 01:33:53PM -0500, Zachary Uram wrote: > I was quitting and during countdown someone geno'd in PreT and it > froze my countdown during the geno parade and then cancelled it so I > had to press shift-q again. There are two critical data values; - p_flags & PFSELFDEST, a bit in the player flags variable, which means that a self destruct timer is running, - p_selfdest, a player variable, an integer representing the future game time (in terms of p_updates) that the self destruct will take effect if not cancelled. PFSELFDEST is set in socket.c at the same point that you get the warning "Self destruct initiated". If you get that warning, PFSELFDEST is certainly set. Check your logs. p_selfdest is set at the same moment, to a time in the future (p_updates plus something). See function handleQuitReq. PFSELFDEST is explicitly cleared under two conditions only: 1. the self destruct timer expires, in which case your ship begins to explode, and if the parade triggers at that point your explosion will join the parade (your client may render this as a ship), and then the end of parade explosion will change the reason for your death from what you selected (you quit) to whatever triggered the parade (genocide), 2. if a packet is received from the client forcing the cancel, in which case you are told "Self Destruct has been canceled". If you saw that message, then your client sent a packet after the quit request. Check your logs. PFSELFDEST is not cleared by the conquer parade, and the parade halts the p_updates increment (it is a pause), so once the pause is finished the fact that the ship is dead for reasons of genocide would hide the PFSELFDEST flag. PFSELFDEST is also cleared at the point a ship enters the game. See enter.c, function enter(), where p_flags is assigned rather than bit manipulated. Therefore the pending self destruct won't be seen by the next ship in that slot. In theory, the same problem you observe (self destruct ineffective) might also occur if you are killed by an enemy before the timer expires. However, the typical client remembers you asked to quit. COW doesn't use PFSELFDEST at all. The problem is no doubt caused by the original design overloading the cause of death ... and offering only *one* cause of death in any circumstance, instead of whatever causes are available. Cause of death should be a bit mask of possibilities, rather than a constant single value. Unlikely to change. -- James Cameron http://quozl.linux.org.au/