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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines