void C_DECL A_PotteryExplode(mobj_t* actor) { int i, maxBits = (P_Random() & 3) + 3; mobj_t* potteryBit; for(i = 0; i < maxBits; ++i) { if((potteryBit = P_SpawnMobj(MT_POTTERYBIT1, actor->origin, P_Random() << 24, 0))) { P_MobjChangeState(potteryBit, P_GetState(potteryBit->type, SN_SPAWN) + (P_Random() % 5)); potteryBit->mom[MZ] = FIX2FLT(((P_Random() & 7) + 5) * (3 * FRACUNIT / 4)); potteryBit->mom[MX] = FIX2FLT((P_Random() - P_Random()) << 10); potteryBit->mom[MY] = FIX2FLT((P_Random() - P_Random()) << 10); } } S_StartSound(SFX_POTTERY_EXPLODE, potteryBit); if(actor->args[0]) { // Spawn an item. if(!G_Ruleset_NoMonsters() || !(MOBJINFO[TranslateThingType[actor->args[0]]]. flags & MF_COUNTKILL)) { // Only spawn monsters if not -nomonsters. P_SpawnMobj(TranslateThingType[actor->args[0]], actor->origin, actor->angle, 0); } } P_MobjRemove(actor, false); }
dd_bool EV_ThingSpawn(byte *args, dd_bool fog) { int tid, searcher; angle_t angle; mobj_t *mobj, *newMobj, *fogMobj; mobjtype_t moType; dd_bool success; //coord_t z; success = false; searcher = -1; tid = args[0]; moType = TranslateThingType[args[1]]; if(G_Ruleset_NoMonsters() && (MOBJINFO[moType].flags & MF_COUNTKILL)) { // Don't spawn monsters if -nomonsters return false; } angle = (int) args[2] << 24; while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL) { //z = mobj->origin[VZ]; if((newMobj = P_SpawnMobj(moType, mobj->origin, angle, 0))) { if(P_TestMobjLocation(newMobj) == false) { // Didn't fit P_MobjRemove(newMobj, true); } else { if(fog) { if((fogMobj = P_SpawnMobjXYZ(MT_TFOG, mobj->origin[VX], mobj->origin[VY], mobj->origin[VZ] + TELEFOGHEIGHT, angle + ANG180, 0))) S_StartSound(SFX_TELEPORT, fogMobj); } newMobj->flags2 |= MF2_DROPPED; // Don't respawn if(newMobj->flags2 & MF2_FLOATBOB) { newMobj->special1 = FLT2FIX(newMobj->origin[VZ] - newMobj->floorZ); } success = true; } } } return success; }
dd_bool EV_ThingProjectile(byte* args, dd_bool gravity) { uint an; int tid, searcher; angle_t angle; coord_t speed, vspeed; mobjtype_t moType; mobj_t* mobj, *newMobj; dd_bool success; success = false; searcher = -1; tid = args[0]; moType = TranslateThingType[args[1]]; if(G_Ruleset_NoMonsters() && (MOBJINFO[moType].flags & MF_COUNTKILL)) { // Don't spawn monsters if -nomonsters return false; } angle = (int) args[2] << 24; an = angle >> ANGLETOFINESHIFT; speed = FIX2FLT((int) args[3] << 13); vspeed = FIX2FLT((int) args[4] << 13); while((mobj = P_FindMobjFromTID(tid, &searcher)) != NULL) { if((newMobj = P_SpawnMobj(moType, mobj->origin, angle, 0))) { if(newMobj->info->seeSound) S_StartSound(newMobj->info->seeSound, newMobj); newMobj->target = mobj; // Originator newMobj->mom[MX] = speed * FIX2FLT(finecosine[an]); newMobj->mom[MY] = speed * FIX2FLT(finesine[an]); newMobj->mom[MZ] = vspeed; newMobj->flags2 |= MF2_DROPPED; // Don't respawn if(gravity == true) { newMobj->flags &= ~MF_NOGRAVITY; newMobj->flags2 |= MF2_LOGRAV; } if(P_CheckMissileSpawn(newMobj) == true) { success = true; } } } return success; }