diff --git a/nml/ast/for_.py b/nml/ast/for_.py new file mode 100644 index 000000000..85c67f3b3 --- /dev/null +++ b/nml/ast/for_.py @@ -0,0 +1,47 @@ +__license__ = """ +NML is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +NML is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with NML; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" + +from nml.ast import base_statement +from nml.expression.array import Array + + +class InArrayFor(base_statement.BaseStatement): + def __init__(self, array, param, expressions, pos=None): + base_statement.BaseStatement.__init__(self, "for", pos, False, False) + self.array = array + self.param = param + self.expressions = expressions + + def __str__(self): + expressions_string = "" + for expression in self.expressions: + expressions_string += str(expression) + ", " + expressions_string = expressions_string[:-2] + return "[{} for {} in {}]".format( + expressions_string, + self.param, + self.array, + ) + + def reduce(self, id_dicts=None, unknown_id_fatal=True): + self.array = self.array.reduce(id_dicts, unknown_id_fatal) + out_list = [] + for value in self.array.values: + param_tuple = ({self.param.value: value}, lambda name, x, pos: x) + id_dicts.append(param_tuple) + for expression in self.expressions: + out_list.append(expression.reduce(id_dicts, unknown_id_fatal)) + id_dicts.remove(param_tuple) + return Array(out_list, self.pos) diff --git a/nml/expression/binop.py b/nml/expression/binop.py index 732d389a5..f2a626be3 100644 --- a/nml/expression/binop.py +++ b/nml/expression/binop.py @@ -14,6 +14,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" from nml import generic, nmlop +from . import Array from .base_expression import ConstantFloat, ConstantNumeric, Expression from .boolean import Boolean @@ -71,6 +72,7 @@ def reduce(self, id_dicts=None, unknown_id_fatal=True): # - If both subexpressions are constant, compute the result and return it. # - If the operator allows it and the second expression is more complex than # the first one swap them. + # - If first subexpression is an array, compute the result and return it. # - If the operation is a no-op, delete it. # - Variables (as used in action2var) can have some computations attached to # them, do that if possible. @@ -116,6 +118,12 @@ def reduce(self, id_dicts=None, unknown_id_fatal=True): elif op == nmlop.CMP_GT: op = nmlop.CMP_LT + if isinstance(expr1, Array) and isinstance(expr2, ConstantNumeric) and self.op == nmlop.MUL: + return Array(self.op.compiletime_func(expr1.values, expr2.value), self.pos) + + if isinstance(expr1, Array) and isinstance(expr2, Array) and self.op == nmlop.ADD: + return Array(self.op.compiletime_func(expr1.values, expr2.values), self.pos) + # - If the operation is a no-op, delete it. if op == nmlop.AND and isinstance(expr2, ConstantNumeric) and (expr2.value == -1 or expr2.value == 0xFFFFFFFF): return expr1 diff --git a/nml/parser.py b/nml/parser.py index 9df8670d7..4c47b9264 100644 --- a/nml/parser.py +++ b/nml/parser.py @@ -29,6 +29,7 @@ disable_item, error, font, + for_, general, grf, item, @@ -835,3 +836,7 @@ def p_tilelayout_item_prop(self, t): def p_constant(self, t): "constant : CONST expression EQ expression SEMICOLON" t[0] = constant.Constant(t[2], t[4]) + + def p_in_array_for(self, t): + """expression : LBRACKET non_empty_expression_list FOR ID IN expression RBRACKET""" + t[0] = for_.InArrayFor(t[6], t[4], t[2], t.lineno(1)) diff --git a/nml/tokens.py b/nml/tokens.py index 56e10f6a9..60088ba8b 100644 --- a/nml/tokens.py +++ b/nml/tokens.py @@ -61,7 +61,9 @@ "recolour_sprite": "RECOLOUR_SPRITE", "engine_override": "ENGINE_OVERRIDE", "sort": "SORT_VEHICLES", - "const": "CONST" + "const": "CONST", + "for": "FOR", + "in": "IN", } # fmt: on diff --git a/regression/042_for.nml b/regression/042_for.nml new file mode 100644 index 000000000..240c7ac19 --- /dev/null +++ b/regression/042_for.nml @@ -0,0 +1,122 @@ +//Add action8, so we can test the vehicle in-game +grf { + grfid: "NML\42"; + name: string(STR_REGRESSION_NAME); + desc: string(STR_REGRESSION_DESC); + version: 0; + min_compatible_version: 0; +} + +cargotable { + COAL, LVST +} + +spriteset(station_spriteset, "station.png") { + [ 1, 1, 5, 5, -2, -2] + [ 7, 1, 5, 5, -2, -2] + [ 2, 2, 3, 3, -1, -1] + [ 8, 2, 3, 3, -1, -1] +} + +spritelayout station_sprite_layout_X(a) { + ground { + sprite: GROUNDSPRITE_RAIL_X; + } + building { + sprite: 0x42E; + xoffset: 0; + yoffset: 0; + zoffset: 0; + xextent: 16; + yextent: 5; + zextent: 2; + recolour_mode: RECOLOUR_REMAP; + palette: CUSTOM(0); + } + childsprite { + sprite: DEFAULT(a); + xoffset: 17; + yoffset: 11; + recolour_mode: RECOLOUR_REMAP; + palette: CUSTOM(1); + } +} + +spritelayout station_sprite_layout_Y(a) { + ground { + sprite: GROUNDSPRITE_RAIL_Y; + } + building { + sprite: 0x42F; + xoffset: 0; + yoffset: 0; + zoffset: 0; + xextent: 5; + yextent: 16; + zextent: 2; + recolour_mode: RECOLOUR_REMAP; + palette: CUSTOM(2); + } + childsprite { + sprite: station_spriteset(a); + xoffset: 20; + yoffset: 11; + recolour_mode: RECOLOUR_REMAP; + palette: CUSTOM(3); + } +} + +spriteset (palette_1) { + recolour_sprite { + 0xC6:0xB3;0xC7:0xB4;0xC8:0xB5;0xC9:0xB6;0xCA:0xB7;0xCB:0xA4;0xCC:0xA5;0xCD:0xA6; + } +} +spriteset (palette_2) { + recolour_sprite { + 0xC6:0x60;0xC7:0x61;0xC8:0x62;0xC9:0x63;0xCA:0x64;0xCB:0x65;0xCC:0x66;0xCD:0x67; + } +} +spriteset (palette_3) { + recolour_sprite { + 0xC6:0xC6;0xC7:0xC7;0xC8:0xC8;0xC9:0xC9;0xCA:0xCA;0xCB:0xCB;0xCC:0xCC;0xCD:0xCD; + } +} +spriteset (palette_4) { + recolour_sprite { + 0xC6:0x58;0xC7:0x59;0xC8:0x5A;0xC9:0x5B;0xCA:0x5C;0xCB:0x5D;0xCC:0x5E;0xCD:0x5F; + } +} + +switch (FEAT_STATIONS, SELF, palette_switch, a, company_colour2-a) { + 0 : palette_1; + 1 : palette_2; + 2 : palette_3; + palette_4; +} + +item (FEAT_STATIONS, basic_station, 255) { + property { + class : "TEST"; + classname: string(STR_STATION_TEST_CLASS); + name : string(STR_STATION_BASIC); + general_flags: bitmask(STAT_FLAG_EXTENDED_FOUNDATIONS); + cargo_random_triggers: [LVST]; + disabled_platforms: bitmask(5, 6, 7, 8); + tile_flags: [a | bitmask(a) for a in [0, 1, 2, 3]]; + station_layouts: [[[2]],[[a, a] for a in [4, 6]]]; + } + graphics { + foundations: param[param[2]]; + prepare_layout: [STORE_TEMP(0,nearby_tile_station_id(-1,2)), STORE_TEMP(1,1)]; + purchase_prepare_layout: STORE_TEMP(3,3); + sprite_layouts: [ + station_sprite_layout_X(a), + station_sprite_layout_Y(a) for a in [0, 1] + [2, 3] + ]; + custom_spritesets: [palette_switch(a) for a in [param[param[1]],5,6,10]]; + anim_speed: company_colour1 + company_colour2; + LVST: station_spriteset; + COAL: station_spriteset; + station_spriteset; + } +} diff --git a/regression/expected/042_for.grf b/regression/expected/042_for.grf new file mode 100644 index 000000000..c8c840b88 Binary files /dev/null and b/regression/expected/042_for.grf differ diff --git a/regression/expected/042_for.nfo b/regression/expected/042_for.nfo new file mode 100644 index 000000000..49f6ea1cc --- /dev/null +++ b/regression/expected/042_for.nfo @@ -0,0 +1,596 @@ +// 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 \d89 + +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\42" "NML regression test" 00 "A test newgrf testing NML" 00 +3 * 16 00 08 \b1 02 FF \wx0000 +09 "COAL" "LVST" + +4 * 6 01 04 \b4 FF \wx0001 + +5 * 257 00 +00 00 00 00 00 00 00 00 00 00 0A 0B 0C 0D 0E 0F +10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F +20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F +30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F +40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F +50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F +60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F +70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F +80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F +90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F +A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF +B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF +C0 C1 C2 C3 C4 C5 B3 B4 B5 B6 B7 A4 A5 A6 CE CF +D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF +E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF +F0 F1 F2 F3 F4 F5 00 00 00 00 00 00 00 00 00 FF + +6 * 257 00 +00 00 00 00 00 00 00 00 00 00 0A 0B 0C 0D 0E 0F +10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F +20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F +30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F +40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F +50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F +60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F +70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F +80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F +90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F +A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF +B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF +C0 C1 C2 C3 C4 C5 60 61 62 63 64 65 66 67 CE CF +D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF +E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF +F0 F1 F2 F3 F4 F5 00 00 00 00 00 00 00 00 00 FF + +7 * 257 00 +00 00 00 00 00 00 00 00 00 00 0A 0B 0C 0D 0E 0F +10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F +20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F +30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F +40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F +50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F +60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F +70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F +80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F +90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F +A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF +B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF +C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF +D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF +E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF +F0 F1 F2 F3 F4 F5 00 00 00 00 00 00 00 00 00 FF + +8 * 257 00 +00 00 00 00 00 00 00 00 00 00 0A 0B 0C 0D 0E 0F +10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F +20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F +30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F +40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F +50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F +60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F +70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F +80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F +90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F +A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF +B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF +C0 C1 C2 C3 C4 C5 60 59 5A 5B 5C 5D 5E 5F CE CF +D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF +E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF +F0 F1 F2 F3 F4 F5 00 00 00 00 00 00 00 00 00 FF + +// Name: palette_1 - feature 04 +9 * 7 02 04 FF \b0 \b1 + +\w0 + +// Name: palette_2 - feature 04 +10 * 7 02 04 FE \b0 \b1 + +\w1 + +// Name: palette_3 - feature 04 +11 * 7 02 04 FD \b0 \b1 + +\w2 + +// Name: palette_4 - feature 04 +12 * 7 02 04 FC \b0 \b1 + +\w3 + +// Name: palette_switch +// a : register 80 +13 * 51 02 04 FC 89 +43 3C \dx0000000F +\2- 7D 80 00 \dxFFFFFFFF // a +\b3 +\wx00FF \dx00000000 \dx00000000 // 0 .. 0: palette_1; +\wx00FE \dx00000001 \dx00000001 // 1 .. 1: palette_2; +\wx00FD \dx00000002 \dx00000002 // 2 .. 2: palette_3; +\wx00FC // default: palette_4; + +14 * 39 00 04 \b8 01 FF \wx00FF +08 "TEST" +13 18 +12 \dx00000002 +0C F0 +11 0B +14 0E +15 04 +0E \b1 \b1 +02 +\b2 \b2 +04 04 +06 06 +\b0 \b0 + +15 * 11 04 04 FF 01 \wxC4FF "Test" 00 + +16 * 20 04 04 FF 01 \wxC5FF "Basic station" 00 + +17 * 12 01 04 00 FF \wx0004 FF \wx0001 FF \wx0004 + +18 station.png 8bpp 1 1 5 5 -2 -2 normal +19 station.png 8bpp 7 1 5 5 -2 -2 normal +20 station.png 8bpp 2 2 3 3 -1 -1 normal +21 station.png 8bpp 8 2 3 3 -1 -1 normal + +// Name: station_spriteset - feature 04 +22 * 7 02 04 FD \b0 \b1 + +\w4 + +23 * 261 00 04 \b1 01 FF \wx00FF +1A \b8 +\b66 \dx000003F4 \wx0000 +\dx042D842E \wx0088 \b0 \b0 \b0 \b16 \b5 \b2 01 +\dx842D842D \wx008A \b17 \b11 80 88 03 +\b66 \dx000003F3 \wx0000 +\dx042D842F \wx0088 \b0 \b0 \b0 \b5 \b16 \b2 04 +\dx842D842D \wx00CA \b20 \b11 80 89 05 06 +\b66 \dx000003F4 \wx0000 +\dx042D842E \wx0088 \b0 \b0 \b0 \b16 \b5 \b2 01 +\dx842D842D \wx008A \b17 \b11 80 8A 03 +\b66 \dx000003F3 \wx0000 +\dx042D842F \wx0088 \b0 \b0 \b0 \b5 \b16 \b2 04 +\dx842D842D \wx00CA \b20 \b11 80 8B 05 06 +\b66 \dx000003F4 \wx0000 +\dx042D842E \wx0088 \b0 \b0 \b0 \b16 \b5 \b2 01 +\dx842D842D \wx008A \b17 \b11 80 8C 03 +\b66 \dx000003F3 \wx0000 +\dx042D842F \wx0088 \b0 \b0 \b0 \b5 \b16 \b2 04 +\dx842D842D \wx00CA \b20 \b11 80 8D 05 06 +\b66 \dx000003F4 \wx0000 +\dx042D842E \wx0088 \b0 \b0 \b0 \b16 \b5 \b2 01 +\dx842D842D \wx008A \b17 \b11 80 8E 03 +\b66 \dx000003F3 \wx0000 +\dx042D842F \wx0088 \b0 \b0 \b0 \b5 \b16 \b2 04 +\dx842D842D \wx00CA \b20 \b11 80 8F 05 06 + +// Name: Station Layout@registers - Id FF +// a : register 80 +// a : register 81 +// a : register 82 +// a : register 83 +// a : register 84 +// a : register 85 +// a : register 86 +// a : register 87 +24 * 238 02 04 FE 89 +1A 20 \dx00000000 +\2sto 1A 20 \dx00000080 +\2r 1A 20 \dx00000000 +\2sto 1A 20 \dx00000081 +\2r 1A 20 \dx00000001 +\2sto 1A 20 \dx00000082 +\2r 1A 20 \dx00000001 +\2sto 1A 20 \dx00000083 +\2r 1A 20 \dx00000002 +\2sto 1A 20 \dx00000084 +\2r 1A 20 \dx00000002 +\2sto 1A 20 \dx00000085 +\2r 1A 20 \dx00000003 +\2sto 1A 20 \dx00000086 +\2r 1A 20 \dx00000003 +\2sto 1A 20 \dx00000087 +\2r 7D 80 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx00000088 +\2r 7D 81 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx00000089 +\2r 7D 82 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx0000008A +\2r 7D 83 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx0000008B +\2r 7D 84 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx0000008C +\2r 7D 85 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx0000008D +\2r 7D 86 20 \dxFFFFFFFF // a +\2sto 1A 20 \dx0000008E +\2r 7D 87 20 \dxFFFFFFFF // a +\2sto 1A 00 \dx0000008F +\b0 +\wx8000 // Return computed value + +// Name: Station Layout@prepare - Id FF +25 * 35 02 04 FF 89 +1A 20 \dx00000000 +\2sto 6B 2F 20 \dx0000FFFF +\2r 1A 20 \dx00000001 +\2sto 1A 00 \dx00000001 +\b0 +\wx8000 // Return computed value + +// param[126] = param[1] +26 * 5 0D 7E \D= 01 00 + +27 * 7 06 +7E 01 FF \wx0003 +FF + +// param[127] = param[0] +28 * 5 0D 7F \D= 00 00 + +29 * 7 06 +7F 04 FF \wx0006 +FF + +// Name: @return_action_0 +30 * 30 02 04 FB 89 +1A 20 \dx00000000 // param[127] +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// param[124] = param[2] +31 * 5 0D 7C \D= 02 00 + +32 * 7 06 +7C 01 FF \wx0003 +FF + +// param[125] = param[0] +33 * 5 0D 7D \D= 00 00 + +// param[126] = (param[125] | 32768) +34 * 9 0D 7E \D| 7D FF \dx00008000 + +// Name: @return_action_1 +35 * 30 02 04 FA 89 +1A 20 \dx00000005 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_2 +36 * 30 02 04 F9 89 +1A 20 \dx00000006 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_3 +37 * 30 02 04 F8 89 +1A 20 \dx0000000A +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +38 * 7 06 +7E 02 FF \wx0025 +FF + +// Name: @action3_0 +39 * 79 02 04 F8 89 +7E FF 20 \dxFFFFFFFF // Station Layout@prepare - Id FF +\2r 7E FE 20 \dxFFFFFFFF // Station Layout@registers - Id FF +\2r 10 00 \dx000000FF +\b5 +\wx00FB \dx00000001 \dx00000001 // @return_action_0; +\wx8000 \dx00000002 \dx00000002 // return param[126]; +\wx00FA \dx00000003 \dx00000003 // @return_action_1; +\wx00F9 \dx00000004 \dx00000004 // @return_action_2; +\wx00F8 \dx00000006 \dx00000006 // @return_action_3; +\wx00FD // station_spriteset; + +// param[124] = param[1] +40 * 5 0D 7C \D= 01 00 + +41 * 7 06 +7C 01 FF \wx0003 +FF + +// param[125] = param[0] +42 * 5 0D 7D \D= 00 00 + +43 * 7 06 +7D 04 FF \wx0006 +FF + +// Name: @return_action_4 +44 * 30 02 04 F9 89 +1A 20 \dx00000000 // param[125] +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// param[122] = param[2] +45 * 5 0D 7A \D= 02 00 + +46 * 7 06 +7A 01 FF \wx0003 +FF + +// param[123] = param[0] +47 * 5 0D 7B \D= 00 00 + +// param[124] = (param[123] | 32768) +48 * 9 0D 7C \D| 7B FF \dx00008000 + +// Name: @return_action_5 +49 * 30 02 04 FA 89 +1A 20 \dx00000005 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_6 +50 * 30 02 04 FB 89 +1A 20 \dx00000006 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_7 +51 * 30 02 04 F7 89 +1A 20 \dx0000000A +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +52 * 7 06 +7C 02 FF \wx0025 +FF + +// Name: @action3_1 +53 * 79 02 04 F7 89 +7E FF 20 \dxFFFFFFFF // Station Layout@prepare - Id FF +\2r 7E FE 20 \dxFFFFFFFF // Station Layout@registers - Id FF +\2r 10 00 \dx000000FF +\b5 +\wx00F9 \dx00000001 \dx00000001 // @return_action_4; +\wx8000 \dx00000002 \dx00000002 // return param[124]; +\wx00FA \dx00000003 \dx00000003 // @return_action_5; +\wx00FB \dx00000004 \dx00000004 // @return_action_6; +\wx00F7 \dx00000006 \dx00000006 // @return_action_7; +\wx00FD // station_spriteset; + +// param[122] = param[1] +54 * 5 0D 7A \D= 01 00 + +55 * 7 06 +7A 01 FF \wx0003 +FF + +// param[123] = param[0] +56 * 5 0D 7B \D= 00 00 + +57 * 7 06 +7B 04 FF \wx0006 +FF + +// Name: @return_action_8 +58 * 30 02 04 FB 89 +1A 20 \dx00000000 // param[123] +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// param[120] = param[2] +59 * 5 0D 78 \D= 02 00 + +60 * 7 06 +78 01 FF \wx0003 +FF + +// param[121] = param[0] +61 * 5 0D 79 \D= 00 00 + +// param[122] = (param[121] | 32768) +62 * 9 0D 7A \D| 79 FF \dx00008000 + +// Name: @return_action_9 +63 * 30 02 04 FA 89 +1A 20 \dx00000005 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_10 +64 * 30 02 04 F9 89 +1A 20 \dx00000006 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_11 +65 * 30 02 04 F6 89 +1A 20 \dx0000000A +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +66 * 7 06 +7A 02 FF \wx0025 +FF + +// Name: @action3_2 +67 * 79 02 04 F6 89 +7E FF 20 \dxFFFFFFFF // Station Layout@prepare - Id FF +\2r 7E FE 20 \dxFFFFFFFF // Station Layout@registers - Id FF +\2r 10 00 \dx000000FF +\b5 +\wx00FB \dx00000001 \dx00000001 // @return_action_8; +\wx8000 \dx00000002 \dx00000002 // return param[122]; +\wx00FA \dx00000003 \dx00000003 // @return_action_9; +\wx00F9 \dx00000004 \dx00000004 // @return_action_10; +\wx00F6 \dx00000006 \dx00000006 // @return_action_11; +\wx00FD // station_spriteset; + +// param[120] = param[1] +68 * 5 0D 78 \D= 01 00 + +69 * 7 06 +78 01 FF \wx0003 +FF + +// param[121] = param[0] +70 * 5 0D 79 \D= 00 00 + +71 * 7 06 +79 04 FF \wx0006 +FF + +// Name: @return_action_12 +72 * 30 02 04 F9 89 +1A 20 \dx00000000 // param[121] +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// param[118] = param[2] +73 * 5 0D 76 \D= 02 00 + +74 * 7 06 +76 01 FF \wx0003 +FF + +// param[119] = param[0] +75 * 5 0D 77 \D= 00 00 + +// param[120] = (param[119] | 32768) +76 * 9 0D 78 \D| 77 FF \dx00008000 + +// Name: @return_action_13 +77 * 30 02 04 FA 89 +1A 20 \dx00000005 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_14 +78 * 30 02 04 FB 89 +1A 20 \dx00000006 +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +// Name: @return_action_15 +79 * 30 02 04 FC 89 +1A 20 \dx0000000A +\2sto 1A 00 \dx00000080 +\b1 +\wx00FC \dx00000000 \dx00000000 // palette_switch +\wx00FC // palette_switch + +80 * 7 06 +78 02 FF \wx002B +FF + +// Name: @action3_3 +81 * 85 02 04 FD 89 +1A 20 \dx00000003 +\2sto 1A 20 \dx00000003 +\2r 7E FE 20 \dxFFFFFFFF // Station Layout@registers - Id FF +\2r 10 00 \dx000000FF +\b5 +\wx00F9 \dx00000001 \dx00000001 // @return_action_12; +\wx8000 \dx00000002 \dx00000002 // return param[120]; +\wx00FA \dx00000003 \dx00000003 // @return_action_13; +\wx00FB \dx00000004 \dx00000004 // @return_action_14; +\wx00FC \dx00000006 \dx00000006 // @return_action_15; +\wx00FD // station_spriteset; + +82 * 9 00 04 \b1 01 FF \wx00FF +0B 08 + +// Name: @return_action_16 +83 * 20 02 04 FC 89 +43 38 \dx0000000F +\2+ 43 1C \dx0000000F +\b0 +\wx8000 // Return computed value + +// Name: @action3_4 +84 * 23 02 04 FC 89 +0C 00 \dx0000FFFF +\b1 +\wx00FC \dx00000142 \dx00000142 // return (var[0x43, 24, 15] + var[0x43, 28, 15]) +\wx00F8 // @action3_0; + +// Name: @return_action_17 +85 * 20 02 04 FB 89 +43 38 \dx0000000F +\2+ 43 1C \dx0000000F +\b0 +\wx8000 // Return computed value + +// Name: @action3_5 +86 * 33 02 04 FB 89 +0C 00 \dx0000FFFF +\b2 +\wx00F7 \dx00000000 \dx00000000 // @action3_1; +\wx00FB \dx00000142 \dx00000142 // return (var[0x43, 24, 15] + var[0x43, 28, 15]) +\wx00F8 // @action3_0; + +// Name: @return_action_18 +87 * 20 02 04 F7 89 +43 38 \dx0000000F +\2+ 43 1C \dx0000000F +\b0 +\wx8000 // Return computed value + +// Name: @action3_6 +88 * 33 02 04 F8 89 +0C 00 \dx0000FFFF +\b2 +\wx00F6 \dx00000000 \dx00000000 // @action3_2; +\wx00F7 \dx00000142 \dx00000142 // return (var[0x43, 24, 15] + var[0x43, 28, 15]) +\wx00F8 // @action3_0; + +89 * 18 03 04 01 FF \wx00FF \b3 +00 \wx00FB // @action3_5; +01 \wx00F8 // @action3_6; +FF \wx00FD // @action3_3; +\wx00FC // @action3_4; +