示例#1
0
dboolean G_CheckSpot(int playernum, mapthing_t* mthing) {
    fixed_t         x;
    fixed_t         y;
    subsector_t*    ss;
    angle_t         an;
    mobj_t*         mo;
    int             i;

    if(!players[playernum].mo) {
        // first spawn of level, before corpses
        for(i = 0; i < playernum; i++) {
            if((players[i].mo->x == INT2F(mthing->x)) && (players[i].mo->y == INT2F(mthing->y))) {
                return false;
            }
        }
        return true;
    }

    x = INT2F(mthing->x);
    y = INT2F(mthing->y);

    if(!P_CheckPosition(players[playernum].mo, x, y)) {
        return false;
    }

    // flush an old corpse if needed
    if(bodyqueslot >= BODYQUESIZE) {
        P_RemoveMobj(bodyque[bodyqueslot % BODYQUESIZE]);
    }

    bodyque[bodyqueslot%BODYQUESIZE] = players[playernum].mo;
    bodyqueslot++;

    // spawn a teleport fog
    ss = R_PointInSubsector(x, y);

    // 20120402 villsa - force angle_t typecast to avoid issues on 64-bit machines
    an = ANG45 * (angle_t)(mthing->angle / 45);

    mo = P_SpawnMobj(
             x + 20*dcos(an),
             y + 20*dsin(an),
             ss->sector->floorheight,
             MT_TELEPORTFOG
         );

    if(players[playernum].viewz != 1) {
        S_StartSound(mo, sfx_telept);    // don't start sound on first frame
    }

    return true;
}
示例#2
0
static CMD(SpawnThing) {
    int id = 0;
    player_t *player;
    mobj_t *thing;
    fixed_t x, y, z;

    if(gamestate != GS_LEVEL) {
        return;
    }

    if(!param[0]) {
        return;
    }

    if(netgame) {
        return;
    }

    id = datoi(param[0]);
    if(id >= NUMMOBJTYPES || id < 0) {
        return;
    }

    player = &players[consoleplayer];
    x = player->mo->x + FixedMul(INT2F(64) + mobjinfo[id].radius, dcos(player->mo->angle));
    y = player->mo->y + FixedMul(INT2F(64) + mobjinfo[id].radius, dsin(player->mo->angle));
    z = player->mo->z;

    thing = P_SpawnMobj(x, y, z, id);

    if(thing->info->spawnstate == S_000) {
        P_RemoveMobj(thing);
        return;
    }

    thing->angle = player->mo->angle;
}
示例#3
0
//
// P_UnArchiveWorld
//
void P_UnArchiveWorld(void) {
    int         i;
    int         j;
    sector_t    *sec;
    line_t      *li;
    light_t     *light;
    side_t      *si;

    // do sectors
    for(i = 0, sec = sectors; i < numsectors; i++, sec++) {
        sec->floorheight    = INT2F(saveg_read16());
        sec->ceilingheight  = INT2F(saveg_read16());
        sec->floorpic       = saveg_read16();
        sec->ceilingpic     = saveg_read16();
        sec->special        = saveg_read16();
        sec->tag            = saveg_read16();
        sec->flags          = saveg_read16();
        sec->lightlevel     = saveg_read16();
        sec->xoffset        = saveg_read32();
        sec->yoffset        = saveg_read32();

        saveg_set_mobjtarget(&sec->soundtarget, saveg_read_mobjindex());

        for(j = 0; j < 5; j++) {
            sec->colors[j]  = saveg_read16();
        }

        sec->specialdata    = 0;
    }

    // do lines
    for(i = 0, li = lines; i < numlines; i++, li++) {
        li->flags           = (saveg_read16() << 16);
        li->flags           = li->flags | (saveg_read16() & 0xFFFF);
        li->special         = saveg_read16();
        li->tag             = saveg_read16();

        for(j = 0; j < 2; j++) {
            if(li->sidenum[j] == NO_SIDE_INDEX) {
                continue;
            }

            si                  = &sides[li->sidenum[j]];
            si->textureoffset   = INT2F(saveg_read16());
            si->rowoffset       = INT2F(saveg_read16());
            si->toptexture      = saveg_read16();
            si->bottomtexture   = saveg_read16();
            si->midtexture      = saveg_read16();
        }
    }

    // do lights
    for(i = 0, light = lights; i < numlights; i++, light++) {
        light->base_r       = saveg_read8();
        light->base_g       = saveg_read8();
        light->base_b       = saveg_read8();
        light->active_r     = saveg_read8();
        light->active_g     = saveg_read8();
        light->active_b     = saveg_read8();
        light->r            = saveg_read8();
        light->g            = saveg_read8();
        light->b            = saveg_read8();
        saveg_read_pad();
        light->tag          = saveg_read16();
    }
}