Author: cazfi Date: Sun Mar 30 15:37:02 2014 New Revision: 24739 URL: http://svn.gna.org/viewcvs/freeciv?rev=24739&view=rev Log: Create cache listing extra types that can provide tile nativity to the unit class at the ruleset loading time. Iterate over that list only when checking if tile is native for a unit.
See patch #4609 Modified: branches/S2_5/client/packhand.c branches/S2_5/common/movement.c branches/S2_5/common/unittype.c branches/S2_5/common/unittype.h branches/S2_5/server/ruleset.c Modified: branches/S2_5/client/packhand.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/client/packhand.c?rev=24739&r1=24738&r2=24739&view=diff ============================================================================== --- branches/S2_5/client/packhand.c (original) +++ branches/S2_5/client/packhand.c Sun Mar 30 15:37:02 2014 @@ -2834,6 +2834,10 @@ } } road_type_iterate_end; } road_type_iterate_end; + + unit_class_iterate(pclass) { + set_unit_class_caches(pclass); + } unit_class_iterate_end; /* We are not going to crop any more sprites from big sprites, free them. */ finish_loading_sprites(tileset); Modified: branches/S2_5/common/movement.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/movement.c?rev=24739&r1=24738&r2=24739&view=diff ============================================================================== --- branches/S2_5/common/movement.c (original) +++ branches/S2_5/common/movement.c Sun Mar 30 15:37:02 2014 @@ -285,21 +285,17 @@ return TRUE; } - road_type_iterate(proad) { - if (BV_ISSET(roads, road_index(proad)) - && road_has_flag(proad, RF_NATIVE_TILE) - && is_native_road_to_uclass(proad, punitclass)) { + road_type_list_iterate(punitclass->cache.native_tile_roads, proad) { + if (BV_ISSET(roads, road_index(proad))) { return TRUE; } - } road_type_iterate_end; - - base_type_iterate(pbase) { - if (BV_ISSET(bases, base_index(pbase)) - && base_has_flag(pbase, BF_NATIVE_TILE) - && is_native_base_to_uclass(pbase, punitclass)) { + } road_type_list_iterate_end; + + base_type_list_iterate(punitclass->cache.native_tile_bases, pbase) { + if (BV_ISSET(bases, base_index(pbase))) { return TRUE; } - } base_type_iterate_end; + } base_type_list_iterate_end; return FALSE; } Modified: branches/S2_5/common/unittype.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/unittype.c?rev=24739&r1=24738&r2=24739&view=diff ============================================================================== --- branches/S2_5/common/unittype.c (original) +++ branches/S2_5/common/unittype.c Sun Mar 30 15:37:02 2014 @@ -1056,6 +1056,8 @@ for (i = 0; i < ARRAY_SIZE(unit_classes); i++) { unit_classes[i].item_number = i; unit_classes[i].cache.refuel_bases = NULL; + unit_classes[i].cache.native_tile_bases = NULL; + unit_classes[i].cache.native_tile_roads = NULL; } } @@ -1070,6 +1072,14 @@ if (unit_classes[i].cache.refuel_bases != NULL) { base_type_list_destroy(unit_classes[i].cache.refuel_bases); unit_classes[i].cache.refuel_bases = NULL; + } + if (unit_classes[i].cache.native_tile_bases != NULL) { + base_type_list_destroy(unit_classes[i].cache.native_tile_bases); + unit_classes[i].cache.native_tile_bases = NULL; + } + if (unit_classes[i].cache.native_tile_roads != NULL) { + road_type_list_destroy(unit_classes[i].cache.native_tile_roads); + unit_classes[i].cache.native_tile_roads = NULL; } } } @@ -1217,3 +1227,29 @@ { ptype->ais[ai_type_number(ai)] = data; } + +/**************************************************************************** + Set caches for unit class. +****************************************************************************/ +void set_unit_class_caches(struct unit_class *pclass) +{ + pclass->cache.refuel_bases = base_type_list_new(); + pclass->cache.native_tile_bases = base_type_list_new(); + pclass->cache.native_tile_roads = road_type_list_new(); + + base_type_iterate(pbase) { + if (is_native_base_to_uclass(pbase, pclass)) { + base_type_list_append(pclass->cache.refuel_bases, pbase); + if (base_has_flag(pbase, BF_NATIVE_TILE)) { + base_type_list_append(pclass->cache.native_tile_bases, pbase); + } + } + } base_type_iterate_end; + + road_type_iterate(proad) { + if (is_native_road_to_uclass(proad, pclass) + && road_has_flag(proad, RF_NATIVE_TILE)) { + road_type_list_append(pclass->cache.native_tile_roads, proad); + } + } road_type_iterate_end; +} Modified: branches/S2_5/common/unittype.h URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/common/unittype.h?rev=24739&r1=24738&r2=24739&view=diff ============================================================================== --- branches/S2_5/common/unittype.h (original) +++ branches/S2_5/common/unittype.h Sun Mar 30 15:37:02 2014 @@ -106,8 +106,9 @@ } adv; struct { - /* Set only on server side */ struct base_type_list *refuel_bases; + struct base_type_list *native_tile_bases; + struct road_type_list *native_tile_roads; } cache; }; @@ -590,6 +591,8 @@ void unit_classes_init(void); void unit_classes_free(void); +void set_unit_class_caches(struct unit_class *pclass); + struct unit_class *unit_class_array_first(void); const struct unit_class *unit_class_array_last(void); Modified: branches/S2_5/server/ruleset.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/ruleset.c?rev=24739&r1=24738&r2=24739&view=diff ============================================================================== --- branches/S2_5/server/ruleset.c (original) +++ branches/S2_5/server/ruleset.c Sun Mar 30 15:37:02 2014 @@ -942,20 +942,6 @@ } return unit_move_type_invalid(); -} - -/**************************************************************************** - Set refuel bases cache for unit class. -****************************************************************************/ -static void set_unit_class_refuel_bases(struct unit_class *pclass) -{ - pclass->cache.refuel_bases = base_type_list_new(); - - base_type_iterate(pbase) { - if (is_native_base_to_uclass(pbase, pclass)) { - base_type_list_append(pclass->cache.refuel_bases, pbase); - } - } base_type_iterate_end; } /**************************************************************************** @@ -1702,6 +1688,8 @@ break; } + set_unit_class_caches(uc); + if (!unit_move_type_is_valid(uc->move_type)) { /* Not explicitly given, determine automatically */ bool land_moving = FALSE; @@ -1794,9 +1782,6 @@ if (!ok) { break; } - - set_unit_class_refuel_bases(uc); - } unit_class_iterate_end; } _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits