From 6647b3b03465afb3c214db1f664333c041a15f52 Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Mon, 17 May 2004 21:16:28 +0000 Subject: [PATCH] took care of switches triggering single-sided walls (don't try to access the nonexistent adjacent wall via NULL pointers or negative array indices) --- ChangeLog | 17 ++++++++++++----- main/switch.c | 38 +++++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 82c91ff22..7822ec392 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-05-17 Dietfrid Mali + + * main/switch.c: took care of switches triggering single-sided + walls (don't try to access the nonexistent adjacent wall via NULL + pointers or negative array indices) + 2004-05-16 Dietfrid Mali * main/wall.c: fix invalid memory access for d1 levels which @@ -5,9 +11,10 @@ 2004-05-16 Martin Schaffner - * include/ogl_init.h, arch/ogl/*.c, arch/ogl/internal.h: - move most ogl-internal stuff from the ogl interface header to - new header file internal.h + * include/ogl_init.h, arch/ogl/glx.c, arch/ogl/gr.c, + arch/ogl/internal.h, arch/ogl/ogl.c, arch/ogl/sdlgl.c, + arch/ogl/wgl.c: move most ogl-internal stuff from the ogl + interface header to new header file internal.h 2004-05-15 Dietfrid Mali @@ -21,8 +28,8 @@ * main/laser.c: limit homing missile turn rate - * main/fuelcen.{c,h}, main/object.c: implement repair centers - (work like fuel centers but provide shield) + * main/fuelcen.c, main/fuelcen.h, main/object.c: implement repair + centers (work like fuel centers but provide shield) * main/gameseg.c: fix endless loop in some levels with a certain (complicated) structure diff --git a/main/switch.c b/main/switch.c index 0384fe786..2b127e910 100644 --- a/main/switch.c +++ b/main/switch.c @@ -1,4 +1,4 @@ -/* $Id: switch.c,v 1.9 2003-10-04 03:14:48 btb Exp $ */ +/* $Id: switch.c,v 1.10 2004-05-17 21:16:28 btb Exp $ */ /* THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO @@ -163,7 +163,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #endif #ifdef RCS -static char rcsid[] = "$Id: switch.c,v 1.9 2003-10-04 03:14:48 btb Exp $"; +static char rcsid[] = "$Id: switch.c,v 1.10 2004-05-17 21:16:28 btb Exp $"; #endif #include @@ -385,9 +385,17 @@ int do_change_walls(sbyte trigger_num) segp = &Segments[Triggers[trigger_num].seg[i]]; side = Triggers[trigger_num].side[i]; - csegp = &Segments[segp->children[side]]; - cside = find_connect_side(segp, csegp); - Assert(cside != -1); + if (segp->children[side] < 0) + { + csegp = NULL; + cside = -1; + } + else + { + csegp = &Segments[segp->children[side]]; + cside = find_connect_side(segp, csegp); + Assert(cside != -1); + } //segp->sides[side].wall_num = -1; //csegp->sides[cside].wall_num = -1; @@ -402,7 +410,9 @@ int do_change_walls(sbyte trigger_num) break; } - if (Walls[segp->sides[side].wall_num].type == new_wall_type && Walls[csegp->sides[cside].wall_num].type == new_wall_type) + if (Walls[segp->sides[side].wall_num].type == new_wall_type && + (cside < 0 || csegp->sides[cside].wall_num < 0 || + Walls[csegp->sides[cside].wall_num].type == new_wall_type)) continue; //already in correct state, so skip ret = 1; @@ -417,9 +427,12 @@ int do_change_walls(sbyte trigger_num) compute_center_point_on_side(&pos, segp, side ); digi_link_sound_to_pos( SOUND_FORCEFIELD_OFF, segp-Segments, side, &pos, 0, F1_0 ); Walls[segp->sides[side].wall_num].type = new_wall_type; - Walls[csegp->sides[cside].wall_num].type = new_wall_type; digi_kill_sound_linked_to_segment(segp-Segments,side,SOUND_FORCEFIELD_HUM); - digi_kill_sound_linked_to_segment(csegp-Segments,cside,SOUND_FORCEFIELD_HUM); + if (cside > -1 && csegp->sides[cside].wall_num > -1) + { + Walls[csegp->sides[cside].wall_num].type = new_wall_type; + digi_kill_sound_linked_to_segment(csegp-Segments, cside, SOUND_FORCEFIELD_HUM); + } } else start_wall_cloak(segp,side); @@ -436,7 +449,8 @@ int do_change_walls(sbyte trigger_num) compute_center_point_on_side(&pos, segp, side ); digi_link_sound_to_pos(SOUND_FORCEFIELD_HUM,segp-Segments,side,&pos,1, F1_0/2); Walls[segp->sides[side].wall_num].type = new_wall_type; - Walls[csegp->sides[cside].wall_num].type = new_wall_type; + if (cside > -1 && csegp->sides[cside].wall_num > -1) + Walls[csegp->sides[cside].wall_num].type = new_wall_type; } else start_wall_decloak(segp,side); @@ -445,13 +459,15 @@ int do_change_walls(sbyte trigger_num) case TT_ILLUSORY_WALL: mprintf((0,"Illusory wall\n")); Walls[segp->sides[side].wall_num].type = new_wall_type; - Walls[csegp->sides[cside].wall_num].type = new_wall_type; + if (cside > -1 && csegp->sides[cside].wall_num > -1) + Walls[csegp->sides[cside].wall_num].type = new_wall_type; break; } kill_stuck_objects(segp->sides[side].wall_num); - kill_stuck_objects(csegp->sides[cside].wall_num); + if (cside > -1 && csegp->sides[cside].wall_num > -1) + kill_stuck_objects(csegp->sides[cside].wall_num); } }