static int osdcmd_spawn(const osdfuncparm_t *parm) { long x=0,y=0,z=0; unsigned short cstat=0,picnum=0; unsigned char pal=0; short ang=0; short set=0, idx; if (numplayers > 1 || !(ps[myconnectindex].gm & MODE_GAME)) { OSD_Printf("spawn: Can't spawn sprites in multiplayer games or demos\n"); return OSDCMD_OK; } switch (parm->numparms) { case 7: // x,y,z x = Batol(parm->parms[4]); y = Batol(parm->parms[5]); z = Batol(parm->parms[6]); set |= 8; case 4: // ang ang = Batol(parm->parms[3]) & 2047; set |= 4; case 3: // cstat cstat = (unsigned short)Batol(parm->parms[2]); set |= 2; case 2: // pal pal = (unsigned char)Batol(parm->parms[1]); set |= 1; case 1: // tile number if (isdigit(parm->parms[0][0])) { picnum = (unsigned short)Batol(parm->parms[0]); } else { int i,j; for (j=0; j<2; j++) { for (i=0; i<labelcnt; i++) { if ( (j == 0 && !Bstrcmp(label+(i<<6), parm->parms[0])) || (j == 1 && !Bstrcasecmp(label+(i<<6), parm->parms[0])) ) { picnum = (unsigned short)labelcode[i]; break; } } if (i<labelcnt) break; } if (i==labelcnt) { OSD_Printf("spawn: Invalid tile label given\n"); return OSDCMD_OK; } } if (picnum >= MAXTILES) { OSD_Printf("spawn: Invalid tile number\n"); return OSDCMD_OK; } break; default: return OSDCMD_SHOWHELP; } idx = spawn(ps[myconnectindex].i, (short)picnum); if (set & 1) sprite[idx].pal = (char)pal; if (set & 2) sprite[idx].cstat = (short)cstat; if (set & 4) sprite[idx].ang = ang; if (set & 8) { if (setsprite(idx, x,y,z) < 0) { OSD_Printf("spawn: Sprite can't be spawned into null space\n"); deletesprite(idx); } } return OSDCMD_OK; }
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); }