… | |
… | |
16 | |
16 | |
17 | You should have received a copy of the GNU General Public License |
17 | You should have received a copy of the GNU General Public License |
18 | along with this program; if not, write to the Free Software |
18 | along with this program; if not, write to the Free Software |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
19 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | |
20 | |
21 | The authors can be reached via e-mail at crossfire-devel@real-time.com |
21 | The authors can be reached via e-mail at crossfire@schmorp.de |
22 | */ |
22 | */ |
23 | |
23 | |
24 | /* This file is best viewed with a window width of about 100 character */ |
24 | /* This file is best viewed with a window width of about 100 character */ |
25 | |
25 | |
26 | /* This file is really too large. With all the .h files |
26 | /* This file is really too large. With all the .h files |
… | |
… | |
43 | * The following should still hopefully result in an error. |
43 | * The following should still hopefully result in an error. |
44 | */ |
44 | */ |
45 | error - Your ANSI C compiler should be defining __STDC__; |
45 | error - Your ANSI C compiler should be defining __STDC__; |
46 | #endif |
46 | #endif |
47 | |
47 | |
48 | #ifndef WIN32 /* ---win32 exclude unix configuration part */ |
|
|
49 | # include <autoconf.h> |
48 | #include <autoconf.h> |
50 | #endif |
|
|
51 | |
49 | |
52 | #define FONTDIR "" |
50 | #define FONTDIR "" |
53 | #define FONTNAME "" |
51 | #define FONTNAME "" |
54 | |
52 | |
55 | /* Decstations have trouble with fabs()... */ |
53 | /* Decstations have trouble with fabs()... */ |
… | |
… | |
92 | #define FONTSIZE 3000 /* Max chars in font */ |
90 | #define FONTSIZE 3000 /* Max chars in font */ |
93 | |
91 | |
94 | #define MAX_ANIMATIONS 256 |
92 | #define MAX_ANIMATIONS 256 |
95 | |
93 | |
96 | #define MAX_NAME 48 |
94 | #define MAX_NAME 48 |
97 | #define BIG_NAME 32 |
|
|
98 | #define MAX_EXT_TITLE 98 |
95 | #define MAX_EXT_TITLE 98 |
99 | |
96 | |
100 | /* Fatal variables: */ |
97 | /* Fatal variables: */ |
101 | #define OUT_OF_MEMORY 0 |
98 | #define OUT_OF_MEMORY 0 |
102 | #define MAP_ERROR 1 |
99 | #define MAP_ERROR 1 |
… | |
… | |
383 | #define PU_READABLES 0x00400000 |
380 | #define PU_READABLES 0x00400000 |
384 | #define PU_MAGIC_DEVICE 0x00800000 |
381 | #define PU_MAGIC_DEVICE 0x00800000 |
385 | |
382 | |
386 | #define PU_NOT_CURSED 0x01000000 |
383 | #define PU_NOT_CURSED 0x01000000 |
387 | #define PU_JEWELS 0x02000000 |
384 | #define PU_JEWELS 0x02000000 |
|
|
385 | #define PU_FLESH 0x04000000 |
388 | |
386 | |
389 | |
387 | |
390 | /* Instead of using arbitrary constants for indexing the |
388 | /* Instead of using arbitrary constants for indexing the |
391 | * freearr, add these values. <= SIZEOFFREE1 will get you |
389 | * freearr, add these values. <= SIZEOFFREE1 will get you |
392 | * within 1 space. <= SIZEOFFREE2 wll get you withing |
390 | * within 1 space. <= SIZEOFFREE2 wll get you withing |
… | |
… | |
397 | #define SIZEOFFREE2 24 |
395 | #define SIZEOFFREE2 24 |
398 | #define SIZEOFFREE 49 |
396 | #define SIZEOFFREE 49 |
399 | |
397 | |
400 | #define NROF_SOUNDS (23 + NROFREALSPELLS) /* Number of sounds */ |
398 | #define NROF_SOUNDS (23 + NROFREALSPELLS) /* Number of sounds */ |
401 | |
399 | |
402 | /* Flag structure now changed. |
400 | /* |
403 | * Each flag is now a bit offset, starting at zero. The macros |
|
|
404 | * will update/read the appropriate flag element in the object |
|
|
405 | * structure. |
|
|
406 | * |
|
|
407 | * Hopefully, since these offsets are integer constants set at run time, |
|
|
408 | * the compiler will reduce the macros something as simple as the |
|
|
409 | * old system was. |
|
|
410 | * |
|
|
411 | * Flags now have FLAG as the prefix. This to be clearer, and also |
|
|
412 | * to make sure F_ names are not still being used anyplace. |
|
|
413 | * |
|
|
414 | * The macros below assume that the flag size for each element is 32 |
|
|
415 | * bits. IF it is smaller, bad things will happen. See structs.h |
|
|
416 | * for more info. |
|
|
417 | * |
|
|
418 | * All functions should use the macros below. In process of converting |
|
|
419 | * to the new system, I find several files that did not use the previous |
|
|
420 | * macros. |
|
|
421 | * |
|
|
422 | * If any FLAG's are or changed, make sure the flag_names structure in |
401 | * If any FLAG's are added or changed, make sure the flag_names structure in |
423 | * common/loader.l is updated. |
402 | * common/loader.l is updated. |
424 | * |
|
|
425 | * flags[0] is 0 to 31 |
|
|
426 | * flags[1] is 32 to 63 |
|
|
427 | * flags[2] is 64 to 95 |
|
|
428 | * flags[3] is 96 to 127 |
|
|
429 | */ |
403 | */ |
430 | |
404 | |
431 | /* Basic routines to do above */ |
405 | /* Basic routines to do above */ |
432 | #define SET_FLAG(xyz, p) \ |
406 | #define SET_FLAG(obj, flag) (obj)->flags[flag] = 1 |
433 | ((xyz)->flags[p/32] |= (1U << (p % 32))) |
407 | #define CLEAR_FLAG(obj, flag) (obj)->flags[flag] = 0 |
434 | #define CLEAR_FLAG(xyz, p) \ |
408 | #define QUERY_FLAG(obj, flag) (obj)->flags[flag] |
435 | ((xyz)->flags[p/32] &= ~(1U << (p % 32))) |
|
|
436 | #define QUERY_FLAG(xyz, p) \ |
|
|
437 | ((xyz)->flags[p/32] & (1U << (p % 32))) |
|
|
438 | #define COMPARE_FLAGS(p,q) \ |
|
|
439 | ( \ |
|
|
440 | ((p)->flags[0] == (q)->flags[0]) && \ |
|
|
441 | ((p)->flags[1] == (q)->flags[1]) && \ |
|
|
442 | ((p)->flags[2] == (q)->flags[2]) && \ |
|
|
443 | ((p)->flags[3] == (q)->flags[3]) \ |
|
|
444 | ) |
|
|
445 | |
|
|
446 | /* convenience macros to determine what kind of things we are dealing with */ |
|
|
447 | |
|
|
448 | #define IS_WEAPON(op) \ |
|
|
449 | (op->type == ARROW || op->type == BOW || op->type == WEAPON) |
|
|
450 | |
|
|
451 | #define IS_ARMOR(op) \ |
|
|
452 | (op->type == ARMOUR || op->type == SHIELD || op->type == HELMET || \ |
|
|
453 | op->type == CLOAK || op->type == BOOTS || op->type == GLOVES || \ |
|
|
454 | op->type == BRACERS || op->type == GIRDLE) |
|
|
455 | |
|
|
456 | #define IS_LIVE(op) \ |
|
|
457 | ((op->type == PLAYER || QUERY_FLAG(op, FLAG_MONSTER) || \ |
|
|
458 | (QUERY_FLAG(op, FLAG_ALIVE) && !QUERY_FLAG(op, FLAG_GENERATOR) && \ |
|
|
459 | !op->type == DOOR)) && (!QUERY_FLAG(op,FLAG_IS_A_TEMPLATE))) |
|
|
460 | |
|
|
461 | #define IS_ARROW(op) \ |
|
|
462 | (op->type==ARROW || \ |
|
|
463 | (op->type==SPELL_EFFECT && \ |
|
|
464 | (op->subtype == SP_BULLET || op->subtype == SP_MAGIC_MISSILE))) |
|
|
465 | |
|
|
466 | /* This return TRUE if object has still randomitems which |
|
|
467 | * could be expanded. |
|
|
468 | */ |
|
|
469 | #define HAS_RANDOM_ITEMS(op) (op->randomitems && (!QUERY_FLAG(op,FLAG_IS_A_TEMPLATE))) |
|
|
470 | |
409 | |
471 | /* the flags */ |
410 | /* the flags */ |
472 | |
411 | |
473 | #define FLAG_ALIVE 0 /* Object can fight (or be fought) */ |
412 | #define FLAG_ALIVE 0 /* Object can fight (or be fought) */ |
474 | #define FLAG_WIZ 1 /* Object has special privilegies */ |
413 | #define FLAG_WIZ 1 /* Object has special privilegies */ |
… | |
… | |
495 | |
434 | |
496 | #define FLAG_GENERATOR 16 /* Will generate type ob->stats.food */ |
435 | #define FLAG_GENERATOR 16 /* Will generate type ob->stats.food */ |
497 | #define FLAG_IS_THROWN 17 /* Object is designed to be thrown. */ |
436 | #define FLAG_IS_THROWN 17 /* Object is designed to be thrown. */ |
498 | #define FLAG_AUTO_APPLY 18 |
437 | #define FLAG_AUTO_APPLY 18 |
499 | /* Will be applied when created */ |
438 | /* Will be applied when created */ |
500 | #define FLAG_TREASURE 19 /* Will generate treasure when applied */ |
439 | // not used anywhere in the code // #define FLAG_TREASURE 19 /* Will generate treasure when applied */ |
501 | #define FLAG_PLAYER_SOLD 20 /* Object was sold to a shop by a player. */ |
440 | #define FLAG_PLAYER_SOLD 20 /* Object was sold to a shop by a player. */ |
502 | #define FLAG_SEE_INVISIBLE 21 /* Will see invisible player */ |
441 | #define FLAG_SEE_INVISIBLE 21 /* Will see invisible player */ |
503 | #define FLAG_CAN_ROLL 22 /* Object can be rolled */ |
442 | #define FLAG_CAN_ROLL 22 /* Object can be rolled */ |
504 | #define FLAG_OVERLAY_FLOOR 23 /* Object is an overlay floor */ |
443 | #define FLAG_OVERLAY_FLOOR 23 /* Object is an overlay floor */ |
505 | #define FLAG_IS_TURNABLE 24 /* Object can change face with direction */ |
444 | #define FLAG_IS_TURNABLE 24 /* Object can change face with direction */ |
… | |
… | |
1032 | * |
971 | * |
1033 | * 0.94.2 - you probably shouldn't need to change any of the rand stuff |
972 | * 0.94.2 - you probably shouldn't need to change any of the rand stuff |
1034 | * here. |
973 | * here. |
1035 | */ |
974 | */ |
1036 | |
975 | |
1037 | #ifdef HAVE_SRANDOM |
|
|
1038 | # define RANDOM() random() |
976 | #define RANDOM() random() |
1039 | # define SRANDOM(xyz) srandom(xyz) |
977 | #define SRANDOM(xyz) srandom(xyz) |
1040 | #else |
|
|
1041 | # ifdef HAVE_SRAND48 |
|
|
1042 | # define RANDOM() lrand48() |
|
|
1043 | # define SRANDOM(xyz) srand48(xyz) |
|
|
1044 | # else |
|
|
1045 | # ifdef HAVE_SRAND |
|
|
1046 | # define RANDOM() rand() |
|
|
1047 | # define SRANDOM(xyz) srand(xyz) |
|
|
1048 | # else |
|
|
1049 | # error "Could not find a usable random routine" |
|
|
1050 | # endif |
|
|
1051 | # endif |
|
|
1052 | #endif |
|
|
1053 | |
978 | |
1054 | /* Returns the weight of the given object. Note: it does not take the number of |
979 | /* Returns the weight of the given object. Note: it does not take the number of |
1055 | * items (nrof) into account. |
980 | * items (nrof) into account. |
1056 | */ |
981 | */ |
1057 | #define WEIGHT(op) (op->nrof?op->weight:op->weight+op->carrying) |
982 | #define WEIGHT(op) (op->nrof?op->weight:op->weight+op->carrying) |