/* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. */ /* * * New Triggers and Switches. * */ #include #include #include #include #include "gauges.h" #include "game.h" #include "switch.h" #include "inferno.h" #include "segment.h" #include "error.h" #include "gameseg.h" #include "wall.h" #include "texmap.h" #include "fuelcen.h" #include "cntrlcen.h" #include "newdemo.h" #include "player.h" #include "endlevel.h" #include "gameseq.h" #include "multi.h" #include "palette.h" #include "byteswap.h" #ifdef EDITOR #include "editor/editor.h" #endif trigger Triggers[MAX_TRIGGERS]; int Num_triggers; //link Links[MAX_WALL_LINKS]; //int Num_links; #ifdef EDITOR fix trigger_time_count=F1_0; //----------------------------------------------------------------- // Initializes all the switches. void trigger_init() { int i; Num_triggers = 0; // Num_links = 0; for (i=0;isides[side].wall_num; if ( wall_num == -1 ) return; trigger_num = Walls[wall_num].trigger; if (trigger_num == -1) return; if (check_trigger_sub(trigger_num, Player_num)) return; if (Triggers[trigger_num].flags & TRIGGER_ONE_SHOT) { Triggers[trigger_num].flags &= ~TRIGGER_ON; csegp = &Segments[seg->children[side]]; cside = find_connect_side(seg, csegp); Assert(cside != -1); wall_num = csegp->sides[cside].wall_num; if ( wall_num == -1 ) return; ctrigger_num = Walls[wall_num].trigger; Triggers[ctrigger_num].flags &= ~TRIGGER_ON; } #ifndef SHAREWARE #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_trigger(trigger_num); #endif #endif } } void triggers_frame_process() { int i; for (i=0;i= 0) Triggers[i].time -= FrameTime; } /* * reads a v29_trigger structure from a PHYSFS_file */ extern void trigger_read(trigger *t, PHYSFS_file *fp) { int i; t->type = PHYSFSX_readByte(fp); t->flags = PHYSFSX_readShort(fp); t->value = PHYSFSX_readFix(fp); t->time = PHYSFSX_readFix(fp); t->link_num = PHYSFSX_readByte(fp); t->num_links = PHYSFSX_readShort(fp); for (i=0; iseg[i] = PHYSFSX_readShort(fp); for (i=0; iside[i] = PHYSFSX_readShort(fp); } void trigger_swap(trigger *t, int swap) { int i; if (!swap) return; t->flags = SWAPSHORT(t->flags); t->value = SWAPINT(t->value); t->time = SWAPINT(t->time); t->num_links = SWAPSHORT(t->num_links); for (i=0; iseg[i] = SWAPSHORT(t->seg[i]); for (i=0; iside[i] = SWAPSHORT(t->side[i]); } /* * reads n trigger structs from a PHYSFS_file and swaps if specified */ void trigger_read_n_swap(trigger *t, int n, int swap, PHYSFS_file *fp) { int i; PHYSFS_read(fp, t, sizeof(trigger), n); if (swap) for (i = 0; i < n; i++) trigger_swap(&t[i], swap); } void trigger_write(trigger *t, short version, PHYSFS_file *fp) { int i; if (version <= 29) PHYSFSX_writeU8(fp, 0); // unused 'type' else if (version >= 31) { if (t->flags & TRIGGER_CONTROL_DOORS) PHYSFSX_writeU8(fp, 0); // door else if (t->flags & TRIGGER_MATCEN) PHYSFSX_writeU8(fp, 2); // matcen else if (t->flags & TRIGGER_EXIT) PHYSFSX_writeU8(fp, 3); // exit else if (t->flags & TRIGGER_SECRET_EXIT) PHYSFSX_writeU8(fp, 4); // secret exit else if (t->flags & TRIGGER_ILLUSION_OFF) PHYSFSX_writeU8(fp, 5); // illusion off else if (t->flags & TRIGGER_ILLUSION_ON) PHYSFSX_writeU8(fp, 6); // illusion on } if (version <= 30) PHYSFS_writeSLE16(fp, t->flags); else PHYSFSX_writeU8(fp, (t->flags & TRIGGER_ONE_SHOT) ? 2 : 0); // flags if (version >= 30) { PHYSFSX_writeU8(fp, t->num_links); PHYSFSX_writeU8(fp, 0); // t->pad } PHYSFSX_writeFix(fp, t->value); PHYSFSX_writeFix(fp, t->time); if (version <= 29) { PHYSFSX_writeU8(fp, t->link_num); PHYSFS_writeSLE16(fp, t->num_links); } for (i = 0; i < MAX_WALLS_PER_LINK; i++) PHYSFS_writeSLE16(fp, t->seg[i]); for (i = 0; i < MAX_WALLS_PER_LINK; i++) PHYSFS_writeSLE16(fp, t->side[i]); }