Use partial_range on Flickering_lights

This commit is contained in:
Kp 2014-11-23 04:36:58 +00:00
parent f206b3b127
commit 1649fc791c
3 changed files with 34 additions and 33 deletions

View file

@ -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)

View file

@ -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

View file

@ -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)