From 1649fc791ccd42e93484916c2f39adaa41be1748 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 23 Nov 2014 04:36:58 +0000 Subject: [PATCH] Use partial_range on Flickering_lights --- common/main/game.h | 5 ++-- similar/main/game.cpp | 53 ++++++++++++++++++++------------------- similar/main/gamesave.cpp | 9 +++---- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/common/main/game.h b/common/main/game.h index 72c0d4492..8f83ced38 100644 --- a/common/main/game.h +++ b/common/main/game.h @@ -266,8 +266,9 @@ struct flickering_light { #define MAX_FLICKERING_LIGHTS 100 -extern flickering_light Flickering_lights[MAX_FLICKERING_LIGHTS]; -extern int Num_flickering_lights; +typedef array Flickering_light_array_t; +extern Flickering_light_array_t Flickering_lights; +extern unsigned Num_flickering_lights; extern int BigWindowSwitch; // turn flickering off (because light has been turned off) diff --git a/similar/main/game.cpp b/similar/main/game.cpp index 60987f538..2c765d64e 100644 --- a/similar/main/game.cpp +++ b/similar/main/game.cpp @@ -112,6 +112,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "compiler-range_for.h" #include "highest_valid.h" +#include "partial_range.h" #include "segiter.h" #ifndef NDEBUG @@ -1464,17 +1465,14 @@ static void slide_textures(void) } } -flickering_light Flickering_lights[MAX_FLICKERING_LIGHTS]; - -int Num_flickering_lights=0; +Flickering_light_array_t Flickering_lights; +unsigned Num_flickering_lights; static void flicker_lights() { - flickering_light *f; - - f = Flickering_lights; - - for (int l=0;lsegnum]; //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 -static flickering_light *find_flicker(segnum_t segnum, int sidenum) +static std::pair find_flicker(segnum_t segnum, int sidenum) { - flickering_light *f; - //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; - - for (int l=0;lsegnum == segnum && f->sidenum == sidenum) //found it! - return f; - - return NULL; +template +static inline void update_flicker(segnum_t segnum, int sidenum, F f) +{ + auto i = find_flicker(segnum, sidenum); + if (i.first != i.second) + f(*i.first); } //turn flickering off (because light has been turned off) void disable_flicker(segnum_t segnum,int sidenum) { - flickering_light *f; - - if ((f=find_flicker(segnum,sidenum)) != NULL) - f->timer = 0x80000000; + auto F = [](flickering_light &f) { + f.timer = 0x80000000; + }; + update_flicker(segnum, sidenum, F); } //turn flickering off (because light has been turned on) void enable_flicker(segnum_t segnum,int sidenum) { - flickering_light *f; - - if ((f=find_flicker(segnum,sidenum)) != NULL) - f->timer = 0; + auto F = [](flickering_light &f) { + f.timer = 0; + }; + update_flicker(segnum, sidenum, F); } #endif diff --git a/similar/main/gamesave.cpp b/similar/main/gamesave.cpp index f8ca44ea1..b0eb28d77 100644 --- a/similar/main/gamesave.cpp +++ b/similar/main/gamesave.cpp @@ -1274,9 +1274,8 @@ int load_level(const char * filename_passed) if (Gamesave_current_version >= 7) { Num_flickering_lights = PHYSFSX_readInt(LoadFile); - Assert((Num_flickering_lights >= 0) && (Num_flickering_lights < MAX_FLICKERING_LIGHTS)); - for (int i = 0; i < Num_flickering_lights; i++) - flickering_light_read(&Flickering_lights[i], LoadFile); + range_for (auto &i, partial_range(Flickering_lights, Num_flickering_lights)) + flickering_light_read(&i, LoadFile); } else Num_flickering_lights = 0; @@ -1758,8 +1757,8 @@ static int save_level_sub(const char * filename, int compiled_version) if (Gamesave_current_version >= 7) { PHYSFS_writeSLE32(SaveFile, Num_flickering_lights); - for (int i = 0; i < Num_flickering_lights; i++) - flickering_light_write(&Flickering_lights[i], SaveFile); + range_for (auto &i, partial_range(Flickering_lights, Num_flickering_lights)) + flickering_light_write(&i, SaveFile); } if (Gamesave_current_version >= 6)