Move */main/wall.c -> similar/main/wall.c
This commit is contained in:
parent
c1f9bcbf64
commit
d2e3ed0228
|
@ -396,6 +396,7 @@ class DXXProgram(DXXCommon):
|
||||||
'main/terrain.c',
|
'main/terrain.c',
|
||||||
'main/texmerge.c',
|
'main/texmerge.c',
|
||||||
'main/vclip.c',
|
'main/vclip.c',
|
||||||
|
'main/wall.c',
|
||||||
'mem/mem.c',
|
'mem/mem.c',
|
||||||
'misc/hash.c',
|
'misc/hash.c',
|
||||||
'misc/physfsx.c',
|
'misc/physfsx.c',
|
||||||
|
@ -642,7 +643,6 @@ class D1XProgram(DXXProgram):
|
||||||
'main/switch.c',
|
'main/switch.c',
|
||||||
'main/text.c',
|
'main/text.c',
|
||||||
'main/titles.c',
|
'main/titles.c',
|
||||||
'main/wall.c',
|
|
||||||
'main/weapon.c',
|
'main/weapon.c',
|
||||||
'misc/args.c',
|
'misc/args.c',
|
||||||
#'tracker/client/tracker_client.c'
|
#'tracker/client/tracker_client.c'
|
||||||
|
@ -744,7 +744,6 @@ class D2XProgram(DXXProgram):
|
||||||
'main/switch.c',
|
'main/switch.c',
|
||||||
'main/text.c',
|
'main/text.c',
|
||||||
'main/titles.c',
|
'main/titles.c',
|
||||||
'main/wall.c',
|
|
||||||
'main/weapon.c',
|
'main/weapon.c',
|
||||||
'misc/args.c',
|
'misc/args.c',
|
||||||
'misc/physfsrwops.c',
|
'misc/physfsrwops.c',
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,45 +11,16 @@ AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
|
||||||
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Destroyable wall stuff
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "pstypes.h"
|
|
||||||
#include "gr.h"
|
|
||||||
#include "wall.h"
|
#include "wall.h"
|
||||||
#include "switch.h"
|
|
||||||
#include "inferno.h"
|
|
||||||
#include "segment.h"
|
|
||||||
#include "dxxerror.h"
|
|
||||||
#include "gameseg.h"
|
|
||||||
#include "game.h"
|
|
||||||
#include "bm.h"
|
|
||||||
#include "vclip.h"
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "gauges.h"
|
|
||||||
#include "text.h"
|
#include "text.h"
|
||||||
#include "fireball.h"
|
#include "fireball.h"
|
||||||
#include "textures.h"
|
#include "textures.h"
|
||||||
#include "sounds.h"
|
|
||||||
#include "newdemo.h"
|
#include "newdemo.h"
|
||||||
#include "multi.h"
|
#include "multi.h"
|
||||||
#include "gameseq.h"
|
#include "hudmsg.h"
|
||||||
#include "laser.h" // For seeing if a flare is stuck in a wall.
|
#include "laser.h" // For seeing if a flare is stuck in a wall.
|
||||||
#include "collide.h"
|
|
||||||
#include "effects.h"
|
#include "effects.h"
|
||||||
#include "byteswap.h"
|
|
||||||
|
|
||||||
#ifdef EDITOR
|
|
||||||
#include "editor/editor.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Special door on boss level which is locked if not in multiplayer...sorry for this awful solution --MK.
|
// Special door on boss level which is locked if not in multiplayer...sorry for this awful solution --MK.
|
||||||
#define BOSS_LOCKED_DOOR_LEVEL 7
|
#define BOSS_LOCKED_DOOR_LEVEL 7
|
||||||
|
@ -61,23 +32,19 @@ int Num_walls=0; // Number of walls
|
||||||
|
|
||||||
wclip WallAnims[MAX_WALL_ANIMS]; // Wall animations
|
wclip WallAnims[MAX_WALL_ANIMS]; // Wall animations
|
||||||
int Num_wall_anims;
|
int Num_wall_anims;
|
||||||
//--unused-- int walls_bm_num[MAX_WALL_ANIMS];
|
|
||||||
|
|
||||||
//door Doors[MAX_DOORS]; // Master doors array
|
|
||||||
|
|
||||||
active_door ActiveDoors[MAX_DOORS];
|
active_door ActiveDoors[MAX_DOORS];
|
||||||
int Num_open_doors; // Number of open doors
|
int Num_open_doors; // Number of open doors
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
|
#include "collide.h"
|
||||||
#define CLOAKING_WALL_TIME f1_0
|
#define CLOAKING_WALL_TIME f1_0
|
||||||
|
|
||||||
#define MAX_CLOAKING_WALLS 10
|
#define MAX_CLOAKING_WALLS 10
|
||||||
cloaking_wall CloakingWalls[MAX_CLOAKING_WALLS];
|
cloaking_wall CloakingWalls[MAX_CLOAKING_WALLS];
|
||||||
int Num_cloaking_walls;
|
int Num_cloaking_walls;
|
||||||
|
|
||||||
//--unused-- grs_bitmap *wall_title_bms[MAX_WALL_ANIMS];
|
#endif
|
||||||
|
|
||||||
//#define BM_FLAG_TRANSPARENT 1
|
|
||||||
//#define BM_FLAG_SUPER_TRANSPARENT 2
|
|
||||||
|
|
||||||
#ifdef EDITOR
|
#ifdef EDITOR
|
||||||
char Wall_names[7][10] = {
|
char Wall_names[7][10] = {
|
||||||
|
@ -91,7 +58,6 @@ char Wall_names[7][10] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Function prototypes
|
|
||||||
void kill_stuck_objects(int wallnum);
|
void kill_stuck_objects(int wallnum);
|
||||||
|
|
||||||
|
|
||||||
|
@ -175,8 +141,10 @@ int wall_is_doorway ( segment * seg, int side )
|
||||||
if (flags & WALL_DOOR_OPENED)
|
if (flags & WALL_DOOR_OPENED)
|
||||||
return WID_TRANSILLUSORY_WALL;
|
return WID_TRANSILLUSORY_WALL;
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
if (type == WALL_CLOAKED)
|
if (type == WALL_CLOAKED)
|
||||||
return WID_RENDER_FLAG | WID_RENDPAST_FLAG | WID_CLOAKED_FLAG;
|
return WID_RENDER_FLAG | WID_RENDPAST_FLAG | WID_CLOAKED_FLAG;
|
||||||
|
#endif
|
||||||
|
|
||||||
state = Walls[seg->sides[side].wall_num].state;
|
state = Walls[seg->sides[side].wall_num].state;
|
||||||
if ((type == WALL_DOOR) && (state == WALL_DOOR_OPENING))
|
if ((type == WALL_DOOR) && (state == WALL_DOOR_OPENING))
|
||||||
|
@ -207,7 +175,9 @@ void wall_init()
|
||||||
Walls[i].linked_wall = -1;
|
Walls[i].linked_wall = -1;
|
||||||
}
|
}
|
||||||
Num_open_doors = 0;
|
Num_open_doors = 0;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
Num_cloaking_walls = 0;
|
Num_cloaking_walls = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,7 +241,9 @@ void blast_blastable_wall(segment *seg, int side)
|
||||||
|
|
||||||
Assert(seg->sides[side].wall_num != -1);
|
Assert(seg->sides[side].wall_num != -1);
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
Walls[seg->sides[side].wall_num].hps = -1; //say it's blasted
|
Walls[seg->sides[side].wall_num].hps = -1; //say it's blasted
|
||||||
|
#endif
|
||||||
|
|
||||||
csegp = &Segments[seg->children[side]];
|
csegp = &Segments[seg->children[side]];
|
||||||
Connectside = find_connect_side(seg, csegp);
|
Connectside = find_connect_side(seg, csegp);
|
||||||
|
@ -322,8 +294,13 @@ void wall_damage(segment *seg, int side, fix damage)
|
||||||
|
|
||||||
if (Walls[seg->sides[side].wall_num].type != WALL_BLASTABLE)
|
if (Walls[seg->sides[side].wall_num].type != WALL_BLASTABLE)
|
||||||
return;
|
return;
|
||||||
|
int hps;
|
||||||
if (!(Walls[seg->sides[side].wall_num].flags & WALL_BLASTED) && Walls[seg->sides[side].wall_num].hps >= 0)
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
hps = 0;
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
hps = Walls[seg->sides[side].wall_num].hps;
|
||||||
|
#endif
|
||||||
|
if (!(Walls[seg->sides[side].wall_num].flags & WALL_BLASTED) && hps >= 0)
|
||||||
{
|
{
|
||||||
int Connectside;
|
int Connectside;
|
||||||
segment *csegp;
|
segment *csegp;
|
||||||
|
@ -343,7 +320,15 @@ void wall_damage(segment *seg, int side, fix damage)
|
||||||
blast_blastable_wall( seg, side );
|
blast_blastable_wall( seg, side );
|
||||||
#ifdef NETWORK
|
#ifdef NETWORK
|
||||||
if (Game_mode & GM_MULTI)
|
if (Game_mode & GM_MULTI)
|
||||||
multi_send_door_open(seg-Segments, side,Walls[seg->sides[side].wall_num].flags);
|
{
|
||||||
|
int flags;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
flags = 0;
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
flags = Walls[seg->sides[side].wall_num].flags;
|
||||||
|
#endif
|
||||||
|
multi_send_door_open(seg-Segments, side,flags);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -371,9 +356,12 @@ void wall_open_door(segment *seg, int side)
|
||||||
//kill_stuck_objects(seg->sides[side].wall_num);
|
//kill_stuck_objects(seg->sides[side].wall_num);
|
||||||
|
|
||||||
if ((w->state == WALL_DOOR_OPENING) || //already opening
|
if ((w->state == WALL_DOOR_OPENING) || //already opening
|
||||||
(w->state == WALL_DOOR_WAITING) || //open, waiting to close
|
(w->state == WALL_DOOR_WAITING)) //open, waiting to close
|
||||||
(w->state == WALL_DOOR_OPEN)) //open, & staying open
|
|
||||||
return;
|
return;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
|
if ((w->state == WALL_DOOR_OPEN)) //open, & staying open
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (w->state == WALL_DOOR_CLOSING) { //closing, so reuse door
|
if (w->state == WALL_DOOR_CLOSING) { //closing, so reuse door
|
||||||
|
|
||||||
|
@ -478,6 +466,48 @@ void wall_open_door(segment *seg, int side)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
// This function closes the specified door and restores the closed
|
||||||
|
// door texture. This is called when the animation is done
|
||||||
|
void wall_close_door(int door_num)
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
active_door *d;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
d = &ActiveDoors[door_num];
|
||||||
|
|
||||||
|
for (p=0;p<d->n_parts;p++) {
|
||||||
|
wall *w;
|
||||||
|
int Connectside, side;
|
||||||
|
segment *csegp, *seg;
|
||||||
|
|
||||||
|
w = &Walls[d->front_wallnum[p]];
|
||||||
|
|
||||||
|
seg = &Segments[w->segnum];
|
||||||
|
side = w->sidenum;
|
||||||
|
|
||||||
|
Assert(seg->sides[side].wall_num != -1); //Closing door on illegal wall
|
||||||
|
|
||||||
|
csegp = &Segments[seg->children[side]];
|
||||||
|
Connectside = find_connect_side(seg, csegp);
|
||||||
|
Assert(Connectside != -1);
|
||||||
|
|
||||||
|
Walls[seg->sides[side].wall_num].state = WALL_DOOR_CLOSED;
|
||||||
|
Walls[csegp->sides[Connectside].wall_num].state = WALL_DOOR_CLOSED;
|
||||||
|
|
||||||
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=door_num;i<Num_open_doors;i++)
|
||||||
|
ActiveDoors[i] = ActiveDoors[i+1];
|
||||||
|
|
||||||
|
Num_open_doors--;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
// start the transition from closed -> open wall
|
// start the transition from closed -> open wall
|
||||||
void start_wall_cloak(segment *seg, int side)
|
void start_wall_cloak(segment *seg, int side)
|
||||||
|
@ -649,6 +679,7 @@ void start_wall_decloak(segment *seg, int side)
|
||||||
d->back_ls[i] = csegp->sides[Connectside].uvls[i].l;
|
d->back_ls[i] = csegp->sides[Connectside].uvls[i].l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
// This function closes the specified door and restores the closed
|
// This function closes the specified door and restores the closed
|
||||||
|
@ -665,14 +696,14 @@ void wall_close_door_num(int door_num)
|
||||||
wall *w;
|
wall *w;
|
||||||
int Connectside, side;
|
int Connectside, side;
|
||||||
segment *csegp, *seg;
|
segment *csegp, *seg;
|
||||||
|
|
||||||
w = &Walls[d->front_wallnum[p]];
|
w = &Walls[d->front_wallnum[p]];
|
||||||
|
|
||||||
seg = &Segments[w->segnum];
|
seg = &Segments[w->segnum];
|
||||||
side = w->sidenum;
|
side = w->sidenum;
|
||||||
|
|
||||||
Assert(seg->sides[side].wall_num != -1); //Closing door on illegal wall
|
Assert(seg->sides[side].wall_num != -1); //Closing door on illegal wall
|
||||||
|
|
||||||
csegp = &Segments[seg->children[side]];
|
csegp = &Segments[seg->children[side]];
|
||||||
Connectside = find_connect_side(seg, csegp);
|
Connectside = find_connect_side(seg, csegp);
|
||||||
Assert(Connectside != -1);
|
Assert(Connectside != -1);
|
||||||
|
@ -680,7 +711,7 @@ void wall_close_door_num(int door_num)
|
||||||
Walls[seg->sides[side].wall_num].state = WALL_DOOR_CLOSED;
|
Walls[seg->sides[side].wall_num].state = WALL_DOOR_CLOSED;
|
||||||
if (cwall_num > -1)
|
if (cwall_num > -1)
|
||||||
Walls[cwall_num].state = WALL_DOOR_CLOSED;
|
Walls[cwall_num].state = WALL_DOOR_CLOSED;
|
||||||
|
|
||||||
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,0);
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -705,13 +736,121 @@ int check_poke(int objnum,int segnum,int side)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// Animates and processes the closing of a door.
|
||||||
|
// Called from the game loop.
|
||||||
|
void do_door_close(int door_num)
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
active_door *d;
|
||||||
|
wall *w;
|
||||||
|
|
||||||
|
Assert(door_num != -1); //Trying to do_door_open on illegal door
|
||||||
|
|
||||||
|
d = &ActiveDoors[door_num];
|
||||||
|
|
||||||
|
w = &Walls[d->front_wallnum[0]];
|
||||||
|
|
||||||
|
//check for objects in doorway before closing
|
||||||
|
if (w->flags & WALL_DOOR_AUTO)
|
||||||
|
for (p=0;p<d->n_parts;p++) {
|
||||||
|
int Connectside, side;
|
||||||
|
segment *csegp, *seg;
|
||||||
|
int objnum;
|
||||||
|
|
||||||
|
seg = &Segments[w->segnum];
|
||||||
|
side = w->sidenum;
|
||||||
|
|
||||||
|
csegp = &Segments[seg->children[side]];
|
||||||
|
Connectside = find_connect_side(seg, csegp);
|
||||||
|
Assert(Connectside != -1);
|
||||||
|
|
||||||
|
//go through each object in each of two segments, and see if
|
||||||
|
//it pokes into the connecting seg
|
||||||
|
|
||||||
|
for (objnum=seg->objects;objnum!=-1;objnum=Objects[objnum].next)
|
||||||
|
if (check_poke(objnum,seg-Segments,side))
|
||||||
|
return; //abort!
|
||||||
|
|
||||||
|
for (objnum=csegp->objects;objnum!=-1;objnum=Objects[objnum].next)
|
||||||
|
if (check_poke(objnum,csegp-Segments,Connectside))
|
||||||
|
return; //abort!
|
||||||
|
}
|
||||||
|
|
||||||
|
for (p=0;p<d->n_parts;p++) {
|
||||||
|
wall *w;
|
||||||
|
int Connectside, side;
|
||||||
|
segment *csegp, *seg;
|
||||||
|
fix time_elapsed, time_total, one_frame;
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
w = &Walls[d->front_wallnum[p]];
|
||||||
|
|
||||||
|
seg = &Segments[w->segnum];
|
||||||
|
side = w->sidenum;
|
||||||
|
|
||||||
|
if (seg->sides[side].wall_num == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if here, must be auto door
|
||||||
|
Assert(Walls[seg->sides[side].wall_num].flags & WALL_DOOR_AUTO);
|
||||||
|
|
||||||
|
// Otherwise, close it.
|
||||||
|
csegp = &Segments[seg->children[side]];
|
||||||
|
Connectside = find_connect_side(seg, csegp);
|
||||||
|
Assert(Connectside != -1);
|
||||||
|
|
||||||
|
|
||||||
|
if ( Newdemo_state != ND_STATE_PLAYBACK )
|
||||||
|
// NOTE THE LINK TO ABOVE!!
|
||||||
|
if (p==0) //only play one sound for linked doors
|
||||||
|
if ( d->time==0 ) { //first time
|
||||||
|
vms_vector cp;
|
||||||
|
compute_center_point_on_side(&cp, seg, side );
|
||||||
|
if (WallAnims[w->clip_num].close_sound > -1 )
|
||||||
|
digi_link_sound_to_pos( WallAnims[Walls[seg->sides[side].wall_num].clip_num].close_sound, seg-Segments, side, &cp, 0, F1_0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
d->time += FrameTime;
|
||||||
|
|
||||||
|
time_elapsed = d->time;
|
||||||
|
n = WallAnims[w->clip_num].num_frames;
|
||||||
|
time_total = WallAnims[w->clip_num].play_time;
|
||||||
|
|
||||||
|
one_frame = time_total/n;
|
||||||
|
|
||||||
|
i = n-time_elapsed/one_frame-1;
|
||||||
|
|
||||||
|
if (i < n/2) {
|
||||||
|
Walls[seg->sides[side].wall_num].flags &= ~WALL_DOOR_OPENED;
|
||||||
|
Walls[csegp->sides[Connectside].wall_num].flags &= ~WALL_DOOR_OPENED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Animate door.
|
||||||
|
if (i > 0) {
|
||||||
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,i);
|
||||||
|
|
||||||
|
Walls[seg->sides[side].wall_num].state = WALL_DOOR_CLOSING;
|
||||||
|
Walls[csegp->sides[Connectside].wall_num].state = WALL_DOOR_CLOSING;
|
||||||
|
|
||||||
|
ActiveDoors[Num_open_doors].time = 0; //counts up
|
||||||
|
|
||||||
|
} else
|
||||||
|
wall_close_door(door_num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
//returns true of door in unobjstructed (& thus can close)
|
//returns true of door in unobjstructed (& thus can close)
|
||||||
int is_door_free(segment *seg,int side)
|
int is_door_free(segment *seg,int side)
|
||||||
{
|
{
|
||||||
int Connectside;
|
int Connectside;
|
||||||
segment *csegp;
|
segment *csegp;
|
||||||
int objnum;
|
int objnum;
|
||||||
|
|
||||||
csegp = &Segments[seg->children[side]];
|
csegp = &Segments[seg->children[side]];
|
||||||
Connectside = find_connect_side(seg, csegp);
|
Connectside = find_connect_side(seg, csegp);
|
||||||
Assert(Connectside != -1);
|
Assert(Connectside != -1);
|
||||||
|
@ -756,13 +895,13 @@ void wall_close_door(segment *seg, int side)
|
||||||
if (w->state == WALL_DOOR_OPENING) { //reuse door
|
if (w->state == WALL_DOOR_OPENING) { //reuse door
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
d = NULL;
|
d = NULL;
|
||||||
|
|
||||||
for (i=0;i<Num_open_doors;i++) { //find door
|
for (i=0;i<Num_open_doors;i++) { //find door
|
||||||
|
|
||||||
d = &ActiveDoors[i];
|
d = &ActiveDoors[i];
|
||||||
|
|
||||||
if (d->front_wallnum[0]==wall_num || d->back_wallnum[0]==wall_num ||
|
if (d->front_wallnum[0]==wall_num || d->back_wallnum[0]==wall_num ||
|
||||||
(d->n_parts==2 && (d->front_wallnum[1]==wall_num || d->back_wallnum[1]==wall_num)))
|
(d->n_parts==2 && (d->front_wallnum[1]==wall_num || d->back_wallnum[1]==wall_num)))
|
||||||
break;
|
break;
|
||||||
|
@ -775,7 +914,7 @@ void wall_close_door(segment *seg, int side)
|
||||||
|
|
||||||
if (d->time < 0)
|
if (d->time < 0)
|
||||||
d->time = 0;
|
d->time = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
else { //create new door
|
else { //create new door
|
||||||
Assert(w->state == WALL_DOOR_OPEN);
|
Assert(w->state == WALL_DOOR_OPEN);
|
||||||
|
@ -821,6 +960,7 @@ void wall_close_door(segment *seg, int side)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
// Animates opening of a door.
|
// Animates opening of a door.
|
||||||
|
@ -833,7 +973,7 @@ void do_door_open(int door_num)
|
||||||
// Assert(door_num != -1); //Trying to do_door_open on illegal door
|
// Assert(door_num != -1); //Trying to do_door_open on illegal door
|
||||||
if (door_num == -1)
|
if (door_num == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
d = &ActiveDoors[door_num];
|
d = &ActiveDoors[door_num];
|
||||||
|
|
||||||
for (p=0;p<d->n_parts;p++) {
|
for (p=0;p<d->n_parts;p++) {
|
||||||
|
@ -842,43 +982,43 @@ void do_door_open(int door_num)
|
||||||
segment *csegp, *seg;
|
segment *csegp, *seg;
|
||||||
fix time_elapsed, time_total, one_frame;
|
fix time_elapsed, time_total, one_frame;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
w = &Walls[d->front_wallnum[p]];
|
w = &Walls[d->front_wallnum[p]];
|
||||||
kill_stuck_objects(d->front_wallnum[p]);
|
kill_stuck_objects(d->front_wallnum[p]);
|
||||||
kill_stuck_objects(d->back_wallnum[p]);
|
kill_stuck_objects(d->back_wallnum[p]);
|
||||||
|
|
||||||
seg = &Segments[w->segnum];
|
seg = &Segments[w->segnum];
|
||||||
side = w->sidenum;
|
side = w->sidenum;
|
||||||
|
|
||||||
// Assert(seg->sides[side].wall_num != -1); //Trying to do_door_open on illegal wall
|
// Assert(seg->sides[side].wall_num != -1); //Trying to do_door_open on illegal wall
|
||||||
if (seg->sides[side].wall_num == -1)
|
if (seg->sides[side].wall_num == -1)
|
||||||
{
|
{
|
||||||
con_printf(CON_URGENT, "Trying to do_door_open on illegal wall %i. Please check your level!\n",side);
|
con_printf(CON_URGENT, "Trying to do_door_open on illegal wall %i. Please check your level!\n",side);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
csegp = &Segments[seg->children[side]];
|
csegp = &Segments[seg->children[side]];
|
||||||
Connectside = find_connect_side(seg, csegp);
|
Connectside = find_connect_side(seg, csegp);
|
||||||
Assert(Connectside != -1);
|
Assert(Connectside != -1);
|
||||||
|
|
||||||
d->time += FrameTime;
|
d->time += FrameTime;
|
||||||
|
|
||||||
time_elapsed = d->time;
|
time_elapsed = d->time;
|
||||||
n = WallAnims[w->clip_num].num_frames;
|
n = WallAnims[w->clip_num].num_frames;
|
||||||
time_total = WallAnims[w->clip_num].play_time;
|
time_total = WallAnims[w->clip_num].play_time;
|
||||||
|
|
||||||
one_frame = time_total/n;
|
one_frame = time_total/n;
|
||||||
|
|
||||||
i = time_elapsed/one_frame;
|
i = time_elapsed/one_frame;
|
||||||
|
|
||||||
if (i < n)
|
if (i < n)
|
||||||
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,i);
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,i);
|
||||||
|
|
||||||
if (i> n/2) {
|
if (i> n/2) {
|
||||||
Walls[seg->sides[side].wall_num].flags |= WALL_DOOR_OPENED;
|
Walls[seg->sides[side].wall_num].flags |= WALL_DOOR_OPENED;
|
||||||
Walls[csegp->sides[Connectside].wall_num].flags |= WALL_DOOR_OPENED;
|
Walls[csegp->sides[Connectside].wall_num].flags |= WALL_DOOR_OPENED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= n-1) {
|
if (i >= n-1) {
|
||||||
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,n-1);
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,n-1);
|
||||||
|
|
||||||
|
@ -887,8 +1027,10 @@ void do_door_open(int door_num)
|
||||||
for (i=door_num;i<Num_open_doors;i++)
|
for (i=door_num;i<Num_open_doors;i++)
|
||||||
ActiveDoors[i] = ActiveDoors[i+1];
|
ActiveDoors[i] = ActiveDoors[i+1];
|
||||||
Num_open_doors--;
|
Num_open_doors--;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
Walls[seg->sides[side].wall_num].state = WALL_DOOR_OPEN;
|
Walls[seg->sides[side].wall_num].state = WALL_DOOR_OPEN;
|
||||||
Walls[csegp->sides[Connectside].wall_num].state = WALL_DOOR_OPEN;
|
Walls[csegp->sides[Connectside].wall_num].state = WALL_DOOR_OPEN;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
|
@ -903,6 +1045,7 @@ void do_door_open(int door_num)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
// Animates and processes the closing of a door.
|
// Animates and processes the closing of a door.
|
||||||
// Called from the game loop.
|
// Called from the game loop.
|
||||||
|
@ -913,7 +1056,7 @@ void do_door_close(int door_num)
|
||||||
wall *w;
|
wall *w;
|
||||||
|
|
||||||
Assert(door_num != -1); //Trying to do_door_open on illegal door
|
Assert(door_num != -1); //Trying to do_door_open on illegal door
|
||||||
|
|
||||||
d = &ActiveDoors[door_num];
|
d = &ActiveDoors[door_num];
|
||||||
|
|
||||||
w = &Walls[d->front_wallnum[0]];
|
w = &Walls[d->front_wallnum[0]];
|
||||||
|
@ -932,25 +1075,25 @@ void do_door_close(int door_num)
|
||||||
segment *csegp, *seg;
|
segment *csegp, *seg;
|
||||||
fix time_elapsed, time_total, one_frame;
|
fix time_elapsed, time_total, one_frame;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
w = &Walls[d->front_wallnum[p]];
|
w = &Walls[d->front_wallnum[p]];
|
||||||
|
|
||||||
seg = &Segments[w->segnum];
|
seg = &Segments[w->segnum];
|
||||||
side = w->sidenum;
|
side = w->sidenum;
|
||||||
|
|
||||||
if (seg->sides[side].wall_num == -1) {
|
if (seg->sides[side].wall_num == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if here, must be auto door
|
//if here, must be auto door
|
||||||
// Assert(Walls[seg->sides[side].wall_num].flags & WALL_DOOR_AUTO);
|
// Assert(Walls[seg->sides[side].wall_num].flags & WALL_DOOR_AUTO);
|
||||||
//don't assert here, because now we have triggers to close non-auto doors
|
//don't assert here, because now we have triggers to close non-auto doors
|
||||||
|
|
||||||
// Otherwise, close it.
|
// Otherwise, close it.
|
||||||
csegp = &Segments[seg->children[side]];
|
csegp = &Segments[seg->children[side]];
|
||||||
Connectside = find_connect_side(seg, csegp);
|
Connectside = find_connect_side(seg, csegp);
|
||||||
Assert(Connectside != -1);
|
Assert(Connectside != -1);
|
||||||
|
|
||||||
|
|
||||||
if ( Newdemo_state != ND_STATE_PLAYBACK )
|
if ( Newdemo_state != ND_STATE_PLAYBACK )
|
||||||
// NOTE THE LINK TO ABOVE!!
|
// NOTE THE LINK TO ABOVE!!
|
||||||
|
@ -961,22 +1104,22 @@ void do_door_close(int door_num)
|
||||||
if (WallAnims[w->clip_num].close_sound > -1 )
|
if (WallAnims[w->clip_num].close_sound > -1 )
|
||||||
digi_link_sound_to_pos( WallAnims[Walls[seg->sides[side].wall_num].clip_num].close_sound, seg-Segments, side, &cp, 0, F1_0 );
|
digi_link_sound_to_pos( WallAnims[Walls[seg->sides[side].wall_num].clip_num].close_sound, seg-Segments, side, &cp, 0, F1_0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
d->time += FrameTime;
|
d->time += FrameTime;
|
||||||
|
|
||||||
time_elapsed = d->time;
|
time_elapsed = d->time;
|
||||||
n = WallAnims[w->clip_num].num_frames;
|
n = WallAnims[w->clip_num].num_frames;
|
||||||
time_total = WallAnims[w->clip_num].play_time;
|
time_total = WallAnims[w->clip_num].play_time;
|
||||||
|
|
||||||
one_frame = time_total/n;
|
one_frame = time_total/n;
|
||||||
|
|
||||||
i = n-time_elapsed/one_frame-1;
|
i = n-time_elapsed/one_frame-1;
|
||||||
|
|
||||||
if (i < n/2) {
|
if (i < n/2) {
|
||||||
Walls[seg->sides[side].wall_num].flags &= ~WALL_DOOR_OPENED;
|
Walls[seg->sides[side].wall_num].flags &= ~WALL_DOOR_OPENED;
|
||||||
Walls[csegp->sides[Connectside].wall_num].flags &= ~WALL_DOOR_OPENED;
|
Walls[csegp->sides[Connectside].wall_num].flags &= ~WALL_DOOR_OPENED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Animate door.
|
// Animate door.
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,i);
|
wall_set_tmap_num(seg,side,csegp,Connectside,w->clip_num,i);
|
||||||
|
@ -990,6 +1133,7 @@ void do_door_close(int door_num)
|
||||||
wall_close_door_num(door_num);
|
wall_close_door_num(door_num);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
|
@ -1011,8 +1155,10 @@ void wall_illusion_off(segment *seg, int side)
|
||||||
Walls[seg->sides[side].wall_num].flags |= WALL_ILLUSION_OFF;
|
Walls[seg->sides[side].wall_num].flags |= WALL_ILLUSION_OFF;
|
||||||
Walls[csegp->sides[cside].wall_num].flags |= WALL_ILLUSION_OFF;
|
Walls[csegp->sides[cside].wall_num].flags |= WALL_ILLUSION_OFF;
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
kill_stuck_objects(seg->sides[side].wall_num);
|
kill_stuck_objects(seg->sides[side].wall_num);
|
||||||
kill_stuck_objects(csegp->sides[cside].wall_num);
|
kill_stuck_objects(csegp->sides[cside].wall_num);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
|
@ -1068,7 +1214,9 @@ int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *
|
||||||
newdemo_record_wall_hit_process( seg-Segments, side, damage, playernum );
|
newdemo_record_wall_hit_process( seg-Segments, side, damage, playernum );
|
||||||
|
|
||||||
if (w->type == WALL_BLASTABLE) {
|
if (w->type == WALL_BLASTABLE) {
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
if (obj->ctype.laser_info.parent_type == OBJ_PLAYER)
|
if (obj->ctype.laser_info.parent_type == OBJ_PLAYER)
|
||||||
|
#endif
|
||||||
wall_damage(seg, side, damage);
|
wall_damage(seg, side, damage);
|
||||||
return WHP_BLASTABLE;
|
return WHP_BLASTABLE;
|
||||||
}
|
}
|
||||||
|
@ -1082,10 +1230,12 @@ int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *
|
||||||
// messages because he probably didn't intentionally hit the door.
|
// messages because he probably didn't intentionally hit the door.
|
||||||
if (obj->type == OBJ_PLAYER)
|
if (obj->type == OBJ_PLAYER)
|
||||||
show_message = (vm_vec_dot(&obj->orient.fvec, &obj->mtype.phys_info.velocity) > 0);
|
show_message = (vm_vec_dot(&obj->orient.fvec, &obj->mtype.phys_info.velocity) > 0);
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
else if (obj->type == OBJ_ROBOT)
|
else if (obj->type == OBJ_ROBOT)
|
||||||
show_message = 0;
|
show_message = 0;
|
||||||
else if ((obj->type == OBJ_WEAPON) && (obj->ctype.laser_info.parent_type == OBJ_ROBOT))
|
else if ((obj->type == OBJ_WEAPON) && (obj->ctype.laser_info.parent_type == OBJ_ROBOT))
|
||||||
show_message = 0;
|
show_message = 0;
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
show_message = 1;
|
show_message = 1;
|
||||||
|
|
||||||
|
@ -1127,7 +1277,15 @@ int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *
|
||||||
wall_open_door(seg, side);
|
wall_open_door(seg, side);
|
||||||
#ifdef NETWORK
|
#ifdef NETWORK
|
||||||
if (Game_mode & GM_MULTI)
|
if (Game_mode & GM_MULTI)
|
||||||
multi_send_door_open(seg-Segments, side,w->flags);
|
{
|
||||||
|
int flags;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
flags = 0;
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
flags = w->flags;
|
||||||
|
#endif
|
||||||
|
multi_send_door_open(seg-Segments, side,flags);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return WHP_DOOR;
|
return WHP_DOOR;
|
||||||
|
@ -1188,6 +1346,7 @@ void reset_walls()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
void do_cloaking_wall_frame(int cloaking_wall_num)
|
void do_cloaking_wall_frame(int cloaking_wall_num)
|
||||||
{
|
{
|
||||||
cloaking_wall *d;
|
cloaking_wall *d;
|
||||||
|
@ -1321,6 +1480,7 @@ void do_decloaking_wall_frame(int cloaking_wall_num)
|
||||||
newdemo_record_cloaking_wall(d->front_wallnum, d->back_wallnum, wfront->type, wfront->state, wfront->cloak_value, Segments[wfront->segnum].sides[wfront->sidenum].uvls[0].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[1].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[2].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[3].l);
|
newdemo_record_cloaking_wall(d->front_wallnum, d->back_wallnum, wfront->type, wfront->state, wfront->cloak_value, Segments[wfront->segnum].sides[wfront->sidenum].uvls[0].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[1].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[2].l, Segments[wfront->segnum].sides[wfront->sidenum].uvls[3].l);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void wall_frame_process()
|
void wall_frame_process()
|
||||||
{
|
{
|
||||||
|
@ -1345,11 +1505,16 @@ void wall_frame_process()
|
||||||
if (d->back_wallnum[0] > -1)
|
if (d->back_wallnum[0] > -1)
|
||||||
Walls[d->back_wallnum[0]].flags |= WALL_DOOR_OPENED;
|
Walls[d->back_wallnum[0]].flags |= WALL_DOOR_OPENED;
|
||||||
|
|
||||||
if (d->time > DOOR_WAIT_TIME && is_door_free(&Segments[w->segnum],w->sidenum)) {
|
if (d->time > DOOR_WAIT_TIME)
|
||||||
w->state = WALL_DOOR_CLOSING;
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
d->time = 0;
|
if (is_door_free(&Segments[w->segnum],w->sidenum))
|
||||||
}
|
#endif
|
||||||
|
{
|
||||||
|
w->state = WALL_DOOR_CLOSING;
|
||||||
|
d->time = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
else if (w->state == WALL_DOOR_CLOSED || w->state == WALL_DOOR_OPEN) {
|
else if (w->state == WALL_DOOR_CLOSED || w->state == WALL_DOOR_OPEN) {
|
||||||
//this shouldn't happen. if the wall is in one of these states,
|
//this shouldn't happen. if the wall is in one of these states,
|
||||||
//there shouldn't be an activedoor entry for it. So we'll kill
|
//there shouldn't be an activedoor entry for it. So we'll kill
|
||||||
|
@ -1360,8 +1525,10 @@ void wall_frame_process()
|
||||||
ActiveDoors[t] = ActiveDoors[t+1];
|
ActiveDoors[t] = ActiveDoors[t+1];
|
||||||
Num_open_doors--;
|
Num_open_doors--;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
for (i=0;i<Num_cloaking_walls;i++) {
|
for (i=0;i<Num_cloaking_walls;i++) {
|
||||||
cloaking_wall *d;
|
cloaking_wall *d;
|
||||||
wall *w;
|
wall *w;
|
||||||
|
@ -1378,6 +1545,7 @@ void wall_frame_process()
|
||||||
Int3(); //unexpected wall state
|
Int3(); //unexpected wall state
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int Num_stuck_objects=0;
|
int Num_stuck_objects=0;
|
||||||
|
@ -1390,13 +1558,10 @@ void add_stuck_object(object *objp, int segnum, int sidenum)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int wallnum;
|
int wallnum;
|
||||||
|
|
||||||
wallnum = Segments[segnum].sides[sidenum].wall_num;
|
wallnum = Segments[segnum].sides[sidenum].wall_num;
|
||||||
|
|
||||||
if (wallnum != -1) {
|
if (wallnum != -1) {
|
||||||
if (Walls[wallnum].flags & WALL_BLASTED)
|
if (Walls[wallnum].flags & WALL_BLASTED)
|
||||||
objp->flags |= OF_SHOULD_BE_DEAD;
|
objp->flags |= OF_SHOULD_BE_DEAD;
|
||||||
|
|
||||||
for (i=0; i<MAX_STUCK_OBJECTS; i++) {
|
for (i=0; i<MAX_STUCK_OBJECTS; i++) {
|
||||||
if (Stuck_objects[i].wallnum == -1) {
|
if (Stuck_objects[i].wallnum == -1) {
|
||||||
Stuck_objects[i].wallnum = wallnum;
|
Stuck_objects[i].wallnum = wallnum;
|
||||||
|
@ -1407,11 +1572,27 @@ void add_stuck_object(object *objp, int segnum, int sidenum)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
// --------------------------------------------------------------------------------------------------
|
||||||
|
// Look at the list of stuck objects, clean up in case an object has gone away, but not been removed here.
|
||||||
|
// Removes up to one/frame.
|
||||||
|
void remove_obsolete_stuck_objects(void)
|
||||||
|
{
|
||||||
|
int objnum;
|
||||||
|
|
||||||
|
objnum = d_tick_count % MAX_STUCK_OBJECTS;
|
||||||
|
|
||||||
|
if (Stuck_objects[objnum].wallnum != -1)
|
||||||
|
if ((Stuck_objects[objnum].wallnum == 0) || (Objects[Stuck_objects[objnum].objnum].signature != Stuck_objects[objnum].signature)) {
|
||||||
|
Num_stuck_objects--;
|
||||||
|
Stuck_objects[objnum].wallnum = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
// --------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------
|
||||||
// Look at the list of stuck objects, clean up in case an object has gone away, but not been removed here.
|
// Look at the list of stuck objects, clean up in case an object has gone away, but not been removed here.
|
||||||
// Removes up to one/frame.
|
// Removes up to one/frame.
|
||||||
|
@ -1433,8 +1614,7 @@ void remove_obsolete_stuck_objects(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
extern void flush_fcd_cache(void);
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------------
|
||||||
// Door with wall index wallnum is opening, kill all objects stuck in it.
|
// Door with wall index wallnum is opening, kill all objects stuck in it.
|
||||||
|
@ -1451,38 +1631,26 @@ void kill_stuck_objects(int wallnum)
|
||||||
for (i=0; i<MAX_STUCK_OBJECTS; i++)
|
for (i=0; i<MAX_STUCK_OBJECTS; i++)
|
||||||
if (Stuck_objects[i].wallnum == wallnum) {
|
if (Stuck_objects[i].wallnum == wallnum) {
|
||||||
if (Objects[Stuck_objects[i].objnum].type == OBJ_WEAPON) {
|
if (Objects[Stuck_objects[i].objnum].type == OBJ_WEAPON) {
|
||||||
Objects[Stuck_objects[i].objnum].lifeleft = F1_0/8;
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
#define DXX_WEAPON_LIFELEFT F1_0/4
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
#define DXX_WEAPON_LIFELEFT F1_0/8
|
||||||
|
#endif
|
||||||
|
Objects[Stuck_objects[i].objnum].lifeleft = DXX_WEAPON_LIFELEFT;
|
||||||
}
|
}
|
||||||
Stuck_objects[i].wallnum = -1;
|
Stuck_objects[i].wallnum = -1;
|
||||||
} else if (Stuck_objects[i].wallnum != -1) {
|
} else if (Stuck_objects[i].wallnum != -1) {
|
||||||
Num_stuck_objects++;
|
Num_stuck_objects++;
|
||||||
}
|
}
|
||||||
// Ok, this is awful, but we need to do things whenever a door opens/closes/disappears, etc.
|
// Ok, this is awful, but we need to do things whenever a door opens/closes/disappears, etc.
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
|
extern void flush_fcd_cache(void);
|
||||||
flush_fcd_cache();
|
flush_fcd_cache();
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
// -- unused -- // -----------------------------------------------------------------------------------
|
|
||||||
// -- unused -- // Return object id of first flare found embedded in segp:sidenum.
|
|
||||||
// -- unused -- // If no flare, return -1.
|
|
||||||
// -- unused -- int contains_flare(segment *segp, int sidenum)
|
|
||||||
// -- unused -- {
|
|
||||||
// -- unused -- int i;
|
|
||||||
// -- unused --
|
|
||||||
// -- unused -- for (i=0; i<Num_stuck_objects; i++) {
|
|
||||||
// -- unused -- object *objp = &Objects[Stuck_objects[i].objnum];
|
|
||||||
// -- unused --
|
|
||||||
// -- unused -- if ((objp->type == OBJ_WEAPON) && (objp->id == FLARE_ID)) {
|
|
||||||
// -- unused -- if (Walls[Stuck_objects[i].wallnum].segnum == segp-Segments)
|
|
||||||
// -- unused -- if (Walls[Stuck_objects[i].wallnum].sidenum == sidenum)
|
|
||||||
// -- unused -- return objp-Objects;
|
|
||||||
// -- unused -- }
|
|
||||||
// -- unused -- }
|
|
||||||
// -- unused --
|
|
||||||
// -- unused -- return -1;
|
|
||||||
// -- unused -- }
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
// Initialize stuck objects array. Called at start of level
|
// Initialize stuck objects array. Called at start of level
|
||||||
void init_stuck_objects(void)
|
void init_stuck_objects(void)
|
||||||
|
@ -1610,6 +1778,7 @@ int wclip_read_n_d1(wclip *wc, int n, PHYSFS_file *fp)
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* reads a wclip structure from a PHYSFS_file
|
* reads a wclip structure from a PHYSFS_file
|
||||||
|
@ -1635,7 +1804,7 @@ int wclip_read_n(wclip *wc, int n, PHYSFS_file *fp)
|
||||||
/*
|
/*
|
||||||
* reads a v16_wall structure from a PHYSFS_file
|
* reads a v16_wall structure from a PHYSFS_file
|
||||||
*/
|
*/
|
||||||
extern void v16_wall_read(v16_wall *w, PHYSFS_file *fp)
|
void v16_wall_read(v16_wall *w, PHYSFS_file *fp)
|
||||||
{
|
{
|
||||||
w->type = PHYSFSX_readByte(fp);
|
w->type = PHYSFSX_readByte(fp);
|
||||||
w->flags = PHYSFSX_readByte(fp);
|
w->flags = PHYSFSX_readByte(fp);
|
||||||
|
@ -1648,7 +1817,7 @@ extern void v16_wall_read(v16_wall *w, PHYSFS_file *fp)
|
||||||
/*
|
/*
|
||||||
* reads a v19_wall structure from a PHYSFS_file
|
* reads a v19_wall structure from a PHYSFS_file
|
||||||
*/
|
*/
|
||||||
extern void v19_wall_read(v19_wall *w, PHYSFS_file *fp)
|
void v19_wall_read(v19_wall *w, PHYSFS_file *fp)
|
||||||
{
|
{
|
||||||
w->segnum = PHYSFSX_readInt(fp);
|
w->segnum = PHYSFSX_readInt(fp);
|
||||||
w->sidenum = PHYSFSX_readInt(fp);
|
w->sidenum = PHYSFSX_readInt(fp);
|
||||||
|
@ -1664,7 +1833,7 @@ extern void v19_wall_read(v19_wall *w, PHYSFS_file *fp)
|
||||||
/*
|
/*
|
||||||
* reads a wall structure from a PHYSFS_file
|
* reads a wall structure from a PHYSFS_file
|
||||||
*/
|
*/
|
||||||
extern void wall_read(wall *w, PHYSFS_file *fp)
|
void wall_read(wall *w, PHYSFS_file *fp)
|
||||||
{
|
{
|
||||||
w->segnum = PHYSFSX_readInt(fp);
|
w->segnum = PHYSFSX_readInt(fp);
|
||||||
w->sidenum = PHYSFSX_readInt(fp);
|
w->sidenum = PHYSFSX_readInt(fp);
|
||||||
|
@ -1676,8 +1845,15 @@ extern void wall_read(wall *w, PHYSFS_file *fp)
|
||||||
w->trigger = PHYSFSX_readByte(fp);
|
w->trigger = PHYSFSX_readByte(fp);
|
||||||
w->clip_num = PHYSFSX_readByte(fp);
|
w->clip_num = PHYSFSX_readByte(fp);
|
||||||
w->keys = PHYSFSX_readByte(fp);
|
w->keys = PHYSFSX_readByte(fp);
|
||||||
w->controlling_trigger = PHYSFSX_readByte(fp);
|
sbyte controlling_trigger = PHYSFSX_readByte(fp);
|
||||||
w->cloak_value = PHYSFSX_readByte(fp);
|
sbyte cloak_value = PHYSFSX_readByte(fp);
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
(void)controlling_trigger;
|
||||||
|
(void)cloak_value;
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
w->controlling_trigger = controlling_trigger;
|
||||||
|
w->cloak_value = cloak_value;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wall_swap(wall *w, int swap)
|
void wall_swap(wall *w, int swap)
|
||||||
|
@ -1788,20 +1964,28 @@ void wall_write(wall *w, short version, PHYSFS_file *fp)
|
||||||
|
|
||||||
if (version >= 20)
|
if (version >= 20)
|
||||||
{
|
{
|
||||||
PHYSFSX_writeU8(fp, w->controlling_trigger);
|
sbyte controlling_trigger;
|
||||||
PHYSFSX_writeU8(fp, w->cloak_value);
|
sbyte cloak_value;
|
||||||
|
#if defined(DXX_BUILD_DESCENT_I)
|
||||||
|
controlling_trigger = 0;
|
||||||
|
cloak_value = 0;
|
||||||
|
#elif defined(DXX_BUILD_DESCENT_II)
|
||||||
|
controlling_trigger = w->controlling_trigger;
|
||||||
|
cloak_value = w->cloak_value;
|
||||||
|
#endif
|
||||||
|
PHYSFSX_writeU8(fp, controlling_trigger);
|
||||||
|
PHYSFSX_writeU8(fp, cloak_value);
|
||||||
}
|
}
|
||||||
else if (version >= 17)
|
else if (version >= 17)
|
||||||
PHYSFS_writeSLE32(fp, w->linked_wall);
|
PHYSFS_writeSLE32(fp, w->linked_wall);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DXX_BUILD_DESCENT_II)
|
||||||
void cloaking_wall_swap(cloaking_wall *cw, int swap)
|
void cloaking_wall_swap(cloaking_wall *cw, int swap)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!swap)
|
if (!swap)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cw->front_wallnum = SWAPSHORT(cw->front_wallnum);
|
cw->front_wallnum = SWAPSHORT(cw->front_wallnum);
|
||||||
cw->back_wallnum = SWAPSHORT(cw->back_wallnum);
|
cw->back_wallnum = SWAPSHORT(cw->back_wallnum);
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
|
@ -1818,10 +2002,9 @@ void cloaking_wall_swap(cloaking_wall *cw, int swap)
|
||||||
void cloaking_wall_read_n_swap(cloaking_wall *cw, int n, int swap, PHYSFS_file *fp)
|
void cloaking_wall_read_n_swap(cloaking_wall *cw, int n, int swap, PHYSFS_file *fp)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
PHYSFS_read(fp, cw, sizeof(cloaking_wall), n);
|
PHYSFS_read(fp, cw, sizeof(cloaking_wall), n);
|
||||||
|
|
||||||
if (swap)
|
if (swap)
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
cloaking_wall_swap(&cw[i], swap);
|
cloaking_wall_swap(&cw[i], swap);
|
||||||
}
|
}
|
||||||
|
#endif
|
Loading…
Reference in a new issue