+2006-11-25
+ * fixed infinite loop / crash bug when killing the player while having
+ a CE with the setting "kill player X when explosion of <player X>"
+
2006-11-21
* fixed nasty bug with initialization only done for the first player
player->present = FALSE;
player->active = FALSE;
+ player->killed = FALSE;
player->action = 0;
player->effective_action = 0;
if (!player->active)
return;
+ /* the following code was introduced to prevent an infinite loop when calling
+ -> Bang()
+ -> CheckTriggeredElementChangeExt()
+ -> ExecuteCustomElementAction()
+ -> KillPlayer()
+ -> (infinitely repeating the above sequence of function calls)
+ which occurs when killing the player while having a CE with the setting
+ "kill player X when explosion of <player X>"; the solution using a new
+ field "player->killed" was chosen for backwards compatibility, although
+ clever use of the fields "player->active" etc. would probably also work */
+ if (player->killed)
+ return;
+
+ player->killed = TRUE;
+
/* remove accessible field at the player's position */
Feld[jx][jy] = EL_EMPTY;
boolean present; /* player present in level playfield */
boolean connected; /* player connected (locally or via network) */
boolean active; /* player present and connected */
+ boolean killed; /* player maybe present/active, but killed */
int index_nr; /* player number (0 to 3) */
int index_bit; /* player number bit (1 << 0 to 1 << 3) */