|
Atrinik Client 2.5
|
00001 /************************************************************************ 00002 * Atrinik, a Multiplayer Online Role Playing Game * 00003 * * 00004 * Copyright (C) 2009-2011 Alex Tokar and Atrinik Development Team * 00005 * * 00006 * Fork from Daimonin (Massive Multiplayer Online Role Playing Game) * 00007 * and Crossfire (Multiplayer game for X-windows). * 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 * This program is distributed in the hope that it will be useful, * 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00017 * GNU General Public License for more details. * 00018 * * 00019 * You should have received a copy of the GNU General Public License * 00020 * along with this program; if not, write to the Free Software * 00021 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * 00022 * * 00023 * The author can be reached at admin@atrinik.org * 00024 ************************************************************************/ 00025 00030 #include <global.h> 00031 00033 server_settings *s_settings = NULL; 00034 00037 void server_settings_init() 00038 { 00039 FILE *fp; 00040 char buf[HUGE_BUF * 4], *cp; 00041 int line = 0; 00042 char_struct *cur_char = NULL; 00043 size_t text_id = 0, i; 00044 00045 fp = server_file_open(SERVER_FILE_SETTINGS); 00046 00047 if (!fp) 00048 { 00049 return; 00050 } 00051 00052 server_settings_deinit(); 00053 s_settings = calloc(1, sizeof(server_settings)); 00054 00055 while (fgets(buf, sizeof(buf) - 1, fp)) 00056 { 00057 line++; 00058 00059 if (*buf == '#') 00060 { 00061 continue; 00062 } 00063 00064 cp = strrchr(buf, '\n'); 00065 00066 /* Eliminate newline. */ 00067 if (cp) 00068 { 00069 *cp = '\0'; 00070 } 00071 00072 if (*buf == '\0') 00073 { 00074 continue; 00075 } 00076 00077 /* Parse the command. Unknown commands will be silently ignored. */ 00078 if (!strncmp(buf, "char ", 5)) 00079 { 00080 s_settings->characters = reallocz(s_settings->characters, sizeof(*s_settings->characters) * s_settings->num_characters, sizeof(*s_settings->characters) * (s_settings->num_characters + 1)); 00081 cur_char = &s_settings->characters[s_settings->num_characters]; 00082 cur_char->name = strdup(buf + 5); 00083 } 00084 else if (!strncmp(buf, "base_hp ", 8)) 00085 { 00086 cur_char->base_hp = atoi(buf + 8); 00087 } 00088 else if (!strncmp(buf, "base_sp ", 8)) 00089 { 00090 cur_char->base_sp = atoi(buf + 8); 00091 } 00092 else if (!strncmp(buf, "base_grace ", 11)) 00093 { 00094 cur_char->base_grace = atoi(buf + 11); 00095 } 00096 else if (!strncmp(buf, "gender ", 7)) 00097 { 00098 char gender[MAX_BUF], arch[MAX_BUF], face[MAX_BUF]; 00099 int gender_id; 00100 00101 if (sscanf(buf + 7, "%s %s %s", gender, arch, face) == 3) 00102 { 00103 gender_id = gender_to_id(gender); 00104 cur_char->gender_archetypes[gender_id] = strdup(arch); 00105 cur_char->gender_faces[gender_id] = strdup(face); 00106 } 00107 } 00108 else if (!strncmp(buf, "points_max ", 11)) 00109 { 00110 cur_char->points_max = atoi(buf + 11); 00111 } 00112 else if (!strncmp(buf, "stats_base ", 11)) 00113 { 00114 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) 00115 { 00116 LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); 00117 } 00118 } 00119 else if (!strncmp(buf, "stats_min ", 10)) 00120 { 00121 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) 00122 { 00123 LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); 00124 } 00125 } 00126 else if (!strncmp(buf, "stats_max ", 10)) 00127 { 00128 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) 00129 { 00130 LOG(llevBug, "Error in settings file, line %d: not enough stats provided.\n", line); 00131 } 00132 } 00133 else if (!strncmp(buf, "desc ", 5)) 00134 { 00135 cur_char->desc = strdup(buf + 5); 00136 } 00137 else if (!strcmp(buf, "end")) 00138 { 00139 s_settings->num_characters++; 00140 } 00141 else if (!strncmp(buf, "level ", 6)) 00142 { 00143 uint32 lev; 00144 00145 s_settings->max_level = atoi(buf + 6); 00146 s_settings->level_exp = malloc(sizeof(*s_settings->level_exp) * (s_settings->max_level + 2)); 00147 00148 for (lev = 0; lev <= s_settings->max_level; lev++) 00149 { 00150 if (!fgets(buf, sizeof(buf) - 1, fp)) 00151 { 00152 break; 00153 } 00154 00155 s_settings->level_exp[lev] = strtoull(buf, NULL, 16); 00156 } 00157 00158 s_settings->level_exp[lev] = 0; 00159 } 00160 else if (!strncmp(buf, "text ", 5)) 00161 { 00162 if (text_id < SERVER_TEXT_MAX) 00163 { 00164 size_t j = 0; 00165 00166 s_settings->text[text_id] = strdup(buf + 5); 00167 convert_newline(s_settings->text[text_id]); 00168 00169 if (text_id == SERVER_TEXT_PROTECTION_LETTERS) 00170 { 00171 cp = strtok(s_settings->text[text_id], " "); 00172 00173 while (cp) 00174 { 00175 strncpy(s_settings->protection_letters[j], cp, sizeof(*s_settings->protection_letters) - 1); 00176 s_settings->protection_letters[j][sizeof(*s_settings->protection_letters) - 1] = '\0'; 00177 j++; 00178 cp = strtok(NULL, " "); 00179 } 00180 } 00181 else if (text_id == SERVER_TEXT_PROTECTION_FULL) 00182 { 00183 cp = strtok(s_settings->text[text_id], " "); 00184 00185 while (cp) 00186 { 00187 strncpy(s_settings->protection_full[j], cp, sizeof(*s_settings->protection_full) - 1); 00188 s_settings->protection_full[j][sizeof(*s_settings->protection_full) - 1] = '\0'; 00189 j++; 00190 cp = strtok(NULL, " "); 00191 } 00192 } 00193 else if (text_id == SERVER_TEXT_SPELL_PATHS) 00194 { 00195 cp = strtok(s_settings->text[text_id], " "); 00196 00197 while (cp) 00198 { 00199 strncpy(s_settings->spell_paths[j], cp, sizeof(*s_settings->spell_paths) - 1); 00200 s_settings->spell_paths[j][sizeof(*s_settings->spell_paths) - 1] = '\0'; 00201 j++; 00202 cp = strtok(NULL, " "); 00203 } 00204 } 00205 else if (text_id == SERVER_TEXT_SKILL_TYPES) 00206 { 00207 cp = strtok(s_settings->text[text_id], " "); 00208 00209 while (cp) 00210 { 00211 strncpy(s_settings->skill_types[j], cp, sizeof(*s_settings->skill_types) - 1); 00212 s_settings->skill_types[j][sizeof(*s_settings->skill_types) - 1] = '\0'; 00213 j++; 00214 cp = strtok(NULL, " "); 00215 } 00216 } 00217 00218 text_id++; 00219 } 00220 else 00221 { 00222 LOG(llevBug, "Error in settings file, more text entries than allowed on line %d.\n", line); 00223 } 00224 } 00225 } 00226 00227 for (i = text_id; i < SERVER_TEXT_MAX; i++) 00228 { 00229 s_settings->text[i] = strdup("???"); 00230 } 00231 00232 fclose(fp); 00233 } 00234 00237 void server_settings_deinit() 00238 { 00239 size_t i, gender; 00240 00241 if (!s_settings) 00242 { 00243 return; 00244 } 00245 00246 free(s_settings->level_exp); 00247 00248 for (i = 0; i < s_settings->num_characters; i++) 00249 { 00250 free(s_settings->characters[i].name); 00251 free(s_settings->characters[i].desc); 00252 00253 for (gender = 0; gender < GENDER_MAX; gender++) 00254 { 00255 if (s_settings->characters[i].gender_archetypes[gender]) 00256 { 00257 free(s_settings->characters[i].gender_archetypes[gender]); 00258 free(s_settings->characters[i].gender_faces[gender]); 00259 } 00260 } 00261 } 00262 00263 for (i = 0; i < SERVER_TEXT_MAX; i++) 00264 { 00265 free(s_settings->text[i]); 00266 } 00267 00268 free(s_settings->characters); 00269 free(s_settings); 00270 s_settings = NULL; 00271 }
1.7.4