+ }
+ }
+ return 0;
+}
+
+
+
+static void server_test()
+{
+ char test[10 + 1 + 10 + 1 + 1];
+ FILE * file = try_fopen(s[S_PATH_OUT], "r", __func__);
+ try_fgets(test, 10 + 10 + 1 + 1, file, __func__);
+ try_fclose(file, __func__);
+ if (strcmp(test, world.server_test))
+ {
+ unset_cleanup_flag(CLEANUP_WORLDSTATE);
+ unset_cleanup_flag(CLEANUP_OUT);
+ unset_cleanup_flag(CLEANUP_IN);
+ char * msg = "Server test string in server output file does not match. "
+ "This indicates that the current server process has been "
+ "superseded by another one.";
+ exit_err(1, msg);
+ }
+}
+
+
+
+static int16_t * build_whitelist()
+{
+ uint16_t i_things = NULL != world.things;
+ struct Thing * t = world.things;
+ for (; t; t = t->next, i_things++);
+ int16_t * whitelist = try_malloc(i_things * sizeof(int16_t), __func__);
+ for (i_things = 0, t = world.things; t;
+ whitelist[i_things] = t->id, t = t->next, i_things++);
+ whitelist[i_things] = -1;
+ return whitelist;
+}
+
+
+
+static uint8_t thing_in_whitelist(uint8_t id, int16_t * whitelist)
+{
+ uint16_t i;
+ for (i = 0; -1 < whitelist[i]; i++)
+ {
+ if ((int16_t) id == whitelist[i])
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+
+static void turn_over()
+{
+ struct Thing * player = get_player();
+ struct Thing * thing = player;
+ int16_t * whitelist = build_whitelist();
+ while (0 < player->lifepoints)
+ {
+ if (!thing)
+ {
+ world.turn++;
+ thing = world.things;
+ free(whitelist);
+ whitelist = build_whitelist();/* The whitelist excludes things */
+ } /* that appear only during the turn.*/
+ if (thing_in_whitelist(thing->id, whitelist))
+ {
+ if (0 < thing->lifepoints)