void P_SpawnLightSequence(Sector* sector, int indexStep) { int count; { findlightsequencesectorparams_t params; params.seqSpecial = LIGHT_SEQUENCE; // Look for Light_Sequence, first. params.count = 1; params.sec = sector; do { // Make sure that the search doesn't back up. P_ToXSector(params.sec)->special = LIGHT_SEQUENCE_START; params.nextSec = NULL; P_Iteratep(params.sec, DMU_LINE, ¶ms, findLightSequenceSector); params.sec = params.nextSec; } while(params.sec); count = params.count; } { findlightsequencestartsectorparams_t params; float base; fixed_t index, indexDelta; params.sec = sector; count *= indexStep; index = 0; indexDelta = FixedDiv(64 * FRACUNIT, count * FRACUNIT); base = P_SectorLight(sector); do { if(P_SectorLight(params.sec)) { base = P_SectorLight(params.sec); } P_SpawnPhasedLight(params.sec, base, index >> FRACBITS); index += indexDelta; params.nextSec = NULL; P_Iteratep(params.sec, DMU_LINE, ¶ms, findLightSequenceStartSector); params.sec = params.nextSec; } while(params.sec); } }
void P_SpawnPhasedLight(Sector *sector, float base, int index) { phase_t *phase = (phase_t *)Z_Calloc(sizeof(*phase), PU_MAP, 0); phase->thinker.function = (thinkfunc_t) T_Phase; Thinker_Add(&phase->thinker); phase->sector = sector; if(index == -1) { // Sector->lightLevel as the index. phase->index = (int) (255.0f * P_SectorLight(sector)) & 63; } else { phase->index = index & 63; } phase->baseValue = base; P_SectorSetLight(phase->sector, phase->baseValue + phaseTable[phase->index]); P_ToXSector(sector)->special = 0; }
void P_SectorModifyLightx(Sector* sector, fixed_t value) { P_SetFloatp(sector, DMU_LIGHT_LEVEL, P_SectorLight(sector) + FIX2FLT(value) / 255.0f); }
void P_SectorModifyLight(Sector* sector, float value) { float level = MINMAX_OF(0.f, P_SectorLight(sector) + value, 1.f); P_SectorSetLight(sector, level); }
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; } }
dd_bool EV_SpawnLight(Line * /*line*/, byte *arg, lighttype_t type) { int arg1, arg2, arg3, arg4; arg1 = (int) arg[1]; arg2 = (int) arg[2]; arg3 = (int) arg[3]; arg4 = (int) arg[4]; iterlist_t *list = P_GetSectorIterListForTag((int) arg[0], false); if(!list) return false; dd_bool rtn = false; IterList_SetIteratorDirection(list, ITERLIST_FORWARD); IterList_RewindIterator(list); Sector *sec; while((sec = (Sector *)IterList_MoveIterator(list))) { rtn = true; dd_bool think = false; light_t *light = (light_t *)Z_Calloc(sizeof(*light), PU_MAP, 0); light->type = type; light->sector = sec; light->count = 0; switch(type) { case LITE_RAISEBYVALUE: P_SectorModifyLight(light->sector, (float) arg1 / 255.0f); break; case LITE_LOWERBYVALUE: P_SectorModifyLight(light->sector, -((float) arg1 / 255.0f)); break; case LITE_CHANGETOVALUE: P_SectorSetLight(light->sector, (float) arg1 / 255.0f); break; case LITE_FADE: think = true; light->value1 = (float) arg1 / 255.0f; // Destination lightlevel. light->value2 = FIX2FLT(FixedDiv((arg1 - (int) (255.0f * P_SectorLight(light->sector))) << FRACBITS, arg2 << FRACBITS)) / 255.0f; // Delta lightlevel. if(P_SectorLight(light->sector) <= (float) arg1 / 255.0f) { light->tics2 = 1; // Get brighter. } else { light->tics2 = -1; } break; case LITE_GLOW: think = true; light->value1 = (float) arg1 / 255.0f; // Upper lightlevel. light->value2 = (float) arg2 / 255.0f; // Lower lightlevel. light->tics1 = FixedDiv((arg1 - (int) (255.0f * P_SectorLight(light->sector))) << FRACBITS, arg3 << FRACBITS); // Lightlevel delta. if(P_SectorLight(light->sector) <= (float) arg1 / 255.0f) { light->tics2 = 1; // Get brighter. } else { light->tics2 = -1; } break; case LITE_FLICKER: think = true; light->value1 = (float) arg1 / 255.0f; // Upper lightlevel. light->value2 = (float) arg2 / 255.0f; // Lower lightlevel. P_SectorSetLight(light->sector, light->value1); light->count = (P_Random() & 64) + 1; break; case LITE_STROBE: think = true; light->value1 = (float) arg1 / 255.0f; // Upper lightlevel. light->value2 = (float) arg2 / 255.0f; // Lower lightlevel. light->tics1 = arg3; // Upper tics. light->tics2 = arg4; // Lower tics. light->count = arg3; P_SectorSetLight(light->sector, light->value1); break; default: rtn = false; break; } if(think) { light->thinker.function = (thinkfunc_t) T_Light; Thinker_Add(&light->thinker); } else { Z_Free(light); } } return rtn; }