Beispiel #1
0
/**
 * 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();
}
Beispiel #2
0
/**
 * 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);
}