Use partial_range on Flickering_lights
This commit is contained in:
parent
f206b3b127
commit
1649fc791c
|
@ -266,8 +266,9 @@ struct flickering_light {
|
||||||
|
|
||||||
#define MAX_FLICKERING_LIGHTS 100
|
#define MAX_FLICKERING_LIGHTS 100
|
||||||
|
|
||||||
extern flickering_light Flickering_lights[MAX_FLICKERING_LIGHTS];
|
typedef array<flickering_light, MAX_FLICKERING_LIGHTS> Flickering_light_array_t;
|
||||||
extern int Num_flickering_lights;
|
extern Flickering_light_array_t Flickering_lights;
|
||||||
|
extern unsigned Num_flickering_lights;
|
||||||
extern int BigWindowSwitch;
|
extern int BigWindowSwitch;
|
||||||
|
|
||||||
// turn flickering off (because light has been turned off)
|
// turn flickering off (because light has been turned off)
|
||||||
|
|
|
@ -112,6 +112,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
||||||
|
|
||||||
#include "compiler-range_for.h"
|
#include "compiler-range_for.h"
|
||||||
#include "highest_valid.h"
|
#include "highest_valid.h"
|
||||||
|
#include "partial_range.h"
|
||||||
#include "segiter.h"
|
#include "segiter.h"
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
@ -1464,17 +1465,14 @@ static void slide_textures(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flickering_light Flickering_lights[MAX_FLICKERING_LIGHTS];
|
Flickering_light_array_t Flickering_lights;
|
||||||
|
unsigned Num_flickering_lights;
|
||||||
int Num_flickering_lights=0;
|
|
||||||
|
|
||||||
static void flicker_lights()
|
static void flicker_lights()
|
||||||
{
|
{
|
||||||
flickering_light *f;
|
range_for (auto &rf, partial_range(Flickering_lights, Num_flickering_lights))
|
||||||
|
{
|
||||||
f = Flickering_lights;
|
auto f = &rf;
|
||||||
|
|
||||||
for (int l=0;l<Num_flickering_lights;l++,f++) {
|
|
||||||
segment *segp = &Segments[f->segnum];
|
segment *segp = &Segments[f->segnum];
|
||||||
|
|
||||||
//make sure this is actually a light
|
//make sure this is actually a light
|
||||||
|
@ -1502,37 +1500,40 @@ static void flicker_lights()
|
||||||
}
|
}
|
||||||
|
|
||||||
//returns ptr to flickering light structure, or NULL if can't find
|
//returns ptr to flickering light structure, or NULL if can't find
|
||||||
static flickering_light *find_flicker(segnum_t segnum, int sidenum)
|
static std::pair<Flickering_light_array_t::iterator, Flickering_light_array_t::iterator> find_flicker(segnum_t segnum, int sidenum)
|
||||||
{
|
{
|
||||||
flickering_light *f;
|
|
||||||
|
|
||||||
//see if there's already an entry for this seg/side
|
//see if there's already an entry for this seg/side
|
||||||
|
auto pr = partial_range(Flickering_lights, Num_flickering_lights);
|
||||||
|
auto predicate = [segnum, sidenum](const flickering_light &f) {
|
||||||
|
return f.segnum == segnum && f.sidenum == sidenum; //found it!
|
||||||
|
};
|
||||||
|
return {std::find_if(pr.begin(), pr.end(), predicate), pr.end()};
|
||||||
|
}
|
||||||
|
|
||||||
f = Flickering_lights;
|
template <typename F>
|
||||||
|
static inline void update_flicker(segnum_t segnum, int sidenum, F f)
|
||||||
for (int l=0;l<Num_flickering_lights;l++,f++)
|
{
|
||||||
if (f->segnum == segnum && f->sidenum == sidenum) //found it!
|
auto i = find_flicker(segnum, sidenum);
|
||||||
return f;
|
if (i.first != i.second)
|
||||||
|
f(*i.first);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//turn flickering off (because light has been turned off)
|
//turn flickering off (because light has been turned off)
|
||||||
void disable_flicker(segnum_t segnum,int sidenum)
|
void disable_flicker(segnum_t segnum,int sidenum)
|
||||||
{
|
{
|
||||||
flickering_light *f;
|
auto F = [](flickering_light &f) {
|
||||||
|
f.timer = 0x80000000;
|
||||||
if ((f=find_flicker(segnum,sidenum)) != NULL)
|
};
|
||||||
f->timer = 0x80000000;
|
update_flicker(segnum, sidenum, F);
|
||||||
}
|
}
|
||||||
|
|
||||||
//turn flickering off (because light has been turned on)
|
//turn flickering off (because light has been turned on)
|
||||||
void enable_flicker(segnum_t segnum,int sidenum)
|
void enable_flicker(segnum_t segnum,int sidenum)
|
||||||
{
|
{
|
||||||
flickering_light *f;
|
auto F = [](flickering_light &f) {
|
||||||
|
f.timer = 0;
|
||||||
if ((f=find_flicker(segnum,sidenum)) != NULL)
|
};
|
||||||
f->timer = 0;
|
update_flicker(segnum, sidenum, F);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1274,9 +1274,8 @@ int load_level(const char * filename_passed)
|
||||||
|
|
||||||
if (Gamesave_current_version >= 7) {
|
if (Gamesave_current_version >= 7) {
|
||||||
Num_flickering_lights = PHYSFSX_readInt(LoadFile);
|
Num_flickering_lights = PHYSFSX_readInt(LoadFile);
|
||||||
Assert((Num_flickering_lights >= 0) && (Num_flickering_lights < MAX_FLICKERING_LIGHTS));
|
range_for (auto &i, partial_range(Flickering_lights, Num_flickering_lights))
|
||||||
for (int i = 0; i < Num_flickering_lights; i++)
|
flickering_light_read(&i, LoadFile);
|
||||||
flickering_light_read(&Flickering_lights[i], LoadFile);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Num_flickering_lights = 0;
|
Num_flickering_lights = 0;
|
||||||
|
@ -1758,8 +1757,8 @@ static int save_level_sub(const char * filename, int compiled_version)
|
||||||
if (Gamesave_current_version >= 7)
|
if (Gamesave_current_version >= 7)
|
||||||
{
|
{
|
||||||
PHYSFS_writeSLE32(SaveFile, Num_flickering_lights);
|
PHYSFS_writeSLE32(SaveFile, Num_flickering_lights);
|
||||||
for (int i = 0; i < Num_flickering_lights; i++)
|
range_for (auto &i, partial_range(Flickering_lights, Num_flickering_lights))
|
||||||
flickering_light_write(&Flickering_lights[i], SaveFile);
|
flickering_light_write(&i, SaveFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Gamesave_current_version >= 6)
|
if (Gamesave_current_version >= 6)
|
||||||
|
|
Loading…
Reference in a new issue