Commits

Anonymous committed 64a6601

Add: Regression test for houses. Well-documented so it can serve as example.

Comments (0)

Files changed (7)

regression/030_house.nml

+/*
+ * This NewGRF adds the FIRS Brewery as a 2x2 town building
+ * It accepts grain (as well as some/pax) mail.
+ * Whenever grain is accepted, a smoke plume rises above the building.
+ * The Brewery has a very high probability to appear, but special checks
+ * make sure that only 1 appears per town.
+ */
+
+/* Make our NewGRF visible to OpenTTD */
+grf {
+    grfid: "NML\30";
+    name: string(STR_REGRESSION_NAME);
+    desc: string(STR_REGRESSION_DESC);
+    version: 0;
+    min_compatible_version: 0;
+}
+
+/* Add a cargo translation table */
+cargotable {
+    PASS, MAIL, GRAI, WHEA
+}
+
+/* Sprite templates for both ground and building sprites */
+template tmpl_ground_tile(x, y, filename) {
+ [x, y, 64, 31, -31, 0, filename]
+}
+
+template tmpl_building_sprite(x, y, h, dy, filename) {
+    [x, y, 64, h, -31, dy, NOCROP, filename]
+}
+
+/* Spriteset containing all ground sprites */
+spriteset(brewery_spriteset_ground) {
+    tmpl_ground_tile( 10, 10, "groundtiles.png") //bare
+    tmpl_ground_tile(150, 10, "groundtiles.png") //stones
+    tmpl_ground_tile(220, 10, "groundtiles.png") //snowed
+    [] /* pad with empty sprites, as all spritesets have to have the same no. of sprites (=6) */
+    []
+    []
+}
+
+spriteset(brewery_spriteset_building) {
+    tmpl_building_sprite( 10, 60, 91, -60, "brewery.png") // tile with chimney
+    tmpl_building_sprite( 80, 60, 91, -60, "brewery.png") // left part of large building
+    tmpl_building_sprite(150, 60, 91, -60, "brewery.png") // right part of large building
+    tmpl_building_sprite( 10, 60, 91, -60, "brewery_snow.png") // idem, with snow
+    tmpl_building_sprite( 80, 60, 91, -60, "brewery_snow.png")
+    tmpl_building_sprite(150, 60, 91, -60, "brewery_snow.png")
+}
+
+/* Generic sprite layout that is used for all tiles of the building. Parmaeters:
+ * - building_sprite: offset in the brewery_spriteset_building spriteset to use. -1 to skip building sprite.
+ * - with_smoke: Show smoke above the tile (also depends on animation state) */
+spritelayout brewery_sprite_layout(building_sprite, with_smoke) { 
+    /* First: Draw the normal ground sprite as a base layer */
+    ground {
+        sprite: GROUNDSPRITE_NORMAL;
+    }
+    /* Now draw our own ground sprite
+     * Below the snowline, it is either a bare land sprite (construction state 0) or stones (construction state 1..3)
+     * Above the snowline, it is always a snowed sprite */
+    childsprite {
+        sprite: brewery_spriteset_ground((terrain_type == TILETYPE_SNOW) ? 2 : min(construction_state, 1));
+        always_draw: 1; // Draw this sprite even in transparent mode
+    }
+    /* Now draw the building sprite, assuming the building is fully constructed */
+    building { 
+        sprite: brewery_spriteset_building((terrain_type == TILETYPE_SNOW) * 3 + building_sprite); 
+        /* Enable recolouring for the flag on top, it will get a random colour */
+        recolour_mode: RECOLOUR_REMAP;
+        palette: PALETTE_USE_DEFAULT;
+        zextent: 48;
+        hide_sprite: building_sprite == -1 || construction_state != 3;
+    }
+    building { 
+        /* 3079 .. 3083 are steam smoke sprites
+         * Draw one of them, assuming the animation frame != 0 */
+        sprite: 3079 + (animation_frame - 1) / 4;
+        xoffset: 8;
+        yoffset: 0; 
+        zoffset: 55 + (animation_frame - 1); 
+        xextent: 11;
+        zextent: 7;
+        hide_sprite: !with_smoke || animation_frame == 0;
+    }
+}
+
+switch(FEAT_HOUSES, SELF, brewery_layout_1, house_tile) {
+    HOUSE_TILE_NORTH: brewery_sprite_layout(2, 0);
+    HOUSE_TILE_WEST:  brewery_sprite_layout(1, 0);
+    HOUSE_TILE_EAST:  brewery_sprite_layout(-1, 0); // empty tile
+    brewery_sprite_layout(0, 1); //south, building with chimney
+}
+
+switch(FEAT_HOUSES, SELF, brewery_layout_2, house_tile) {
+    HOUSE_TILE_NORTH: brewery_sprite_layout(-1, 0); // empty tile
+    HOUSE_TILE_WEST:  brewery_sprite_layout(0, 1); // building with chimney
+    HOUSE_TILE_EAST:  brewery_sprite_layout(2, 0);
+    brewery_sprite_layout(1, 0); //south
+}
+
+/* Randomly choose a graphics layout */
+switch(FEAT_HOUSES, SELF, brewery_choose_layout, random_bits & 1) {
+    0 : brewery_layout_1;
+    brewery_layout_2;
+}
+
+/* Stop the animation in frame 0, else continue normally
+ * We choose frame 0 as 'stop' frame (no smoke visible) so there is no smoke
+ * during / after construction */
+switch(FEAT_HOUSES, SELF, brewery_next_frame, animation_frame) {
+    0 : return CB_RESULT_STOP_ANIMATION;
+    return CB_RESULT_NEXT_FRAME;
+}
+
+/* When grain / wheat is accepted, start the animation if:
+ * - The animation is currently stopped (frame 0)
+ * - The house tile actually contains smoke. This saves CPU time
+ * Else, do nothing */
+switch(FEAT_HOUSES, SELF, brewery_cargo_accepted, house_tile == ((random_bits & 1) ? HOUSE_TILE_WEST : HOUSE_TILE_SOUTH)) {
+    // only animate the tile that has the chimney with smoke
+    1 : return (animation_frame == 0) ? 1 : CB_RESULT_DO_NOTHING;
+    return CB_RESULT_DO_NOTHING;
+}
+
+/* Only allow construction of a brewery if there isn't already one in the same town */
+switch(FEAT_HOUSES, SELF, brewery_check_location, same_house_count_town) {
+    0 : 1;
+    0;
+}
+
+/* Only enable the brewery if there is a grain or wheat cargo type */
+if (cargotype_available("GRAI") || cargotype_available("WHEA")) {
+    item(FEAT_HOUSES, item_brewery, -1, HOUSE_SIZE_2X2) {
+        property {
+            substitute: 40; // use 2x2 shopping mall as fallback
+            name: string(STR_BREWERY_NAME);
+            /* do not replace (override) any original house type */
+            building_flags: bitmask(HOUSE_FLAG_ANIMATE);
+            population: 100;
+            mail_multiplier: 25;
+            accepted_cargos: [[cargotype_available("GRAI") ? GRAI : WHEA, 8], [PASS, 2], [MAIL, 1]];
+            local_authority_impact: 200;
+            removal_cost_multiplier: 250;
+            probability: 15; // high probability for testing purposes
+            years_available: [1940, 2050];
+            minimum_lifetime: 20;
+            availability_mask: [bitmask(TOWNZONE_EDGE, TOWNZONE_OUTSKIRT, TOWNZONE_OUTER_SUBURB),
+                                bitmask(CLIMATE_TEMPERATE, CLIMATE_ARCTIC, ABOVE_SNOWLINE)];
+            random_colours: [COLOUR_RED, COLOUR_BLUE, COLOUR_GREEN, COLOUR_YELLOW];
+            refresh_multiplier: 0;
+            animation_info: [ANIMATION_LOOPING, 21]; // 'stop' frame + 20 normal frames. Auto-loop back to frame 0
+            animation_speed: 2;
+            /* no building class set, it's pointless */
+            watched_cargo_types: [GRAI, WHEA];
+        }
+
+        graphics {
+            default: brewery_choose_layout;
+            anim_next_frame: brewery_next_frame;
+            watched_cargo_accepted: brewery_cargo_accepted;
+            construction_check: brewery_check_location;
+        }
+    }
+}

regression/brewery.png

Added
New image

regression/brewery_snow.png

Added
New image

regression/expected/030_house.grf

Binary file added.

regression/expected/030_house.nfo

+// Automatically generated by GRFCODEC. Do not modify!
+// (Info version 32)
+// Escapes: 2+ 2- 2< 2> 2u< 2u> 2/ 2% 2u/ 2u% 2* 2& 2| 2^ 2sto = 2s 2rst = 2r 2psto 2ror = 2rot 2cmp 2ucmp 2<< 2u>> 2>>
+// Escapes: 71 70 7= 7! 7< 7> 7G 7g 7gG 7GG 7gg 7c 7C
+// Escapes: D= = DR D+ = DF D- = DC Du* = DM D* = DnF Du<< = DnC D<< = DO D& D| Du/ D/ Du% D%
+// Format: spritenum imagefile depth xpos ypos xsize ysize xrel yrel zoom flags
+
+0 * 4 \d97 
+
+1 * 54 14 "C" "INFO" 
+"B" "VRSN" \w4 \dx00000000 
+"B" "MINV" \w4 \dx00000000 
+"B" "NPAR" \w1 00 
+"B" "PALS" \w1 "W" 
+"B" "BLTR" \w1 "8" 
+00 
+00 
+2 * 52 08 08 "NML\30" "NML regression test" 00 "A test newgrf testing NML" 00 
+3 * 14 04 07 FF 01 \wxDC00 "Brewery" 00 
+
+4 * 22 00 08 \b1 04 00 
+09 "PASS" "MAIL" "GRAI" "WHEA" 
+
+5 * 6 01 07 \b2 FF \wx0006 
+
+6 groundtiles.png 8bpp 10 10 64 31 -31 0 normal 
+7 groundtiles.png 8bpp 150 10 64 31 -31 0 normal 
+8 groundtiles.png 8bpp 220 10 64 31 -31 0 normal 
+9 * 1 00 
+10 * 1 00 
+11 * 1 00 
+
+12 brewery.png 8bpp 10 60 64 91 -31 -60 normal nocrop 
+13 brewery.png 8bpp 80 60 64 91 -31 -60 normal nocrop 
+14 brewery.png 8bpp 150 60 64 91 -31 -60 normal nocrop 
+15 brewery_snow.png 8bpp 10 60 64 91 -31 -60 normal nocrop 
+16 brewery_snow.png 8bpp 80 60 64 91 -31 -60 normal nocrop 
+17 brewery_snow.png 8bpp 150 60 64 91 -31 -60 normal nocrop 
+
+// Name: brewery_sprite_layout - feature 07
+18 * 49 02 07 FF \b67 \dx00000F8D \wx0000 
+\dxC0000000 \wx0002 \b0 \b0 80 83 
+\dx80008001 \wx0003 \b0 \b0 \b0 \b16 \b16 \b48 86 84 
+\dx00000000 \wx0023 \b8 \b0 \b0 \b11 \b16 \b7 89 87 8A 
+
+// Name: brewery_sprite_layout@registers - feature 07
+19 * 383 02 07 FF 89 
+43 20 \dx000000FF 
+\2cmp 1A 20 \dx00000004 
+\2& 1A 20 \dx00000001 
+\2u< 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000080 	// guard
+\2^ 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000081 	// !guard
+\2r 40 20 \dx00000003 
+\2< 1A 20 \dx00000001 
+\2* 7D 81 20 \dxFFFFFFFF 
+\2sto 1A 20 \dx00000082 
+\2r 7D 80 20 \dxFFFFFFFF 
+\2* 1A 20 \dx00000002 
+\2+ 7D 82 20 \dxFFFFFFFF 
+\2sto 1A 20 \dx00000083 
+\2r 43 20 \dx000000FF 
+\2cmp 1A 20 \dx00000004 
+\2& 1A 20 \dx00000001 
+\2* 1A 20 \dx00000003 
+\2+ 7D 8B 20 \dxFFFFFFFF 
+\2sto 1A 20 \dx00000084 
+\2r 40 20 \dx00000003 
+\2cmp 1A 20 \dx00000003 
+\2& 1A 20 \dx00000001 
+\2^ 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000085 
+\2r 7D 8B 20 \dxFFFFFFFF 
+\2cmp 1A 20 \dxFFFFFFFF 
+\2& 1A 20 \dx00000001 
+\2| 7D 85 20 \dxFFFFFFFF 
+\2u< 1A 20 \dx00000001 
+\2^ 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000086 
+\2r 46 60 \dx000000FF \dxFFFFFFFF \dx00000004 
+\2+ 1A 20 \dx00000C07 
+\2sto 1A 20 \dx00000087 
+\2r 46 20 \dx000000FF 
+\2cmp 1A 20 \dx00000000 
+\2& 1A 20 \dx00000001 
+\2u< 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000088 
+\2r 7D 8C 20 \dxFFFFFFFF 
+\2u< 1A 20 \dx00000001 
+\2^ 1A 20 \dx00000001 
+\2| 7D 88 20 \dxFFFFFFFF 
+\2^ 1A 20 \dx00000001 
+\2sto 1A 20 \dx00000089 
+\2r 46 60 \dx000000FF \dx00000036 \dx00000001 
+\2sto 1A 00 \dx0000008A 
+\b1 
+\wx00FF \dx00000000 \dx00000000 
+\wx00FF // 
+
+// Name: @return_action_0
+20 * 44 02 07 FE 89 
+1A 20 \dx00000002 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_1
+21 * 44 02 07 FD 89 
+1A 20 \dx00000001 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_2
+22 * 44 02 07 FC 89 
+1A 20 \dxFFFFFFFF 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_3
+23 * 44 02 07 FB 89 
+1A 20 \dx00000000 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000001 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: brewery_layout_1
+24 * 44 02 07 FB 89 
+7D FF 10 \dx000000FF 
+\b3 
+\wx00FE \dx00000000 \dx00000000 	// 0 .. 0: @return_action_0;
+\wx00FD \dx00000002 \dx00000002 	// 2 .. 2: @return_action_1;
+\wx00FC \dx00000001 \dx00000001 	// 1 .. 1: @return_action_2;
+\wx00FB // default: @return_action_3;
+
+// Name: @return_action_0
+25 * 44 02 07 FC 89 
+1A 20 \dxFFFFFFFF 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_1
+26 * 44 02 07 FD 89 
+1A 20 \dx00000000 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000001 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_2
+27 * 44 02 07 FE 89 
+1A 20 \dx00000002 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: @return_action_3
+28 * 44 02 07 FF 89 
+1A 20 \dx00000001 
+\2sto 1A 20 \dx0000008B 
+\2r 1A 20 \dx00000000 
+\2sto 1A 00 \dx0000008C 
+\b1 
+\wx00FF \dx00000000 \dx00000000 	// brewery_sprite_layout
+\wx00FF // brewery_sprite_layout
+
+// Name: brewery_layout_2
+29 * 44 02 07 FF 89 
+7D FF 10 \dx000000FF 
+\b3 
+\wx00FC \dx00000000 \dx00000000 	// 0 .. 0: @return_action_0;
+\wx00FD \dx00000002 \dx00000002 	// 2 .. 2: @return_action_1;
+\wx00FE \dx00000001 \dx00000001 	// 1 .. 1: @return_action_2;
+\wx00FF // default: @return_action_3;
+
+// Name: brewery_choose_layout
+30 * 23 02 07 FF 89 
+5F 08 \dx00000001 
+\b1 
+\wx00FB \dx00000000 \dx00000000 	// 0 .. 0: brewery_layout_1;
+\wx00FF // default: brewery_layout_2;
+
+// Name: brewery_next_frame
+31 * 23 02 07 FB 89 
+46 00 \dx000000FF 
+\b1 
+\wx80FF \dx00000000 \dx00000000 	// 0 .. 0: return 255;
+\wx80FE // default: return 254;
+
+// Name: @return_action_0
+32 * 48 02 07 FE 89 
+46 20 \dx000000FF 
+\2cmp 1A 20 \dx00000000 
+\2& 1A 20 \dx00000001 
+\2u< 1A 20 \dx00000001 
+\2* 1A 20 \dxFFFFFF04 	// expr1 - expr2
+\2+ 1A 00 \dx000000FD 
+\b0 
+\wx8000 // Return computed value
+
+// Name: brewery_cargo_accepted
+33 * 59 02 07 FE 89 
+5F 28 \dx00000001 
+\2u< 1A 20 \dx00000001 
+\2* 1A 20 \dxFFFFFFFF 	// expr1 - expr2
+\2+ 1A 20 \dx00000003 
+\2cmp 7D FF 30 \dx000000FF 
+\2& 1A 00 \dx00000001 
+\b1 
+\wx00FE \dx00000001 \dx00000001 	// 1 .. 1: return ((var[0x46, 0, 255] == 0) ? 1 : 253)
+\wx80FD // default: return 253;
+
+// Name: brewery_check_location
+34 * 23 02 07 FD 89 
+44 00 \dx000000FF 
+\b1 
+\wx8001 \dx00000000 \dx00000000 	// 0 .. 0: return 1;
+\wx8000 // default: return 0;
+
+// param[65] = 0
+35 * 9 0D 41 \D= FF 00 \dx00000000 
+
+36 * 9 09 00 04 \7c \dx49415247 01 
+
+// param[65] = 1
+37 * 9 0D 41 \D= FF 00 \dx00000001 
+
+// param[66] = 0
+38 * 9 0D 42 \D= FF 00 \dx00000000 
+
+39 * 9 09 00 04 \7c \dx41454857 01 
+
+// param[66] = 1
+40 * 9 0D 42 \D= FF 00 \dx00000001 
+
+// param[64] = (param[65] | param[66])
+41 * 5 0D 40 \D| 41 42 
+
+42 * 9 09 40 04 \7= \dx00000000 10 
+
+// param[68] = 3
+43 * 9 0D 44 \D= FF 00 \dx00000003 
+
+// param[69] = 0
+44 * 9 0D 45 \D= FF 00 \dx00000000 
+
+45 * 9 09 00 04 \7c \dx49415247 01 
+
+// param[69] = 1
+46 * 9 0D 45 \D= FF 00 \dx00000001 
+
+47 * 9 09 45 04 \7= \dx00000000 01 
+
+// param[68] = 2
+48 * 9 0D 44 \D= FF 00 \dx00000002 
+
+// param[67] = (param[68] & 255)
+49 * 9 0D 43 \D& 44 FF \dx000000FF 
+
+// param[66] = (param[67] | 0)
+50 * 9 0D 42 \D| 43 FF \dx00000000 
+
+// param[65] = (param[66] | 65536)
+51 * 9 0D 41 \D| 42 FF \dx00010000 
+
+// param[69] = 3
+52 * 9 0D 45 \D= FF 00 \dx00000003 
+
+// param[70] = 0
+53 * 9 0D 46 \D= FF 00 \dx00000000 
+
+54 * 9 09 00 04 \7c \dx49415247 01 
+
+// param[70] = 1
+55 * 9 0D 46 \D= FF 00 \dx00000001 
+
+56 * 9 09 46 04 \7= \dx00000000 01 
+
+// param[69] = 2
+57 * 9 0D 45 \D= FF 00 \dx00000002 
+
+// param[68] = (param[69] & 255)
+58 * 9 0D 44 \D& 45 FF \dx000000FF 
+
+// param[67] = (param[68] | 0)
+59 * 9 0D 43 \D| 44 FF \dx00000000 
+
+// param[66] = (param[67] | 65536)
+60 * 9 0D 42 \D| 43 FF \dx00010000 
+
+// param[70] = 3
+61 * 9 0D 46 \D= FF 00 \dx00000003 
+
+// param[71] = 0
+62 * 9 0D 47 \D= FF 00 \dx00000000 
+
+63 * 9 09 00 04 \7c \dx49415247 01 
+
+// param[71] = 1
+64 * 9 0D 47 \D= FF 00 \dx00000001 
+
+65 * 9 09 47 04 \7= \dx00000000 01 
+
+// param[70] = 2
+66 * 9 0D 46 \D= FF 00 \dx00000002 
+
+// param[69] = (param[70] & 255)
+67 * 9 0D 45 \D& 46 FF \dx000000FF 
+
+// param[68] = (param[69] | 0)
+68 * 9 0D 44 \D| 45 FF \dx00000000 
+
+// param[67] = (param[68] | 65536)
+69 * 9 0D 43 \D| 44 FF \dx00010000 
+
+// param[71] = 3
+70 * 9 0D 47 \D= FF 00 \dx00000003 
+
+// param[72] = 0
+71 * 9 0D 48 \D= FF 00 \dx00000000 
+
+72 * 9 09 00 04 \7c \dx49415247 01 
+
+// param[72] = 1
+73 * 9 0D 48 \D= FF 00 \dx00000001 
+
+74 * 9 09 48 04 \7= \dx00000000 01 
+
+// param[71] = 2
+75 * 9 0D 47 \D= FF 00 \dx00000002 
+
+// param[70] = (param[71] & 255)
+76 * 9 0D 46 \D& 47 FF \dx000000FF 
+
+// param[69] = (param[70] | 0)
+77 * 9 0D 45 \D| 46 FF \dx00000000 
+
+// param[68] = (param[69] | 65536)
+78 * 9 0D 44 \D| 45 FF \dx00010000 
+
+79 * 22 06 
+41 04 FF \wx0037 
+42 04 FF \wx003B 
+43 04 FF \wx003F 
+44 04 FF \wx0043 
+FF 
+
+80 * 176 00 07 \b23 04 00 
+08 28 29 2A 2B 
+12 \wxDC00 \wxDC00 \wxDC00 \wxDC00 
+09 30 20 20 20 
+19 00 00 00 00 
+0B 64 00 00 00 
+0C 19 00 00 00 
+0D 08 08 08 08 
+0E 02 02 02 02 
+0F 01 01 01 01 
+1E \dx00000000 \dx00000000 \dx00000000 \dx00000000 
+10 \wx00C8 \wx00C8 \wx00C8 \wx00C8 
+11 FA FA FA FA 
+18 F0 00 00 00 
+0A \wx8214 \wx0000 \wx0000 \wx0000 
+21 \wx0794 \wx0000 \wx0000 \wx0000 
+22 \wx0802 \wx0000 \wx0000 \wx0000 
+1F 14 00 00 00 
+13 \wx3807 \wx0000 \wx0000 \wx0000 
+17 \dx03060804 \dx03060804 \dx03060804 \dx03060804 
+16 00 00 00 00 
+1A 94 94 94 94 
+1B 02 02 02 02 
+20 \b2 
+02 03 
+\b2 
+02 03 
+\b2 
+02 03 
+\b2 
+02 03 
+
+81 * 9 00 07 \b2 01 00 
+14 03 
+1D 00 
+
+82 * 2 10 10 
+
+// Name: @action3_0
+83 * 57 02 07 FD 89 
+1A 20 \dx00000000 
+\2sto 1A 20 \dx000000FF 
+\2r 0C 00 \dx0000FFFF 
+\b3 
+\wx00FD \dx00000017 \dx00000017 	// brewery_check_location;
+\wx00FB \dx0000001A \dx0000001A 	// brewery_next_frame;
+\wx00FE \dx00000148 \dx00000148 	// brewery_cargo_accepted;
+\wx00FF // brewery_choose_layout;
+
+84 * 9 07 40 04 \7= \dx00000000 02 
+
+85 * 7 03 07 01 00 \b0 
+\wx00FD 	// @action3_0;
+
+86 * 9 00 07 \b2 01 01 
+14 02 
+1D 00 
+
+// Name: @action3_1
+87 * 47 02 07 FD 89 
+1A 20 \dx00010100 
+\2sto 1A 20 \dx000000FF 
+\2r 0C 00 \dx0000FFFF 
+\b2 
+\wx00FB \dx0000001A \dx0000001A 	// brewery_next_frame;
+\wx00FE \dx00000148 \dx00000148 	// brewery_cargo_accepted;
+\wx00FF // brewery_choose_layout;
+
+88 * 9 07 40 04 \7= \dx00000000 02 
+
+89 * 7 03 07 01 01 \b0 
+\wx00FD 	// @action3_1;
+
+90 * 9 00 07 \b2 01 02 
+14 02 
+1D 00 
+
+// Name: @action3_2
+91 * 47 02 07 FD 89 
+1A 20 \dx00020001 
+\2sto 1A 20 \dx000000FF 
+\2r 0C 00 \dx0000FFFF 
+\b2 
+\wx00FB \dx0000001A \dx0000001A 	// brewery_next_frame;
+\wx00FE \dx00000148 \dx00000148 	// brewery_cargo_accepted;
+\wx00FF // brewery_choose_layout;
+
+92 * 9 07 40 04 \7= \dx00000000 02 
+
+93 * 7 03 07 01 02 \b0 
+\wx00FD 	// @action3_2;
+
+94 * 9 00 07 \b2 01 03 
+14 02 
+1D 00 
+
+// Name: @action3_3
+95 * 47 02 07 FF 89 
+1A 20 \dx00030101 
+\2sto 1A 20 \dx000000FF 
+\2r 0C 00 \dx0000FFFF 
+\b2 
+\wx00FB \dx0000001A \dx0000001A 	// brewery_next_frame;
+\wx00FE \dx00000148 \dx00000148 	// brewery_cargo_accepted;
+\wx00FF // brewery_choose_layout;
+
+96 * 9 07 40 04 \7= \dx00000000 01 
+
+97 * 7 03 07 01 03 \b0 
+\wx00FF 	// @action3_3;
+

regression/groundtiles.png

Added
New image

regression/lang/english.lng

 STR_COALMINE_EXTRA_TEXT        :{BLACK}Extra info for coal mine: {COMMA}
 STR_COALMINE_MONTH_0_10        :{BLACK}coal
 STR_COALMINE_MONTH_11          :{BLACK}diamonds
+
+STR_BREWERY_NAME               :Brewery