1 /* $Id: */ 2 /* 3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX 4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO 5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A 6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS 7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS 8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE 9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE 10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS 11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. 12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. 13 */ 14 15 #ifndef _WALL_H 16 #define _WALL_H 17 18 #include "inferno.h" 19 #include "segment.h" 20 #include "object.h" 21 #include "cfile.h" 22 23 //#include "vclip.h" 24 25 #define MAX_WALLS 254 // Maximum number of walls 26 #define MAX_WALL_ANIMS 60 // Maximum different types of doors 27 #define MAX_DOORS 90 // Maximum number of open doors 28 29 // Various wall types. 30 #define WALL_NORMAL 0 // Normal wall 31 #define WALL_BLASTABLE 1 // Removable (by shooting) wall 32 #define WALL_DOOR 2 // Door 33 #define WALL_ILLUSION 3 // Wall that appears to be there, but you can fly thru 34 #define WALL_OPEN 4 // Just an open side. (Trigger) 35 #define WALL_CLOSED 5 // Wall. Used for transparent walls. 36 #define WALL_OVERLAY 6 // Goes over an actual solid side. For triggers 37 #define WALL_CLOAKED 7 // Can see it, and see through it 38 39 // Various wall flags. 40 #define WALL_BLASTED 1 // Blasted out wall. 41 #define WALL_DOOR_OPENED 2 // Open door. 42 #define WALL_DOOR_LOCKED 8 // Door is locked. 43 #define WALL_DOOR_AUTO 16 // Door automatically closes after time. 44 #define WALL_ILLUSION_OFF 32 // Illusionary wall is shut off. 45 #define WALL_WALL_SWITCH 64 // This wall is openable by a wall switch. 46 #define WALL_BUDDY_PROOF 128 // Buddy assumes he cannot get through this wall. 47 48 // Wall states 49 #define WALL_DOOR_CLOSED 0 // Door is closed 50 #define WALL_DOOR_OPENING 1 // Door is opening. 51 #define WALL_DOOR_WAITING 2 // Waiting to close 52 #define WALL_DOOR_CLOSING 3 // Door is closing 53 #define WALL_DOOR_OPEN 4 // Door is open, and staying open 54 #define WALL_DOOR_CLOAKING 5 // Wall is going from closed -> open 55 #define WALL_DOOR_DECLOAKING 6 // Wall is going from open -> closed 56 57 //note: a door is considered opened (i.e., it has WALL_OPENED set) when it 58 //is more than half way open. Thus, it can have any of OPENING, CLOSING, 59 //or WAITING bits set when OPENED is set. 60 61 #define KEY_NONE 1 62 #define KEY_BLUE 2 63 #define KEY_RED 4 64 #define KEY_GOLD 8 65 66 #define WALL_HPS 100*F1_0 // Normal wall's hp 67 #define WALL_DOOR_INTERVAL 5*F1_0 // How many seconds a door is open 68 69 #define DOOR_OPEN_TIME i2f(2) // How long takes to open 70 #define DOOR_WAIT_TIME i2f(5) // How long before auto door closes 71 72 #define MAX_CLIP_FRAMES 50 73 74 // WALL_IS_DOORWAY flags. 75 #define WID_FLY_FLAG 1 76 #define WID_RENDER_FLAG 2 77 #define WID_RENDPAST_FLAG 4 78 #define WID_EXTERNAL_FLAG 8 79 #define WID_CLOAKED_FLAG 16 80 81 //@@// WALL_IS_DOORWAY return values F/R/RP 82 //@@#define WID_WALL 2 // 0/1/0 wall 83 //@@#define WID_TRANSPARENT_WALL 6 // 0/1/1 transparent wall 84 //@@#define WID_ILLUSORY_WALL 3 // 1/1/0 illusory wall 85 //@@#define WID_TRANSILLUSORY_WALL 7 // 1/1/1 transparent illusory wall 86 //@@#define WID_NO_WALL 5 // 1/0/1 no wall, can fly through 87 //@@#define WID_EXTERNAL 8 // 0/0/0/1 don't see it, dont fly through it 88 89 #define MAX_STUCK_OBJECTS 32 90 91 typedef struct stuckobj { 92 short objnum, wallnum; 93 int signature; 94 } stuckobj; 95 96 //Start old wall structures 97 98 typedef struct v16_wall { 99 byte type; // What kind of special wall. 100 byte flags; // Flags for the wall. 101 fix hps; // "Hit points" of the wall. 102 byte trigger; // Which trigger is associated with the wall. 103 byte clip_num; // Which animation associated with the wall. 104 byte keys; 105 } __pack__ v16_wall; 106 107 typedef struct v19_wall { 108 int segnum,sidenum; // Seg & side for this wall 109 byte type; // What kind of special wall. 110 byte flags; // Flags for the wall. 111 fix hps; // "Hit points" of the wall. 112 byte trigger; // Which trigger is associated with the wall. 113 byte clip_num; // Which animation associated with the wall. 114 byte keys; 115 int linked_wall; // number of linked wall 116 } __pack__ v19_wall; 117 118 typedef struct v19_door { 119 int n_parts; // for linked walls 120 short seg[2]; // Segment pointer of door. 121 short side[2]; // Side number of door. 122 short type[2]; // What kind of door animation. 123 fix open; // How long it has been open. 124 } __pack__ v19_door; 125 126 //End old wall structures 127 128 typedef struct wall { 129 int segnum,sidenum; // Seg & side for this wall 130 fix hps; // "Hit points" of the wall. 131 int linked_wall; // number of linked wall 132 ubyte type; // What kind of special wall. 133 ubyte flags; // Flags for the wall. 134 ubyte state; // Opening, closing, etc. 135 byte trigger; // Which trigger is associated with the wall. 136 byte clip_num; // Which animation associated with the wall. 137 ubyte keys; // which keys are required 138 byte controlling_trigger;// which trigger causes something to happen here. Not like "trigger" above, which is the trigger on this wall. 139 // Note: This gets stuffed at load time in gamemine.c. Don't try to use it in the editor. You will be sorry! 140 byte cloak_value; // if this wall is cloaked, the fade value 141 } __pack__ wall; 142 143 typedef struct active_door { 144 int n_parts; // for linked walls 145 short front_wallnum[2]; // front wall numbers for this door 146 short back_wallnum[2]; // back wall numbers for this door 147 fix time; // how long been opening, closing, waiting 148 } __pack__ active_door; 149 150 typedef struct cloaking_wall { 151 short front_wallnum; // front wall numbers for this door 152 short back_wallnum; // back wall numbers for this door 153 fix front_ls[4]; // front wall saved light values 154 fix back_ls[4]; // back wall saved light values 155 fix time; // how long been cloaking or decloaking 156 } __pack__ cloaking_wall; 157 158 //wall clip flags 159 #define WCF_EXPLODES 1 //door explodes when opening 160 #define WCF_BLASTABLE 2 //this is a blastable wall 161 #define WCF_TMAP1 4 //this uses primary tmap, not tmap2 162 #define WCF_HIDDEN 8 //this uses primary tmap, not tmap2 163 164 typedef struct { 165 fix play_time; 166 short num_frames; 167 short frames[MAX_CLIP_FRAMES]; 168 short open_sound; 169 short close_sound; 170 short flags; 171 char filename[13]; 172 char pad; 173 } __pack__ wclip; 174 175 extern char Wall_names[7][10]; 176 177 //#define WALL_IS_DOORWAY(seg,side) wall_is_doorway(seg, side) 178 179 #define WALL_IS_DOORWAY(seg,side) (((seg)->children[(side)] == -1) ? WID_RENDER_FLAG : ((seg)->children[(side)] == -2) ? WID_EXTERNAL_FLAG : ((seg)->sides[(side)].wall_num == -1) ? (WID_FLY_FLAG|WID_RENDPAST_FLAG) : wall_is_doorway((seg), (side))) 180 181 extern wall Walls[MAX_WALLS]; // Master walls array 182 extern int Num_walls; // Number of walls 183 184 extern active_door ActiveDoors[MAX_DOORS]; // Master doors array 185 extern int Num_open_doors; // Number of open doors 186 187 extern cloaking_wall CloakingWalls[]; 188 extern int Num_cloaking_walls; 189 190 extern wclip WallAnims[MAX_WALL_ANIMS]; 191 extern int Num_wall_anims; 192 193 extern int walls_bm_num[MAX_WALL_ANIMS]; 194 195 // Initializes all walls (i.e. no special walls.) 196 extern void wall_init(); 197 198 // Automatically checks if a there is a doorway (i.e. can fly through) 199 extern int wall_is_doorway ( segment *seg, int side ); 200 201 // Deteriorate appearance of wall. (Changes bitmap (paste-ons)) 202 extern void wall_damage(segment *seg, int side, fix damage); 203 204 // Destroys a blastable wall. (So it is an opening afterwards) 205 extern void wall_destroy(segment *seg, int side); 206 207 void wall_illusion_on(segment *seg, int side); 208 209 void wall_illusion_off(segment *seg, int side); 210 211 // Opens a door, including animation and other processing. 212 void do_door_open(int door_num); 213 214 // Closes a door, including animation and other processing. 215 void do_door_close(int door_num); 216 217 // Opens a door 218 extern void wall_open_door(segment *seg, int side); 219 220 // Closes a door 221 extern void wall_close_door(segment *seg, int side); 222 223 //return codes for wall_hit_process() 224 #define WHP_NOT_SPECIAL 0 //wasn't a quote-wall-unquote 225 #define WHP_NO_KEY 1 //hit door, but didn't have key 226 #define WHP_BLASTABLE 2 //hit blastable wall 227 #define WHP_DOOR 3 //a door (which will now be opening) 228 229 // Determines what happens when a wall is shot 230 //obj is the object that hit...either a weapon or the player himself 231 extern int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *obj ); 232 233 // Opens/destroys specified door. 234 extern void wall_toggle(segment *seg, int side); 235 236 // Tidy up Walls array for load/save purposes. 237 extern void reset_walls(); 238 239 // Called once per frame.. 240 void wall_frame_process(); 241 242 extern stuckobj Stuck_objects[MAX_STUCK_OBJECTS]; 243 244 // An object got stuck in a door (like a flare). 245 // Add global entry. 246 extern void add_stuck_object(object *objp, int segnum, int sidenum); 247 extern void remove_obsolete_stuck_objects(void); 248 249 //set the tmap_num or tmap_num2 field for a wall/door 250 extern void wall_set_tmap_num(segment *seg,int side,segment *csegp,int cside,int anim_num,int frame_num); 251 252 // Remove any flares from a wall 253 void kill_stuck_objects(int wallnum); 254 255 //start wall open <-> closed transitions 256 void start_wall_cloak(segment *seg, int side); 257 void start_wall_decloak(segment *seg, int side); 258 259 extern int wclip_read_n_d1(wclip *wc, int n, CFILE *fp); 260 #ifdef FAST_FILE_IO 261 #define wclip_read_n(wc, n, fp) cfread(wc, sizeof(wclip), n, fp) 262 #define v16_wall_read(w, fp) cfread(w, sizeof(v16_wall), 1, fp) 263 #define v19_wall_read(w, fp) cfread(w, sizeof(v19_wall), 1, fp) 264 #define wall_read(w, fp) cfread(w, sizeof(wall), 1, fp) 265 #define v19_door_read(d, fp) cfread(d, sizeof(v19_door), 1, fp) 266 #define active_door_read(d, fp) cfread(d, sizeof(active_door), 1, fp) 267 #else 268 /* 269 * reads n wclip structs from a CFILE 270 */ 271 extern int wclip_read_n(wclip *wc, int n, CFILE *fp); 272 273 /* 274 * reads a v16_wall structure from a CFILE 275 */ 276 extern void v16_wall_read(v16_wall *w, CFILE *fp); 277 278 /* 279 * reads a v19_wall structure from a CFILE 280 */ 281 extern void v19_wall_read(v19_wall *w, CFILE *fp); 282 283 /* 284 * reads a wall structure from a CFILE 285 */ 286 extern void wall_read(wall *w, CFILE *fp); 287 288 /* 289 * reads a v19_door structure from a CFILE 290 */ 291 extern void v19_door_read(v19_door *d, CFILE *fp); 292 293 /* 294 * reads an active_door structure from a CFILE 295 */ 296 extern void active_door_read(active_door *ad, CFILE *fp); 297 #endif 298 299 #endif 300