///////////////////////////////////////////////////// // SpawnWallSound ///////////////////////////////////////////////////// void SpawnWallSound(short sndnum, short i) { short SpriteNum; vec3_t mid; SPRITEp sp; int handle; SpriteNum = COVERinsertsprite(0, STAT_DEFAULT); if (SpriteNum < 0) return; sp = &sprite[SpriteNum]; sp->cstat = 0; sp->extra = 0; // Get wall midpoint for offset in mirror view mid.x = (wall[i].x + wall[wall[i].point2].x) / 2; mid.y = (wall[i].y + wall[wall[i].point2].y) / 2; mid.z = (sector[wall[i].nextsector].ceilingz + sector[wall[i].nextsector].floorz) / 2; setspritez(SpriteNum, &mid); sp = &sprite[SpriteNum]; handle = PlaySound(sndnum, &sp->x, &sp->y, &sp->z, v3df_dontpan | v3df_doppler); if (handle != -1) Set3DSoundOwner(SpriteNum); }
int AutoBreakWall(WALLp wallp, long hitx, long hity, long hitz, short ang, short type) { BREAK_INFOp break_info; short BreakSprite; WALLp nwp; SPRITEp bsp; //DSPRINTF(ds,"wallnum %d, pic %d, lo %d, hi %d",wallp-wall, wallp->picnum, wallp->lotag, wallp->hitag); MONO_PRINT(ds); wallp->lotag = 0; if (wallp->nextwall >= 0) { nwp = &wall[wallp->nextwall]; // get rid of both sides // only break ONE of the walls if (nwp->lotag == TAG_WALL_BREAK && nwp->overpicnum > 0 && TEST(nwp->cstat, CSTAT_WALL_MASKED)) { nwp->lotag = 0; } } if (wallp->overpicnum > 0 && TEST(wallp->cstat, CSTAT_WALL_MASKED)) break_info = FindWallBreakInfo(wallp->overpicnum); else break_info = FindWallBreakInfo(wallp->picnum); if (!break_info) { //DSPRINTF(ds,"Break Info not found - wall %d", wallp - wall); MONO_PRINT(ds); return(FALSE); } // Check to see if it should break with current weapon type if(!CheckBreakToughness(break_info, type)) return(FALSE); if (hitx != MAXLONG) { // need correct location for spawning shrap BreakSprite = COVERinsertsprite(0, STAT_DEFAULT); ASSERT(BreakSprite >= 0); bsp = &sprite[BreakSprite]; bsp->cstat = 0; bsp->extra = 0; bsp->ang = ang; bsp->picnum = ST1; bsp->xrepeat = bsp->yrepeat = 64; setsprite(BreakSprite, hitx, hity, hitz); // pass Break Info Globally GlobBreakInfo = break_info; SpawnShrap(BreakSprite, -1); GlobBreakInfo = NULL; KillSprite(BreakSprite); } // change the wall if (wallp->overpicnum > 0 && TEST(wallp->cstat, CSTAT_WALL_MASKED)) { if (break_info->breaknum == -1) { RESET(wallp->cstat, CSTAT_WALL_MASKED|CSTAT_WALL_1WAY|CSTAT_WALL_BLOCK_HITSCAN|CSTAT_WALL_BLOCK); wallp->overpicnum = 0; if (wallp->nextwall >= 0) { nwp = &wall[wallp->nextwall]; RESET(nwp->cstat, CSTAT_WALL_MASKED|CSTAT_WALL_1WAY|CSTAT_WALL_BLOCK_HITSCAN|CSTAT_WALL_BLOCK); nwp->overpicnum = 0; } } else { RESET(wallp->cstat, CSTAT_WALL_BLOCK_HITSCAN|CSTAT_WALL_BLOCK); wallp->overpicnum = break_info->breaknum; if (wallp->nextwall >= 0) { nwp = &wall[wallp->nextwall]; RESET(nwp->cstat, CSTAT_WALL_BLOCK_HITSCAN|CSTAT_WALL_BLOCK); nwp->overpicnum = break_info->breaknum; } } } else { if (break_info->breaknum == -1) wallp->picnum = 594; // temporary break pic else { wallp->picnum = break_info->breaknum; if( wallp->hitag < 0) DoWallBreakSpriteMatch( wallp->hitag ); } } return(TRUE); }