ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/login.C
Revision: 1.44
Committed: Sun Jan 7 02:39:14 2007 UTC (17 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.43: +0 -0 lines
State: FILE REMOVED
Log Message:
""

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4 pippijn 1.43 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5 elmex 1.1 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6     Copyright (C) 1992 Frank Tore Johansen
7    
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12    
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     GNU General Public License for more details.
17    
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21    
22 root 1.18 The authors can be reached via e-mail at <crossfire@schmorp.de>
23 elmex 1.1 */
24    
25     #include <global.h>
26 root 1.30 #include <sproto.h>
27 elmex 1.1 #include <spells.h>
28     #include <loader.h>
29     #include <define.h>
30    
31     extern void sub_weight (object *, signed long);
32     extern void add_weight (object *, signed long);
33     extern long pticks;
34    
35     /* Delete character with name. if new is set, also delete the new
36     * style directory, otherwise, just delete the old style playfile
37     * (needed for transition)
38     */
39 root 1.15 void
40 root 1.42 delete_character (const char *name)
41 root 1.15 {
42     char buf[MAX_BUF];
43 elmex 1.1
44 root 1.42 sprintf (buf, "%s/%s/%s", settings.localdir, settings.playerdir, name);
45     /* this effectively does an rm -rf on the directory */
46     remove_directory (buf);
47 elmex 1.1 }
48    
49 root 1.15 int
50     create_savedir_if_needed (char *savedir)
51 elmex 1.1 {
52     struct stat *buf;
53    
54 root 1.15 if ((buf = (struct stat *) malloc (sizeof (struct stat))) == NULL)
55     {
56     LOG (llevError, "Unable to save playerfile... out of memory.\n");
57     return 0;
58     }
59     else
60     {
61     stat (savedir, buf);
62     if (!S_ISDIR (buf->st_mode))
63     if (mkdir (savedir, SAVE_DIR_MODE))
64     {
65     LOG (llevError, "Unable to create player savedir %s: %s\n", savedir, strerror (errno));
66     return 0;
67     }
68     free (buf);
69     }
70 root 1.30
71 root 1.15 return 1;
72 elmex 1.1 }
73    
74     /*
75 root 1.30 * If final is set, it a clean/final save, not a backup, ie dont remove objects from inventory
76 elmex 1.1 */
77 root 1.30 void
78     player::save (bool final)
79 root 1.15 {
80 root 1.30 object *tmp, *container = 0;
81 root 1.15
82     /* Sanity check - some stuff changes this when player is exiting */
83 root 1.30 if (ob->type != PLAYER || !enable_save || !ns)
84     return;
85 elmex 1.1
86 root 1.40 char filename[MAX_BUF];
87    
88     sprintf (filename, "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, &ob->name, &ob->name);
89     make_path_to_file (filename);
90    
91     INVOKE_PLAYER (SAVE, ob->contr, ARG_STRING (filename));
92 root 1.5
93 root 1.30 object_freezer freezer;
94 elmex 1.1
95 root 1.33 int wiz = ob->flag [FLAG_WIZ];
96 root 1.3
97 root 1.9 /* Eneq(@csd.uu.se): If we have an open container hide it. */
98 root 1.30 container = ob->container;
99     ob->container = 0;
100    
101 root 1.39 #define PL_OUT(k) freezer.put (KW_ ## k, k)
102     #define PL_OUT2(k,v) freezer.put (KW_ ## k, v)
103 elmex 1.1
104 root 1.39 PL_OUT (password);
105     PL_OUT2 (title, own_title);
106     PL_OUT (explore);
107     PL_OUT (gen_hp);
108     PL_OUT (gen_sp);
109     PL_OUT (gen_grace);
110     PL_OUT (listening);
111     PL_OUT (shoottype);
112     PL_OUT (bowtype);
113     PL_OUT (petmode);
114     PL_OUT (peaceful);
115     PL_OUT (digestion);
116     PL_OUT2 (pickup, mode);
117     PL_OUT (outputs_sync);
118     PL_OUT (outputs_count);
119    
120     freezer.put (KW_usekeys, usekeys == key_inventory ? "key_inventory" : (usekeys == keyrings ? "keyrings" : "containers"));
121     freezer.put (KW_unapply, unapply == unapply_nochoice ? "unapply_nochoice" : (unapply == unapply_never ? "unapply_never" : "unapply_always"));
122    
123     if (ob->map) PL_OUT2 (map, ob->map->path);
124    
125     PL_OUT (savebed_map);
126     PL_OUT (bed_x);
127     PL_OUT (bed_y);
128     PL_OUT (weapon_sp);
129     PL_OUT2 (Str, orig_stats.Str);
130     PL_OUT2 (Dex, orig_stats.Dex);
131     PL_OUT2 (Con, orig_stats.Con);
132     PL_OUT2 (Int, orig_stats.Int);
133     PL_OUT2 (Pow, orig_stats.Pow);
134     PL_OUT2 (Wis, orig_stats.Wis);
135     PL_OUT2 (Cha, orig_stats.Cha);
136 root 1.3
137 root 1.39 PL_OUT2 (lev_array, min (ob->level, 10));
138 root 1.30
139     for (int i = 1; i <= last_level && i <= 10; i++)
140     {
141     fprintf (freezer, "%d\n", levhp[i]);
142     fprintf (freezer, "%d\n", levsp[i]);
143     fprintf (freezer, "%d\n", levgrace[i]);
144 root 1.15 }
145 root 1.4
146 root 1.30 freezer.put (ob->contr);
147 root 1.39 freezer.put (KW_endplst);
148 elmex 1.1
149 root 1.30 SET_FLAG (ob, FLAG_NO_FIX_PLAYER);
150     CLEAR_FLAG (ob, FLAG_WIZ);
151 root 1.35 save_object (freezer, ob, 1); /* don't check and don't remove */
152 elmex 1.1
153 root 1.9 freezer.save (filename);
154    
155 root 1.30 CLEAR_FLAG (ob, FLAG_NO_FIX_PLAYER);
156 elmex 1.1
157     /* Eneq(@csd.uu.se): Reveal the container if we have one. */
158 root 1.30 ob->container = container;
159 root 1.5
160 root 1.33 ob->flag [FLAG_WIZ] = wiz;
161 elmex 1.1
162 root 1.30 enable_save = !final;
163 root 1.40
164     INVOKE_PLAYER (SAVE_DONE, ob->contr, ARG_STRING (filename));
165 elmex 1.1 }
166    
167 root 1.30 player *
168     player::load (const char *path)
169 root 1.15 {
170 root 1.30 object_thawer thawer (path);
171 root 1.15
172     /* If no file, must be a new player, so lets get confirmation of
173     * the password. Return control to the higher level dispatch,
174     * since the rest of this just deals with loading of the file.
175     */
176     if (!thawer)
177 root 1.30 return 0;
178 root 1.3
179 root 1.30 player *pl = new player;
180 root 1.16
181 root 1.30 char buf[MAX_BUF], bufall[MAX_BUF];
182 root 1.19
183 root 1.30 pl->set_object (object::create ());
184     pl->last_save_time = time (0);
185 elmex 1.1
186 root 1.37 pl->savebed_map = first_map_path;
187 root 1.15
188     /* Loop through the file, loading the rest of the values */
189 root 1.38 for (;;)
190 root 1.15 {
191 root 1.38 keyword kw = thawer.get_kv ();
192 root 1.30
193 root 1.38 switch (kw)
194 root 1.37 {
195 root 1.38 case KW_EOF:
196     LOG (llevError, "%s: error while reading player header\n", path);
197     return 0;
198    
199 root 1.41 case KW_ERROR:
200     LOG (llevError, "%s: error while reading player header, skipping (%s,%s)\n", path, thawer.last_keyword, thawer.last_value);
201     break;
202    
203 root 1.38 case KW_endplst:
204     goto done;
205    
206     case KW_oid: thawer.get (pl, thawer.get_sint32 ()); break;
207     case KW_password: assign (pl->password , thawer.get_str ()); break;
208     case KW_title: assign (pl->own_title, thawer.get_str ()); break;
209     case KW_shoottype: pl->shoottype = (rangetype) thawer.get_sint32 (); break;
210     case KW_bowtype: pl->bowtype = (bowtype_t) thawer.get_sint32 (); break;
211     case KW_petmode: pl->petmode = (petmode_t) thawer.get_sint32 (); break;
212     case KW_explore: thawer.get (pl->explore); break;
213     case KW_listening: thawer.get (pl->listening); break;
214     case KW_peaceful: thawer.get (pl->peaceful); break;
215     case KW_digestion: thawer.get (pl->digestion); break;
216     case KW_pickup: thawer.get (pl->mode); break;
217     case KW_outputs_sync: thawer.get (pl->outputs_sync); break;
218     case KW_outputs_count: thawer.get (pl->outputs_count); break;
219     case KW_map: thawer.get (pl->maplevel); break;
220     case KW_savebed_map: thawer.get (pl->savebed_map); break;
221     case KW_bed_x: thawer.get (pl->bed_x); break;
222     case KW_bed_y: thawer.get (pl->bed_y); break;
223     case KW_weapon_sp: thawer.get (pl->weapon_sp); break;
224     case KW_Str: thawer.get (pl->orig_stats.Str); break;
225     case KW_Dex: thawer.get (pl->orig_stats.Dex); break;
226     case KW_Con: thawer.get (pl->orig_stats.Con); break;
227     case KW_Int: thawer.get (pl->orig_stats.Int); break;
228     case KW_Pow: thawer.get (pl->orig_stats.Pow); break;
229     case KW_Wis: thawer.get (pl->orig_stats.Wis); break;
230     case KW_Cha: thawer.get (pl->orig_stats.Cha); break;
231     case KW_gen_hp: thawer.get (pl->gen_hp); break;
232     case KW_gen_sp: thawer.get (pl->gen_sp); break;
233     case KW_gen_grace: thawer.get (pl->gen_grace); break;
234    
235     case KW_usekeys:
236     if (!strcmp (thawer.get_str (), "key_inventory"))
237     pl->usekeys = key_inventory;
238     else if (!strcmp (thawer.get_str (), "keyrings"))
239     pl->usekeys = keyrings;
240     else if (!strcmp (thawer.get_str (), "containers"))
241     pl->usekeys = containers;
242     else
243     LOG (llevDebug, "load_player: got unknown usekeys type: %s\n", thawer.get_str ());
244     break;
245    
246     case KW_unapply:
247     if (!strcmp (thawer.get_str (), "unapply_nochoice"))
248     pl->unapply = unapply_nochoice;
249     else if (!strcmp (thawer.get_str (), "unapply_never"))
250     pl->unapply = unapply_never;
251     else if (!strcmp (thawer.get_str (), "unapply_always"))
252     pl->unapply = unapply_always;
253     else
254     LOG (llevDebug, "load_player: got unknown unapply type: %s\n", thawer.get_str ());
255     break;
256    
257     case KW_lev_array:
258 root 1.15 {
259 root 1.38 int count = thawer.get_sint32 ();
260 root 1.15
261 root 1.38 for (int i = 1; i <= count; i++)
262     {
263     char line[128];
264    
265     fgets (line, 128, thawer); pl->levhp [i] = atoi (line);
266     fgets (line, 128, thawer); pl->levsp [i] = atoi (line);
267     fgets (line, 128, thawer); pl->levgrace[i] = atoi (line);
268     }
269 root 1.15 }
270 root 1.38 break;
271    
272     default:
273     LOG (llevError, "%s: skipping unknown key in player header: %s\n", path, keyword_str [kw]);
274     break;
275 root 1.15 }
276 root 1.30 }
277 root 1.15
278 root 1.38 done:
279 root 1.15 /* this loads the standard objects values. */
280 root 1.30 load_object (thawer, pl->ob, 0);
281 root 1.15
282     pl->last_save_tick = pticks;
283    
284 root 1.30 INVOKE_PLAYER (LOAD, pl, ARG_STRING (path));
285 root 1.15
286 root 1.30 return pl;
287     }
288 root 1.15