Atrinik Client 2.5
client/server_settings.c
Go to the documentation of this file.
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 }