<URL: http://bugs.freeciv.org/Ticket/Display.html?id=37534 >
On 3/5/07, Marko Lindqvist <[EMAIL PROTECTED]> wrote: > > Get base gfx tags from ruleset. - Necessary modifications to all rulesets and tilesets - If primary gfx and alt gfx consisted different layers, parts of alt gfx appeared in addition to primary gfx. Fixed. - ML
diff -Nurd -X.diff_ignore freeciv/client/packhand.c freeciv/client/packhand.c --- freeciv/client/packhand.c 2007-03-06 03:31:58.000000000 +0200 +++ freeciv/client/packhand.c 2007-03-06 04:53:52.000000000 +0200 @@ -2473,6 +2473,8 @@ sz_strlcpy(pbase->name_orig, p->name); pbase->name = Q_(pbase->name_orig); + sz_strlcpy(pbase->graphic_str, p->graphic_str); + sz_strlcpy(pbase->graphic_alt, p->graphic_alt); for (i = 0; i < p->reqs_count; i++) { requirement_vector_append(&pbase->reqs, &p->reqs[i]); @@ -2482,6 +2484,8 @@ pbase->native_to = p->native_to; pbase->flags = p->flags; + + tileset_setup_base(tileset, pbase); } /************************************************************************** diff -Nurd -X.diff_ignore freeciv/client/tilespec.c freeciv/client/tilespec.c --- freeciv/client/tilespec.c 2007-02-28 23:02:38.000000000 +0200 +++ freeciv/client/tilespec.c 2007-03-06 05:12:43.000000000 +0200 @@ -27,6 +27,7 @@ #include <string.h> #include "astring.h" +#include "base.h" #include "capability.h" #include "fcintl.h" #include "game.h" /* for fill_xxx */ @@ -241,9 +242,6 @@ *irrigation[MAX_INDEX_CARDINAL], *pollution, *village, - *fortress, - *fortress_back, - *airbase, *fallout, *fog, **fullfog, @@ -253,6 +251,12 @@ } tx; /* terrain extra */ struct { struct sprite + *background, + *middleground, + *foreground; + } bases[BASE_LAST]; + struct { + struct sprite *main[EDGE_COUNT], *city[EDGE_COUNT], *worked[EDGE_COUNT], @@ -947,6 +951,9 @@ government_iterate(gov) { tileset_setup_government(tileset, gov->index); } government_iterate_end; + base_type_iterate(pbase) { + tileset_setup_base(tileset, pbase); + } base_type_iterate_end; for (id = 0; id < game.control.nation_count; id++) { tileset_setup_nation_flag(tileset, id); } @@ -2259,9 +2266,6 @@ SET_SPRITE(tx.fallout, "tx.fallout"); SET_SPRITE(tx.pollution, "tx.pollution"); SET_SPRITE(tx.village, "tx.village"); - SET_SPRITE(tx.fortress, "tx.fortress"); - SET_SPRITE_ALT(tx.fortress_back, "tx.fortress_back", "tx.fortress"); - SET_SPRITE(tx.airbase, "tx.airbase"); SET_SPRITE(tx.fog, "tx.fog"); /* Load color sprites. */ @@ -2494,9 +2498,9 @@ or else return NULL, and emit log message. ***********************************************************************/ struct sprite* lookup_sprite_tag_alt(struct tileset *t, - const char *tag, const char *alt, - bool required, const char *what, - const char *name) + const char *tag, const char *alt, + bool required, const char *what, + const char *name) { struct sprite *sp; @@ -2591,6 +2595,59 @@ presource->name); } +/**************************************************************************** + Set base sprite values; should only happen after + tilespec_load_tiles(). +****************************************************************************/ +void tileset_setup_base(struct tileset *t, + const struct base_type *pbase) +{ + char full_tag_name[MAX_LEN_NAME + strlen("_fg")]; + const int id = pbase->id; + + assert(id >= 0 && id < game.control.num_base_types); + + sz_strlcpy(full_tag_name, pbase->graphic_str); + strcat(full_tag_name, "_bg"); + t->sprites.bases[id].background = load_sprite(t, full_tag_name); + + sz_strlcpy(full_tag_name, pbase->graphic_str); + strcat(full_tag_name, "_mg"); + t->sprites.bases[id].middleground = load_sprite(t, full_tag_name); + + sz_strlcpy(full_tag_name, pbase->graphic_str); + strcat(full_tag_name, "_fg"); + t->sprites.bases[id].foreground = load_sprite(t, full_tag_name); + + if (t->sprites.bases[id].background == NULL + && t->sprites.bases[id].middleground == NULL + && t->sprites.bases[id].foreground == NULL) { + /* No primary graphics at all. Try alternative */ + freelog(LOG_VERBOSE, + _("Using alternate graphic %s (instead of %s) for base %s"), + pbase->graphic_alt, pbase->graphic_str, base_name(pbase)); + + sz_strlcpy(full_tag_name, pbase->graphic_alt); + strcat(full_tag_name, "_bg"); + t->sprites.bases[id].background = load_sprite(t, full_tag_name); + + sz_strlcpy(full_tag_name, pbase->graphic_alt); + strcat(full_tag_name, "_mg"); + t->sprites.bases[id].middleground = load_sprite(t, full_tag_name); + + sz_strlcpy(full_tag_name, pbase->graphic_alt); + strcat(full_tag_name, "_fg"); + t->sprites.bases[id].foreground = load_sprite(t, full_tag_name); + + if (t->sprites.bases[id].background == NULL + && t->sprites.bases[id].middleground == NULL + && t->sprites.bases[id].foreground == NULL) { + /* Cannot find alternative graphics either */ + freelog(LOG_ERROR, _("No graphics for base %s at all!"), pbase->name); + exit(EXIT_FAILURE); + } + } +} /********************************************************************** @@ -4072,10 +4129,9 @@ } } - if (draw_fortress_airbase - && pbase != NULL && pbase->id == BASE_FORTRESS - && t->sprites.tx.fortress_back) { - ADD_SPRITE_FULL(t->sprites.tx.fortress_back); + if (draw_fortress_airbase && pbase != NULL + && t->sprites.bases[pbase->id].background) { + ADD_SPRITE_FULL(t->sprites.bases[pbase->id].background); } if (draw_mines && contains_special(tspecial, S_MINE) @@ -4127,9 +4183,9 @@ case LAYER_SPECIAL2: if (ptile && client_tile_get_known(ptile) != TILE_UNKNOWN) { - if (draw_fortress_airbase - && pbase != NULL && pbase->id == BASE_AIRBASE) { - ADD_SPRITE_FULL(t->sprites.tx.airbase); + if (draw_fortress_airbase && pbase != NULL + && t->sprites.bases[pbase->id].middleground) { + ADD_SPRITE_FULL(t->sprites.bases[pbase->id].middleground); } if (draw_pollution && contains_special(tspecial, S_POLLUTION)) { @@ -4176,11 +4232,11 @@ case LAYER_SPECIAL3: if (ptile && client_tile_get_known(ptile) != TILE_UNKNOWN) { - if (t->is_isometric && draw_fortress_airbase - && pbase != NULL && pbase->id == BASE_FORTRESS) { + if (draw_fortress_airbase && pbase != NULL + && t->sprites.bases[pbase->id].foreground) { /* Draw fortress front in iso-view (non-iso view only has a fortress * back). */ - ADD_SPRITE_FULL(t->sprites.tx.fortress); + ADD_SPRITE_FULL(t->sprites.bases[pbase->id].foreground); } } break; diff -Nurd -X.diff_ignore freeciv/client/tilespec.h freeciv/client/tilespec.h --- freeciv/client/tilespec.h 2007-02-26 14:16:19.000000000 +0200 +++ freeciv/client/tilespec.h 2007-03-06 04:53:52.000000000 +0200 @@ -25,6 +25,8 @@ struct sprite; /* opaque; gui-dep */ +struct base_type; + /* Create the sprite_vector type. */ #define SPECVEC_TAG sprite #define SPECVEC_TYPE struct sprite * @@ -130,6 +132,8 @@ const struct terrain *pterrain); void tileset_setup_resource(struct tileset *t, const struct resource *presource); +void tileset_setup_base(struct tileset *t, + const struct base_type *pbase); void tileset_setup_government(struct tileset *t, int id); void tileset_setup_nation_flag(struct tileset *t, int id); void tileset_setup_city_tiles(struct tileset *t, int style); diff -Nurd -X.diff_ignore freeciv/common/base.h freeciv/common/base.h --- freeciv/common/base.h 2007-03-06 03:31:58.000000000 +0200 +++ freeciv/common/base.h 2007-03-06 04:53:52.000000000 +0200 @@ -35,9 +35,11 @@ BV_DEFINE(bv_base_flags, BF_LAST); struct base_type { + int id; const char *name; char name_orig[MAX_LEN_NAME]; - int id; + char graphic_str[MAX_LEN_NAME]; + char graphic_alt[MAX_LEN_NAME]; struct requirement_vector reqs; bv_unit_classes native_to; diff -Nurd -X.diff_ignore freeciv/common/packets.def freeciv/common/packets.def --- freeciv/common/packets.def 2007-03-06 03:31:58.000000000 +0200 +++ freeciv/common/packets.def 2007-03-06 04:53:52.000000000 +0200 @@ -1270,6 +1270,8 @@ PACKET_RULESET_BASE=120;sc,lsend UINT8 id; STRING name[MAX_LEN_NAME]; + STRING graphic_str[MAX_LEN_NAME]; + STRING graphic_alt[MAX_LEN_NAME]; UINT8 reqs_count; REQUIREMENT reqs[MAX_NUM_REQS:reqs_count]; BV_UNIT_CLASSES native_to; diff -Nurd -X.diff_ignore freeciv/data/amplio/moderncities.spec freeciv/data/amplio/moderncities.spec --- freeciv/data/amplio/moderncities.spec 2007-02-26 14:15:32.000000000 +0200 +++ freeciv/data/amplio/moderncities.spec 2007-03-06 04:53:52.000000000 +0200 @@ -46,10 +46,10 @@ ; used by all city styles 0, 0, "city.disorder" - 0, 1, "tx.airbase" + 0, 1, "base.airbase_mg" 0, 2, "tx.airbase_full" - 0, 4, "tx.fortress" - 0, 5, "tx.fortress_back" + 0, 4, "base.fortress_fg" + 0, 5, "base.fortress_bg" 0, 6, "city.electricage_occupied_0" 0, 6, "city.modern_occupied_0" 0, 6, "city.postmodern_occupied_0" diff -Nurd -X.diff_ignore freeciv/data/civ1/terrain.ruleset freeciv/data/civ1/terrain.ruleset --- freeciv/data/civ1/terrain.ruleset 2007-03-06 03:31:56.000000000 +0200 +++ freeciv/data/civ1/terrain.ruleset 2007-03-06 04:57:03.000000000 +0200 @@ -609,6 +609,8 @@ [fortress] name = _("Fortress") +graphic = "base.fortress" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Construction", "Player" @@ -620,6 +622,8 @@ [airbase] name = _("Airbase") +graphic = "base.airbase" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Never", "Player" diff -Nurd -X.diff_ignore freeciv/data/civ2/terrain.ruleset freeciv/data/civ2/terrain.ruleset --- freeciv/data/civ2/terrain.ruleset 2007-03-06 03:31:57.000000000 +0200 +++ freeciv/data/civ2/terrain.ruleset 2007-03-06 04:56:42.000000000 +0200 @@ -701,6 +701,8 @@ [fortress] name = _("Fortress") +graphic = "base.fortress" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Construction", "Player" @@ -712,6 +714,8 @@ [airbase] name = _("Airbase") +graphic = "base.airbase" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Radio", "Player" diff -Nurd -X.diff_ignore freeciv/data/default/terrain.ruleset freeciv/data/default/terrain.ruleset --- freeciv/data/default/terrain.ruleset 2007-03-06 03:31:57.000000000 +0200 +++ freeciv/data/default/terrain.ruleset 2007-03-06 04:53:52.000000000 +0200 @@ -756,6 +756,9 @@ ; fortress and airbase. ; ; name = Name of the base type. +; graphic = tag specifing preferred graphic +; graphic_alt = tag for alternate garphic if preferred graphic is not +; present. Can use eg "-" for no alternate graphic. ; reqs = requirements to build the base (see effects.ruleset ; and README.effects for help on requirements) ; flags @@ -768,6 +771,8 @@ [fortress] name = _("Fortress") +graphic = "base.fortress" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Construction", "Player" @@ -779,6 +784,8 @@ [airbase] name = _("Airbase") +graphic = "base.airbase" +graphic_alt = "-" reqs = { "type", "name", "range" "Tech", "Radio", "Player" diff -Nurd -X.diff_ignore freeciv/data/hex2t/items.spec freeciv/data/hex2t/items.spec --- freeciv/data/hex2t/items.spec 2007-02-26 14:15:35.000000000 +0200 +++ freeciv/data/hex2t/items.spec 2007-03-06 05:00:56.000000000 +0200 @@ -32,10 +32,10 @@ ; used by all city styles 1, 0, "city.disorder" - 1, 1, "tx.airbase" + 1, 1, "base.airbase_mg" 1, 2, "tx.airbase_full" - 1, 3, "tx.fortress" - 1, 4, "tx.fortress_back" + 1, 3, "base.fortress_fg" + 1, 4, "base.fortress_bg" ; default city tiles 2, 2, "cd.city" diff -Nurd -X.diff_ignore freeciv/data/isotrident/cities.spec freeciv/data/isotrident/cities.spec --- freeciv/data/isotrident/cities.spec 2006-07-17 23:56:23.000000000 +0300 +++ freeciv/data/isotrident/cities.spec 2007-03-06 04:59:16.000000000 +0200 @@ -47,10 +47,10 @@ ; used by all city styles 0, 0, "city.disorder" - 0, 1, "tx.airbase" + 0, 1, "base.airbase_mg" 0, 2, "tx.airbase_full" - 0, 4, "tx.fortress" - 0, 5, "tx.fortress_back" + 0, 4, "base.fortress_fg" + 0, 5, "base.fortress_bg" ; ; city tiles ; diff -Nurd -X.diff_ignore freeciv/data/trident/tiles.spec freeciv/data/trident/tiles.spec --- freeciv/data/trident/tiles.spec 2007-02-26 14:16:13.000000000 +0200 +++ freeciv/data/trident/tiles.spec 2007-03-06 05:00:25.000000000 +0200 @@ -370,8 +370,8 @@ 12, 10, "tx.oil_mine" 12, 11, "tx.pollution" 12, 14, "tx.village" - 12, 15, "tx.fortress" - 13, 16, "tx.airbase" + 12, 15, "base.fortress_fg" + 13, 16, "base.airbase_mg" 13, 0, "mask.tile" 13, 17, "tx.fog" 13, 18, "tx.fallout" diff -Nurd -X.diff_ignore freeciv/server/ruleset.c freeciv/server/ruleset.c --- freeciv/server/ruleset.c 2007-03-06 03:31:56.000000000 +0200 +++ freeciv/server/ruleset.c 2007-03-06 04:53:52.000000000 +0200 @@ -1801,6 +1801,13 @@ freelog(LOG_ERROR, "Unhandled base type in load_ruleset_terrain()"); exit(EXIT_FAILURE); } + + sz_strlcpy(pbase->graphic_str, + secfile_lookup_str_default(file, "-", "%s.graphic", section)); + sz_strlcpy(pbase->graphic_alt, + secfile_lookup_str_default(file, "-", + "%s.graphic_alt", section)); + reqs = lookup_req_list(file, section, "reqs"); requirement_vector_copy(&pbase->reqs, reqs); @@ -3077,6 +3084,8 @@ packet.id = b->id; sz_strlcpy(packet.name, b->name); + sz_strlcpy(packet.graphic_str, b->graphic_str); + sz_strlcpy(packet.graphic_alt, b->graphic_alt); j = 0; requirement_vector_iterate(&b->reqs, preq) { diff -Nurd -X.diff_ignore freeciv/version.in freeciv/version.in --- freeciv/version.in 2007-03-06 03:31:58.000000000 +0200 +++ freeciv/version.in 2007-03-06 04:54:08.000000000 +0200 @@ -24,4 +24,4 @@ # - Avoid adding a new manditory capbility to the development branch for # as long as possible. We want to maintain network compatibility with # the stable branch for as long as possible. -FREECIV_NETWORK_CAPSTRING("+Freeciv.Devel.2007.Mar.06") +FREECIV_NETWORK_CAPSTRING("+Freeciv.Devel.2007.Mar.06-2")
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev