ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/login.C
(Generate patch)

Comparing deliantra/server/server/login.C (file contents):
Revision 1.31 by root, Sat Dec 23 03:38:43 2006 UTC vs.
Revision 1.38 by root, Sun Dec 31 21:26:19 2006 UTC

28#include <define.h> 28#include <define.h>
29 29
30extern void sub_weight (object *, signed long); 30extern void sub_weight (object *, signed long);
31extern void add_weight (object *, signed long); 31extern void add_weight (object *, signed long);
32extern long pticks; 32extern long pticks;
33
34/* If flag is non zero, it means that we want to try and save everyone, but
35 * keep the game running. Thus, we don't want to free any information.
36 */
37void
38emergency_save (int flag)
39{
40 player *pl;
41
42 trying_emergency_save = 1;
43
44 LOG (llevError, "Emergency save: ");
45 for (pl = first_player; pl; pl = pl->next)
46 {
47 if (!pl->ob)
48 {
49 LOG (llevError, "No name, ignoring this.\n");
50 continue;
51 }
52
53 LOG (llevError, "%s ", &pl->ob->name);
54 new_draw_info (NDI_UNIQUE, 0, pl->ob, "Emergency save...");
55
56 /* If we are not exiting the game (ie, this is sort of a backup save), then
57 * don't change the location back to the village. Note that there are other
58 * options to have backup saves be done at the starting village
59 */
60 if (!flag)
61 {
62 strcpy (pl->maplevel, first_map_path);
63
64 pl->ob->map = 0;
65 pl->ob->x = -1;
66 pl->ob->y = -1;
67 }
68
69 pl->save (1);
70 }
71
72 LOG (llevError, "\n");
73}
74 33
75/* Delete character with name. if new is set, also delete the new 34/* Delete character with name. if new is set, also delete the new
76 * style directory, otherwise, just delete the old style playfile 35 * style directory, otherwise, just delete the old style playfile
77 * (needed for transition) 36 * (needed for transition)
78 */ 37 */
133 92
134 INVOKE_PLAYER (SAVE, ob->contr); 93 INVOKE_PLAYER (SAVE, ob->contr);
135 94
136 object_freezer freezer; 95 object_freezer freezer;
137 96
138 int wiz = ob->flags [FLAG_WIZ]; 97 int wiz = ob->flag [FLAG_WIZ];
139 98
140 /* Eneq(@csd.uu.se): If we have an open container hide it. */ 99 /* Eneq(@csd.uu.se): If we have an open container hide it. */
141 container = ob->container; 100 container = ob->container;
142 ob->container = 0; 101 ob->container = 0;
143 102
164 /* Match the enumerations but in string form */ 123 /* Match the enumerations but in string form */
165 fprintf (freezer, "unapply %s\n", unapply == unapply_nochoice ? "unapply_nochoice" : 124 fprintf (freezer, "unapply %s\n", unapply == unapply_nochoice ? "unapply_nochoice" :
166 (unapply == unapply_never ? "unapply_never" : "unapply_always")); 125 (unapply == unapply_never ? "unapply_never" : "unapply_always"));
167 126
168 if (ob->map) 127 if (ob->map)
169 fprintf (freezer, "map %s\n", ob->map->path); 128 fprintf (freezer, "map %s\n", &ob->map->path);
170 else
171 fprintf (freezer, "map %s\n", settings.emergency_mapname);
172 129
173 fprintf (freezer, "savebed_map %s\n", savebed_map); 130 fprintf (freezer, "savebed_map %s\n", &savebed_map);
174 fprintf (freezer, "bed_x %d\nbed_y %d\n", bed_x, bed_y); 131 fprintf (freezer, "bed_x %d\nbed_y %d\n", bed_x, bed_y);
175 fprintf (freezer, "weapon_sp %f\n", weapon_sp); 132 fprintf (freezer, "weapon_sp %f\n", weapon_sp);
176 fprintf (freezer, "Str %d\n", orig_stats.Str); 133 fprintf (freezer, "Str %d\n", orig_stats.Str);
177 fprintf (freezer, "Dex %d\n", orig_stats.Dex); 134 fprintf (freezer, "Dex %d\n", orig_stats.Dex);
178 fprintf (freezer, "Con %d\n", orig_stats.Con); 135 fprintf (freezer, "Con %d\n", orig_stats.Con);
194 151
195 fprintf (freezer, "endplst\n"); 152 fprintf (freezer, "endplst\n");
196 153
197 SET_FLAG (ob, FLAG_NO_FIX_PLAYER); 154 SET_FLAG (ob, FLAG_NO_FIX_PLAYER);
198 CLEAR_FLAG (ob, FLAG_WIZ); 155 CLEAR_FLAG (ob, FLAG_WIZ);
199 save_object (freezer, ob, 3); /* don't check and don't remove */ 156 save_object (freezer, ob, 1); /* don't check and don't remove */
200 157
201 char filename[MAX_BUF]; 158 char filename[MAX_BUF];
202 159
203 sprintf (filename, "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, &ob->name, &ob->name); 160 sprintf (filename, "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, &ob->name, &ob->name);
204 make_path_to_file (filename); 161 make_path_to_file (filename);
207 CLEAR_FLAG (ob, FLAG_NO_FIX_PLAYER); 164 CLEAR_FLAG (ob, FLAG_NO_FIX_PLAYER);
208 165
209 /* Eneq(@csd.uu.se): Reveal the container if we have one. */ 166 /* Eneq(@csd.uu.se): Reveal the container if we have one. */
210 ob->container = container; 167 ob->container = container;
211 168
212 ob->flags [FLAG_WIZ] = wiz; 169 ob->flag [FLAG_WIZ] = wiz;
213 170
214 enable_save = !final; 171 enable_save = !final;
215} 172}
216 173
217player * 174player *
230 187
231 char buf[MAX_BUF], bufall[MAX_BUF]; 188 char buf[MAX_BUF], bufall[MAX_BUF];
232 189
233 pl->set_object (object::create ()); 190 pl->set_object (object::create ());
234 pl->last_save_time = time (0); 191 pl->last_save_time = time (0);
235 pl->name_changed = 1;
236 192
237 assign (pl->savebed_map, first_map_path); 193 pl->savebed_map = first_map_path;
238 194
239 /* Loop through the file, loading the rest of the values */ 195 /* Loop through the file, loading the rest of the values */
240 while (fgets (bufall, MAX_BUF, thawer)) 196 for (;;)
241 { 197 {
242 int value; 198 keyword kw = thawer.get_kv ();
243 sscanf (bufall, "%s %d\n", buf, &value);
244 199
245 if (!strcmp (buf, "endplst")) 200 switch (kw)
246 break;
247 else if (!strcmp (buf, "oid"))
248 thawer.get (pl, value);
249 else if (!strcmp (buf, "password"))
250 sscanf (bufall, "password %[^\n]", pl->password);
251 else if (!strcmp (buf, "title"))
252 sscanf (bufall, "title %[^\n]", pl->own_title);
253 else if (!strcmp (buf, "explore"))
254 pl->explore = value;
255 else if (!strcmp (buf, "gen_hp"))
256 pl->gen_hp = value;
257 else if (!strcmp (buf, "shoottype"))
258 pl->shoottype = (rangetype) value;
259 else if (!strcmp (buf, "bowtype"))
260 pl->bowtype = (bowtype_t) value;
261 else if (!strcmp (buf, "petmode"))
262 pl->petmode = (petmode_t) value;
263 else if (!strcmp (buf, "gen_sp"))
264 pl->gen_sp = value;
265 else if (!strcmp (buf, "gen_grace"))
266 pl->gen_grace = value;
267 else if (!strcmp (buf, "listening"))
268 pl->listening = value;
269 else if (!strcmp (buf, "peaceful"))
270 pl->peaceful = value;
271 else if (!strcmp (buf, "digestion"))
272 pl->digestion = value;
273 else if (!strcmp (buf, "pickup"))
274 pl->mode = value;
275 else if (!strcmp (buf, "outputs_sync"))
276 pl->outputs_sync = value;
277 else if (!strcmp (buf, "outputs_count"))
278 pl->outputs_count = value;
279 else if (!strcmp (buf, "map"))
280 sscanf (bufall, "map %s", pl->maplevel);
281 else if (!strcmp (buf, "savebed_map"))
282 sscanf (bufall, "savebed_map %s", pl->savebed_map);
283 else if (!strcmp (buf, "bed_x"))
284 pl->bed_x = value;
285 else if (!strcmp (buf, "bed_y"))
286 pl->bed_y = value;
287 else if (!strcmp (buf, "weapon_sp"))
288 sscanf (buf, "weapon_sp %f", &pl->weapon_sp);
289 else if (!strcmp (buf, "Str"))
290 pl->orig_stats.Str = value;
291 else if (!strcmp (buf, "Dex"))
292 pl->orig_stats.Dex = value;
293 else if (!strcmp (buf, "Con"))
294 pl->orig_stats.Con = value;
295 else if (!strcmp (buf, "Int"))
296 pl->orig_stats.Int = value;
297 else if (!strcmp (buf, "Pow"))
298 pl->orig_stats.Pow = value;
299 else if (!strcmp (buf, "Wis"))
300 pl->orig_stats.Wis = value;
301 else if (!strcmp (buf, "Cha"))
302 pl->orig_stats.Cha = value;
303 else if (!strcmp (buf, "usekeys"))
304 { 201 {
305 if (!strcmp (bufall + 8, "key_inventory\n")) 202 case KW_ERROR:
203 case KW_EOF:
204 LOG (llevError, "%s: error while reading player header\n", path);
205 return 0;
206
207 case KW_endplst:
208 goto done;
209
210 case KW_oid: thawer.get (pl, thawer.get_sint32 ()); break;
211 case KW_password: assign (pl->password , thawer.get_str ()); break;
212 case KW_title: assign (pl->own_title, thawer.get_str ()); break;
213 case KW_shoottype: pl->shoottype = (rangetype) thawer.get_sint32 (); break;
214 case KW_bowtype: pl->bowtype = (bowtype_t) thawer.get_sint32 (); break;
215 case KW_petmode: pl->petmode = (petmode_t) thawer.get_sint32 (); break;
216 case KW_explore: thawer.get (pl->explore); break;
217 case KW_listening: thawer.get (pl->listening); break;
218 case KW_peaceful: thawer.get (pl->peaceful); break;
219 case KW_digestion: thawer.get (pl->digestion); break;
220 case KW_pickup: thawer.get (pl->mode); break;
221 case KW_outputs_sync: thawer.get (pl->outputs_sync); break;
222 case KW_outputs_count: thawer.get (pl->outputs_count); break;
223 case KW_map: thawer.get (pl->maplevel); break;
224 case KW_savebed_map: thawer.get (pl->savebed_map); break;
225 case KW_bed_x: thawer.get (pl->bed_x); break;
226 case KW_bed_y: thawer.get (pl->bed_y); break;
227 case KW_weapon_sp: thawer.get (pl->weapon_sp); break;
228 case KW_Str: thawer.get (pl->orig_stats.Str); break;
229 case KW_Dex: thawer.get (pl->orig_stats.Dex); break;
230 case KW_Con: thawer.get (pl->orig_stats.Con); break;
231 case KW_Int: thawer.get (pl->orig_stats.Int); break;
232 case KW_Pow: thawer.get (pl->orig_stats.Pow); break;
233 case KW_Wis: thawer.get (pl->orig_stats.Wis); break;
234 case KW_Cha: thawer.get (pl->orig_stats.Cha); break;
235 case KW_gen_hp: thawer.get (pl->gen_hp); break;
236 case KW_gen_sp: thawer.get (pl->gen_sp); break;
237 case KW_gen_grace: thawer.get (pl->gen_grace); break;
238
239 case KW_usekeys:
240 if (!strcmp (thawer.get_str (), "key_inventory"))
306 pl->usekeys = key_inventory; 241 pl->usekeys = key_inventory;
307 else if (!strcmp (bufall + 8, "keyrings\n")) 242 else if (!strcmp (thawer.get_str (), "keyrings"))
308 pl->usekeys = keyrings; 243 pl->usekeys = keyrings;
309 else if (!strcmp (bufall + 8, "containers\n")) 244 else if (!strcmp (thawer.get_str (), "containers"))
310 pl->usekeys = containers; 245 pl->usekeys = containers;
311 else 246 else
312 LOG (llevDebug, "load_player: got unknown usekeys type: %s\n", bufall + 8); 247 LOG (llevDebug, "load_player: got unknown usekeys type: %s\n", thawer.get_str ());
248 break;
249
250 case KW_unapply:
251 if (!strcmp (thawer.get_str (), "unapply_nochoice"))
252 pl->unapply = unapply_nochoice;
253 else if (!strcmp (thawer.get_str (), "unapply_never"))
254 pl->unapply = unapply_never;
255 else if (!strcmp (thawer.get_str (), "unapply_always"))
256 pl->unapply = unapply_always;
257 else
258 LOG (llevDebug, "load_player: got unknown unapply type: %s\n", thawer.get_str ());
259 break;
260
261 case KW_lev_array:
262 {
263 int count = thawer.get_sint32 ();
264
265 for (int i = 1; i <= count; i++)
266 {
267 char line[128];
268
269 fgets (line, 128, thawer); pl->levhp [i] = atoi (line);
270 fgets (line, 128, thawer); pl->levsp [i] = atoi (line);
271 fgets (line, 128, thawer); pl->levgrace[i] = atoi (line);
272 }
273 }
274 break;
275
276 default:
277 LOG (llevError, "%s: skipping unknown key in player header: %s\n", path, keyword_str [kw]);
278 break;
313 } 279 }
314 else if (!strcmp (buf, "unapply"))
315 {
316 if (!strcmp (bufall + 8, "unapply_nochoice\n"))
317 pl->unapply = unapply_nochoice;
318 else if (!strcmp (bufall + 8, "unapply_never\n"))
319 pl->unapply = unapply_never;
320 else if (!strcmp (bufall + 8, "unapply_always\n"))
321 pl->unapply = unapply_always;
322 else
323 LOG (llevDebug, "load_player: got unknown unapply type: %s\n", bufall + 8);
324 }
325 else if (!strcmp (buf, "lev_array"))
326 {
327 for (int i = 1; i <= value; i++)
328 {
329 char line[128];
330
331 fgets (line, 128, thawer);
332 pl->levhp[i] = atoi (line);
333 fgets (line, 128, thawer);
334 pl->levsp[i] = atoi (line);
335 fgets (line, 128, thawer);
336 pl->levgrace[i] = atoi (line);
337 }
338 /* spell_array code removed - don't know when that was last used.
339 * Even the load code below will someday be replaced by spells being
340 * objects.
341 */
342 }
343 else
344 LOG (llevDebug, "unparseable line in player file %s: %s\n", path, bufall);
345 } 280 }
346 281
282done:
347 /* this loads the standard objects values. */ 283 /* this loads the standard objects values. */
348 load_object (thawer, pl->ob, 0); 284 load_object (thawer, pl->ob, 0);
349 285
350 /* If the map where the person was last saved does not exist,
351 * restart them on their home-savebed. This is good for when
352 * maps change between versions
353 * First, we check for partial path, then check to see if the full
354 * path (for unique player maps)
355 */
356 if (!has_been_loaded (pl->maplevel)
357 && check_path (pl->maplevel, 1) == -1
358 && check_path (pl->maplevel, 0) == -1)
359 {
360 strcpy (pl->maplevel, pl->savebed_map);
361 pl->ob->x = pl->bed_x, pl->ob->y = pl->bed_y;
362 }
363
364 /* make sure he's a player -- needed because of class change. */
365 pl->name_changed = 1;
366 pl->last_save_tick = pticks; 286 pl->last_save_tick = pticks;
367 287
368 INVOKE_PLAYER (LOAD, pl, ARG_STRING (path)); 288 INVOKE_PLAYER (LOAD, pl, ARG_STRING (path));
369 289
370 return pl; 290 return pl;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines