DEFINE_ACTION_FUNCTION(AActor, A_ShedShard) { PARAM_ACTION_PROLOGUE; AActor *mo; int spawndir = self->special1; int spermcount = self->special2; if (spermcount <= 0) { return 0; // No sperm left } self->special2 = 0; spermcount--; // every so many calls, spawn a new missile in its set directions if (spawndir & SHARDSPAWN_LEFT) { mo = P_SpawnMissileAngleZSpeed(self, self->Z(), RUNTIME_CLASS(AFrostMissile), self->Angles.Yaw + 5, 0, (20. + 2 * spermcount), self->target); if (mo) { mo->special1 = SHARDSPAWN_LEFT; mo->special2 = spermcount; mo->Vel.Z = self->Vel.Z; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_RIGHT) { mo = P_SpawnMissileAngleZSpeed(self, self->Z(), RUNTIME_CLASS(AFrostMissile), self->Angles.Yaw - 5, 0, (20. + 2 * spermcount), self->target); if (mo) { mo->special1 = SHARDSPAWN_RIGHT; mo->special2 = spermcount; mo->Vel.Z = self->Vel.Z; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_UP) { mo = P_SpawnMissileAngleZSpeed(self, self->Z() + 8., RUNTIME_CLASS(AFrostMissile), self->Angles.Yaw, 0, (15. + 2 * spermcount), self->target); if (mo) { mo->Vel.Z = self->Vel.Z; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_UP | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_UP; mo->special2 = spermcount; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_DOWN) { mo = P_SpawnMissileAngleZSpeed(self, self->Z() - 4., RUNTIME_CLASS(AFrostMissile), self->Angles.Yaw, 0, (15. + 2 * spermcount), self->target); if (mo) { mo->Vel.Z = self->Vel.Z; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_DOWN | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_DOWN; mo->special2 = spermcount; mo->target = self->target; mo->args[0] = (spermcount==3)?2:0; } } return 0; }
DEFINE_ACTION_FUNCTION(AActor, A_ShedShard) { AActor *mo; int spawndir = self->special1; int spermcount = self->special2; if (spermcount <= 0) return; // No sperm left self->special2 = 0; spermcount--; // every so many calls, spawn a new missile in its set directions if (spawndir & SHARDSPAWN_LEFT) { mo = P_SpawnMissileAngleZSpeed (self, self->z, RUNTIME_CLASS(AFrostMissile), self->angle+(ANG45/9), 0, (20+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->special1 = SHARDSPAWN_LEFT; mo->special2 = spermcount; mo->velz = self->velz; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_RIGHT) { mo = P_SpawnMissileAngleZSpeed (self, self->z, RUNTIME_CLASS(AFrostMissile), self->angle-(ANG45/9), 0, (20+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->special1 = SHARDSPAWN_RIGHT; mo->special2 = spermcount; mo->velz = self->velz; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_UP) { mo = P_SpawnMissileAngleZSpeed (self, self->z+8*FRACUNIT, RUNTIME_CLASS(AFrostMissile), self->angle, 0, (15+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->velz = self->velz; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_UP | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_UP; mo->special2 = spermcount; mo->args[0] = (spermcount==3)?2:0; } } if (spawndir & SHARDSPAWN_DOWN) { mo = P_SpawnMissileAngleZSpeed (self, self->z-4*FRACUNIT, RUNTIME_CLASS(AFrostMissile), self->angle, 0, (15+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->velz = self->velz; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_DOWN | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_DOWN; mo->special2 = spermcount; mo->target = self->target; mo->args[0] = (spermcount==3)?2:0; } } }
DEFINE_ACTION_FUNCTION(AActor, A_ShedShard) { AActor *mo; int spawndir = self->special1; int spermcount = self->special2; // [BC] Let the server do this. if (( NETWORK_GetState( ) == NETSTATE_CLIENT ) || ( CLIENTDEMO_IsPlaying( ))) { return; } if (spermcount <= 0) return; // No sperm left self->special2 = 0; spermcount--; // every so many calls, spawn a new missile in its set directions if (spawndir & SHARDSPAWN_LEFT) { mo = P_SpawnMissileAngleZSpeed (self, self->z, RUNTIME_CLASS(AFrostMissile), self->angle+(ANG45/9), 0, (20+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->special1 = SHARDSPAWN_LEFT; mo->special2 = spermcount; mo->momz = self->momz; mo->args[0] = (spermcount==3)?2:0; // [BC] Tell clients to spawn the shard. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissileExact( mo ); } } if (spawndir & SHARDSPAWN_RIGHT) { mo = P_SpawnMissileAngleZSpeed (self, self->z, RUNTIME_CLASS(AFrostMissile), self->angle-(ANG45/9), 0, (20+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->special1 = SHARDSPAWN_RIGHT; mo->special2 = spermcount; mo->momz = self->momz; mo->args[0] = (spermcount==3)?2:0; // [BC] Tell clients to spawn the shard. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissileExact( mo ); } } if (spawndir & SHARDSPAWN_UP) { mo = P_SpawnMissileAngleZSpeed (self, self->z+8*FRACUNIT, RUNTIME_CLASS(AFrostMissile), self->angle, 0, (15+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->momz = self->momz; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_UP | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_UP; mo->special2 = spermcount; mo->args[0] = (spermcount==3)?2:0; // [BC] Tell clients to spawn the shard. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissileExact( mo ); } } if (spawndir & SHARDSPAWN_DOWN) { mo = P_SpawnMissileAngleZSpeed (self, self->z-4*FRACUNIT, RUNTIME_CLASS(AFrostMissile), self->angle, 0, (15+2*spermcount)<<FRACBITS, self->target); if (mo) { mo->momz = self->momz; if (spermcount & 1) // Every other reproduction mo->special1 = SHARDSPAWN_DOWN | SHARDSPAWN_LEFT | SHARDSPAWN_RIGHT; else mo->special1 = SHARDSPAWN_DOWN; mo->special2 = spermcount; mo->target = self->target; mo->args[0] = (spermcount==3)?2:0; // [BC] Tell clients to spawn the shard. if ( NETWORK_GetState( ) == NETSTATE_SERVER ) SERVERCOMMANDS_SpawnMissileExact( mo ); } } }