/** * Called when a moving plat needs to be removed. * * @param plat Ptr to the plat to remove. */ static void stopPlat(plat_t *plat) { DENG2_ASSERT(plat); P_ToXSector(plat->sector)->specialData = nullptr; P_NotifySectorFinished(P_ToXSector(plat->sector)->tag); Thinker_Remove(&plat->thinker); }
/** * Called when a moving plat needs to be removed. * * @param plat Ptr to the plat to remove. */ static void stopPlat(plat_t* plat) { P_ToXSector(plat->sector)->specialData = NULL; #if __JHEXEN__ P_TagFinished(P_ToXSector(plat->sector)->tag); #endif Thinker_Remove(&plat->thinker); }
void T_BuildPillar(pillar_t *pillar) { DENG2_ASSERT(pillar); // First, raise the floor result_e res1 = T_MovePlane(pillar->sector, pillar->floorSpeed, pillar->floorDest, pillar->crush, 0, pillar->direction); // floorOrCeiling, direction // Then, lower the ceiling result_e res2 = T_MovePlane(pillar->sector, pillar->ceilingSpeed, pillar->ceilingDest, pillar->crush, 1, -pillar->direction); if(res1 == pastdest && res2 == pastdest) { P_ToXSector(pillar->sector)->specialData = 0; SN_StopSequenceInSec(pillar->sector); P_NotifySectorFinished(P_ToXSector(pillar->sector)->tag); Thinker_Remove(&pillar->thinker); } }
void T_FloorWaggle(waggle_t *waggle) { DENG_ASSERT(waggle != 0); switch(waggle->state) { default: case WS_STABLE: if(waggle->ticker != -1) { if(!--waggle->ticker) { waggle->state = WS_REDUCE; } } break; case WS_EXPAND: if((waggle->scale += waggle->scaleDelta) >= waggle->targetScale) { waggle->scale = waggle->targetScale; waggle->state = WS_STABLE; } break; case WS_REDUCE: if((waggle->scale -= waggle->scaleDelta) <= 0) { // Remove. P_SetDoublep(waggle->sector, DMU_FLOOR_HEIGHT, waggle->originalHeight); P_ChangeSector(waggle->sector, 1 /*crush damage*/); P_ToXSector(waggle->sector)->specialData = nullptr; P_NotifySectorFinished(P_ToXSector(waggle->sector)->tag); Thinker_Remove(&waggle->thinker); return; } break; } waggle->accumulator += waggle->accDelta; coord_t fh = waggle->originalHeight + FLOATBOBOFFSET(((int) waggle->accumulator) & 63) * waggle->scale; P_SetDoublep(waggle->sector, DMU_FLOOR_HEIGHT, fh); P_SetDoublep(waggle->sector, DMU_FLOOR_TARGET_HEIGHT, fh); P_SetFloatp(waggle->sector, DMU_FLOOR_SPEED, 0); P_ChangeSector(waggle->sector, 1 /*crush damage*/); }
void T_Light(light_t *light) { if(light->count) { light->count--; return; } switch(light->type) { case LITE_FADE: P_SectorModifyLight(light->sector, light->value2); if(light->tics2 == 1) { if(P_SectorLight(light->sector) >= light->value1) { P_SectorSetLight(light->sector, light->value1); Thinker_Remove(&light->thinker); } } else if(P_SectorLight(light->sector) <= light->value1) { P_SectorSetLight(light->sector, light->value1); Thinker_Remove(&light->thinker); } break; case LITE_GLOW: P_SectorModifyLightx(light->sector, light->tics1); if(light->tics2 == 1) { if(P_SectorLight(light->sector) >= light->value1) { P_SectorSetLight(light->sector, light->value1); light->tics1 = -light->tics1; light->tics2 = -1; // Reverse direction. } } else if(P_SectorLight(light->sector) <= light->value2) { P_SectorSetLight(light->sector, light->value2); light->tics1 = -light->tics1; light->tics2 = 1; // Reverse direction. } break; case LITE_FLICKER: if(P_SectorLight(light->sector) == light->value1) { P_SectorSetLight(light->sector, light->value2); light->count = (P_Random() & 7) + 1; } else { P_SectorSetLight(light->sector, light->value1); light->count = (P_Random() & 31) + 1; } break; case LITE_STROBE: if(P_SectorLight(light->sector) == light->value1) { P_SectorSetLight(light->sector, light->value2); light->count = light->tics2; } else { P_SectorSetLight(light->sector, light->value1); light->count = light->tics1; } break; default: break; } }