<URL: http://bugs.freeciv.org/Ticket/Display.html?id=39387 >
Re-reading the original posting, that should be "match_style". After much testing, I've completely eliminated "match_style", and its parameters "none", "bool", and "full". Instead, I've replaced it with "match_with", a listing of match_types. This allows completely orthogonal operations between "styles". Styles are determined automagically (internally). That is, layer0_match_style = "bool" layer0_match_type = "hills" becomes layer0_match_type = "hills" layer0_match_with = "hills" Simple enough. The elegance comes as more match_with types are added: layer0_match_type = "shallow" layer0_match_with = "land", "deep" The above is the equivalent of the old match_style = "full", but doesn't interfere with other tiles' matching styles. *And* may be extensible to more than 3 types! (Currently limited to 3 as before.) This patch doesn't make any substantive changes. It continues to operate in exactly the same manner as before, so that old savegames will run without modification. Never-the-less, this is the "big one"! Old tilesets will no longer work. (Replacements are provided for the main 5 here.) I've tested 2.1 savegames against all 5 tilesets, and also trunk edit savegames (with deep water) against all 5 tilesets.
Index: data/trident.tilespec =================================================================== --- data/trident.tilespec (revision 13103) +++ data/trident.tilespec (working copy) @@ -2,7 +2,7 @@ [tilespec] ; Format and options of this tilespec file: -options = "+tilespec4.2007.Feb.20" +options = "+tilespec4.2007.Jul.13" ; A simple name for the tileset specified by this file: name = "Trident" @@ -86,169 +86,138 @@ ; Terrain info - see README.graphics [layer0] -match_style = "BOOL" match_types = "arctic", "desert", "forest", "grassland", "hills", "jungle", "mountains", "water", "plains", "swamp", "tundra" [layer1] -match_style = "BOOL" match_types = "water" [layer2] -match_style = "BOOL" match_types = "water" ; Water graphics referenced by terrain.ruleset ; -[terrain_coast] +[tile_coast] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" -[terrain_shelf] +[tile_shelf] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" -[terrain_floor] +[tile_floor] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" -[terrain_trench] +[tile_trench] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" -[terrain_ridge] +[tile_ridge] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" -[terrain_vent] +[tile_vent] is_blended = 0 num_layers = 3 -layer0_match_style = "none" layer0_match_type = "water" -layer1_match_style = "bool" layer1_match_type = "water" -layer2_match_style = "bool" +layer1_match_with = "water" layer2_match_type = "water" -layer2_cell_type = "rect" +layer2_match_with = "water" +layer2_sprite_type = "corner" ; Land graphics referenced by terrain.ruleset ; -[terrain_arctic] +[tile_arctic] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "arctic" +layer0_match_with = "arctic" mine_sprite = "tx.oil_mine" -[terrain_desert] +[tile_desert] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "desert" +layer0_match_with = "desert" mine_sprite = "tx.oil_mine" -[terrain_forest] +[tile_forest] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "forest" +layer0_match_with = "forest" -[terrain_grassland] +[tile_grassland] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "grassland" +layer0_match_with = "grassland" -[terrain_hills] +[tile_hills] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "hills" +layer0_match_with = "hills" mine_sprite = "tx.mine" -[terrain_jungle] +[tile_jungle] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "jungle" +layer0_match_with = "jungle" -[terrain_mountains] +[tile_mountains] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "mountains" +layer0_match_with = "mountains" mine_sprite = "tx.mine" -[terrain_ocean] +[tile_plains] is_blended = 0 -num_layers = 3 -layer0_match_style = "none" -layer0_match_type = "water" -layer1_match_style = "bool" -layer1_match_type = "water" -layer2_match_style = "bool" -layer2_match_type = "water" -layer2_cell_type = "rect" - -[terrain_deep] -is_blended = 0 -num_layers = 3 -layer0_match_style = "none" -layer0_match_type = "water" -layer1_match_style = "bool" -layer1_match_type = "water" -layer2_match_style = "bool" -layer2_match_type = "water" -layer2_cell_type = "rect" - -[terrain_plains] -is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "plains" +layer0_match_with = "plains" -[terrain_swamp] +[tile_swamp] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "swamp" +layer0_match_with = "swamp" -[terrain_tundra] +[tile_tundra] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "tundra" +layer0_match_with = "tundra" Index: data/isophex.tilespec =================================================================== --- data/isophex.tilespec (revision 13103) +++ data/isophex.tilespec (working copy) @@ -2,7 +2,7 @@ [tilespec] ; Format and options of this tilespec file: -options = "+tilespec4.2007.Feb.20" +options = "+tilespec4.2007.Jul.13" ; A simple name for the tileset specified by this file: name = "isophex" @@ -100,126 +100,117 @@ ; Terrain info - see README.graphics [layer0] -match_style = "BOOL" match_types = "land", "water" [layer1] -match_style = "BOOL" match_types = "forest", "hills", "mountains", "ridge", "trench" ; Water graphics referenced by terrain.ruleset ; -[terrain_coast] +[tile_coast] is_blended = 1 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_shelf] +[tile_shelf] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_floor] +[tile_floor] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_trench] +[tile_trench] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "trench" +layer1_match_with = "trench" -[terrain_ridge] +[tile_ridge] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "ridge" +layer1_match_with = "ridge" -[terrain_vent] +[tile_vent] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" ; Land graphics referenced by terrain.ruleset ; -[terrain_arctic] +[tile_arctic] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_desert] +[tile_desert] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_forest] +[tile_forest] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "forest" +layer1_match_with = "forest" -[terrain_grassland] +[tile_grassland] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_hills] +[tile_hills] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "hills" +layer1_match_with = "hills" mine_sprite = "tx.mine" -[terrain_jungle] +[tile_jungle] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_mountains] +[tile_mountains] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "mountains" +layer1_match_with = "mountains" mine_sprite = "tx.mine" -[terrain_ocean] +[tile_plains] is_blended = 1 num_layers = 1 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" - -[terrain_plains] -is_blended = 1 -num_layers = 1 layer0_match_type = "land" -[terrain_swamp] +[tile_swamp] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_tundra] +[tile_tundra] is_blended = 1 num_layers = 1 layer0_match_type = "land" Index: data/amplio.tilespec =================================================================== --- data/amplio.tilespec (revision 13103) +++ data/amplio.tilespec (working copy) @@ -2,7 +2,7 @@ [tilespec] ; Format and options of this tilespec file: -options = "+tilespec4.2007.Feb.20" +options = "+tilespec4.2007.Jul.13" ; A simple name for the tileset specified by this file: name = "amplio" @@ -95,159 +95,125 @@ ; Terrain info - see README.graphics [layer0] -match_style = "BOOL" match_types = "land", "water" [layer1] -match_style = "BOOL" match_types = "forest", "hills", "mountains", "shallow", "ridge", "trench", "deep" ; Water graphics referenced by terrain.ruleset ; -[terrain_coast] +[tile_coast] is_blended = 1 num_layers = 2 -;layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" -layer1_match_type = "shallow" -layer1_cell_type = "rect" +;layer0_match_with = "water" +layer0_sprite_type = "corner" +layer1_match_type = "shallow" +layer1_match_with = "shallow" +layer1_sprite_type = "corner" -[terrain_shelf] +[tile_shelf] is_blended = 0 num_layers = 2 -;layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" -layer1_match_type = "shallow" -layer1_cell_type = "rect" +;layer0_match_with = "water" +layer0_sprite_type = "corner" +layer1_match_type = "shallow" +layer1_match_with = "shallow" +layer1_sprite_type = "corner" -[terrain_floor] +[tile_floor] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_trench] +[tile_trench] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "trench" +layer1_match_with = "trench" -[terrain_ridge] +[tile_ridge] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "ridge" +layer1_match_with = "ridge" -[terrain_vent] +[tile_vent] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" ; Land graphics referenced by terrain.ruleset ; -[terrain_arctic] +[tile_arctic] ; TODO: ice cliffs is_blended = 0 num_layers = 2 layer0_match_type = "land" -layer1_match_type = "shallow" +layer1_match_type = "shallow" mine_sprite = "tx.oil_mine" -[terrain_desert] +[tile_desert] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_forest] +[tile_forest] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "forest" +layer1_match_with = "forest" -[terrain_grassland] +[tile_grassland] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_hills] +[tile_hills] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "hills" +layer1_match_with = "hills" mine_sprite = "tx.mine" -[terrain_jungle] +[tile_jungle] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_mountains] +[tile_mountains] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "mountains" +layer1_match_with = "mountains" mine_sprite = "tx.mine" -[terrain_ocean] +[tile_plains] is_blended = 1 num_layers = 1 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" - -; Deep Ocean is currently quite a hack: -; - Blending is disabled so there will be no blending -; between Ocean and Deep Ocean. Ocean blending tile -; is of land colour and we don't want that to appear -; in the middle of the ocean. -; - Deep Ocean is in two layers. Layer0 is setup just -; for match_type = "water". Ocean will match this -; and will not draw coast sprites between Ocean and -; Deep Ocean. Layer1 is for actual Deep Ocean drawing. -; Ocean will not match this, so Deep Ocean to Ocean -; sprites will be drawn. -; -; Problems: -; - There is no blending between Deep Ocean and land tiles -; - There is no coast drawn beteen Deep Ocean and land tiles -[terrain_deep] -is_blended = 0 -num_layers = 2 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" -layer1_match_type = "deep" -layer1_cell_type = "rect" - -[terrain_plains] -is_blended = 1 -num_layers = 1 layer0_match_type = "land" -[terrain_swamp] +[tile_swamp] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_tundra] +[tile_tundra] is_blended = 1 num_layers = 1 layer0_match_type = "land" Index: data/civ1/terrain.ruleset =================================================================== --- data/civ1/terrain.ruleset (revision 13103) +++ data/civ1/terrain.ruleset (working copy) @@ -175,8 +175,8 @@ [terrain_legacy_water] ; undifferentiated open water from old savefiles -name = _("Ocean") -graphic = "ocean" +name = _("Water") +graphic = "coast" graphic_alt = "-" identifier = " " movement_cost = 1 @@ -280,7 +280,7 @@ ") [terrain_ocean_coast] -name = _("Coast") +name = _("Ocean") graphic = "coast" graphic_alt = "-" identifier = "." Index: data/civ2/terrain.ruleset =================================================================== --- data/civ2/terrain.ruleset (revision 13103) +++ data/civ2/terrain.ruleset (working copy) @@ -183,8 +183,8 @@ [terrain_legacy_water] ; undifferentiated open water from old savefiles -name = _("Ocean") -graphic = "ocean" +name = _("Water") +graphic = "coast" graphic_alt = "-" identifier = " " movement_cost = 1 @@ -288,7 +288,7 @@ ") [terrain_ocean_coast] -name = _("Coast") +name = _("Ocean") graphic = "coast" graphic_alt = "-" identifier = "." Index: data/default/terrain.ruleset =================================================================== --- data/default/terrain.ruleset (revision 13103) +++ data/default/terrain.ruleset (working copy) @@ -183,8 +183,8 @@ [terrain_legacy_water] ; undifferentiated open water from old savefiles -name = _("Ocean") -graphic = "ocean" +name = _("Water") +graphic = "coast" graphic_alt = "-" identifier = " " movement_cost = 1 @@ -303,7 +303,7 @@ ") [terrain_ocean_coast] -name = _("Coast") +name = _("Ocean") graphic = "coast" graphic_alt = "-" identifier = "." Index: data/isotrident.tilespec =================================================================== --- data/isotrident.tilespec (revision 13103) +++ data/isotrident.tilespec (working copy) @@ -2,7 +2,7 @@ [tilespec] ; Format and options of this tilespec file: -options = "+tilespec4.2007.Feb.20" +options = "+tilespec4.2007.Jul.13" ; A simple name for the tileset specified by this file: name = "MacroIsoTrident" @@ -90,131 +90,115 @@ ; Terrain info - see README.graphics [layer0] -match_style = "BOOL" match_types = "land", "water" [layer1] -match_style = "BOOL" match_types = "forest", "hills", "mountains", "ridge" ; Water graphics referenced by terrain.ruleset ; -[terrain_coast] +[tile_coast] is_blended = 1 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_shelf] +[tile_shelf] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_floor] +[tile_floor] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_trench] +[tile_trench] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_ridge] +[tile_ridge] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "ridge" +layer1_match_with = "ridge" -[terrain_vent] +[tile_vent] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" ; Land graphics referenced by terrain.ruleset ; -[terrain_arctic] +[tile_arctic] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_desert] +[tile_desert] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_forest] +[tile_forest] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "forest" +layer1_match_with = "forest" -[terrain_grassland] +[tile_grassland] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_hills] +[tile_hills] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "hills" +layer1_match_with = "hills" mine_sprite = "tx.mine" -[terrain_jungle] +[tile_jungle] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_mountains] +[tile_mountains] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "mountains" +layer1_match_with = "mountains" mine_sprite = "tx.mine" -[terrain_ocean] +[tile_plains] is_blended = 1 num_layers = 1 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" - -[terrain_deep] -is_blended = 0 -num_layers = 1 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" - -[terrain_plains] -is_blended = 1 -num_layers = 1 layer0_match_type = "land" -[terrain_swamp] +[tile_swamp] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_tundra] +[tile_tundra] is_blended = 1 num_layers = 1 layer0_match_type = "land" Index: data/hex2t.tilespec =================================================================== --- data/hex2t.tilespec (revision 13103) +++ data/hex2t.tilespec (working copy) @@ -2,7 +2,7 @@ [tilespec] ; Format and options of this tilespec file: -options = "+tilespec4.2007.Feb.20" +options = "+tilespec4.2007.Jul.13" ; A simple name for the tileset specified by this file: name = "hex-2 tileset" @@ -94,126 +94,116 @@ ; Terrain info - see README.graphics [layer0] -match_style = "BOOL" match_types = "water", "land" [layer1] -match_style = "BOOL" match_types = "forest", "jungle", "steep" ; Water graphics referenced by terrain.ruleset ; -[terrain_coast] +[tile_coast] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_shelf] +[tile_shelf] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_floor] +[tile_floor] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_trench] +[tile_trench] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" -[terrain_ridge] +[tile_ridge] is_blended = 0 num_layers = 2 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" -layer1_match_style = "bool" +layer0_match_with = "water" +layer0_sprite_type = "corner" layer1_match_type = "steep" +layer1_match_with = "steep" -[terrain_vent] +[tile_vent] is_blended = 0 num_layers = 1 -layer0_match_style = "bool" layer0_match_type = "water" -layer0_cell_type = "rect" +layer0_match_with = "water" +layer0_sprite_type = "corner" ; Land graphics referenced by terrain.ruleset ; -[terrain_arctic] +[tile_arctic] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_desert] +[tile_desert] is_blended = 1 num_layers = 1 layer0_match_type = "land" mine_sprite = "tx.oil_mine" -[terrain_forest] +[tile_forest] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "forest" +layer1_match_with = "forest" -[terrain_grassland] +[tile_grassland] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_hills] +[tile_hills] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "steep" +layer1_match_with = "steep" mine_sprite = "tx.mine" -[terrain_jungle] +[tile_jungle] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "none" layer1_match_type = "jungle" -[terrain_mountains] +[tile_mountains] is_blended = 1 num_layers = 2 layer0_match_type = "land" -layer1_match_style = "bool" layer1_match_type = "steep" +layer1_match_with = "steep" mine_sprite = "tx.mine" -[terrain_ocean] -is_blended = 0 -num_layers = 1 -layer0_match_style = "bool" -layer0_match_type = "water" -layer0_cell_type = "rect" - -[terrain_plains] +[tile_plains] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_swamp] +[tile_swamp] is_blended = 1 num_layers = 1 layer0_match_type = "land" -[terrain_tundra] +[tile_tundra] is_blended = 1 num_layers = 1 layer0_match_type = "land" Index: client/tilespec.c =================================================================== --- client/tilespec.c (revision 13103) +++ client/tilespec.c (working copy) @@ -59,8 +59,25 @@ #include "tilespec.h" +#define TILESPEC_CAPSTR "+tilespec4.2007.Jul.13 duplicates_ok" +/* + * Tilespec capabilities acceptable to this program: + * + * +tilespec4 - basic format; required + * + * duplicates_ok - we can handle existence of duplicate tags + * (lattermost tag which appears is used; tilesets which + * have duplicates should specify "+duplicates_ok") + */ + +#define SPEC_CAPSTR "+spec3" +/* + * Individual spec file capabilities acceptable to this program: + * +spec3 - basic format, required + */ + #define TILESPEC_SUFFIX ".tilespec" -#define TILE_SECTION_PREFIX "terrain_" +#define TILE_SECTION_PREFIX "tile_" /* This the way directional indices are now encoded: */ #define MAX_INDEX_CARDINAL 64 @@ -85,30 +102,31 @@ enum match_style { MATCH_NONE, MATCH_SAME, /* "boolean" match */ + MATCH_PAIR, MATCH_FULL }; -enum cell_type { +enum sprite_type { CELL_WHOLE, /* entire tile */ CELL_CORNER /* corner of tile */ }; -struct terrain_drawing_data { +struct drawing_data { char *name; char *mine_tag; int num_layers; /* 1 thru MAX_NUM_LAYERS. */ #define MAX_NUM_LAYERS 3 - struct { + struct drawing_layer { bool is_tall; int offset_x, offset_y; enum match_style match_style; - int match_type; - int match_count; + int match_index[1 + MATCH_FULL]; + int match_indices; /* 0 = no match_type, 1 = no match_with */ - enum cell_type cell_type; + enum sprite_type sprite_type; struct sprite_vector base; struct sprite *match[MAX_INDEX_CARDINAL]; @@ -286,7 +304,7 @@ struct sprite *player[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS]; } colors; - struct terrain_drawing_data *terrain[MAX_NUM_TERRAINS]; + struct drawing_data *drawing[MAX_NUM_ITEMS]; }; /* Don't reorder this enum since tilesets depend on it. */ @@ -391,10 +409,9 @@ int num_index_valid, num_index_cardinal; enum direction8 valid_tileset_dirs[8], cardinal_tileset_dirs[8]; - struct { - enum match_style match_style; - int count; + struct tileset_layer { char **match_types; + int match_count; } layers[MAX_NUM_LAYERS]; struct specfile_list *specfiles; @@ -406,7 +423,7 @@ struct hash_table *sprite_hash; /* This hash table maps terrain graphic strings to drawing data. */ - struct hash_table *terrain_hash; + struct hash_table *tile_hash; struct named_sprites sprites; @@ -418,24 +435,6 @@ struct tileset *tileset; -#define TILESPEC_CAPSTR "+tilespec4.2007.Feb.20 duplicates_ok" -/* - * Tilespec capabilities acceptable to this program: - * - * +tilespec3 - basic format; required - * - * duplicates_ok - we can handle existence of duplicate tags - * (lattermost tag which appears is used; tilesets which - * have duplicates should specify "+duplicates_ok") - */ - -#define SPEC_CAPSTR "+spec3" -/* - * Individual spec file capabilities acceptable to this program: - * +spec3 - basic format, required - */ - - int focus_unit_state = 0; @@ -775,7 +774,6 @@ } if (t->prefered_themes) { - int i; for (i = 0; i < t->num_prefered_themes; i++) { free(t->prefered_themes[i]); } @@ -784,12 +782,12 @@ } t->num_prefered_themes = 0; - if (t->terrain_hash) { - while (hash_num_entries(t->terrain_hash) > 0) { - struct terrain_drawing_data *draw; + if (t->tile_hash) { + while (hash_num_entries(t->tile_hash) > 0) { + struct drawing_data *draw + = (void *)hash_value_by_number(t->tile_hash, 0); - draw = (void *)hash_value_by_number(t->terrain_hash, 0); - hash_delete_entry(t->terrain_hash, draw->name); + hash_delete_entry(t->tile_hash, draw->name); free(draw->name); if (draw->mine_tag) { free(draw->mine_tag); @@ -804,17 +802,19 @@ } free(draw); } - hash_free(t->terrain_hash); - t->terrain_hash = NULL; /* Helpful for sanity. */ + hash_free(t->tile_hash); + t->tile_hash = NULL; /* Helpful for sanity. */ } for (i = 0; i < MAX_NUM_LAYERS; i++) { - if (t->layers[i].match_types) { - for (j = 0; j < t->layers[i].count; j++) { - free(t->layers[i].match_types[j]); + struct tileset_layer *tslp = &t->layers[i]; + + if (tslp->match_types) { + for (j = 0; j < tslp->match_count; j++) { + free(tslp->match_types[j]); } - free(t->layers[i].match_types); - t->layers[i].match_types = NULL; + free(tslp->match_types); + tslp->match_types = NULL; } } @@ -895,7 +895,7 @@ sz_strlcpy(tileset_name, name); sz_strlcpy(old_name, tileset->name); - freelog(LOG_NORMAL, "Loading tileset %s.", tileset_name); + freelog(LOG_NORMAL, _("Loading tileset \"%s\"."), tileset_name); /* Step 0: Record old data. * @@ -1030,7 +1030,7 @@ } } - freelog(LOG_VERBOSE, "Could not load gfx file \"%s\".", gfx_filename); + freelog(LOG_ERROR, "Could not load gfx file \"%s\".", gfx_filename); return NULL; } @@ -1240,6 +1240,7 @@ return NULL; } +#if 0 /********************************************************************** Determine the match_style string. ***********************************************************************/ @@ -1254,33 +1255,42 @@ if (mystrcasecmp(style, "none") == 0) { return MATCH_NONE; } + if (mystrcasecmp(style, "pair") == 0) { + return MATCH_PAIR; + } if (mystrcasecmp(style, "same") == 0) { return MATCH_SAME; } - freelog(LOG_ERROR, "Unknown match_style \"%s\" for layer %d.", - style, layer); + if (mystrcasecmp(style, "self") == 0) { + return MATCH_SAME; + } + freelog(LOG_ERROR, "layer %d: unknown match_style \"%s\".", + layer, + style); return MATCH_NONE; } +#endif /********************************************************************** - Determine the cell_type string. + Determine the sprite_type string. ***********************************************************************/ -static int check_cell_type(const char *cell_type, const char *tile_type) +static int check_sprite_type(const char *sprite_type, const char *tile_section) { - if (mystrcasecmp(cell_type, "corner") == 0) { + if (mystrcasecmp(sprite_type, "corner") == 0) { return CELL_CORNER; } - if (mystrcasecmp(cell_type, "rect") == 0) { + if (mystrcasecmp(sprite_type, "rect") == 0) { return CELL_CORNER; } - if (mystrcasecmp(cell_type, "single") == 0) { + if (mystrcasecmp(sprite_type, "single") == 0) { return CELL_WHOLE; } - if (mystrcasecmp(cell_type, "whole") == 0) { + if (mystrcasecmp(sprite_type, "whole") == 0) { return CELL_WHOLE; } - freelog(LOG_ERROR, "Unknown cell_type \"%s\" for [%s].", - cell_type, tile_type); + freelog(LOG_ERROR, "[%s] unknown sprite_type \"%s\".", + tile_section, + sprite_type); return CELL_WHOLE; } @@ -1353,8 +1363,8 @@ } if (t->is_isometric && !isometric_view_supported()) { - freelog(LOG_NORMAL, _("Client does not support isometric tilesets." - " Using default tileset instead.")); + freelog(LOG_NORMAL, _("Client does not support isometric tilesets.")); + freelog(LOG_NORMAL, _("Using default tileset instead.")); assert(tileset_name != NULL); section_file_free(file); free(fname); @@ -1362,8 +1372,8 @@ return NULL; } if (!t->is_isometric && !overhead_view_supported()) { - freelog(LOG_NORMAL, _("Client does not support overhead view tilesets." - " Using default tileset instead.")); + freelog(LOG_NORMAL, _("Client does not support overhead view tilesets.")); + freelog(LOG_NORMAL, _("Using default tileset instead.")); assert(tileset_name != NULL); section_file_free(file); free(fname); @@ -1454,17 +1464,25 @@ /* Terrain layer info. */ for (i = 0; i < MAX_NUM_LAYERS; i++) { - char *style = secfile_lookup_str_default(file, "none", - "layer%d.match_style", i); - int j; + struct tileset_layer *tslp = &t->layers[i]; + int j, k; - t->layers[i].match_style = check_match_style(style,i); + tslp->match_types + = secfile_lookup_str_vec(file, &tslp->match_count, + "layer%d.match_types", i); + for (j = 0; j < tslp->match_count; j++) { + tslp->match_types[j] = mystrdup(tslp->match_types[j]); - t->layers[i].match_types - = secfile_lookup_str_vec(file, &t->layers[i].count, - "layer%d.match_types", i); - for (j = 0; j < t->layers[i].count; j++) { - t->layers[i].match_types[j] = mystrdup(t->layers[i].match_types[j]); + for (k = 0; k < j; k++) { + if (tslp->match_types[k][0] == tslp->match_types[j][0]) { + freelog(LOG_FATAL, "[layer%d] match_types: \"%s\" initial" + " ('%c') is not unique.", + i, + tslp->match_types[j], + tslp->match_types[j][0]); + exit(EXIT_FAILURE); + } + } } } @@ -1479,122 +1497,174 @@ return NULL; } - assert(t->terrain_hash == NULL); - t->terrain_hash = hash_new(hash_fval_string, hash_fcmp_string); + assert(t->tile_hash == NULL); + t->tile_hash = hash_new(hash_fval_string, hash_fcmp_string); for (i = 0; i < num_sections; i++) { - struct terrain_drawing_data *terr = fc_calloc(1, sizeof(*terr)); - char *cell_type; - int l, j; + struct drawing_data *draw = fc_calloc(1, sizeof(*draw)); + char *sprite_type; + int l; - terr->name = mystrdup(sections[i] + strlen(TILE_SECTION_PREFIX)); - terr->blending = secfile_lookup_int_default(file, 0, + draw->name = mystrdup(sections[i] + strlen(TILE_SECTION_PREFIX)); + draw->blending = secfile_lookup_int_default(file, 0, "%s.is_blended", sections[i]); - terr->blending = CLIP(0, terr->blending, MAX_NUM_LAYERS); + draw->blending = CLIP(0, draw->blending, MAX_NUM_LAYERS); - terr->is_reversed = secfile_lookup_bool_default(file, FALSE, + draw->is_reversed = secfile_lookup_bool_default(file, FALSE, "%s.is_reversed", sections[i]); - terr->num_layers = secfile_lookup_int(file, "%s.num_layers", + draw->num_layers = secfile_lookup_int(file, "%s.num_layers", sections[i]); - terr->num_layers = CLIP(1, terr->num_layers, MAX_NUM_LAYERS); + draw->num_layers = CLIP(1, draw->num_layers, MAX_NUM_LAYERS); - for (l = 0; l < terr->num_layers; l++) { - char *match_type, *match_style; + for (l = 0; l < draw->num_layers; l++) { + struct drawing_layer *dlp = &draw->layer[l]; + struct tileset_layer *tslp = &t->layers[l]; + char *match_type; + char **match_with; + int count; - terr->layer[l].is_tall + dlp->is_tall = secfile_lookup_bool_default(file, FALSE, "%s.layer%d_is_tall", sections[i], l); - terr->layer[l].offset_x + dlp->offset_x = secfile_lookup_int_default(file, 0, "%s.layer%d_offset_x", sections[i], l); - terr->layer[l].offset_y + dlp->offset_y = secfile_lookup_int_default(file, 0, "%s.layer%d_offset_y", sections[i], l); - match_style = secfile_lookup_str_default(file, "none", - "%s.layer%d_match_style", - sections[i], l); - terr->layer[l].match_style = check_match_style(match_style,l); - match_type = secfile_lookup_str_default(file, NULL, "%s.layer%d_match_type", sections[i], l); if (match_type) { - /* Set match_count */ - switch (terr->layer[l].match_style) { - case MATCH_FULL: - terr->layer[l].match_count = t->layers[l].count; - break; - case MATCH_SAME: - terr->layer[l].match_count = 2; - break; - default: - terr->layer[l].match_count = 0; - break; - }; + int j; /* Determine our match_type. */ - for (j = 0; j < t->layers[l].count; j++) { - if (mystrcasecmp(t->layers[l].match_types[j], match_type) == 0) { + for (j = 0; j < tslp->match_count; j++) { + if (mystrcasecmp(tslp->match_types[j], match_type) == 0) { break; } } - if (j >= t->layers[l].count) { - freelog(LOG_ERROR, "Invalid match type given for [%s].", sections[i]); - terr->layer[l].match_type = 0; - terr->layer[l].match_style = MATCH_NONE; + if (j >= tslp->match_count) { + freelog(LOG_ERROR, "[%s] invalid match_type \"%s\".", + sections[i], + match_type); } else { - terr->layer[l].match_type = j; + dlp->match_index[dlp->match_indices++] = j; } - } else { - terr->layer[l].match_style = MATCH_NONE; - if (t->layers[l].match_style != MATCH_NONE) { - freelog(LOG_ERROR, "[Layer %d] has a match_style set;" - " all sections must have a match_type." - " [%s] doesn't.", l, sections[i]); - } } - if (terr->layer[l].match_style == MATCH_NONE - && t->layers[l].match_style == MATCH_FULL) { - freelog(LOG_ERROR, "[Layer %d] has match_type full set;" - " all sections must match this." - " [%s] doesn't.", l, sections[i]); + match_with = secfile_lookup_str_vec(file, &count, + "%s.layer%d_match_with", + sections[i], l); + if (match_with) { + int j, k; + + if (count > MATCH_FULL) { + freelog(LOG_ERROR, "[%s] match_with has too many types (%d, max %d)", + sections[i], + count, + MATCH_FULL); + count = MATCH_FULL; + } + + if (1 < dlp->match_indices) { + freelog(LOG_ERROR, "[%s] previous match_with ignored.", + sections[i]); + dlp->match_indices = 1; + } else if (1 > dlp->match_indices) { + freelog(LOG_ERROR, "[%s] missing match_type, using \"%s\".", + sections[i], + tslp->match_types[0]); + dlp->match_index[0] = 0; + dlp->match_indices = 1; + } + + for (k = 0; k < count; k++) { + for (j = 0; j < tslp->match_count; j++) { + if (mystrcasecmp(tslp->match_types[j], match_with[k]) == 0) { + break; + } + } + if (j >= tslp->match_count) { + freelog(LOG_ERROR, "[%s] layer%d_match_with: invalid \"%s\".", + sections[i], + l, + match_with[k]); + } else if (1 < count) { + int m; + + for (m = 0; m < dlp->match_indices; m++) { + if (dlp->match_index[m] == j) { + freelog(LOG_ERROR, "[%s] layer%d_match_with: duplicate \"%s\".", + sections[i], + l, + match_with[k]); + break; + } + } + if (m >= dlp->match_indices) { + dlp->match_index[dlp->match_indices++] = j; + } + } else { + dlp->match_index[dlp->match_indices++] = j; + } + } + free(match_with); + match_with = NULL; } - cell_type - = secfile_lookup_str_default(file, "whole", "%s.layer%d_cell_type", + /* Check match_indices */ + switch (dlp->match_indices) { + case 0: + case 1: + dlp->match_style = MATCH_NONE; + break; + case 2: + if (dlp->match_index[0] == dlp->match_index[1] ) { + dlp->match_style = MATCH_SAME; + } else { + dlp->match_style = MATCH_PAIR; + } + break; + default: + dlp->match_style = MATCH_FULL; + break; + }; + + sprite_type + = secfile_lookup_str_default(file, "whole", "%s.layer%d_sprite_type", sections[i], l); - terr->layer[l].cell_type = check_cell_type(cell_type, sections[i]); + dlp->sprite_type = check_sprite_type(sprite_type, sections[i]); - switch (terr->layer[l].cell_type) { + switch (dlp->sprite_type) { case CELL_WHOLE: /* OK, no problem */ break; case CELL_CORNER: - if (terr->layer[l].is_tall - || terr->layer[l].offset_x > 0 - || terr->layer[l].offset_y > 0) { + if (dlp->is_tall + || dlp->offset_x > 0 + || dlp->offset_y > 0) { freelog(LOG_ERROR, "[%s] layer %d: you cannot have tall terrain or\n" - "a sprite offset with a cell-based drawing method.", + "a sprite offset with a cell-based drawing method.", sections[i], l); - terr->layer[l].is_tall = FALSE; - terr->layer[l].offset_x = terr->layer[l].offset_y = 0; + dlp->is_tall = FALSE; + dlp->offset_x = dlp->offset_y = 0; } break; }; } - terr->mine_tag = secfile_lookup_str_default(file, NULL, "%s.mine_sprite", + draw->mine_tag = secfile_lookup_str_default(file, NULL, "%s.mine_sprite", sections[i]); - if (terr->mine_tag) { - terr->mine_tag = mystrdup(terr->mine_tag); + if (draw->mine_tag) { + draw->mine_tag = mystrdup(draw->mine_tag); } - if (!hash_insert(t->terrain_hash, terr->name, terr)) { + if (!hash_insert(t->tile_hash, draw->name, draw)) { freelog(LOG_NORMAL, "warning: duplicate tilespec entry [%s].", sections[i]); section_file_free(file); @@ -2696,7 +2766,7 @@ void tileset_setup_tile_type(struct tileset *t, const struct terrain *pterrain) { - struct terrain_drawing_data *draw; + struct drawing_data *draw; struct sprite *sprite; char buffer[MAX_LEN_NAME + 20]; int i, l; @@ -2705,9 +2775,9 @@ return; } - draw = hash_lookup_data(t->terrain_hash, pterrain->graphic_str); + draw = hash_lookup_data(t->tile_hash, pterrain->graphic_str); if (!draw) { - draw = hash_lookup_data(t->terrain_hash, pterrain->graphic_alt); + draw = hash_lookup_data(t->tile_hash, pterrain->graphic_alt); if (!draw) { freelog(LOG_FATAL, "Terrain \"%s\": no graphic tile \"%s\" or \"%s\".", terrain_rule_name(pterrain), @@ -2719,11 +2789,12 @@ /* Set up each layer of the drawing. */ for (l = 0; l < draw->num_layers; l++) { - sprite_vector_init(&draw->layer[l].base); + struct drawing_layer *dlp = &draw->layer[l]; + sprite_vector_init(&dlp->base); - switch (draw->layer[l].cell_type) { + switch (dlp->sprite_type) { case CELL_WHOLE: - switch (draw->layer[l].match_style) { + switch (dlp->match_style) { case MATCH_NONE: /* Load whole sprites for this tile. */ for (i = 0; ; i++) { @@ -2735,8 +2806,8 @@ if (!sprite) { break; } - sprite_vector_reserve(&draw->layer[l].base, i + 1); - draw->layer[l].base.p[i] = sprite; + sprite_vector_reserve(&dlp->base, i + 1); + dlp->base.p[i] = sprite; } if (i == 0) { freelog(LOG_FATAL, "Missing base sprite tag \"%s\".", @@ -2745,51 +2816,60 @@ } break; case MATCH_SAME: - case MATCH_FULL: /* Load 16 cardinally-matched sprites. */ for (i = 0; i < t->num_index_cardinal; i++) { my_snprintf(buffer, sizeof(buffer), "t.l%d.%s_%s", l, draw->name, cardinal_index_str(t, i)); - draw->layer[l].match[i] = + dlp->match[i] = lookup_sprite_tag_alt(t, buffer, "", TRUE, "matched terrain", terrain_rule_name(pterrain)); } break; + case MATCH_PAIR: + case MATCH_FULL: + assert(0); /* not yet defined */ + break; }; break; case CELL_CORNER: { - const int count = draw->layer[l].match_count; + const int count = dlp->match_indices; int number = NUM_CORNER_DIRS; - switch (draw->layer[l].match_style) { + switch (dlp->match_style) { case MATCH_NONE: /* do nothing */ break; + case MATCH_PAIR: case MATCH_SAME: + /* N directions (NSEW) * 3 dimensions of matching */ + assert(count == 2); + number = NUM_CORNER_DIRS * 2 * 2 * 2; + break; case MATCH_FULL: + default: /* N directions (NSEW) * 3 dimensions of matching */ /* could use exp() or expi() here? */ number = NUM_CORNER_DIRS * count * count * count; break; }; - draw->layer[l].cells - = fc_malloc(number * sizeof(*draw->layer[l].cells)); + dlp->cells + = fc_calloc(number, sizeof(*dlp->cells)); for (i = 0; i < number; i++) { enum direction4 dir = i % NUM_CORNER_DIRS; int value = i / NUM_CORNER_DIRS; - switch (draw->layer[l].match_style) { + switch (dlp->match_style) { case MATCH_NONE: my_snprintf(buffer, sizeof(buffer), "t.l%d.%s_cell_%c", l, draw->name, direction4letters[dir]); - draw->layer[l].cells[i] + dlp->cells[i] = lookup_sprite_tag_alt(t, buffer, "", TRUE, "cell terrain", terrain_rule_name(pterrain)); break; @@ -2801,21 +2881,33 @@ (value >> 0) & 1, (value >> 1) & 1, (value >> 2) & 1); - draw->layer[l].cells[i] + dlp->cells[i] = lookup_sprite_tag_alt(t, buffer, "", TRUE, "same cell terrain", terrain_rule_name(pterrain)); break; + case MATCH_PAIR: + my_snprintf(buffer, sizeof(buffer), "t.l%d.%s_cell_%c%d%d%d", + l, + draw->name, + direction4letters[dir], + (value >> 0) & 1, + (value >> 1) & 1, + (value >> 2) & 1); + dlp->cells[i] + = lookup_sprite_tag_alt(t, buffer, "", TRUE, "cell pair terrain", + terrain_rule_name(pterrain)); + break; case MATCH_FULL: { - int this = draw->layer[l].match_type; - int n = 0, s = 0, e = 0, w = 0; + int this = dlp->match_index[0]; + int n, s, e, w; int v1, v2, v3; - v1 = value % count; + v1 = dlp->match_index[value % count]; value /= count; - v2 = value % count; + v2 = dlp->match_index[value % count]; value /= count; - v3 = value % count; + v3 = dlp->match_index[value % count]; assert(v1 < count && v2 < count && v3 < count); @@ -2840,14 +2932,16 @@ w = v3; break; case DIR4_WEST: + default: /* avoid warnings */ e = this; s = v1; w = v2; n = v3; break; }; - /* use only first character of match_type */ - /* FIXME: need earlier check of match_type for uniqueness */ + + /* Use first character of match_types, + * already checked for uniqueness. */ my_snprintf(buffer, sizeof(buffer), "t.l%d.cellgroup_%c_%c_%c_%c", l, @@ -2875,7 +2969,7 @@ buffer); } - draw->layer[l].cells[i] = sprite; + dlp->cells[i] = sprite; } break; }; @@ -2931,7 +3025,7 @@ draw->mine = NULL; } - t->sprites.terrain[pterrain->index] = draw; + t->sprites.drawing[pterrain->index] = draw; color_system_setup_terrain(t->color_system, pterrain); } @@ -3615,11 +3709,11 @@ if (!tile1 || client_tile_get_known(tile1) == TILE_UNKNOWN || pterrain == (other = tterrain_near[DIR4_TO_DIR8[dir]]) - || 0 == t->sprites.terrain[other->index]->blending) { + || 0 == t->sprites.drawing[other->index]->blending) { continue; } - ADD_SPRITE(t->sprites.terrain[other->index]->blend[dir], TRUE, + ADD_SPRITE(t->sprites.drawing[other->index]->blend[dir], TRUE, offsets[dir][0], offsets[dir][1]); } @@ -3689,18 +3783,18 @@ { struct drawn_sprite *saved_sprs = sprs; struct terrain *pterrain = tile_get_terrain(ptile); - struct terrain_drawing_data *draw = t->sprites.terrain[pterrain->index]; - int match_type = draw->layer[l].match_type; + struct drawing_data *draw = t->sprites.drawing[pterrain->index]; + int this = draw->layer[l].match_index[0]; int ox = draw->layer[l].offset_x; int oy = draw->layer[l].offset_y; int i; #define MATCH(dir) \ - (t->sprites.terrain[tterrain_near[(dir)]->index]->num_layers > l \ - ? t->sprites.terrain[tterrain_near[(dir)]->index]->layer[l].match_type \ + (t->sprites.drawing[tterrain_near[(dir)]->index]->num_layers > l \ + ? t->sprites.drawing[tterrain_near[(dir)]->index]->layer[l].match_index[0] \ : -1) - switch (draw->layer[l].cell_type) { + switch (draw->layer[l].sprite_type) { case CELL_WHOLE: { switch (draw->layer[l].match_style) { @@ -3732,7 +3826,7 @@ for (i = 0; i < t->num_cardinal_tileset_dirs; i++) { enum direction8 dir = t->cardinal_tileset_dirs[i]; - if (MATCH(dir) == match_type) { + if (MATCH(dir) == this) { tileno |= 1 << i; } } @@ -3744,6 +3838,7 @@ ADD_SPRITE(draw->layer[l].match[tileno], TRUE, ox, oy); break; } + case MATCH_PAIR: case MATCH_FULL: assert(0); /* not yet defined */ break; @@ -3770,7 +3865,7 @@ /* put corner cells */ for (i = 0; i < NUM_CORNER_DIRS; i++) { - const int count = draw->layer[l].match_count; + const int count = draw->layer[l].match_indices; int array_index = 0; enum direction8 dir = dir_ccw(DIR4_TO_DIR8[i]); int x = (t->is_isometric ? iso_offsets[i][0] : noniso_offsets[i][0]); @@ -3783,11 +3878,15 @@ /* We have no need for matching, just plug the piece in place. */ break; case MATCH_SAME: - assert(count == 2); - array_index = array_index * count + (m[2] != match_type); - array_index = array_index * count + (m[1] != match_type); - array_index = array_index * count + (m[0] != match_type); + array_index = array_index * count + (m[2] != this); + array_index = array_index * count + (m[1] != this); + array_index = array_index * count + (m[0] != this); break; + case MATCH_PAIR: + array_index = array_index * count + (m[2] != this); + array_index = array_index * count + (m[1] != this); + array_index = array_index * count + (m[0] != this); + break; case MATCH_FULL: if (m[0] != -1 && m[1] != -1 && m[2] != -1) { array_index = array_index * count + m[2]; @@ -3888,7 +3987,7 @@ struct drawn_sprite *saved_sprs = sprs; struct sprite *sprite; struct terrain *pterrain = tile_get_terrain(ptile); - struct terrain_drawing_data *draw = t->sprites.terrain[pterrain->index]; + struct drawing_data *draw = t->sprites.drawing[pterrain->index]; const int l = (draw->is_reversed ? (draw->num_layers - layer_num - 1) : layer_num); @@ -4261,8 +4360,8 @@ } if (draw_mines && contains_special(tspecial, S_MINE) - && t->sprites.terrain[pterrain->index]->mine) { - ADD_SPRITE_SIMPLE(t->sprites.terrain[pterrain->index]->mine); + && t->sprites.drawing[pterrain->index]->mine) { + ADD_SPRITE_SIMPLE(t->sprites.drawing[pterrain->index]->mine); } if (draw_specials && contains_special(tspecial, S_HUT)) {
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev