From 979316abf57e9bba10cc0d6520465ec1d2b9c63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Lach?= Date: Wed, 14 Dec 2022 17:18:15 +0100 Subject: [PATCH] =?UTF-8?q?!OSDN:=20#TICKET:=2046273=20-=20S=C5=82awomir?= =?UTF-8?q?=20Lach=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce sharing city counters' index mechanism. diff --git a/common/counters.c b/common/counters.c index f17eaa6d9f..361c6a6c2f 100644 --- a/common/counters.c +++ b/common/counters.c @@ -33,6 +33,7 @@ static struct counter counters[MAX_COUNTERS]; /* City counters array + related data */ static struct counter *counters_city[MAX_COUNTERS]; static int number_city_counters; +static int highest_index_city_counters; /************************************************************************//** Initialize counters system @@ -41,6 +42,7 @@ void counters_init(void) { game.control.num_counters = 0; number_city_counters = 0; + highest_index_city_counters = 0; } @@ -55,6 +57,7 @@ void counters_free(void) game.control.num_counters = 0; number_city_counters = 0; + highest_index_city_counters = 0; } /************************************************************************//** @@ -62,7 +65,7 @@ void counters_free(void) ****************************************************************************/ int counters_get_city_counters_count(void) { - return number_city_counters; + return highest_index_city_counters; } /************************************************************************//** @@ -75,6 +78,18 @@ struct counter *counter_by_id(int id) return &counters[id]; } +/************************************************************************//** + Added for future uses only. Return true if counter of some target + and behavior could share index. +****************************************************************************/ + +static bool counter_allow_index_sharing(enum counter_behaviour behaviour, enum counter_target target) +{ + (void) behaviour; + (void) target; + + return TRUE; +} /************************************************************************//** Attaching given counter type to array containing counter type related to cities. Counter must be present in array for @@ -82,8 +97,19 @@ struct counter *counter_by_id(int id) ****************************************************************************/ void attach_city_counter(struct counter *counter) { + int index = highest_index_city_counters + 1; + if (counter_allow_index_sharing(counter->type, counter->target)) { + + city_counters_iterate(pcount) { + if (counter->type == pcount->type + && counter->target == pcount->target) { + index = pcount->index; + } + } city_counters_iterate_end; + } + counters_city[number_city_counters] = counter; - counters_city[number_city_counters]->index = number_city_counters; + counters_city[number_city_counters]->index = index; number_city_counters++; } diff --git a/common/counters.h b/common/counters.h index d5cadf0205..1d032362cb 100644 --- a/common/counters.h +++ b/common/counters.h @@ -51,16 +51,31 @@ struct counter *counter_by_index(int index, enum counter_target target); int counters_get_city_counters_count(void); void attach_city_counter(struct counter *counter); -#define city_counters_iterate(pcount) { \ +#define city_counters_iterate_low_level(pcount) { \ int _i_##pcount; \ struct counter *pcount; \ int _ccounter_count_##pcount = counters_get_city_counters_count(); \ for (_i_##pcount = 0; _i_##pcount < _ccounter_count_##pcount; _i_##pcount++) { \ pcount = counter_by_index(_i_##pcount, CTGT_CITY); -#define city_counters_iterate_end } \ +#define city_counters_iterate_low_level_end } \ } + +#define city_counters_iterate(pcount) { \ + int _i_##pcount; \ + struct counter *pcount; \ + int _next_index_##pcount = 0; \ + int _ccounter_count_##pcount = counters_get_city_counters_count(); \ + for (_i_##pcount = 0; _i_##pcount < _ccounter_count_##pcount; _i_##pcount++) { \ + pcount = counter_by_index(_i_##pcount, CTGT_CITY); \ + if (pcount->index != _next_index_##pcount) { \ + continue; \ + } \ + _next_index_##pcount = _next_index_##pcount + 1; + +#define city_counters_iterate_end } \ + } #ifdef __cplusplus } #endif /* __cplusplus */ -- 2.38.1