ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/define.h
Revision: 1.62
Committed: Sun Jul 1 05:00:18 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.61: +11 -12 lines
Log Message:
- upgrade crossfire trt to the GPL version 3 (hopefully correctly).
- add a single file covered by the GNU Affero General Public License
  (which is not yet released, so I used the current draft, which is
  legally a bit wavy, but its likely better than nothing as it expresses
  direct intent by the authors, and we can upgrade as soon as it has been
  released).
  * this should ensure availability of source code for the server at least
    and hopefully also archetypes and maps even when modified versions
    are not being distributed, in accordance of section 13 of the agplv3.

File Contents

# Content
1 /*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2003-2005,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
8 * Crossfire TRT 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 3 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, see <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
22 */
23
24 /* This file is best viewed with a window width of about 100 character */
25
26 /* This file is really too large. With all the .h files
27 * around, this file should be better split between them - things
28 * that deal with objects should be in objects.h, things dealing
29 * with players in player.h, etc. As it is, everything just seems
30 * to be dumped in here.
31 */
32
33 #ifndef DEFINE_H
34 #define DEFINE_H
35
36 #include <autoconf.h>
37
38 #define FONTDIR ""
39 #define FONTNAME ""
40
41 /* Decstations have trouble with fabs()... */
42 #define FABS(x) fabs (x)
43
44 #ifdef __NetBSD__
45 # include <sys/param.h>
46 #endif
47 #ifndef MIN
48 # define MIN(x,y) min (x, y)
49 #endif
50 #ifndef MAX
51 # define MAX(x,y) max (x, y)
52 #endif
53
54 // maximum length of an object name in the protocol
55 #define NAME_LEN 127
56
57 /* MAX3 is basically like MAX, but instead does 3 values. */
58 #ifndef MAX3
59 # define MAX3(x,y, z) (MAX(x, MAX(y,z)))
60 #endif
61
62 /* MIN3 is basically like MIN, but instead does 3 values. */
63 #ifndef MIN3
64 # define MIN3(x,y, z) (MIN(x, MIN(y,z)))
65 #endif
66
67 #define MAX_STAT 30 /* The maximum legal value of any stat */
68 #define MIN_STAT 1 /* The minimum legal value of any stat */
69
70 //TODO: not only use more reasonable values, also enforce them
71 #define MIN_WC -120
72 #define MAX_WC 120
73 #define MIN_AC -120
74 #define MAX_AC 120
75 #define MIN_DAM 0
76 #define MAX_DAM 200
77
78 #define MAX_BUF 1024
79 /* Used for all kinds of things */
80 #define VERY_BIG_BUF 2048
81 #define HUGE_BUF 4096 /* Used for messages - some can be quite long */
82 #define SOCKET_BUFLEN 4096 /* Max length a packet could be */
83
84 #define FONTSIZE 3000 /* Max chars in font */
85
86 #define MAX_ANIMATIONS 256
87
88 #define MAX_NAME 48
89 #define MAX_EXT_TITLE 98
90
91 /* Fatal variables: */
92 //TODO: remove all calls to fatal and replace them by cleanup
93 #define OUT_OF_MEMORY 0
94 #define MAP_ERROR 1
95 #define ARCHTABLE_TOO_SMALL 2 // unused
96 #define TOO_MANY_ERRORS 3
97
98 /* TYPE DEFINES */
99
100 /* Only add new values to this list if somewhere in the program code,
101 * it is actually needed. Just because you add a new monster does not
102 * mean it has to have a type defined here. That only needs to happen
103 * if in some .c file, it needs to do certain special actions based on
104 * the monster type, that can not be handled by any of the numerous
105 * flags
106 * Also, if you add new entries, try and fill up the holes in this list.
107 * Additionally, when you add a new entry, include it in the table in item.c
108 */
109
110 /* USED TYPES: (for dead types please look at the bottom of the type
111 * definitions)
112 */
113
114 /* type 0 objects have the default behaviour */
115
116 #define PLAYER 1
117 #define TRANSPORT 2 /* see pod/objects.pod */
118 #define ROD 3
119 #define TREASURE 4
120 #define POTION 5
121 #define FOOD 6
122 #define POISON 7
123 #define BOOK 8
124 #define CLOCK 9
125
126 #define ARROW 13
127 #define BOW 14
128 #define WEAPON 15
129 #define ARMOUR 16
130 #define PEDESTAL 17
131 #define ALTAR 18
132
133 #define LOCKED_DOOR 20
134 #define SPECIAL_KEY 21
135 #define MAP 22
136 #define DOOR 23
137 #define KEY 24
138
139 #define TIMED_GATE 26
140 #define TRIGGER 27
141 #define GRIMREAPER 28
142 #define MAGIC_EAR 29
143 #define TRIGGER_BUTTON 30
144 #define TRIGGER_ALTAR 31
145 #define TRIGGER_PEDESTAL 32
146 #define SHIELD 33
147 #define HELMET 34
148 #define HORN 35
149 #define MONEY 36
150 #define CLASS 37 /* object for applying character class modifications to someone */
151 #define GRAVESTONE 38
152 #define AMULET 39
153 #define PLAYERMOVER 40
154 #define TELEPORTER 41
155 #define CREATOR 42
156 #define SKILL 43 /* also see SKILL_TOOL (74) below */
157
158 #define EARTHWALL 45
159 #define GOLEM 46
160
161 #define THROWN_OBJ 48
162 #define BLINDNESS 49
163 #define GOD 50
164 #define DETECTOR 51 /* peterm: detector is an object
165 * which notices the presense of
166 * another object and is triggered
167 * like buttons.
168 */
169 #define TRIGGER_MARKER 52 /* inserts an invisible, weightless
170 * force into a player with a specified string WHEN TRIGGERED.
171 */
172 #define DEAD_OBJECT 53
173 #define DRINK 54
174 #define MARKER 55 /* inserts an invisible, weightless
175 * force into a player with a specified string.
176 */
177 #define HOLY_ALTAR 56
178 #define PLAYER_CHANGER 57
179 #define BATTLEGROUND 58 /* battleground, by Andreas Vogl */
180
181 #define PEACEMAKER 59 /* Object owned by a player which can convert
182 * a monster into a peaceful being incapable of attack.
183 */
184 #define GEM 60
185
186 #define FIREWALL 62
187 #define ANVIL 63
188 #define CHECK_INV 64 /* by b.t. thomas@nomad.astro.psu.edu */
189 #define MOOD_FLOOR 65 /* by b.t. thomas@nomad.astro.psu.edu
190 * values of last_sp set how to change:
191 * 0 = furious, all monsters become aggressive
192 * 1 = angry, all but friendly become aggressive
193 * 2 = calm, all aggressive monsters calm down
194 * 3 = sleep, all monsters fall asleep
195 * 4 = charm, monsters become pets */
196 #define EXIT 66
197 #define ENCOUNTER 67
198 #define SHOP_FLOOR 68
199 #define SHOP_MAT 69
200 #define RING 70
201 #define FLOOR 71 /* this is a floor tile -> native layer 0 */
202 #define FLESH 72 /* animal 'body parts' -b.t. */
203 #define INORGANIC 73 /* metals and minerals */
204 #define SKILL_TOOL 74 /* Allows the use of a skill */
205 #define LIGHTER 75
206
207 #define BUILDABLE_WALL 77 /* this is a buildable wall */
208
209
210 #define MISC_OBJECT 79 /* misc. objects are for objects without a function
211 in the engine. Like statues, clocks, chairs,...
212 If perhaps we create a function where we can sit
213 on chairs, we create a new type and remove all
214 chairs from here. */
215
216 #define LAMP 82 /* a lamp */
217 #define DUPLICATOR 83 /* duplicator/multiplier object */
218
219 #define SPELLBOOK 85
220
221 #define CLOAK 87
222
223 #define SPINNER 90
224 #define GATE 91
225 #define BUTTON 92
226 #define CF_HANDLE 93
227 #define HOLE 94
228 #define TRAPDOOR 95
229
230 #define SIGN 98
231 #define BOOTS 99
232 #define GLOVES 100
233 #define SPELL 101
234 #define SPELL_EFFECT 102
235 #define CONVERTER 103
236 #define BRACERS 104
237 #define POISONING 105
238 #define SAVEBED 106
239
240 #define WAND 109
241
242 #define SCROLL 111
243 #define DIRECTOR 112
244 #define GIRDLE 113
245 #define FORCE 114
246 #define POTION_EFFECT 115 /* a force, holding the effect of a potion */
247 #define EVENT_CONNECTOR 116 /* Lauwenmark: an invisible object holding a plugin event hook */
248
249 #define CLOSE_CON 121 /* Eneq(@csd.uu.se): Id for close_container archetype. */
250 #define CONTAINER 122
251 #define ARMOUR_IMPROVER 123
252 #define WEAPON_IMPROVER 124
253
254 #define SKILLSCROLL 130 /* can add a skill to player's inventory -bt. */
255 #define DEEP_SWAMP 138
256 #define IDENTIFY_ALTAR 139
257
258 #define MENU 150 /* Mark Wedel (mark@pyramid.com) Shop inventories */
259
260 #define RUNE 154
261 #define TRAP 155
262
263 #define POWER_CRYSTAL 156
264 #define CORPSE 157
265
266 #define DISEASE 158
267 #define SYMPTOM 159
268 #define BUILDER 160 /* Generic item builder, see subtypes */
269 #define MATERIAL 161 /* Material for building */
270
271 #define ITEM_TRANSFORMER 163 /* Transforming one item with another */
272
273 #define SAFE_GROUND 165 /* This is a safe ground, means that neither bombs,
274 potions, alchemy, or magic works here (elmex) */
275
276 #define NUM_TYPES 166 // must be max(type) + 1
277
278 /* DEAD TYPES: */
279 //#define FBULLET 10
280 //#define FBALL 11
281 //#define LIGHTNING 12 // elmex: implemented by type 102 subtype 4
282 //#define CONFUSION 19
283 //#define MMISSILE 25
284 /*#define EXPERIENCE 44*//* This is basically obsolete now. It used to contain
285 * experience for broad skill categories. This value
286 * is now automatically converteed at load time.
287 */
288 //#define BOMB 47
289 //#define FIRECHEST 61 /* FIRECHEST folded into FIREWALL */
290
291 /* random crossfire developer: The trap_part, wall, light_source,
292 * misc_object, monster, and spawn_generator
293 * types are not used in any archetypes,
294 * and should perhaps be removed.
295 *
296 * Wed Dec 20 13:35:24 CET 2006:
297 * elmex: removed TRAP_PART, LIGHT_SOURCE, MONSTER and SPAWN_GENERATOR now.
298 * monsters are marked by FLAG_MONSTER and generator with FLAG_GENERATOR.
299 * renamed WALL to BUILDABLE_WALL.
300 */
301
302 //#define TRAP_PART 76 /* Needed by set traps skill -b.t. */
303 //#define LIGHT_SOURCE 78 /* torches, lamps, etc. */
304 //#define MONSTER 80 /* yes, thats a real, living creature */
305 //#define SPAWN_GENERATOR 81 /* a spawn point or monster generator object */
306 //#define TOOL 84 /* a tool for building objects */
307 //#define BUILDFAC 86 /* facilities for building objects */
308 //#define CONE 88
309 //#define AURA 89 /* aura spell object */
310 //#define WORD_OF_RECALL 96
311 //#define PARAIMAGE 97
312 //#define POISONCLOUD 107
313 //#define FIREHOLES 108
314 //#define ABILITY 110
315 /* unused: 125 - 129
316 * type 125 was MONEY_CHANGER
317 */
318 //#define CANCELLATION 141 /* not used with new spell code */
319 //#define BALL_LIGHTNING 151 /* peterm: ball lightning and color spray */
320 //#define SWARM_SPELL 153
321 //#define GPS 162 /* Ground positionning system, moved to Python plugin */
322 //#define QUEST 164 /* See below for subtypes */
323
324 /* END TYPE DEFINE */
325
326 #define NUM_SUBTYPES 64 // maximum supported subtype number + 1, can be increased to 256
327
328 /* Subtypes for BUILDER */
329 #define ST_BD_BUILD 1 /* Builds an item */
330 #define ST_BD_REMOVE 2 /* Removes an item */
331
332 /* Subtypes for MATERIAL */
333 #define ST_MAT_FLOOR 1 /* Floor */
334 #define ST_MAT_WALL 2 /* Wall */
335 #define ST_MAT_ITEM 3 /* All other items, including doors & such */
336
337 /* definitions for weapontypes */
338
339 #define WEAP_HIT 0 /* the basic */
340 #define WEAP_SLASH 1 /* slash */
341 #define WEAP_PIERCE 2 /* arrows, stiletto */
342 #define WEAP_CLEAVE 3 /* axe */
343 #define WEAP_SLICE 4 /* katana */
344 #define WEAP_STAB 5 /* knife, dagger */
345 #define WEAP_WHIP 6 /* whips n chains */
346 #define WEAP_CRUSH 7 /* big hammers, flails */
347 #define WEAP_BLUD 8 /* bludgeoning, club, stick */
348
349 typedef struct typedata
350 {
351 int number;
352 const char *name;
353 const char *name_pl;
354 int identifyskill;
355 int identifyskill2;
356 } typedata;
357
358 extern const int ItemTypesSize;
359 extern typedata ItemTypes[];
360
361 /* definitions for detailed pickup descriptions.
362 * The objective is to define intelligent groups of items that the
363 * user can pick up or leave as he likes. */
364
365 /* high bit as flag for new pickup options */
366 #define PU_NOTHING 0x00000000
367
368 #define PU_DEBUG 0x10000000
369 #define PU_INHIBIT 0x20000000
370 #define PU_STOP 0x40000000
371 #define PU_NEWMODE 0x80000000
372
373 #define PU_RATIO 0x0000000F
374
375 #define PU_FOOD 0x00000010
376 #define PU_DRINK 0x00000020
377 #define PU_VALUABLES 0x00000040
378 #define PU_BOW 0x00000080
379
380 #define PU_ARROW 0x00000100
381 #define PU_HELMET 0x00000200
382 #define PU_SHIELD 0x00000400
383 #define PU_ARMOUR 0x00000800
384
385 #define PU_BOOTS 0x00001000
386 #define PU_GLOVES 0x00002000
387 #define PU_CLOAK 0x00004000
388 #define PU_KEY 0x00008000
389
390 #define PU_MISSILEWEAPON 0x00010000
391 #define PU_ALLWEAPON 0x00020000
392 #define PU_MAGICAL 0x00040000
393 #define PU_POTION 0x00080000
394
395 #define PU_SPELLBOOK 0x00100000
396 #define PU_SKILLSCROLL 0x00200000
397 #define PU_READABLES 0x00400000
398 #define PU_MAGIC_DEVICE 0x00800000
399
400 #define PU_NOT_CURSED 0x01000000
401 #define PU_JEWELS 0x02000000
402 #define PU_FLESH 0x04000000
403
404
405 /* Instead of using arbitrary constants for indexing the
406 * freearr, add these values. <= SIZEOFFREE1 will get you
407 * within 1 space. <= SIZEOFFREE2 wll get you withing
408 * 2 spaces, and the entire array (< SIZEOFFREE) is
409 * three spaces
410 */
411 #define SIZEOFFREE1 8
412 #define SIZEOFFREE2 24
413 #define SIZEOFFREE 49
414
415 #define NROF_SOUNDS (23 + NROFREALSPELLS) /* Number of sounds */
416
417 /*
418 * If any FLAG's are added or changed, make sure the flag_names structure in
419 * common/loader.l is updated.
420 */
421
422 /* Basic routines to do above */
423 #define SET_FLAG(obj, flg) (obj)->flag [flg] = 1
424 #define CLEAR_FLAG(obj, flg) (obj)->flag [flg] = 0
425 #define QUERY_FLAG(obj, flg) (obj)->flag [flg]
426
427 /* the flags */
428
429 #define FLAG_ALIVE 0 /* Object can fight (or be fought) */
430 #define FLAG_WIZ 1 /* Object has special privilegies */
431 #define FLAG_REMOVED 2 /* Object is not in any map or invenory */
432 #define FLAG_FREED 3 /* Object is in the list of free objects */
433 //#define FLAG_WAS_WIZ 4 /* Player was once a wiz */
434 #define FLAG_APPLIED 5 /* Object is ready for use by living */
435 #define FLAG_UNPAID 6 /* Object hasn't been paid for yet */
436 #define FLAG_USE_SHIELD 7
437 /* Can this creature use a shield? */
438
439 #define FLAG_NO_PICK 8 /* Object can't be picked up */
440
441 /*#define FLAG_WALK_ON 9*//* Applied when it's walked upon */
442 /*#define FLAG_NO_PASS 10*//* Nothing can pass (wall() is true) */
443
444 #define FLAG_ANIMATE 11 /* The object looks at archetype for faces */
445
446 /*#define FLAG_SLOW_MOVE 12*//* Uses the stats.exp/1000 to slow down */
447 /*#define FLAG_FLYING 13*//* Not affected by WALK_ON or SLOW_MOVE) */
448
449 #define FLAG_MONSTER 14 /* Will attack players */
450 #define FLAG_FRIENDLY 15 /* Will help players */
451
452 #define FLAG_GENERATOR 16 /* Will generate type ob->stats.food */
453 #define FLAG_IS_THROWN 17 /* Object is designed to be thrown. */
454 #define FLAG_AUTO_APPLY 18
455 /* Will be applied when created */
456 #define FLAG_TREASURE_ENV 19 // put treasure into environment not in inventory
457 #define FLAG_PLAYER_SOLD 20 /* Object was sold to a shop by a player. */
458 #define FLAG_SEE_INVISIBLE 21 /* Will see invisible player */
459 #define FLAG_CAN_ROLL 22 /* Object can be rolled */
460 #define FLAG_OVERLAY_FLOOR 23 /* Object is an overlay floor */
461 #define FLAG_IS_TURNABLE 24 /* Object can change face with direction */
462
463 /*#define FLAG_WALK_OFF 25*//* Object is applied when left */
464 /*#define FLAG_FLY_ON 26*//* As WALK_ON, but only with FLAG_FLYING */
465 /*#define FLAG_FLY_OFF 27*//* As WALK_OFF, but only with FLAG_FLYING */
466
467 #define FLAG_IS_USED_UP 28
468 /* When (--food<0) the object will exit */
469 #define FLAG_IDENTIFIED 29
470 /* Player knows full info about item */
471 #define FLAG_REFLECTING 30
472 /* Object reflects from walls (lightning) */
473 #define FLAG_CHANGING 31 /* Changes to other_arch when anim is done */
474
475 #define FLAG_SPLITTING 32 /* Object splits into stats.food other objs */
476 #define FLAG_HITBACK 33 /* Object will hit back when hit */
477 #define FLAG_STARTEQUIP 34
478 /* Object was given to player at start */
479 #define FLAG_BLOCKSVIEW 35
480 /* Object blocks view */
481 #define FLAG_UNDEAD 36 /* Monster is undead */
482 #define FLAG_SCARED 37 /* Monster is scared (mb player in future) */
483 #define FLAG_UNAGGRESSIVE 38 /* Monster doesn't attack players */
484 #define FLAG_REFL_MISSILE 39 /* Arrows will reflect from object */
485
486 #define FLAG_REFL_SPELL 40
487 /* Spells (some) will reflect from object */
488 #define FLAG_NO_MAGIC 41 /* Spells (some) can't pass this object */
489 #define FLAG_NO_FIX_PLAYER 42 /* fix_player() won't be called */
490 #define FLAG_IS_LIGHTABLE 43 /* object can be lit */
491 #define FLAG_TEAR_DOWN 44 /* at->faces[hp*animations/maxhp] at hit */
492 #define FLAG_RUN_AWAY 45 /* Object runs away from nearest player \
493 but can still attack at a distance */
494
495 /*#define FLAG_PASS_THRU 46*//* Objects with can_pass_thru can pass \
496 thru this object as if it wasn't there */
497 /*#define FLAG_CAN_PASS_THRU 47*//* Can pass thru... */
498
499 #define FLAG_PICK_UP 48 /* Can pick up */
500 #define FLAG_UNIQUE 49 /* Item is really unique (UNIQUE_ITEMS) */
501 #define FLAG_NO_DROP 50 /* Object can't be dropped */
502 #define FLAG_WIZCAST 51 /* The wizard can cast spells in no-magic area */
503 #define FLAG_CAST_SPELL 52
504 /* (Monster) can learn and cast spells */
505 #define FLAG_USE_SCROLL 53
506 /* (Monster) can read scroll */
507 #define FLAG_USE_RANGE 54 /* (Monster) can apply and use range items */
508 #define FLAG_USE_BOW 55 /* (Monster) can apply and fire bows */
509
510 #define FLAG_USE_ARMOUR 56
511 /* (Monster) can wear armour/shield/helmet */
512 #define FLAG_USE_WEAPON 57
513 /* (Monster) can wield weapons */
514 #define FLAG_USE_RING 58 /* (Monster) can use rings, boots, gauntlets, etc */
515 #define FLAG_READY_RANGE 59 /* (Monster) has a range attack readied... 8) */
516 #define FLAG_READY_BOW 60 /* (Monster) has valid bow readied */
517 #define FLAG_XRAYS 61 /* X-ray vision */
518 #define FLAG_NO_APPLY 62 /* Avoids step_on/fly_on to this object */
519 #define FLAG_IS_FLOOR 63 /* Can't see what's underneath this object */
520
521 #define FLAG_LIFESAVE 64 /* Saves a players' life once, then destr. */
522 #define FLAG_NO_STRENGTH 65 /* Strength-bonus not added to wc/dam */
523 #define FLAG_SLEEP 66 /* NPC is sleeping */
524 #define FLAG_STAND_STILL 67 /* NPC will not (ever) move */
525 #define FLAG_RANDOM_MOVE 68 /* NPC will move randomly */
526 #define FLAG_ONLY_ATTACK 69 /* NPC will evaporate if there is no enemy */
527 #define FLAG_CONFUSED 70 /* Will also be unable to cast spells */
528 #define FLAG_STEALTH 71 /* Will wake monsters with less range */
529
530 #define FLAG_WIZPASS 72 /* The wizard can go through walls */
531 #define FLAG_IS_LINKED 73 /* The object is linked with other objects */
532 #define FLAG_CURSED 74 /* The object is cursed */
533 #define FLAG_DAMNED 75 /* The object is _very_ cursed */
534 #define FLAG_SEE_ANYWHERE 76 /* The object will be visible behind walls */
535 #define FLAG_KNOWN_MAGICAL 77 /* The object is known to be magical */
536 #define FLAG_KNOWN_CURSED 78 /* The object is known to be cursed */
537 #define FLAG_CAN_USE_SKILL 79 /* The monster can use skills */
538
539 #define FLAG_BEEN_APPLIED 80 /* The object has been applied */
540 #define FLAG_READY_SCROLL 81 /* monster has scroll in inv and can use it */
541 #define FLAG_USE_ROD 82 /* (Monster) can apply and use rods */
542
543 #define FLAG_PRECIOUS 83 // object is precious (pets)
544 #define FLAG_USE_HORN 84 /* (Monster) can apply and use horns */
545 #define FLAG_MAKE_INVIS 85
546 /* (Item) gives invisibility when applied */
547 #define FLAG_INV_LOCKED 86
548 /* Item will not be dropped from inventory */
549 #define FLAG_IS_WOODED 87 /* Item is wooded terrain */
550
551 #define FLAG_IS_HILLY 88 /* Item is hilly/mountain terrain */
552 #define FLAG_READY_SKILL 89 /* (Monster or Player) has a skill readied */
553 #define FLAG_READY_WEAPON 90 /* (Monster or Player) has a weapon readied */
554 #define FLAG_NO_SKILL_IDENT 91 /* If set, item cannot be identified w/ a skill */
555 #define FLAG_BLIND 92 /* If set, object cannot see (visually) */
556 #define FLAG_SEE_IN_DARK 93 /* if set ob not effected by darkness */
557 #define FLAG_IS_CAULDRON 94 /* container can make alchemical stuff */
558
559 /*#define FLAG_DUST 95 *//* item is a 'powder', effects throwing */
560
561 #define FLAG_NO_STEAL 96 /* Item can't be stolen */
562 #define FLAG_ONE_HIT 97 /* Monster can only hit once before going
563 * away (replaces ghosthit)
564 */
565 #define FLAG_CLIENT_SENT 98 /* THIS IS A DEBUG FLAG ONLY. We use it to
566 * detect cases were the server is trying
567 * to send an upditem when we have not
568 * actually sent the item.
569 */
570
571 #define FLAG_BERSERK 99 /* monster will attack closest living
572 object */
573 #define FLAG_NEUTRAL 100 /* monster is from type neutral */
574 #define FLAG_NO_ATTACK 101 /* monster don't attack */
575 #define FLAG_NO_DAMAGE 102 /* monster can't be damaged */
576 #define FLAG_OBJ_ORIGINAL 103 /* NEVER SET THIS. Item was loaded by
577 * load_original_map() */
578 #define FLAG_OBJ_SAVE_ON_OVL 104 /* this object should be saved on
579 * the overlay, and is not subject to
580 * decay. */
581 #define FLAG_ACTIVATE_ON_PUSH 105 /* connected object is activated when 'pushed' */
582 #define FLAG_ACTIVATE_ON_RELEASE 106 /* connected object is activated when 'released' */
583 #define FLAG_IS_WATER 107
584 #define FLAG_CONTENT_ON_GEN 108
585 #define FLAG_IS_A_TEMPLATE 109 /* Object has no ingame life until instanciated */
586 #define FLAG_IS_BUILDABLE 110 /* Can build on item */
587 #define FLAG_DESTROY_ON_DEATH 111 /* Object will be destroyed when env dies */
588 #define FLAG_NO_MAP_SAVE 112 // item doesn't get saved with map
589
590 #define NUM_FLAGS 113 /* Should always be equal to the last
591 * defined flag + 1. If you change this,
592 * make sure you update the flag_links
593 * in common/loader.l
594 */
595
596 /* Values can go up to 127 before the size of the flags array in the
597 * object structure needs to be enlarged.
598 * So there are 18 available flags slots
599 */
600
601 #define NROFNEWOBJS(xyz) ((xyz)->stats.food)
602
603 /* If you add new movement types, you may need to update
604 * describe_item() so properly describe those types.
605 * change_abil() probably should be updated also.
606 */
607 #define MOVE_WALK 0x01 /* Object walks */
608 #define MOVE_FLY_LOW 0x02 /* Low flying object */
609 #define MOVE_FLY_HIGH 0x04 /* High flying object */
610 #define MOVE_FLYING 0x06
611 /* Combo of fly_low and fly_high */
612 #define MOVE_SWIM 0x08 /* Swimming object */
613 #define MOVE_BOAT 0x10 /* Boats/sailing */
614 #define MOVE_SHIP 0x20 /* boats suitable fro oceans */
615
616 #define MOVE_ALL 0x3f /* Mask of all movement types */
617
618 /* typdef here to define type large enough to hold bitmask of
619 * all movement types. Make one declaration so easy to update.
620 * uint8 is defined yet, so just use what that would define it
621 * at anyways.
622 */
623 typedef unsigned char MoveType;
624
625 /* Basic macro to see if ob2 blocks ob1 from moving onto this space.
626 * Basically, ob2 has to block all of ob1 movement types.
627 */
628 #define OB_MOVE_BLOCK(ob1, ob2) \
629 ((ob1->move_type & ob2->move_block) == ob1->move_type)
630
631 /* Basic macro to see if if ob1 can not move onto a space based
632 * on the 'type' move_block parameter
633 * Add check - if type is 0, don't stop anything from moving
634 * onto it.
635 *
636 */
637 #define OB_TYPE_MOVE_BLOCK(ob1, type) \
638 ((type) && (ob1->move_type & type) == ob1->move_type)
639
640
641 #define SET_GENERATE_TYPE(xyz,va) (xyz)->stats.sp=(va)
642 #define GENERATE_TYPE(xyz) ((xyz)->stats.sp)
643 #define GENERATE_SPEED(xyz) ((xyz)->stats.maxsp) /* if(!RANDOM()%<speed>) */
644
645 /* Note: These values are only a default value, resizing can change them */
646 #define INV_SIZE 12 /* How many items can be viewed in inventory */
647 #define LOOK_SIZE 6 /* ditto, but for the look-window */
648 #define MAX_INV_SIZE 40 /* For initializing arrays */
649 #define MAX_LOOK_SIZE 40 /* ditto for the look-window */
650
651 #define EDITABLE(xyz) ((xyz)->arch->editable)
652
653 #define E_MONSTER 0x00000001
654 #define E_EXIT 0x00000002
655 #define E_TREASURE 0x00000004
656 #define E_BACKGROUND 0x00000008
657 #define E_DOOR 0x00000010
658 #define E_SPECIAL 0x00000020
659 #define E_SHOP 0x00000040
660 #define E_NORMAL 0x00000080
661 #define E_FALSE_WALL 0x00000100
662 #define E_WALL 0x00000200
663 #define E_EQUIPMENT 0x00000400
664 #define E_OTHER 0x00000800
665 #define E_ARTIFACT 0x00001000
666
667 #define EXIT_PATH(xyz) (xyz)->slaying
668 #define EXIT_LEVEL(xyz) (xyz)->stats.food
669 #define EXIT_X(xyz) (xyz)->stats.hp
670 #define EXIT_Y(xyz) (xyz)->stats.sp
671 #define EXIT_ALT_X(xyz) (xyz)->stats.maxhp
672 #define EXIT_ALT_Y(xyz) (xyz)->stats.maxsp
673
674 /* for use by the lighting code */
675 #define MAX_LIGHT_RADII 4 /* max radii for 'light' object, really
676 * large values allow objects that can
677 * slow down the game */
678 #define MAX_DARKNESS 5 /* maximum map darkness, there is no
679 * practical reason to exceed this */
680 #define BRIGHTNESS(xyz) (xyz)->glow_radius>MAX_LIGHT_RADII? \
681 MAX_LIGHT_RADII:(xyz)->glow_radius;
682
683 #define F_BUY 0
684 #define F_SELL 1
685 #define F_TRUE 2 /* True value of item, unadjusted */
686 #define F_NO_BARGAIN 4 /* combine with F_BUY or F_SELL to disable bargaining calc */
687 #define F_IDENTIFIED 8 /* flag to calculate value of identified item */
688 #define F_NOT_CURSED 16 /* flag to calculate value of uncursed item */
689 #define F_APPROX 32 /* flag to give a guess of item value */
690 #define F_SHOP 64 /* consider the effect that the shop that the player is in has */
691
692 #define DIRX(xyz) freearr_x[(xyz)->direction]
693 #define DIRY(xyz) freearr_y[(xyz)->direction]
694
695 #define D_LOCK(xyz) (xyz)->contr->freeze_inv=(xyz)->contr->freeze_look=1;
696 #define D_UNLOCK(xyz) (xyz)->contr->freeze_inv=(xyz)->contr->freeze_look=0;
697
698 #define ARMOUR_SPEED(xyz) (xyz)->last_sp
699 #define ARMOUR_SPELLS(xyz) (xyz)->gen_sp_armour
700 #define WEAPON_SPEED(xyz) (xyz)->last_sp
701
702 /* GET_?_FROM_DIR if used only for positional firing where dir is X and Y
703 each of them signed char, concatenated in a int16 */
704 #define GET_X_FROM_DIR(dir) (signed char) ( dir & 0xFF )
705 #define GET_Y_FROM_DIR(dir) (signed char) ( (dir & 0xFF00) >> 8)
706 #define SET_DIR_FROM_XY(X,Y) (signed char)X + ( ((signed char)Y)<<8)
707 #define FIRE_DIRECTIONAL 0
708 #define FIRE_POSITIONAL 1
709
710 /******************************************************************************/
711 /* Monster Movements added by kholland@sunlab.cit.cornell.edu */
712 /******************************************************************************/
713 /* if your monsters start acting wierd, mail me */
714 /******************************************************************************/
715 /* the following definitions are for the attack_movement variable in monsters */
716 /* if the attack_variable movement is left out of the monster archetype, or is*/
717 /* set to zero */
718 /* the standard mode of movement from previous versions of crossfire will be */
719 /* used. the upper four bits of movement data are not in effect when the monst*/
720 /* er has an enemy. these should only be used for non agressive monsters. */
721 /* to program a monsters movement add the attack movement numbers to the movem*/
722 /* ment numbers example a monster that moves in a circle until attacked and */
723 /* then attacks from a distance: */
724 /* CIRCLE1 = 32 */
725 /* + DISTATT = 1 */
726 /* ------------------- */
727 /* attack_movement = 33 */
728 /******************************************************************************/
729 #define DISTATT 1 /* move toward a player if far, but mantain some space, */
730 /* attack from a distance - good for missile users only */
731 #define RUNATT 2 /* run but attack if player catches up to object */
732 #define HITRUN 3 /* run to then hit player then run away cyclicly */
733 #define WAITATT 4 /* wait for player to approach then hit, move if hit */
734 #define RUSH 5 /* Rush toward player blindly, similiar to dumb monster */
735 #define ALLRUN 6 /* always run never attack good for sim. of weak player */
736 #define DISTHIT 7 /* attack from a distance if hit as recommended by Frank */
737 #define WAIT2 8 /* monster does not try to move towards player if far */
738 /* maintains comfortable distance */
739 #define PETMOVE 16 /* if the upper four bits of attack_movement */
740 /* are set to this number, the monster follows a player */
741 /* until the owner calls it back or off */
742 /* player followed denoted by 0b->owner */
743 /* the monster will try to attack whatever the player is */
744 /* attacking, and will continue to do so until the owner */
745 /* calls off the monster - a key command will be */
746 /* inserted to do so */
747 #define CIRCLE1 32 /* if the upper four bits of move_type / attack_movement */
748 /* are set to this number, the monster will move in a */
749 /* circle until it is attacked, or the enemy field is */
750 /* set, this is good for non-aggressive monsters and NPC */
751 #define CIRCLE2 48 /* same as above but a larger circle is used */
752 #define PACEH 64 /* The Monster will pace back and forth until attacked */
753 /* this is HORIZONTAL movement */
754 #define PACEH2 80 /* the monster will pace as above but the length of the */
755 /* pace area is longer and the monster stops before */
756 /* changing directions */
757 /* this is HORIZONTAL movement */
758 #define RANDO 96 /* the monster will go in a random direction until */
759 /* it is stopped by an obstacle, then it chooses another */
760 /* direction. */
761 #define RANDO2 112 /* constantly move in a different random direction */
762 #define PACEV 128 /* The Monster will pace back and forth until attacked */
763 /* this is VERTICAL movement */
764 #define PACEV2 144 /* the monster will pace as above but the length of the */
765 /* pace area is longer and the monster stops before */
766 /* changing directions */
767 /* this is VERTICAL movement */
768 #define LO4 15 /* bitmasks for upper and lower 4 bits from 8 bit fields */
769 #define HI4 240
770
771 #define BLANK_FACE_NAME "blank.x11"
772 #define EMPTY_FACE_NAME "empty.x11"
773
774 /*
775 * Defines for the luck/random functions to make things more readable
776 */
777
778 #define PREFER_HIGH 1
779 #define PREFER_LOW 0
780
781 /* Simple function we use below to keep adding to the same string
782 * but also make sure we don't overwrite that string.
783 */
784 static inline void
785 safe_strcat (char *dest, const char *orig, int *curlen, int maxlen)
786 {
787 if (*curlen == (maxlen - 1))
788 return;
789
790 strncpy (dest + *curlen, orig, maxlen - *curlen - 1);
791 dest[maxlen - 1] = 0;
792 *curlen += strlen (orig);
793
794 if (*curlen > (maxlen - 1))
795 *curlen = maxlen - 1;
796 }
797
798
799 /* The SAFE versions of these call the safe_strcat function above.
800 * Ideally, all functions should use the SAFE functions, but they
801 * require some extra support in the calling function to remain as
802 * efficient.
803 */
804 #define DESCRIBE_ABILITY_SAFE(retbuf, variable, name, len, maxlen) \
805 if(variable) { \
806 int i,j=0; \
807 safe_strcat(retbuf,"(" name ": ", len, maxlen); \
808 for(i=0; i<NROFATTACKS; i++) \
809 if(variable & (1<<i)) { \
810 if (j) \
811 safe_strcat(retbuf,", ", len, maxlen); \
812 else \
813 j = 1; \
814 safe_strcat(retbuf, attacks[i], len, maxlen); \
815 } \
816 safe_strcat(retbuf,")",len,maxlen); \
817 }
818
819
820 /* separated this from the common/item.c file. b.t. Dec 1995 */
821
822 #define DESCRIBE_ABILITY(retbuf, variable, name) \
823 if(variable) { \
824 int i,j=0; \
825 strcat(retbuf,"(" name ": "); \
826 for(i=0; i<NROFATTACKS; i++) \
827 if(variable & (1<<i)) { \
828 if (j) \
829 strcat(retbuf,", "); \
830 else \
831 j = 1; \
832 strcat(retbuf, attacks[i]); \
833 } \
834 strcat(retbuf,")"); \
835 }
836
837
838 #define DESCRIBE_PATH(retbuf, variable, name) \
839 if(variable) { \
840 int i,j=0; \
841 strcat(retbuf,"(" name ": "); \
842 for(i=0; i<NRSPELLPATHS; i++) \
843 if(variable & (1<<i)) { \
844 if (j) \
845 strcat(retbuf,", "); \
846 else \
847 j = 1; \
848 strcat(retbuf, spellpathnames[i]); \
849 } \
850 strcat(retbuf,")"); \
851 }
852
853
854 #define DESCRIBE_PATH_SAFE(retbuf, variable, name, len, maxlen) \
855 if(variable) { \
856 int i,j=0; \
857 safe_strcat(retbuf,"(" name ": ", len, maxlen); \
858 for(i=0; i<NRSPELLPATHS; i++) \
859 if(variable & (1<<i)) { \
860 if (j) \
861 safe_strcat(retbuf,", ", len, maxlen); \
862 else \
863 j = 1; \
864 safe_strcat(retbuf, spellpathnames[i], len, maxlen); \
865 } \
866 safe_strcat(retbuf,")", len, maxlen); \
867 }
868
869 /* Flags for apply_special() */
870 enum apply_flag
871 {
872 /* Basic flags/mode, always use one of these */
873 AP_TOGGLE = 0,
874 AP_APPLY = 1,
875 AP_UNAPPLY = 2,
876
877 AP_BASIC_FLAGS = 0x0f,
878
879 /* Optional flags, for bitwise or with a basic flag */
880 AP_NO_MERGE = 0x10,
881 AP_IGNORE_CURSE = 0x20,
882 AP_PRINT = 0x40, /* Print what to do, don't actually do it */
883 AP_NO_READY = 0x80, // do not ready skill associated with skilltool.
884 };
885
886 /* Bitmask values for 'can_apply_object()' return values.
887 * the CAN_APPLY_ prefix is to just note what function the
888 * are returned from.
889 *
890 * CAN_APPLY_NEVER: who will never be able to use this - requires a body
891 * location who doesn't have.
892 * CAN_APPLY_RESTRICTION: There is some restriction from using this item -
893 * this basically means one of the FLAGS are set saying you can't
894 * use this.
895 * CAN_APPLY_NOT_MASK - this can be used to check the return value to see
896 * if this object can do anything to use this object. If the value
897 * returned from can_apply_object() anded with the mask is non zero,
898 * then it is out of the control of this creature to use the item.
899 * otherwise it means that by unequipping stuff, they could apply the object
900 * CAN_APPLY_UNAPPLY: Player needs to unapply something before applying
901 * this.
902 * CAN_APPLY_UNAPPLY_MULT: There are multiple items that need to be
903 * unapplied before this can be applied. Think of switching to
904 * a bow but you have a sword & shield - both the sword and
905 * shield need to be uneqipped before you can do the bow.
906 * CAN_APPLY_UNAPPLY_CHOICE: There is a choice of items to unapply before
907 * this one can be applied. Think of rings - human is wearing two
908 * rings and tries to apply one - there are two possible rings he
909 * could remove.
910 *
911 */
912 #define CAN_APPLY_NEVER 0x1
913 #define CAN_APPLY_RESTRICTION 0x2
914 #define CAN_APPLY_NOT_MASK 0xf
915 #define CAN_APPLY_UNAPPLY 0x10
916 #define CAN_APPLY_UNAPPLY_MULT 0x20
917 #define CAN_APPLY_UNAPPLY_CHOICE 0x40
918
919 /* Cut off point of when an object is put on the active list or not */
920 #define MIN_ACTIVE_SPEED 1e-5
921
922 #define RANDOM() (rndm.next () & 0xffffffU)
923 #define SRANDOM(xyz) rndm.seed (xyz) //TODO, get rid of
924
925 /* Returns the weight of the given object. Note: it does not take the number of
926 * items (nrof) into account.
927 */
928 #define WEIGHT(op) (op->nrof?op->weight:op->weight+op->carrying)
929
930
931 /* Code fastening defines
932 * FAST_STRCAT & FAST_STRNCAT will add buf2__ at position pointed by
933 * buf__ and increment buf__ position so it will point to the end of buf__.
934 * the '\0' caracter will not be put at end of buf__.
935 * use preparefastcat and finishfastcat on buf__ to prepare
936 * and clean up the string. (Lots faster than doing each time...)
937 * If you use them and have choice between FAST_STRCAT and FAST_STRNCAT,
938 * keep in mind FAST_STRNCAT is faster since length of second argument is
939 * kown in advance.
940 */
941
942 #define PREPARE_FASTCAT(buf__) buf__+strlen(buf__)
943 #define FAST_STRNCAT(buf__,buf2__,size__) {memcpy (buf__,buf2__,size__);buf__+=size__;}
944 #define FAST_STRCAT(buf__,buf2__) {memcpy (buf__,buf2__,strlen(buf2__));buf__+=strlen(buf2__);}
945 #define FINISH_FASTCAT(buf__) buf__[0]='\0';
946
947 /*
948 * Warning!
949 * If you add message types here, don't forget
950 * to keep the client up to date too!
951 */
952
953 /* message types */
954 #define MSG_TYPE_BOOK 1
955 #define MSG_TYPE_CARD 2
956 #define MSG_TYPE_PAPER 3
957 #define MSG_TYPE_SIGN 4
958 #define MSG_TYPE_MONUMENT 5
959 #define MSG_TYPE_SCRIPTED_DIALOG 6
960 #define MSG_TYPE_MOTD 7
961 #define MSG_TYPE_ADMIN 8
962 #define MSG_TYPE_LAST 9
963
964 #define MSG_SUBTYPE_NONE 0
965
966 /* book messages subtypes */
967 #define MSG_TYPE_BOOK_CLASP_1 1
968 #define MSG_TYPE_BOOK_CLASP_2 2
969 #define MSG_TYPE_BOOK_ELEGANT_1 3
970 #define MSG_TYPE_BOOK_ELEGANT_2 4
971 #define MSG_TYPE_BOOK_QUARTO_1 5
972 #define MSG_TYPE_BOOK_QUARTO_2 6
973 #define MSG_TYPE_BOOK_SPELL_EVOKER 7
974 #define MSG_TYPE_BOOK_SPELL_PRAYER 8
975 #define MSG_TYPE_BOOK_SPELL_PYRO 9
976 #define MSG_TYPE_BOOK_SPELL_SORCERER 10
977 #define MSG_TYPE_BOOK_SPELL_SUMMONER 11
978
979 /* card messages subtypes*/
980 #define MSG_TYPE_CARD_SIMPLE_1 1
981 #define MSG_TYPE_CARD_SIMPLE_2 2
982 #define MSG_TYPE_CARD_SIMPLE_3 3
983 #define MSG_TYPE_CARD_ELEGANT_1 4
984 #define MSG_TYPE_CARD_ELEGANT_2 5
985 #define MSG_TYPE_CARD_ELEGANT_3 6
986 #define MSG_TYPE_CARD_STRANGE_1 7
987 #define MSG_TYPE_CARD_STRANGE_2 8
988 #define MSG_TYPE_CARD_STRANGE_3 9
989 #define MSG_TYPE_CARD_MONEY_1 10
990 #define MSG_TYPE_CARD_MONEY_2 11
991 #define MSG_TYPE_CARD_MONEY_3 12
992
993 /* Paper messages subtypes */
994 #define MSG_TYPE_PAPER_NOTE_1 1
995 #define MSG_TYPE_PAPER_NOTE_2 2
996 #define MSG_TYPE_PAPER_NOTE_3 3
997 #define MSG_TYPE_PAPER_LETTER_OLD_1 4
998 #define MSG_TYPE_PAPER_LETTER_OLD_2 5
999 #define MSG_TYPE_PAPER_LETTER_NEW_1 6
1000 #define MSG_TYPE_PAPER_LETTER_NEW_2 7
1001 #define MSG_TYPE_PAPER_ENVELOPE_1 8
1002 #define MSG_TYPE_PAPER_ENVELOPE_2 9
1003 #define MSG_TYPE_PAPER_SCROLL_OLD_1 10
1004 #define MSG_TYPE_PAPER_SCROLL_OLD_2 11
1005 #define MSG_TYPE_PAPER_SCROLL_NEW_1 12
1006 #define MSG_TYPE_PAPER_SCROLL_NEW_2 13
1007 #define MSG_TYPE_PAPER_SCROLL_MAGIC 14
1008
1009 /* road signs messages subtypes */
1010 #define MSG_TYPE_SIGN_BASIC 1
1011 #define MSG_TYPE_SIGN_DIR_LEFT 2
1012 #define MSG_TYPE_SIGN_DIR_RIGHT 3
1013 #define MSG_TYPE_SIGN_DIR_BOTH 4
1014
1015 /* stones and monument messages */
1016 #define MSG_TYPE_MONUMENT_STONE_1 1
1017 #define MSG_TYPE_MONUMENT_STONE_2 2
1018 #define MSG_TYPE_MONUMENT_STONE_3 3
1019 #define MSG_TYPE_MONUMENT_STATUE_1 4
1020 #define MSG_TYPE_MONUMENT_STATUE_2 5
1021 #define MSG_TYPE_MONUMENT_STATUE_3 6
1022 #define MSG_TYPE_MONUMENT_GRAVESTONE_1 7
1023 #define MSG_TYPE_MONUMENT_GRAVESTONE_2 8
1024 #define MSG_TYPE_MONUMENT_GRAVESTONE_3 9
1025 #define MSG_TYPE_MONUMENT_WALL_1 10
1026 #define MSG_TYPE_MONUMENT_WALL_2 11
1027 #define MSG_TYPE_MONUMENT_WALL_3 12
1028
1029 /*some readable flags*/
1030
1031 /* dialog messsage */
1032 #define MSG_TYPE_DIALOG_NPC 1 /*A message from the npc */
1033 #define MSG_TYPE_DIALOG_ANSWER 2 /*One of possible answers */
1034 #define MSG_TYPE_DIALOG_ANSWER_COUNT 3 /*Number of possible answers */
1035
1036 /* admin messages */
1037 #define MSG_TYPE_ADMIN_RULES 1
1038 #define MSG_TYPE_ADMIN_NEWS 2
1039
1040 #endif /* DEFINE_H */
1041