/** * End the system. */ void system_end(void) { tooltip_dismiss(); object_deinit(); notification_destroy(); popup_destroy_all(); resources_deinit(); toolkit_widget_deinit(); client_socket_deinitialize(); metaserver_clear_data(); effects_deinit(); sound_ambient_clear(); interface_deinit(); sound_deinit(); intro_deinit(); cmd_aliases_deinit(); server_settings_deinit(); texture_deinit(); text_deinit(); hfiles_deinit(); settings_deinit(); keybind_deinit(); image_bmaps_deinit(); anims_deinit(); skills_deinit(); spells_deinit(); clioption_settings_deinit(); server_files_deinit(); image_deinit(); toolkit_deinit(); SDL_Quit(); }
/** * Initialize the server settings from the srv file. */ void server_settings_init() { FILE *fp; char buf[HUGE_BUF * 4], *cp; int line = 0; char_struct *cur_char = NULL; size_t text_id = 0, i; fp = server_file_open(SERVER_FILE_SETTINGS); if (!fp) { return; } server_settings_deinit(); s_settings = calloc(1, sizeof(server_settings)); while (fgets(buf, sizeof(buf) - 1, fp)) { line++; if (*buf == '#') { continue; } cp = strrchr(buf, '\n'); /* Eliminate newline. */ if (cp) { *cp = '\0'; } if (*buf == '\0') { continue; } /* Parse the command. Unknown commands will be silently ignored. */ if (!strncmp(buf, "char ", 5)) { s_settings->characters = reallocz(s_settings->characters, sizeof(*s_settings->characters) * s_settings->num_characters, sizeof(*s_settings->characters) * (s_settings->num_characters + 1)); cur_char = &s_settings->characters[s_settings->num_characters]; cur_char->name = strdup(buf + 5); } else if (!strncmp(buf, "base_hp ", 8)) { cur_char->base_hp = atoi(buf + 8); } else if (!strncmp(buf, "base_sp ", 8)) { cur_char->base_sp = atoi(buf + 8); } else if (!strncmp(buf, "base_grace ", 11)) { cur_char->base_grace = atoi(buf + 11); } else if (!strncmp(buf, "gender ", 7)) { char gender[MAX_BUF], arch[MAX_BUF], face[MAX_BUF]; int gender_id; if (sscanf(buf + 7, "%s %s %s", gender, arch, face) == 3) { gender_id = gender_to_id(gender); cur_char->gender_archetypes[gender_id] = strdup(arch); cur_char->gender_faces[gender_id] = strdup(face); } } else if (!strncmp(buf, "points_max ", 11)) { cur_char->points_max = atoi(buf + 11); } else if (!strncmp(buf, "stats_base ", 11)) { if (sscanf(buf + 11, "%d %d %d %d %d %d %d", &cur_char->stats_base[0], &cur_char->stats_base[1], &cur_char->stats_base[2], &cur_char->stats_base[3], &cur_char->stats_base[4], &cur_char->stats_base[5], &cur_char->stats_base[6]) != 7) { LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); } } else if (!strncmp(buf, "stats_min ", 10)) { if (sscanf(buf + 10, "%d %d %d %d %d %d %d", &cur_char->stats_min[0], &cur_char->stats_min[1], &cur_char->stats_min[2], &cur_char->stats_min[3], &cur_char->stats_min[4], &cur_char->stats_min[5], &cur_char->stats_min[6]) != 7) { LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); } } else if (!strncmp(buf, "stats_max ", 10)) { if (sscanf(buf + 10, "%d %d %d %d %d %d %d", &cur_char->stats_max[0], &cur_char->stats_max[1], &cur_char->stats_max[2], &cur_char->stats_max[3], &cur_char->stats_max[4], &cur_char->stats_max[5], &cur_char->stats_max[6]) != 7) { LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); } } else if (!strncmp(buf, "desc ", 5)) { cur_char->desc = strdup(buf + 5); } else if (!strcmp(buf, "end")) { s_settings->num_characters++; } else if (!strncmp(buf, "level ", 6)) { uint32 i; s_settings->max_level = atoi(buf + 6); s_settings->level_exp = malloc(sizeof(*s_settings->level_exp) * (s_settings->max_level + 2)); for (i = 0; i <= s_settings->max_level; i++) { if (!fgets(buf, sizeof(buf) - 1, fp)) { break; } s_settings->level_exp[i] = strtoull(buf, NULL, 16); } s_settings->level_exp[i] = 0; } else if (!strncmp(buf, "text ", 5)) { if (text_id < SERVER_TEXT_MAX) { char *cp; size_t j = 0; s_settings->text[text_id] = strdup(buf + 5); convert_newline(s_settings->text[text_id]); if (text_id == SERVER_TEXT_PROTECTION_LETTERS) { cp = strtok(s_settings->text[text_id], " "); while (cp) { strncpy(s_settings->protection_letters[j], cp, sizeof(*s_settings->protection_letters) - 1); s_settings->protection_letters[j][sizeof(*s_settings->protection_letters) - 1] = '\0'; j++; cp = strtok(NULL, " "); } } else if (text_id == SERVER_TEXT_PROTECTION_FULL) { cp = strtok(s_settings->text[text_id], " "); while (cp) { strncpy(s_settings->protection_full[j], cp, sizeof(*s_settings->protection_full) - 1); s_settings->protection_full[j][sizeof(*s_settings->protection_full) - 1] = '\0'; j++; cp = strtok(NULL, " "); } } text_id++; } else { LOG(llevBug, "Error in settings file, more text entries than allowed on line %d.\n", line); } } } for (i = text_id; i < SERVER_TEXT_MAX; i++) { s_settings->text[i] = strdup("???"); } fclose(fp); }