コード例 #1
0
ファイル: osdcmds.c プロジェクト: jonof/duke3d-megaton
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;
}
コード例 #2
0
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);    
    }