forked from github/server
add a terrain_changed function for use with static terrain variables.
This commit is contained in:
parent
c597bebb8b
commit
7196f799e6
3 changed files with 28 additions and 7 deletions
|
@ -57,6 +57,17 @@ const char *terraindata[MAXTERRAINS] = {
|
|||
};
|
||||
|
||||
static terrain_type *registered_terrains;
|
||||
static int terrain_changes = 1;
|
||||
|
||||
bool terrain_changed(int *cache) {
|
||||
assert(cache);
|
||||
if (*cache != terrain_changes) {
|
||||
*cache = terrain_changes;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void free_terrains(void)
|
||||
{
|
||||
|
@ -76,6 +87,7 @@ void free_terrains(void)
|
|||
}
|
||||
free(t);
|
||||
}
|
||||
++terrain_changes;
|
||||
}
|
||||
|
||||
const terrain_type *terrains(void)
|
||||
|
@ -110,6 +122,7 @@ const terrain_type *get_terrain(const char *name) {
|
|||
terrain_type * get_or_create_terrain(const char *name) {
|
||||
terrain_type *terrain = terrain_find_i(name);
|
||||
if (!terrain) {
|
||||
++terrain_changes;
|
||||
terrain = (terrain_type *)calloc(sizeof(terrain_type), 1);
|
||||
if (terrain) {
|
||||
terrain->_name = strdup(name);
|
||||
|
|
|
@ -18,6 +18,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
|
||||
#ifndef TERRAIN_H
|
||||
#define TERRAIN_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
@ -68,12 +69,13 @@ extern "C" {
|
|||
struct terrain_type *next;
|
||||
} terrain_type;
|
||||
|
||||
extern terrain_type *get_or_create_terrain(const char *name);
|
||||
extern const terrain_type *terrains(void);
|
||||
extern const terrain_type *get_terrain(const char *name);
|
||||
extern const char *terrain_name(const struct region *r);
|
||||
terrain_type *get_or_create_terrain(const char *name);
|
||||
const terrain_type *terrains(void);
|
||||
const terrain_type *get_terrain(const char *name);
|
||||
const char *terrain_name(const struct region *r);
|
||||
bool terrain_changed(int *cache);
|
||||
|
||||
extern void init_terrains(void);
|
||||
void init_terrains(void);
|
||||
void free_terrains(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
10
src/laws.c
10
src/laws.c
|
@ -246,9 +246,15 @@ static void calculate_emigration(region * r)
|
|||
int maxp = region_maxworkers(r);
|
||||
int rp = rpeasants(r);
|
||||
int max_immigrants = MAX_IMMIGRATION(maxp - rp);
|
||||
static int terrain_cache;
|
||||
static const terrain_type *t_volcano;
|
||||
static const terrain_type *t_smoking;
|
||||
|
||||
if (r->terrain == newterrain(T_VOLCANO)
|
||||
|| r->terrain == newterrain(T_VOLCANO_SMOKING)) {
|
||||
if (terrain_changed(&terrain_cache)) {
|
||||
t_volcano = get_terrain("volcano");
|
||||
t_smoking = get_terrain("activevolcano");
|
||||
}
|
||||
if (r->terrain == t_volcano || r->terrain == t_smoking) {
|
||||
max_immigrants = max_immigrants / 10;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue