Branch data Line data Source code
1 : : /* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
2 : : /* pdump.c */
3 : :
4 : : #include <ctype.h>
5 : : #include "glob.h"
6 : :
7 : : char *monk_rank_string(int rank);
8 : : char *legion_rank_string( int rank );
9 : : char *arena_rank_string( int rank );
10 : : char *college_rank_string( int rank );
11 : : char *nobility_rank_string( int rank );
12 : : char *circle_rank_string( int rank );
13 : : char *order_rank_string( int rank );
14 : : char *thieves_rank_string( int rank );
15 : : char *priesthood_rank_string( int rank, int patron );
16 : : char *elapsed_time_string( long minutes );
17 : : char *alignment_string( int alignment );
18 : : int alignment_level_index( int alignment );
19 : : short build_check( long *check, char *s );
20 : : short dump( FILE *dumpfile, char *s, short do_check );
21 : : short dump_basic( FILE *dumpfile );
22 : : short dump_options( FILE *dumpfile );
23 : : short dump_stati( FILE *dumpfile );
24 : : short dump_immunities( FILE *dumpfile );
25 : : short dump_in_columns( FILE *dumpfile, int col_width, char *s );
26 : : short end_dump_in_columns( FILE *dumpfile );
27 : : short dump_ranks( FILE *dumpfile );
28 : : char *fill_rank_field( char *buf );
29 : : void strcat_carry_item( char *buf, int slotnum );
30 : : short dump_carried( FILE *dumpfile );
31 : : short dump_pack( FILE *dumpfile );
32 : : short dump_condo( FILE *dumpfile );
33 : : short dump_possessions( FILE *dumpfile );
34 : : void player_dump( void );
35 : :
36 : : long dumpcheck;
37 : : char *why;
38 : : char dump_buf[ 100 ];
39 : : char spaces[] = " "
40 : : " ";
41 : :
42 : : short do_dump_stat_imm = TRUE;
43 : :
44 : : char *legion_ranks[ 6 ] =
45 : : {
46 : : "",
47 : : "Legionaire",
48 : : "Centurion of the Legion",
49 : : "Force Leader of the Legion",
50 : : "Colonel of the Legion",
51 : : "Commandant of the Legion"
52 : : };
53 : :
54 : : char *arena_ranks[ 6 ] =
55 : : {
56 : : "Ex-gladiator",
57 : : "Gladiator Trainee of the Arena",
58 : : "Bestiarius of the Arena",
59 : : "Retiarius of the Arena",
60 : : "Gladiator of the Arena",
61 : : "Gladiator Champion of the Arena"
62 : : };
63 : :
64 : : char *college_ranks[ 6 ] =
65 : : {
66 : : "",
67 : : "Collegium Magii: Novice",
68 : : "Collegium Magii: Student",
69 : : "Collegium Magii: Preceptor",
70 : : "Collegium Magii: Mage",
71 : : "Archmage of the Collegium Magii"
72 : : };
73 : :
74 : : char *nobility_ranks[ 6 ] =
75 : : {
76 : : "Lowly Commoner",
77 : : "Commoner",
78 : : "Squire of Rampart",
79 : : "Order of the Knights of Rampart",
80 : : "Peer of the Realm",
81 : : "Duke of Rampart"
82 : : };
83 : :
84 : : char *circle_ranks[ 6 ] =
85 : : {
86 : : "Former member of the Circle",
87 : : "Member of the Circle of Initiates",
88 : : "Member of the Circle of Enchanters",
89 : : "Member of the Circle of Sorcerors",
90 : : "High Sorceror of the Inner Circle",
91 : : "Prime Sorceror of the Inner Circle"
92 : : };
93 : :
94 : : char *order_ranks[ 6 ] =
95 : : {
96 : : "Washout from the Order of Paladins",
97 : : "Gallant of the Order",
98 : : "Guardian of the Order",
99 : : "Chevalier of the Order",
100 : : "Paladin of the Order",
101 : : "Justiciar of the Order of Paladins"
102 : : };
103 : :
104 : : char *thieves_ranks[ 6 ] =
105 : : {
106 : : "",
107 : : "Guild of Thieves: Candidate Member",
108 : : "Guild of Thieves: Apprentice Thief",
109 : : "Guild of Thieves: Thief",
110 : : "Guild of Thieves: Master Thief",
111 : : "Guild of Thieves: Shadowlord"
112 : : };
113 : :
114 : : char *priesthood_ranks[ 6 ] =
115 : : {
116 : : "",
117 : : "A lay devotee of ",
118 : : "An Acolyte of ",
119 : : "A Priest of ",
120 : : "A Senior Priest of ",
121 : : "The High Priest of "
122 : : };
123 : :
124 : : char *patron_names[ 7 ] =
125 : : {
126 : : "",
127 : : "Odin",
128 : : "Set",
129 : : "Athena",
130 : : "Hecate",
131 : : "Druidism",
132 : : "the Lords of Destiny"
133 : : };
134 : :
135 : : char *monk_ranks[8] =
136 : : {
137 : : "",
138 : : "Monk Trainee",
139 : : "Monk",
140 : : "Monk Master",
141 : : "Monk Master of Sighs",
142 : : "Monk Master of Pain",
143 : : "Monk Master of Tears",
144 : : "Monk Grandmaster"
145 : : };
146 : :
147 : 1 : void player_dump( void )
148 : : {
149 : : FILE *dumpfile;
150 : : char dump_name[ 32 ];
151 : :
152 : : /* build player dump file name as "charactername.txt" */
153 : 1 : strncpy( dump_name, Player.name, 27 );
154 : 1 : strcat( dump_name, ".txt" );
155 : :
156 : : /* try to open dump file for writing, not using checkfopen() */
157 : : /* (file.c) because there is no need to quit the program if */
158 : : /* fopen fails. */
159 : 1 : dumpfile = fopen( dump_name, "w" );
160 [ - + ]: 1 : if ( !dumpfile )
161 : : {
162 : 0 : why = "couldn't open file";
163 : 0 : goto dump_failed;
164 : : }
165 : :
166 : : /* dump name, stats, etc. */
167 [ - + ]: 1 : if ( !dump_basic( dumpfile ) )
168 : 0 : goto dump_failed;
169 : :
170 : : /* dump options */
171 [ - + ]: 1 : if ( !dump_options( dumpfile ) )
172 : 0 : goto dump_failed;
173 : :
174 [ + - ]: 1 : if ( do_dump_stat_imm )
175 : : {
176 : : /* dump stati */
177 [ - + ]: 1 : if ( !dump_stati( dumpfile ) )
178 : 0 : goto dump_failed;
179 : :
180 : : /* dump immunities */
181 [ - + ]: 1 : if ( !dump_immunities( dumpfile ) )
182 : 0 : goto dump_failed;
183 : : }
184 : :
185 : : /* dump ranks */
186 [ - + ]: 1 : if ( !dump_ranks( dumpfile ) )
187 : 0 : goto dump_failed;
188 : :
189 : : /* dump possessions */
190 [ - + ]: 1 : if ( !dump_possessions( dumpfile ) )
191 : 0 : goto dump_failed;
192 : :
193 : 1 : fclose( dumpfile );
194 : : /*_ftype = 'odat';*/
195 : :
196 : 1 : clearmsg();
197 : 1 : print1( "Character dump successful" );
198 : 1 : morewait();
199 : 1 : return;
200 : :
201 : : dump_failed:
202 : 0 : clearmsg();
203 : 0 : sprintf( Str3, "Character dump unsuccessful (%s)", why );
204 : 0 : print1( Str3 );
205 : 0 : morewait();
206 : 1 : return;
207 : : }
208 : :
209 : 15 : void strcat_carry_item( char *buf, int slot )
210 : : {
211 [ + + ]: 15 : if ( Player.possessions[ slot ] == NULL )
212 : 10 : strcat( buf, "(nothing)\n" );
213 : : else
214 : : {
215 : 5 : strcat( buf, itemid( Player.possessions[ slot ] ));
216 : 5 : strcat( buf, "\n" );
217 : : }
218 : 15 : }
219 : :
220 : 1 : short dump_carried( FILE *dumpfile )
221 : : {
222 : : /* reset "checksum" */
223 : 1 : dumpcheck = 0;
224 : :
225 [ - + ]: 1 : if ( !dump( dumpfile, "-- Possessions (Carried) --\n\n", FALSE ) )
226 : 0 : return FALSE;
227 : :
228 : 1 : strcpy( dump_buf, "a) Ready hand : " );
229 : 1 : strcat_carry_item( dump_buf, O_READY_HAND );
230 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
231 : 0 : return FALSE;
232 : :
233 : 1 : strcpy( dump_buf, "b) Weapon hand : " );
234 : 1 : strcat_carry_item( dump_buf, O_WEAPON_HAND );
235 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
236 : 0 : return FALSE;
237 : :
238 : 1 : strcpy( dump_buf, "c) Left shoulder : " );
239 : 1 : strcat_carry_item( dump_buf, O_LEFT_SHOULDER );
240 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
241 : 0 : return FALSE;
242 : :
243 : 1 : strcpy( dump_buf, "d) Right shoulder : " );
244 : 1 : strcat_carry_item( dump_buf, O_RIGHT_SHOULDER );
245 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
246 : 0 : return FALSE;
247 : :
248 : 1 : strcpy( dump_buf, "e) Belt : " );
249 : 1 : strcat_carry_item( dump_buf, O_BELT1 );
250 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
251 : 0 : return FALSE;
252 : :
253 : 1 : strcpy( dump_buf, "f) Belt : " );
254 : 1 : strcat_carry_item( dump_buf, O_BELT2 );
255 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
256 : 0 : return FALSE;
257 : :
258 : 1 : strcpy( dump_buf, "g) Belt : " );
259 : 1 : strcat_carry_item( dump_buf, O_BELT3 );
260 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
261 : 0 : return FALSE;
262 : :
263 : 1 : strcpy( dump_buf, "h) Shield : " );
264 : 1 : strcat_carry_item( dump_buf, O_SHIELD );
265 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
266 : 0 : return FALSE;
267 : :
268 : 1 : strcpy( dump_buf, "i) Armor : " );
269 : 1 : strcat_carry_item( dump_buf, O_ARMOR );
270 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
271 : 0 : return FALSE;
272 : :
273 : 1 : strcpy( dump_buf, "j) Boots : " );
274 : 1 : strcat_carry_item( dump_buf, O_BOOTS );
275 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
276 : 0 : return FALSE;
277 : :
278 : 1 : strcpy( dump_buf, "k) Cloak : " );
279 : 1 : strcat_carry_item( dump_buf, O_CLOAK );
280 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
281 : 0 : return FALSE;
282 : :
283 : 1 : strcpy( dump_buf, "l) Finger : " );
284 : 1 : strcat_carry_item( dump_buf, O_RING1 );
285 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
286 : 0 : return FALSE;
287 : :
288 : 1 : strcpy( dump_buf, "m) Finger : " );
289 : 1 : strcat_carry_item( dump_buf, O_RING2 );
290 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
291 : 0 : return FALSE;
292 : :
293 : 1 : strcpy( dump_buf, "n) Finger : " );
294 : 1 : strcat_carry_item( dump_buf, O_RING3 );
295 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
296 : 0 : return FALSE;
297 : :
298 : 1 : strcpy( dump_buf, "o) Finger : " );
299 : 1 : strcat_carry_item( dump_buf, O_RING4 );
300 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
301 : 0 : return FALSE;
302 : :
303 : 1 : sprintf( dump_buf, "\n[Verification: %8.8lx]\n\n", dumpcheck );
304 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
305 : 0 : return FALSE;
306 : :
307 : 1 : return TRUE;
308 : : }
309 : :
310 : 1 : short dump_pack( FILE *dumpfile )
311 : : {
312 : : int i;
313 : :
314 [ - + ]: 1 : if ( Player.packptr > 0 )
315 : : {
316 : : /* reset "checksum" */
317 : 0 : dumpcheck = 0;
318 : :
319 [ # # ]: 0 : if ( !dump( dumpfile, "-- Possessions (In Pack) --\n\n", FALSE ) )
320 : 0 : return FALSE;
321 : :
322 [ # # ]: 0 : for( i = 0; i < Player.packptr; i++ )
323 : : {
324 : 0 : sprintf( dump_buf, "%c) %s\n", i + 'A', itemid( Player.pack[ i ] ) );
325 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
326 : 0 : return FALSE;
327 : : }
328 : :
329 : 0 : sprintf( dump_buf, "\n[Verification: %8.8lx]\n\n", dumpcheck );
330 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, FALSE ) )
331 : 0 : return FALSE;
332 : : }
333 : :
334 : 1 : return TRUE;
335 : : }
336 : :
337 : 0 : short dump_condo( FILE *dumpfile )
338 : : {
339 : : pol ol;
340 : :
341 [ # # ]: 0 : if ( Condoitems )
342 : : {
343 : : /* reset "checksum" */
344 : 0 : dumpcheck = 0;
345 : :
346 [ # # ]: 0 : if ( !dump( dumpfile, "-- Possessions (In Condo) --\n\n", FALSE ) )
347 : 0 : return FALSE;
348 : :
349 [ # # ]: 0 : for( ol = Condoitems; ol; ol = ol->next )
350 : : {
351 : 0 : sprintf( dump_buf, "%s\n", itemid( ol->thing ) );
352 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
353 : 0 : return FALSE;
354 : : }
355 : :
356 : 0 : sprintf( dump_buf, "\n[Verification: %8.8lx]\n\n", dumpcheck );
357 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, FALSE ) )
358 : 0 : return FALSE;
359 : : }
360 : :
361 : 0 : return TRUE;
362 : : }
363 : :
364 : 1 : short dump_possessions( FILE *dumpfile )
365 : : {
366 [ - + ]: 1 : if ( !dump_carried( dumpfile ) )
367 : 0 : return FALSE;
368 : :
369 [ - + ]: 1 : if ( !dump_pack( dumpfile ) )
370 : 0 : return FALSE;
371 : :
372 [ - + ]: 1 : if ( gamestatusp( SOLD_CONDO ) )
373 : : {
374 [ # # ]: 0 : if ( !dump_condo( dumpfile ) )
375 : 0 : return FALSE;
376 : : }
377 : :
378 : 1 : return TRUE;
379 : : }
380 : :
381 : : #define RANK_FIELD_WIDTH 41
382 : 2 : char *fill_rank_field( char *buf )
383 : : {
384 : : int slen;
385 : : char *cp;
386 : :
387 : 2 : slen = strlen( buf );
388 : 2 : cp = buf + slen;
389 [ + + ]: 60 : while( slen < RANK_FIELD_WIDTH )
390 : : {
391 : 58 : *cp++ = ' ';
392 : 58 : slen++;
393 : : }
394 : :
395 : 2 : return cp;
396 : : }
397 : :
398 : 1 : short dump_ranks( FILE *dumpfile )
399 : : {
400 : : char *cp;
401 : :
402 : : /* reset "checksum" */
403 : 1 : dumpcheck = 0;
404 : :
405 [ - + ]: 1 : if ( !dump( dumpfile, "-- Current Ranks --\n\n", FALSE ) )
406 : 0 : return FALSE;
407 : :
408 [ + - ]: 1 : if ( Player.rank[ LEGION ] > 0 )
409 : : {
410 : 1 : strcpy( dump_buf, legion_rank_string( Player.rank[ LEGION ] ) );
411 : 1 : cp = fill_rank_field( dump_buf );
412 : 1 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ LEGION ] );
413 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
414 : 0 : return FALSE;
415 : : }
416 : :
417 [ - + ]: 1 : if ( Player.rank[ ARENA ] != 0 )
418 : : {
419 : 0 : strcpy( dump_buf, arena_rank_string( Player.rank[ ARENA ] ) );
420 [ # # ]: 0 : if ( Player.rank[ ARENA ] > 0 )
421 : : {
422 : 0 : cp = fill_rank_field( dump_buf );
423 : 0 : sprintf( cp, "%d opponents defeated\n", Arena_Opponent - 3 );
424 : : }
425 : : else
426 : : {
427 : 0 : strcat( dump_buf, "\n" );
428 : : }
429 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
430 : 0 : return FALSE;
431 : : }
432 : :
433 [ - + ]: 1 : if ( Player.rank[ COLLEGE ] > 0 )
434 : : {
435 : 0 : strcpy( dump_buf, college_rank_string( Player.rank[ COLLEGE ] ) );
436 : 0 : cp = fill_rank_field( dump_buf );
437 : 0 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ COLLEGE ] );
438 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
439 : 0 : return FALSE;
440 : : }
441 : :
442 : 1 : strcpy( dump_buf, nobility_rank_string( Player.rank[ NOBILITY ] ) );
443 : 1 : cp = fill_rank_field( dump_buf );
444 [ + - ]: 1 : if ( Player.rank[ NOBILITY ] == 0 )
445 : : {
446 : 1 : *cp++ = '\n';
447 : 1 : *cp = '\0';
448 : : }
449 [ # # ]: 0 : else if ( Player.rank[ NOBILITY ] == 1 )
450 : : {
451 : 0 : sprintf( cp, "1st quest undertaken\n" );
452 : : }
453 [ # # ]: 0 : else if ( Player.rank[ NOBILITY ] > 1 )
454 : : {
455 : 0 : sprintf( cp, "%d%s quest completed\n", Player.rank[ NOBILITY ] - 1,
456 : 0 : ordinal( Player.rank[ NOBILITY ] - 1 ) );
457 : : }
458 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
459 : 0 : return FALSE;
460 : :
461 [ - + ]: 1 : if ( Player.rank[ CIRCLE ] != 0 )
462 : : {
463 : 0 : strcpy( dump_buf, circle_rank_string( Player.rank[ CIRCLE ] ) );
464 [ # # ]: 0 : if ( Player.rank[ CIRCLE ] > 0 )
465 : : {
466 : 0 : cp = fill_rank_field( dump_buf );
467 : 0 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ CIRCLE ] );
468 : : }
469 : : else
470 : : {
471 : 0 : strcat( dump_buf, "\n" );
472 : : }
473 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
474 : 0 : return FALSE;
475 : : }
476 : :
477 [ - + ]: 1 : if ( Player.rank[ ORDER ] != 0 )
478 : : {
479 : 0 : strcpy( dump_buf, order_rank_string( Player.rank[ ORDER ] ) );
480 [ # # ]: 0 : if ( Player.rank[ ORDER ] > 0 )
481 : : {
482 : 0 : cp = fill_rank_field( dump_buf );
483 : 0 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ ORDER ] );
484 : : }
485 : : else
486 : : {
487 : 0 : strcat( dump_buf, "\n" );
488 : : }
489 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
490 : 0 : return FALSE;
491 : : }
492 : :
493 [ - + ]: 1 : if ( Player.rank[ THIEVES ] > 0 )
494 : : {
495 : 0 : strcpy( dump_buf, thieves_rank_string( Player.rank[ THIEVES ] ) );
496 : 0 : cp = fill_rank_field( dump_buf );
497 : 0 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ THIEVES ] );
498 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
499 : 0 : return FALSE;
500 : : }
501 : :
502 [ - + ]: 1 : if ( Player.rank[ PRIESTHOOD ] > 0 )
503 : : {
504 : 0 : strcpy( dump_buf, priesthood_rank_string( Player.rank[ PRIESTHOOD ], Player.patron ) );
505 : 0 : cp = fill_rank_field( dump_buf );
506 : 0 : sprintf( cp, "Exp: %ld\n", Player.guildxp[ PRIESTHOOD ] );
507 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
508 : 0 : return FALSE;
509 : : }
510 : :
511 [ - + ]: 1 : if ( Player.rank[ MONKS ] > 0 )
512 : : {
513 : 0 : strcpy(dump_buf, monk_rank_string(Player.rank[MONKS]));
514 : 0 : cp = fill_rank_field(dump_buf);
515 : 0 : sprintf(cp, "Exp: %ld\n", Player.guildxp[MONKS]);
516 [ # # ]: 0 : if (!dump(dumpfile, dump_buf, TRUE)) return FALSE;
517 : : }
518 : :
519 [ - + ]: 1 : if ( Player.rank[ ADEPT ] > 0 )
520 : : {
521 [ # # ]: 0 : if ( !dump( dumpfile, "********** An Adept of Omega **********\n", TRUE ) )
522 : 0 : return FALSE;
523 : : }
524 : :
525 : 1 : sprintf( dump_buf, "\n[Verification: %8.8lx]\n\n", dumpcheck );
526 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
527 : 0 : return FALSE;
528 : :
529 : 1 : return TRUE;
530 : : }
531 : :
532 : : int dump_col;
533 : :
534 : 0 : short dump_in_columns( FILE *dumpfile, int col_width, char *s )
535 : : {
536 : : int i, slen;
537 : :
538 : 0 : slen = strlen( s );
539 [ # # ]: 0 : if (( dump_col + slen ) > ( 80 - col_width ))
540 : : {
541 : 0 : strcat( dump_buf, s );
542 : 0 : strcat( dump_buf, "\n" );
543 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
544 : 0 : return FALSE;
545 : :
546 : 0 : dump_col = 0;
547 : : }
548 [ # # ]: 0 : else if ( dump_col == 0 )
549 : : {
550 : 0 : strcpy( dump_buf, s );
551 [ # # ]: 0 : for( dump_col = slen; dump_col < col_width; dump_col++ )
552 : 0 : dump_buf[ dump_col ] = ' ';
553 : 0 : dump_buf[ dump_col ] = '\0';
554 : : }
555 : : else
556 : : {
557 : 0 : strcat( dump_buf, s );
558 [ # # ]: 0 : for( i = dump_col + slen; i < dump_col + col_width; i++ )
559 : 0 : dump_buf[ i ] = ' ';
560 : 0 : dump_col = i;
561 : 0 : dump_buf[ dump_col ] = '\0';
562 : : }
563 : :
564 : 0 : return TRUE;
565 : : }
566 : :
567 : 0 : short end_dump_in_columns( FILE *dumpfile )
568 : : {
569 [ # # ]: 0 : if ( dump_col > 0 )
570 : : {
571 : 0 : strcat( dump_buf, "\n" );
572 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, TRUE ) )
573 : 0 : return FALSE;
574 : : }
575 : :
576 [ # # ]: 0 : if ( !dump( dumpfile, "\n", FALSE ) )
577 : 0 : return FALSE;
578 : :
579 : 0 : return TRUE;
580 : : }
581 : :
582 : 1 : short dump_stati( FILE *dumpfile )
583 : : {
584 : 1 : int numstati = 0;
585 : :
586 : : /* reset "checksum" */
587 : 1 : dumpcheck = 0;
588 : 1 : dump_col = 0;
589 : :
590 [ - + ]: 1 : if ( !dump( dumpfile, "-- Current Stati --\n\n", FALSE ) )
591 : 0 : return FALSE;
592 : :
593 [ - + ]: 1 : if ( Player.status[ BLINDED ] )
594 : : {
595 : 0 : numstati++;
596 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Blinded" ) )
597 : 0 : return FALSE;
598 : : }
599 : :
600 [ - + ]: 1 : if ( Player.status[ SLOWED ] )
601 : : {
602 : 0 : numstati++;
603 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Slowed" ) )
604 : 0 : return FALSE;
605 : : }
606 : :
607 [ - + ]: 1 : if ( Player.status[ HASTED ] )
608 : : {
609 : 0 : numstati++;
610 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Hasted" ) )
611 : 0 : return FALSE;
612 : : }
613 : :
614 [ - + ]: 1 : if ( Player.status[ DISPLACED ] )
615 : : {
616 : 0 : numstati++;
617 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Displaced" ) )
618 : 0 : return FALSE;
619 : : }
620 : :
621 [ - + ]: 1 : if ( Player.status[ SLEPT ] )
622 : : {
623 : 0 : numstati++;
624 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Slept" ) )
625 : 0 : return FALSE;
626 : : }
627 : :
628 [ - + ]: 1 : if ( Player.status[ DISEASED ] )
629 : : {
630 : 0 : numstati++;
631 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Diseased" ) )
632 : 0 : return FALSE;
633 : : }
634 : :
635 [ - + ]: 1 : if ( Player.status[ POISONED ] )
636 : : {
637 : 0 : numstati++;
638 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Poisoned" ) )
639 : 0 : return FALSE;
640 : : }
641 : :
642 [ - + ]: 1 : if ( Player.status[ BREATHING ] )
643 : : {
644 : 0 : numstati++;
645 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Breathing" ) )
646 : 0 : return FALSE;
647 : : }
648 : :
649 [ - + ]: 1 : if ( Player.status[ INVISIBLE ] )
650 : : {
651 : 0 : numstati++;
652 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Invisible" ) )
653 : 0 : return FALSE;
654 : : }
655 : :
656 [ - + ]: 1 : if ( Player.status[ REGENERATING ] )
657 : : {
658 : 0 : numstati++;
659 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Regenerating" ) )
660 : 0 : return FALSE;
661 : : }
662 : :
663 [ - + ]: 1 : if ( Player.status[ VULNERABLE ] )
664 : : {
665 : 0 : numstati++;
666 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Vulnerable" ) )
667 : 0 : return FALSE;
668 : : }
669 : :
670 [ - + ]: 1 : if ( Player.status[ BERSERK ] )
671 : : {
672 : 0 : numstati++;
673 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Berserk" ) )
674 : 0 : return FALSE;
675 : : }
676 : :
677 [ - + ]: 1 : if ( Player.status[ IMMOBILE ] )
678 : : {
679 : 0 : numstati++;
680 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Immobile" ) )
681 : 0 : return FALSE;
682 : : }
683 : :
684 [ - + ]: 1 : if ( Player.status[ ALERT ] )
685 : : {
686 : 0 : numstati++;
687 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Alert" ) )
688 : 0 : return FALSE;
689 : : }
690 : :
691 [ - + ]: 1 : if ( Player.status[ AFRAID ] )
692 : : {
693 : 0 : numstati++;
694 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Afraid" ) )
695 : 0 : return FALSE;
696 : : }
697 : :
698 [ - + ]: 1 : if ( Player.status[ ACCURATE ] )
699 : : {
700 : 0 : numstati++;
701 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Accurate" ) )
702 : 0 : return FALSE;
703 : : }
704 : :
705 [ - + ]: 1 : if ( Player.status[ HERO ] )
706 : : {
707 : 0 : numstati++;
708 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Heroic" ) )
709 : 0 : return FALSE;
710 : : }
711 : :
712 [ - + ]: 1 : if ( Player.status[ LEVITATING ] )
713 : : {
714 : 0 : numstati++;
715 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 20, "Levitating" ) )
716 : 0 : return FALSE;
717 : : }
718 : :
719 [ - + ]: 1 : if ( numstati )
720 : : {
721 : : /* dump last row of stati */
722 [ # # ]: 0 : if ( !end_dump_in_columns( dumpfile ) )
723 : 0 : return FALSE;
724 : :
725 : 0 : sprintf( dump_buf, "[Verification: %8.8lx]\n\n", dumpcheck );
726 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, FALSE ) )
727 : 0 : return FALSE;
728 : : }
729 : : else
730 : : {
731 : 1 : sprintf( dump_buf, "(None)\n\n" );
732 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
733 : 0 : return FALSE;
734 : : }
735 : :
736 : 1 : return TRUE;
737 : : }
738 : :
739 : 1 : short dump_immunities( FILE *dumpfile )
740 : : {
741 : 1 : int numimmunities = 0;
742 : :
743 : : /* reset "checksum" */
744 : 1 : dumpcheck = 0;
745 : 1 : dump_col = 0;
746 : :
747 [ - + ]: 1 : if ( !dump( dumpfile, "-- Current Immunities --\n\n", FALSE ) )
748 : 0 : return FALSE;
749 : :
750 [ - + ]: 1 : if ( p_immune( NORMAL_DAMAGE ) )
751 : : {
752 : 0 : numimmunities++;
753 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Normal Damage" ) )
754 : 0 : return FALSE;
755 : : }
756 : :
757 [ - + ]: 1 : if ( p_immune( FLAME ) )
758 : : {
759 : 0 : numimmunities++;
760 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Flame" ) )
761 : 0 : return FALSE;
762 : : }
763 : :
764 [ - + ]: 1 : if ( p_immune( ELECTRICITY ) )
765 : : {
766 : 0 : numimmunities++;
767 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Electricity" ) )
768 : 0 : return FALSE;
769 : : }
770 : :
771 [ - + ]: 1 : if ( p_immune( COLD ) )
772 : : {
773 : 0 : numimmunities++;
774 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Cold" ) )
775 : 0 : return FALSE;
776 : : }
777 : :
778 [ - + ]: 1 : if ( p_immune( POISON ) )
779 : : {
780 : 0 : numimmunities++;
781 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Poison" ) )
782 : 0 : return FALSE;
783 : : }
784 : :
785 [ - + ]: 1 : if ( p_immune( ACID ) )
786 : : {
787 : 0 : numimmunities++;
788 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Acid" ) )
789 : 0 : return FALSE;
790 : : }
791 : :
792 [ - + ]: 1 : if ( p_immune( FEAR ) )
793 : : {
794 : 0 : numimmunities++;
795 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Fear" ) )
796 : 0 : return FALSE;
797 : : }
798 : :
799 [ - + ]: 1 : if ( p_immune( SLEEP ) )
800 : : {
801 : 0 : numimmunities++;
802 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Sleep" ) )
803 : 0 : return FALSE;
804 : : }
805 : :
806 [ - + ]: 1 : if ( p_immune( NEGENERGY ) )
807 : : {
808 : 0 : numimmunities++;
809 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Negative Energies" ) )
810 : 0 : return FALSE;
811 : : }
812 : :
813 [ - + ]: 1 : if ( p_immune( THEFT ) )
814 : : {
815 : 0 : numimmunities++;
816 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Theft" ) )
817 : 0 : return FALSE;
818 : : }
819 : :
820 [ - + ]: 1 : if ( p_immune( GAZE ) )
821 : : {
822 : 0 : numimmunities++;
823 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Gaze" ) )
824 : 0 : return FALSE;
825 : : }
826 : :
827 [ - + ]: 1 : if ( p_immune( INFECTION ) )
828 : : {
829 : 0 : numimmunities++;
830 [ # # ]: 0 : if ( !dump_in_columns( dumpfile, 26, "Infection" ) )
831 : 0 : return FALSE;
832 : : }
833 : :
834 [ - + ]: 1 : if ( numimmunities )
835 : : {
836 : : /* dump last row of immunities */
837 [ # # ]: 0 : if ( !end_dump_in_columns( dumpfile ) )
838 : 0 : return FALSE;
839 : :
840 : 0 : sprintf( dump_buf, "[Verification: %8.8lx]\n\n", dumpcheck );
841 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, FALSE ) )
842 : 0 : return FALSE;
843 : : }
844 : : else
845 : : {
846 : 1 : sprintf( dump_buf, "(None)\n\n" );
847 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
848 : 0 : return FALSE;
849 : : }
850 : :
851 : 1 : return TRUE;
852 : : }
853 : :
854 : : short cheated_death;
855 : : short cheated_savegame;
856 : :
857 : 1 : short dump_options( FILE *dumpfile )
858 : : {
859 [ + - ][ - + ]: 1 : if ( cheated_death || cheated_savegame )
860 : : {
861 : : /* reset "checksum" */
862 : 0 : dumpcheck = 0;
863 : :
864 [ # # ]: 0 : if ( !dump( dumpfile, "\n-- Cheats --\n\n", FALSE ) )
865 : 0 : return FALSE;
866 : :
867 [ # # ]: 0 : if ( gamestatusp( CHEATED ) )
868 : : {
869 [ # # ]: 0 : if ( !dump( dumpfile, "Entered Wizard Mode\n", TRUE ) )
870 : 0 : return FALSE;
871 : : }
872 : :
873 [ # # ]: 0 : if ( cheated_death )
874 : : {
875 [ # # ]: 0 : if ( !dump( dumpfile, "Refused to die\n", TRUE ) )
876 : 0 : return FALSE;
877 : : }
878 : :
879 [ # # ]: 0 : if ( cheated_savegame )
880 : : {
881 [ # # ]: 0 : if ( !dump( dumpfile, "Restored from save file after death\n", TRUE ) )
882 : 0 : return FALSE;
883 : : }
884 : :
885 : 0 : sprintf( dump_buf, "[Verification: %8.8lx]\n\n", dumpcheck );
886 [ # # ]: 0 : if ( !dump( dumpfile, dump_buf, FALSE ) )
887 : 0 : return FALSE;
888 : : }
889 : :
890 : 1 : return TRUE;
891 : : }
892 : :
893 : 1 : short dump_basic( FILE *dumpfile )
894 : : {
895 : : int curcol;
896 : : long total_balance;
897 : : char *cp;
898 : : bank_account *account;
899 : :
900 : : /* reset "checksum" */
901 : 1 : dumpcheck = 0;
902 : :
903 : 1 : strcpy( dump_buf, "[*] " );
904 : 1 : strcat( dump_buf, VERSIONSTRING );
905 : 1 : strcat( dump_buf, " character dump [*]\n\n" );
906 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
907 : 0 : return FALSE;
908 : :
909 : 1 : curcol = sprintf( dump_buf, "Name : %s\n", Player.name );
910 [ - + ]: 1 : if ( gamestatusp( CHEATED ) )
911 : : {
912 [ # # ]: 0 : if ( 72 > strlen( dump_buf ) )
913 : 0 : cp = strrchr( dump_buf, '\n' );
914 : : else
915 : 0 : cp = &(dump_buf[ 70 ]);
916 : 0 : strcpy( cp, " (WIZARD)\n" );
917 : : }
918 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
919 : 0 : return FALSE;
920 : :
921 : 1 : sprintf( dump_buf, "Level : %s [%d]\n", levelname( Player.level ), Player.level );
922 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
923 : 0 : return FALSE;
924 : :
925 : 1 : sprintf( dump_buf, "Alignment : %s\n\n", alignment_string( Player.alignment ) );
926 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
927 : 0 : return FALSE;
928 : :
929 : : /*
930 : : sprintf( dump_buf, "Str : %5d [%d]%n%*sHP : %5d [%d]%n%*sHit : %d\n",
931 : : Player.str, Player.maxstr, &curcol, 26 - curcol, spaces,
932 : : Player.hp, Player.maxhp, &curcol, 57 - curcol, spaces,
933 : : Player.hit );
934 : : if ( !dump( dumpfile, dump_buf, TRUE ) )
935 : : return FALSE;
936 : : */
937 : :
938 : 1 : curcol = sprintf( dump_buf, "Str : %5d [%d]", Player.str, Player.maxstr );
939 : 1 : cp = strrchr( dump_buf, '\0' );
940 [ + + ]: 11 : for ( ; curcol < 26; curcol++ )
941 : 10 : *cp++ = ' ';
942 : 1 : curcol += sprintf( cp, "HP : %5d [%d]", Player.hp, Player.maxhp );
943 : 1 : cp = strrchr( dump_buf, '\0' );
944 [ + + ]: 11 : for ( ; curcol < 57; curcol++ )
945 : 10 : *cp++ = ' ';
946 : 1 : sprintf( cp, "Hit : %d\n", Player.hit );
947 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
948 : 0 : return FALSE;
949 : :
950 : 1 : curcol = sprintf( dump_buf, "Con : %5d [%d]", Player.con, Player.maxcon );
951 : 1 : cp = strrchr( dump_buf, '\0' );
952 [ + + ]: 11 : for ( ; curcol < 26; curcol++ )
953 : 10 : *cp++ = ' ';
954 : 1 : curcol += sprintf( cp, "Mana : %5ld [%ld]", Player.mana, Player.maxmana );
955 : 1 : cp = strrchr( dump_buf, '\0' );
956 [ + + ]: 11 : for ( ; curcol < 57; curcol++ )
957 : 10 : *cp++ = ' ';
958 : 1 : sprintf( cp, "Damage : %d\n", Player.dmg );
959 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
960 : 0 : return FALSE;
961 : :
962 : 1 : curcol = sprintf( dump_buf, "Dex : %5d [%d]", Player.dex, Player.maxdex );
963 : 1 : cp = strrchr( dump_buf, '\0' );
964 [ + + ]: 42 : for ( ; curcol < 57; curcol++ )
965 : 41 : *cp++ = ' ';
966 : 1 : sprintf( cp, "Defense : %d\n", Player.defense );
967 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
968 : 0 : return FALSE;
969 : :
970 : 1 : curcol = sprintf( dump_buf, "Agi : %5d [%d]", Player.agi, Player.maxagi );
971 : 1 : cp = strrchr( dump_buf, '\0' );
972 [ + + ]: 11 : for ( ; curcol < 26; curcol++ )
973 : 10 : *cp++ = ' ';
974 : 1 : sprintf( cp, "Exp : %-10ld Armor : %d\n", Player.xp, Player.absorption );
975 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
976 : 0 : return FALSE;
977 : :
978 : 1 : curcol = sprintf( dump_buf, "Int : %5d [%d]", Player.iq, Player.maxiq );
979 : 1 : cp = strrchr( dump_buf, '\0' );
980 [ + + ]: 11 : for ( ; curcol < 26; curcol++ )
981 : 10 : *cp++ = ' ';
982 : 2 : sprintf( cp, "Carry : %-10d Speed : %d.%d\n",
983 : 2 : Player.itemweight, 5 / Player.speed, 500 / Player.speed % 100 );
984 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
985 : 0 : return FALSE;
986 : :
987 : 1 : curcol = sprintf( dump_buf, "Pow : %5d [%d]", Player.pow, Player.maxpow );
988 : 1 : cp = strrchr( dump_buf, '\0' );
989 [ + + ]: 12 : for ( ; curcol < 26; curcol++ )
990 : 11 : *cp++ = ' ';
991 : 1 : sprintf( cp, "Capacity : %d\n\n", Player.maxweight );
992 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
993 : 0 : return FALSE;
994 : :
995 : 1 : total_balance = 0;
996 [ + + ]: 9 : for( account = bank; account; account = account->next_account )
997 : : {
998 [ + + ]: 8 : if ( account->player )
999 : 1 : total_balance += account->balance;
1000 : : }
1001 : :
1002 : 1 : sprintf( dump_buf, "Cash (carried/bank) : %ld / %ld\n", Player.cash, total_balance );
1003 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
1004 : 0 : return FALSE;
1005 : :
1006 : 1 : sprintf( dump_buf, "Current Point Total : %ld\n", calc_points() );
1007 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
1008 : 0 : return FALSE;
1009 : :
1010 : 1 : sprintf( dump_buf, "Elapsed Game Time : %s\n\n", elapsed_time_string( Time ) );
1011 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, TRUE ) )
1012 : 0 : return FALSE;
1013 : :
1014 : 1 : sprintf( dump_buf, "[Verification: %8.8lx]\n\n", dumpcheck );
1015 [ - + ]: 1 : if ( !dump( dumpfile, dump_buf, FALSE ) )
1016 : 0 : return FALSE;
1017 : :
1018 : 1 : return TRUE;
1019 : : }
1020 : :
1021 : 39 : short dump( FILE *dumpfile, char *s, short do_check )
1022 : : {
1023 [ + + ]: 39 : if ( do_check )
1024 : : {
1025 [ - + ]: 29 : if( !build_check( &dumpcheck, s ) )
1026 : 0 : return FALSE;
1027 : : }
1028 : :
1029 [ - + ]: 39 : if ( EOF == fputs( s, dumpfile ) )
1030 : : {
1031 : 0 : fclose( dumpfile );
1032 : 0 : why = "failed write";
1033 : 0 : return FALSE;
1034 : : }
1035 : :
1036 : 39 : return TRUE;
1037 : : }
1038 : :
1039 : 29 : short build_check( long *check, char *s )
1040 : : {
1041 : 29 : int count = 0;
1042 : 29 : char *cp = s;
1043 : :
1044 : : /* build checksum of all printing characters in s, while rotating */
1045 : : /* the partial checksum left one bit for each character added */
1046 [ + + ]: 1187 : while ( *cp )
1047 : : {
1048 [ + + ]: 1158 : if ( isgraph( *cp ) )
1049 : : {
1050 [ + + ]: 622 : if ( *check < 0 )
1051 : : {
1052 : 231 : (*check) <<= 1;
1053 : 231 : (*check)++;
1054 : : }
1055 : : else
1056 : : {
1057 : 391 : (*check) <<= 1;
1058 : : }
1059 : 622 : (*check) += ( (long)(*cp) & 0xff );
1060 : : }
1061 : :
1062 : 1158 : cp++;
1063 [ - + ]: 1158 : if ( ++count > 80 )
1064 : : {
1065 : 0 : why = "checksum unterminated string";
1066 : 0 : return FALSE;
1067 : : }
1068 : : }
1069 : :
1070 : 29 : return TRUE;
1071 : : }
1072 : :
1073 : 1 : int alignment_level_index( int alignment )
1074 : : {
1075 : 1 : alignment = abs( alignment );
1076 : :
1077 [ - + ]: 1 : if ( !alignment )
1078 : 0 : return 0;
1079 [ - + ]: 1 : else if ( alignment < 10 )
1080 : 0 : return 1;
1081 [ + - ]: 1 : else if ( alignment < 50 )
1082 : 1 : return 2;
1083 [ # # ]: 0 : else if ( alignment < 100 )
1084 : 0 : return 3;
1085 [ # # ]: 0 : else if ( alignment < 200 )
1086 : 0 : return 4;
1087 [ # # ]: 0 : else if ( alignment < 400 )
1088 : 0 : return 5;
1089 [ # # ]: 0 : else if ( alignment < 800 )
1090 : 0 : return 6;
1091 : : else
1092 : 0 : return 7;
1093 : : }
1094 : :
1095 : : char *alignment_level[ 8 ] =
1096 : : {
1097 : : "Neutral, embodying the Cosmic Balance",
1098 : : "Neutral, tending toward ",
1099 : : "Neutral-",
1100 : : "",
1101 : : "Servant of ",
1102 : : "Master of ",
1103 : : "The Essence of ",
1104 : : "The Ultimate Avatar of "
1105 : : };
1106 : :
1107 : 1 : char *alignment_string( int alignment )
1108 : : {
1109 : 1 : strcpy( Str3, alignment_level[ alignment_level_index( alignment ) ] );
1110 : :
1111 [ - + ]: 1 : if ( alignment < 0 )
1112 : 0 : strcat( Str3, "Chaos" );
1113 [ + - ]: 1 : else if ( alignment > 0 )
1114 : 1 : strcat( Str3, "Law" );
1115 : :
1116 : 1 : return Str3;
1117 : : }
1118 : :
1119 : 1 : char *elapsed_time_string( long minutes )
1120 : : {
1121 : : long hours, days, months, years;
1122 : :
1123 : 1 : hours = minutes / 60;
1124 : 1 : days = hours / 24;
1125 : 1 : months = days / 30;
1126 : 1 : years = months / 12;
1127 : :
1128 : 1 : minutes %= 60;
1129 : 1 : hours %= 24;
1130 : 1 : days %= 30;
1131 : 1 : months %= 12;
1132 : :
1133 : 1 : Str3[ 0 ] = '\0';
1134 : :
1135 [ - + ]: 1 : if ( years )
1136 : : {
1137 : 0 : sprintf( Str2, "%ld years, ", years );
1138 : 0 : strcat( Str3, Str2 );
1139 : : }
1140 : :
1141 [ + - ][ - + ]: 1 : if ( years || months )
1142 : : {
1143 : 0 : sprintf( Str2, "%ld months, ", months );
1144 : 0 : strcat( Str3, Str2 );
1145 : : }
1146 : :
1147 [ + - ][ + - ]: 1 : if ( years || months || days )
[ + - ]
1148 : : {
1149 : 1 : sprintf( Str2, "%ld days, ", days );
1150 : 1 : strcat( Str3, Str2 );
1151 : : }
1152 : :
1153 [ + - ][ + - ]: 1 : if ( years || months || days || hours )
[ - + ][ # # ]
1154 : : {
1155 : 1 : sprintf( Str2, "%ld hours, ", hours );
1156 : 1 : strcat( Str3, Str2 );
1157 : : }
1158 : :
1159 [ + - ][ + - ]: 1 : if ( years || months || days || hours || minutes )
[ - + ][ # # ]
[ # # ]
1160 : : {
1161 : 1 : sprintf( Str2, "%ld minutes", minutes );
1162 : 1 : strcat( Str3, Str2 );
1163 : : }
1164 : :
1165 : 1 : return Str3;
1166 : : }
1167 : :
1168 : 1 : char *legion_rank_string( int rank )
1169 : : {
1170 : 1 : return legion_ranks[ rank ];
1171 : : }
1172 : :
1173 : 0 : char *arena_rank_string( int rank )
1174 : : {
1175 [ # # ]: 0 : if ( rank < 0 )
1176 : 0 : return arena_ranks[ 0 ];
1177 : : else
1178 : 0 : return arena_ranks[ rank ];
1179 : : }
1180 : :
1181 : 0 : char *college_rank_string( int rank )
1182 : : {
1183 : 0 : return college_ranks[ rank ];
1184 : : }
1185 : :
1186 : 1 : char *nobility_rank_string( int rank )
1187 : : {
1188 : 1 : return nobility_ranks[ rank ];
1189 : : }
1190 : :
1191 : 0 : char *circle_rank_string( int rank )
1192 : : {
1193 [ # # ]: 0 : if ( rank < 0 )
1194 : 0 : return circle_ranks[ 0 ];
1195 : : else
1196 : 0 : return circle_ranks[ rank ];
1197 : : }
1198 : :
1199 : 0 : char *order_rank_string( int rank )
1200 : : {
1201 [ # # ]: 0 : if ( rank < 0 )
1202 : 0 : return order_ranks[ 0 ];
1203 : : else
1204 : 0 : return order_ranks[ rank ];
1205 : : }
1206 : :
1207 : 0 : char *thieves_rank_string( int rank )
1208 : : {
1209 : 0 : return thieves_ranks[ rank ];
1210 : : }
1211 : :
1212 : 0 : char *priesthood_rank_string( int rank, int patron )
1213 : : {
1214 : 0 : strcpy( Str3, priesthood_ranks[ rank ] );
1215 : 0 : strcat( Str3, patron_names[ patron ] );
1216 : 0 : return Str3;
1217 : : }
1218 : :
1219 : 0 : char *monk_rank_string(int rank)
1220 : : {
1221 : 0 : return monk_ranks[rank];
1222 : : }
1223 : :
|