//----------------------------------------------------------------- // Opens doors/destroys wall/shuts off triggers. void wall_toggle(segment *seg, int side) { int wall_num; if (seg - Segments > Highest_segment_index) { Warning("Can't toggle side %d of segment %d - nonexistent segment!\n", side, seg-Segments); return; } Assert( side < MAX_SIDES_PER_SEGMENT ); wall_num = seg->sides[side].wall_num; if (wall_num == -1) { mprintf((0, "Illegal wall_toggle\n")); return; } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_wall_toggle(seg-Segments, side ); if (Walls[wall_num].type == WALL_BLASTABLE) wall_destroy(seg, side); if ((Walls[wall_num].type == WALL_DOOR) && (Walls[wall_num].state == WALL_DOOR_CLOSED)) wall_open_door(seg, side); }
//----------------------------------------------------------------- // Opens doors/destroys wall/shuts off triggers. void wall_toggle(int segnum, int side) { int wall_num; if (segnum < 0 || segnum > Highest_segment_index || side < 0 || side >= MAX_SIDES_PER_SEGMENT) { #ifndef NDEBUG Warning("Can't toggle side %d (%i) of\nsegment %d (%i)!\n", side, MAX_SIDES_PER_SEGMENT, segnum, Highest_segment_index); #endif return; } wall_num = Segments[segnum].sides[side].wall_num; if (wall_num == -1) { return; } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_wall_toggle(segnum, side ); if (Walls[wall_num].type == WALL_BLASTABLE) wall_destroy(&Segments[segnum], side); if ((Walls[wall_num].type == WALL_DOOR) && (Walls[wall_num].state == WALL_DOOR_CLOSED)) wall_open_door(&Segments[segnum], side); }
//----------------------------------------------------------------- // Opens doors/destroys wall/shuts off triggers. void wall_toggle(segment *seg, int side) { int wall_num; Assert( seg-Segments <= Highest_segment_index); Assert( side < MAX_SIDES_PER_SEGMENT ); wall_num = seg->sides[side].wall_num; if (wall_num == -1) { return; } if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_wall_toggle(seg-Segments, side ); if (Walls[wall_num].type == WALL_BLASTABLE) wall_destroy(seg, side); if ((Walls[wall_num].type == WALL_DOOR) && (Walls[wall_num].state == WALL_DOOR_CLOSED)) wall_open_door(seg, side); }
//----------------------------------------------------------------- // 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) if (!is_door_free(&Segments[w->segnum],w->sidenum)) { digi_kill_sound_linked_to_segment(w->segnum,w->sidenum,-1); wall_open_door(&Segments[w->segnum],w->sidenum); //re-open door return; } 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) { mprintf((0, "Trying to do_door_close on Illegal wall\n")); return; } //if here, must be auto door // 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 // 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_num(door_num); } }
//----------------------------------------------------------------- // Determines what happens when a wall is shot //returns info about wall. see wall.h for codes //obj is the object that hit...either a weapon or the player himself //playernum is the number the player who hit the wall or fired the weapon, //or -1 if a robot fired the weapon int wall_hit_process(segment *seg, int side, fix damage, int playernum, object *obj ) { wall *w; fix show_message; Assert (seg-Segments != -1); // If it is not a "wall" then just return. if ( seg->sides[side].wall_num < 0 ) return WHP_NOT_SPECIAL; w = &Walls[seg->sides[side].wall_num]; if ( Newdemo_state == ND_STATE_RECORDING ) newdemo_record_wall_hit_process( seg-Segments, side, damage, playernum ); if (w->type == WALL_BLASTABLE) { if (obj->ctype.laser_info.parent_type == OBJ_PLAYER) wall_damage(seg, side, damage); return WHP_BLASTABLE; } if (playernum != Player_num) //return if was robot fire return WHP_NOT_SPECIAL; Assert( playernum > -1 ); // Determine whether player is moving forward. If not, don't say negative // messages because he probably didn't intentionally hit the door. if (obj->type == OBJ_PLAYER) show_message = (vm_vec_dot(&obj->orient.fvec, &obj->mtype.phys_info.velocity) > 0); else if (obj->type == OBJ_ROBOT) show_message = 0; else if ((obj->type == OBJ_WEAPON) && (obj->ctype.laser_info.parent_type == OBJ_ROBOT)) show_message = 0; else show_message = 1; if (w->keys == KEY_BLUE) if (!(Players[playernum].flags & PLAYER_FLAGS_BLUE_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_BLUE,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->keys == KEY_RED) if (!(Players[playernum].flags & PLAYER_FLAGS_RED_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_RED,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->keys == KEY_GOLD) if (!(Players[playernum].flags & PLAYER_FLAGS_GOLD_KEY)) { if ( playernum==Player_num ) if (show_message) HUD_init_message("%s %s",TXT_YELLOW,TXT_ACCESS_DENIED); return WHP_NO_KEY; } if (w->type == WALL_DOOR) { if ((w->flags & WALL_DOOR_LOCKED ) && !(special_boss_opening_allowed(seg-Segments, side)) ) { if ( playernum==Player_num ) if (show_message) HUD_init_message(TXT_CANT_OPEN_DOOR); return WHP_NO_KEY; } else { if (w->state != WALL_DOOR_OPENING) { wall_open_door(seg, side); #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_door_open(seg-Segments, side,w->flags); #endif } return WHP_DOOR; } } return WHP_NOT_SPECIAL; //default is treat like normal wall }