PageRenderTime 56ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/nml-0.2.3/nml/actions/action2var_variables.py

#
Python | 428 lines | 428 code | 0 blank | 0 comment | 3 complexity | b5329458f2f9b147f688c43ea27da5ca MD5 | raw file
Possible License(s): GPL-2.0
  1. __license__ = """
  2. NML is free software; you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation; either version 2 of the License, or
  5. (at your option) any later version.
  6. NML is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License along
  11. with NML; if not, write to the Free Software Foundation, Inc.,
  12. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA."""
  13. from nml import expression, nmlop, generic
  14. # Use feature 0x12 for towns (accessible via station/house/industry parent scope)
  15. varact2vars = 0x13 * [{}]
  16. varact2vars60x = 0x13 * [{}]
  17. # feature number: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12
  18. varact2parent_scope = [0x00, 0x01, 0x02, 0x03, 0x12, None, 0x12, 0x12, None, 0x0A, 0x12, None, None, None, None, 0x12, None, None, None]
  19. def default_60xvar(name, args, pos, info):
  20. """
  21. Function to convert arguments into a variable parameter.
  22. This function handles the default case of one argument.
  23. @param name: Name of the variable
  24. @type name: C{str}
  25. @param args: List of passed arguments
  26. @type args: C{list} of L{Expression}
  27. @param pos: Position information
  28. @type pos: L{Position}
  29. @param info: Information of the variable, as found in the dictionary
  30. @type info: C{dict}
  31. @return: A tuple of two values:
  32. - Parameter to use for the 60+x variable
  33. - List of possible extra parameters that need to be passed via registers
  34. @rtype: C{tuple} of (L{Expression}, C{list} C{tuple} of (C{int}, L{Expression}))
  35. """
  36. if len(args) != 1:
  37. raise generic.ScriptError("'%s'() requires one argument, encountered %d" % (name, len(args)), pos)
  38. if isinstance(args[0], expression.ConstantNumeric):
  39. generic.check_range(args[0].value, 0, 255, "Argument of '%s'" % name, args[0].pos)
  40. return (args[0], [])
  41. def signextend(var, info):
  42. #r = (x ^ m) - m; with m being (1 << (num_bits -1))
  43. m = expression.ConstantNumeric(1 << (info['size'] - 1))
  44. return expression.BinOp(nmlop.SUB, expression.BinOp(nmlop.XOR, var, m, var.pos), m, var.pos)
  45. def muldiv(var, mul, div):
  46. var = expression.BinOp(nmlop.MUL, var, expression.ConstantNumeric(mul, var.pos), var.pos)
  47. return expression.BinOp(nmlop.DIV, var, expression.ConstantNumeric(div, var.pos), var.pos)
  48. varact2_globalvars = {
  49. 'current_month' : {'var': 0x02, 'start': 0, 'size': 8},
  50. 'current_day_of_month' : {'var': 0x02, 'start': 8, 'size': 5},
  51. 'is_leapyear' : {'var': 0x02, 'start': 15, 'size': 1},
  52. 'current_day_of_year' : {'var': 0x02, 'start': 16, 'size': 9},
  53. 'climate' : {'var': 0x03, 'start': 0, 'size': 2},
  54. 'traffic_side' : {'var': 0x06, 'start': 0, 'size': 8},
  55. 'animation_counter' : {'var': 0x0A, 'start': 0, 'size': 16},
  56. 'current_callback' : {'var': 0x0C, 'start': 0, 'size': 16},
  57. 'extra_callback_info1' : {'var': 0x10, 'start': 0, 'size': 32},
  58. 'game_mode' : {'var': 0x12, 'start': 0, 'size': 8},
  59. 'extra_callback_info2' : {'var': 0x18, 'start': 0, 'size': 32},
  60. 'display_options' : {'var': 0x1B, 'start': 0, 'size': 6},
  61. 'last_computed_result' : {'var': 0x1C, 'start': 0, 'size': 32},
  62. 'snowline_height' : {'var': 0x20, 'start': 0, 'size': 8},
  63. 'difficulty_level' : {'var': 0x22, 'start': 0, 'size': 8},
  64. 'current_date' : {'var': 0x23, 'start': 0, 'size': 32},
  65. 'current_year' : {'var': 0x24, 'start': 0, 'size': 32},
  66. }
  67. def func_add_constant(const):
  68. return lambda var, info: expression.BinOp(nmlop.ADD, var, expression.ConstantNumeric(const), var.pos)
  69. varact2vars_vehicles = {
  70. 'position_in_consist' : {'var': 0x40, 'start': 0, 'size': 8},
  71. 'position_in_consist_from_end' : {'var': 0x40, 'start': 8, 'size': 8},
  72. 'num_vehs_in_consist' : {'var': 0x40, 'start': 16, 'size': 8, 'function': func_add_constant(1)},
  73. 'position_in_vehid_chain' : {'var': 0x41, 'start': 0, 'size': 8},
  74. 'position_in_vehid_chain_from_end' : {'var': 0x41, 'start': 8, 'size': 8},
  75. 'num_vehs_in_vehid_chain' : {'var': 0x41, 'start': 16, 'size': 8, 'function': func_add_constant(1)},
  76. 'cargo_classes_in_consist' : {'var': 0x42, 'start': 0, 'size': 8},
  77. 'most_common_refit' : {'var': 0x42, 'start': 16, 'size': 8},
  78. 'bitmask_consist_info' : {'var': 0x42, 'start': 24, 'size': 8},
  79. 'company_num' : {'var': 0x43, 'start': 0, 'size': 8},
  80. 'company_type' : {'var': 0x43, 'start': 16, 'size': 2},
  81. 'company_colour1' : {'var': 0x43, 'start': 24, 'size': 4},
  82. 'company_colour2' : {'var': 0x43, 'start': 28, 'size': 4},
  83. 'aircraft_height' : {'var': 0x44, 'start': 8, 'size': 8},
  84. 'airport_type' : {'var': 0x44, 'start': 0, 'size': 8},
  85. 'curv_info_prev_cur' : {'var': 0x45, 'start': 0, 'size': 4, 'function': signextend},
  86. 'curv_info_cur_next' : {'var': 0x45, 'start': 8, 'size': 4, 'function': signextend},
  87. 'curv_info_prev_next' : {'var': 0x45, 'start': 16, 'size': 4, 'function': signextend},
  88. 'curv_info' : {'var': 0x45, 'start': 0, 'size': 12, 'function': lambda var, info: expression.BinOp(nmlop.AND, var, expression.ConstantNumeric(0x0F0F, var.pos), var.pos).reduce()},
  89. 'motion_counter' : {'var': 0x46, 'start': 8, 'size': 4},
  90. 'cargo_type_in_veh' : {'var': 0x47, 'start': 0, 'size': 8},
  91. 'cargo_unit_weight' : {'var': 0x47, 'start': 8, 'size': 8},
  92. 'cargo_classes' : {'var': 0x47, 'start': 16, 'size': 16},
  93. 'vehicle_is_available' : {'var': 0x48, 'start': 0, 'size': 1},
  94. 'vehicle_is_testing' : {'var': 0x48, 'start': 1, 'size': 1},
  95. 'vehicle_is_offered' : {'var': 0x48, 'start': 2, 'size': 1},
  96. 'build_year' : {'var': 0x49, 'start': 0, 'size': 32},
  97. 'direction' : {'var': 0x9F, 'start': 0, 'size': 8},
  98. 'cargo_capacity' : {'var': 0xBA, 'start': 0, 'size': 16},
  99. 'cargo_count' : {'var': 0xBC, 'start': 0, 'size': 16},
  100. 'vehicle_type_id' : {'var': 0xC6, 'start': 0, 'size': 16},
  101. 'cargo_subtype' : {'var': 0xF2, 'start': 0, 'size': 8},
  102. 'vehicle_is_powered' : {'var': 0xFE, 'start': 5, 'size': 1},
  103. 'vehicle_is_not_powered' : {'var': 0xFE, 'start': 6, 'size': 1},
  104. 'vehicle_is_potentially_powered': {'var': 0x4A, 'start': 8, 'size': 1},
  105. 'vehicle_is_reversed' : {'var': 0xFE, 'start': 8, 'size': 1},
  106. 'built_during_preview' : {'var': 0xFE, 'start': 10, 'size': 1},
  107. 'current_railtype' : {'var': 0x4A, 'start': 0, 'size': 8},
  108. 'waiting_triggers' : {'var': 0x5F, 'start': 0, 'size': 8},
  109. 'random_bits' : {'var': 0x5F, 'start': 8, 'size': 8},
  110. 'grfid' : {'var': 0x25, 'start': 0, 'size': 32},
  111. 'vehicle_is_hidden' : {'var': 0xB2, 'start': 0, 'size': 1},
  112. 'vehicle_is_stopped' : {'var': 0xB2, 'start': 1, 'size': 1},
  113. 'vehicle_is_crashed' : {'var': 0xB2, 'start': 7, 'size': 1},
  114. 'vehicle_is_broken' : {'var': 0xCB, 'start': 0, 'size': 8, 'function': lambda var, info: expression.BinOp(nmlop.CMP_EQ, var, expression.ConstantNumeric(1, var.pos), var.pos)},
  115. 'date_of_last_service' : {'var': 0x4B, 'start': 0, 'size': 32},
  116. 'breakdowns_since_last_service' : {'var': 0xCA, 'start': 0, 'size': 8},
  117. 'reliability' : {'var': 0xCE, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 101, 0x10000)},
  118. 'age_in_days' : {'var': 0xC0, 'start': 0, 'size': 16},
  119. 'max_age_in_days' : {'var': 0xC2, 'start': 0, 'size': 16},
  120. }
  121. varact2vars_trains = {
  122. #0x4786 / 0x10000 is an approximation of 3.5790976, the conversion factor
  123. #for train speed
  124. 'max_speed' : {'var': 0x98, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x4786, 0x10000)},
  125. 'current_speed' : {'var': 0xB4, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x4786, 0x10000)},
  126. 'vehicle_is_in_depot' : {'var': 0xE2, 'start': 7, 'size': 1}
  127. }
  128. varact2vars_trains.update(varact2vars_vehicles)
  129. varact2vars_roadvehs = {
  130. #0x23C3 / 0x10000 is an approximation of 7.1581952, the conversion factor
  131. #for road vehicle speed
  132. 'max_speed' : {'var': 0x98, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x23C3, 0x10000)},
  133. 'current_speed' : {'var': 0xB4, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x23C3, 0x10000)},
  134. 'vehicle_is_in_depot' : {'var': 0xE2, 'start': 0, 'size': 8, 'function': lambda var, info: expression.BinOp(nmlop.CMP_EQ, var, expression.ConstantNumeric(0xFE, var.pos))},
  135. }
  136. varact2vars_roadvehs.update(varact2vars_vehicles)
  137. varact2vars_ships = {
  138. #0x23C3 / 0x10000 is an approximation of 7.1581952, the conversion factor
  139. #for ship speed
  140. 'max_speed' : {'var': 0x98, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x23C3, 0x10000)},
  141. 'current_speed' : {'var': 0xB4, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x23C3, 0x10000)},
  142. 'vehicle_is_in_depot' : {'var': 0xE2, 'start': 7, 'size': 1}
  143. }
  144. varact2vars_ships.update(varact2vars_vehicles)
  145. varact2vars_aircraft = {
  146. #0x3939 / 0x1000 is an approximation of 0.279617, the conversion factor
  147. #for aircraft speed
  148. 'max_speed' : {'var': 0x98, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x3939, 0x1000)},
  149. 'current_speed' : {'var': 0xB4, 'start': 0, 'size': 16, 'function': lambda var, info: muldiv(var, 0x3939, 0x1000)},
  150. #No such thing as identical to vehicle_is_in_depot exists for aircraft
  151. }
  152. varact2vars_aircraft.update(varact2vars_vehicles)
  153. varact2vars60x_vehicles = {
  154. 'count_veh_id': {'var': 0x60, 'start': 0, 'size': 8},
  155. }
  156. varact2vars_canals = {
  157. 'tile_height' : {'var': 0x80, 'start': 0, 'size': 8, 'function': lambda var, info: muldiv(var, 8, 1)},
  158. 'terrain_type' : {'var': 0x81, 'start': 0, 'size': 8},
  159. 'random_bits' : {'var': 0x83, 'start': 0, 'size': 8},
  160. }
  161. varact2vars_industrytiles = {
  162. 'construction_state' : {'var': 0x40, 'start': 0, 'size': 2},
  163. 'terrain_type' : {'var': 0x41, 'start': 0, 'size': 8},
  164. 'town_zone': {'var': 0x42, 'start': 0, 'size': 3},
  165. 'relative_x': {'var': 0x43, 'start': 0, 'size': 8},
  166. 'relative_y': {'var': 0x43, 'start': 8, 'size': 8},
  167. 'relative_pos': {'var': 0x43, 'start': 0, 'size': 16},
  168. 'animation_frame': {'var': 0x44, 'start': 0, 'size': 8},
  169. 'random_bits' : {'var': 0x5F, 'start': 8, 'size': 8},
  170. }
  171. def tile_offset(name, args, pos, info, min, max):
  172. if len(args) != 2:
  173. raise generic.ScriptError("'%s'() requires 2 arguments, encountered %d" % (name, len(args)), pos)
  174. for arg in args:
  175. if isinstance(arg, expression.ConstantNumeric):
  176. generic.check_range(arg.value, min, max, "Argument of '%s'" % name, arg.pos)
  177. x = expression.BinOp(nmlop.AND, args[0], expression.ConstantNumeric(0xF), args[0].pos)
  178. y = expression.BinOp(nmlop.AND, args[1], expression.ConstantNumeric(0xF), args[1].pos)
  179. # Shift y left by four
  180. y = expression.BinOp(nmlop.SHIFT_LEFT, y, expression.ConstantNumeric(4), y.pos)
  181. param = expression.BinOp(nmlop.ADD, x, y, x.pos)
  182. #Make sure to reduce the result
  183. return ( param.reduce(), [] )
  184. def signed_tile_offset(name, args, pos, info):
  185. return tile_offset(name, args, pos, info, -8, 7)
  186. def unsigned_tile_offset(name, args, pos, info):
  187. return tile_offset(name, args, pos, info, 0, 15)
  188. varact2vars60x_industrytiles = {
  189. 'nearby_tile_slope' : {'var': 0x60, 'start': 0, 'size': 5, 'function': signed_tile_offset},
  190. 'nearby_tile_is_same_industry' : {'var': 0x60, 'start': 8, 'size': 1, 'function': signed_tile_offset},
  191. 'nearby_tile_is_water' : {'var': 0x60, 'start': 9, 'size': 1, 'function': signed_tile_offset},
  192. 'nearby_tile_terrain_type' : {'var': 0x60, 'start': 10, 'size': 3, 'function': signed_tile_offset},
  193. 'nearby_tile_water_class' : {'var': 0x60, 'start': 13, 'size': 2, 'function': signed_tile_offset},
  194. 'nearby_tile_height' : {'var': 0x60, 'start': 16, 'size': 8, 'function': signed_tile_offset},
  195. 'nearby_tile_class' : {'var': 0x60, 'start': 24, 'size': 4, 'function': signed_tile_offset},
  196. 'nearby_tile_animation_frame' : {'var': 0x61, 'start': 0, 'size': 8, 'function': signed_tile_offset},
  197. 'nearby_tile_industrytile_id' : {'var': 0x62, 'start': 0, 'size': 16, 'function': signed_tile_offset},
  198. }
  199. varact2vars_industries = {
  200. 'waiting_cargo_1' : {'var': 0x40, 'start': 0, 'size': 16},
  201. 'waiting_cargo_2' : {'var': 0x41, 'start': 0, 'size': 16},
  202. 'waiting_cargo_3' : {'var': 0x42, 'start': 0, 'size': 16},
  203. 'water_distance' : {'var': 0x43, 'start': 0, 'size': 32},
  204. 'layout_num' : {'var': 0x44, 'start': 0, 'size': 8},
  205. # bits 0 .. 16 are either useless or already covered by var A7
  206. 'founder_type' : {'var': 0x45, 'start': 16, 'size': 2},
  207. 'founder_colour1' : {'var': 0x45, 'start': 24, 'size': 4},
  208. 'founder_colour2' : {'var': 0x45, 'start': 28, 'size': 4},
  209. 'build_date' : {'var': 0x46, 'start': 0, 'size': 32},
  210. 'random_bits' : {'var': 0x5F, 'start': 8, 'size': 16},
  211. 'produced_cargo_waiting_1' : {'var': 0x8A, 'start': 0, 'size': 16},
  212. 'produced_cargo_waiting_2' : {'var': 0x8C, 'start': 0, 'size': 16},
  213. 'production_level' : {'var': 0x93, 'start': 0, 'size': 8},
  214. 'produced_this_month_1' : {'var': 0x94, 'start': 0, 'size': 16},
  215. 'produced_this_month_2' : {'var': 0x96, 'start': 0, 'size': 16},
  216. 'transported_this_month_1' : {'var': 0x98, 'start': 0, 'size': 16},
  217. 'transported_this_month_2' : {'var': 0x9A, 'start': 0, 'size': 16},
  218. 'transported_last_month_pct_1' : {'var': 0x9C, 'start': 0, 'size': 8, 'function': lambda var, info: muldiv(var, 101, 256)},
  219. 'transported_last_month_pct_2' : {'var': 0x9D, 'start': 0, 'size': 8, 'function': lambda var, info: muldiv(var, 101, 256)},
  220. 'produced_last_month_1' : {'var': 0x9E, 'start': 0, 'size': 16},
  221. 'produced_last_month_2' : {'var': 0xA0, 'start': 0, 'size': 16},
  222. 'transported_last_month_1' : {'var': 0xA2, 'start': 0, 'size': 16},
  223. 'transported_last_month_2' : {'var': 0xA4, 'start': 0, 'size': 16},
  224. 'founder' : {'var': 0xA7, 'start': 0, 'size': 8},
  225. 'colour' : {'var': 0xA8, 'start': 0, 'size': 8},
  226. 'counter' : {'var': 0xAA, 'start': 0, 'size': 16},
  227. 'build_type' : {'var': 0xB3, 'start': 0, 'size': 2},
  228. 'last_accept_date' : {'var': 0xB4, 'start':0, 'size': 16, 'function': func_add_constant(701265)}
  229. }
  230. def industry_count(name, args, pos, info):
  231. if len(args) < 1 or len(args) > 2:
  232. raise generic.ScriptError("'%s'() requires between 1 and 2 argument(s), encountered %d" % (name, len(args)), pos)
  233. if isinstance(args[0], expression.ConstantNumeric):
  234. generic.check_range(args[0].value, 0, 255, "First argument of '%s'" % name, args[0].pos)
  235. grfid = expression.ConstantNumeric(0xFFFFFFFF) if len(args) == 1 else args[1]
  236. extra_params = [(0x100, grfid)]
  237. return (args[0], extra_params)
  238. def industry_layout_count(name, args, pos, info):
  239. if len(args) < 2 or len(args) > 3:
  240. raise generic.ScriptError("'%s'() requires between 2 and 3 argument(s), encountered %d" % (name, len(args)), pos)
  241. if isinstance(args[0], expression.ConstantNumeric):
  242. generic.check_range(args[0].value, 0, 255, "First argument of '%s'" % name, args[0].pos)
  243. grfid = expression.ConstantNumeric(0xFFFFFFFF) if len(args) == 2 else args[2]
  244. extra_params = []
  245. extra_params.append( (0x100, grfid) )
  246. extra_params.append( (0x101, expression.BinOp(nmlop.AND, args[1], expression.ConstantNumeric(0xFF)).reduce()) )
  247. return (args[0], extra_params)
  248. def industry_town_count(name, args, pos, info):
  249. if len(args) < 1 or len(args) > 2:
  250. raise generic.ScriptError("'%s'() requires between 1 and 2 argument(s), encountered %d" % (name, len(args)), pos)
  251. if isinstance(args[0], expression.ConstantNumeric):
  252. generic.check_range(args[0].value, 0, 255, "First argument of '%s'" % name, args[0].pos)
  253. grfid = expression.ConstantNumeric(0xFFFFFFFF) if len(args) == 1 else args[1]
  254. extra_params = []
  255. extra_params.append( (0x100, grfid) )
  256. extra_params.append( (0x101, expression.ConstantNumeric(0x0100).reduce()) )
  257. return (args[0], extra_params)
  258. varact2vars60x_industries = {
  259. 'nearby_tile_industry_tile_id' : { 'var': 0x60, 'start': 0, 'size': 16, 'function': unsigned_tile_offset },
  260. 'nearby_tile_random_bits' : { 'var': 0x61, 'start': 0, 'size': 8, 'function': unsigned_tile_offset },
  261. 'nearby_tile_slope' : { 'var': 0x62, 'start': 0, 'size': 5, 'function': unsigned_tile_offset },
  262. 'nearby_tile_is_water' : { 'var': 0x62, 'start': 9, 'size': 1, 'function': unsigned_tile_offset },
  263. 'nearby_tile_terrain_type' : { 'var': 0x62, 'start': 10, 'size': 3, 'function': unsigned_tile_offset },
  264. 'nearby_tile_water_class' : { 'var': 0x62, 'start': 13, 'size': 2, 'function': unsigned_tile_offset },
  265. 'nearby_tile_height' : { 'var': 0x62, 'start': 16, 'size': 8, 'function': unsigned_tile_offset },
  266. 'nearby_tile_class' : { 'var': 0x62, 'start': 24, 'size': 4, 'function': unsigned_tile_offset },
  267. 'nearby_tile_animation_frame' : { 'var': 0x63, 'start': 0, 'size': 8, 'function': unsigned_tile_offset },
  268. 'town_manhattan_dist' : { 'var': 0x65, 'start': 0, 'size': 16, 'function': signed_tile_offset },
  269. 'town_zone' : { 'var': 0x65, 'start': 16, 'size': 8, 'function': signed_tile_offset },
  270. 'town_euclidean_dist' : { 'var': 0x66, 'start': 0, 'size': 32, 'function': signed_tile_offset },
  271. 'industry_count' : { 'var': 0x67, 'start': 16, 'size': 8, 'function': industry_count },
  272. 'industry_distance' : { 'var': 0x67, 'start': 0, 'size': 16, 'function': industry_count },
  273. 'industry_layout_count' : { 'var': 0x68, 'start': 16, 'size': 8, 'function': industry_layout_count },
  274. 'industry_layout_distance' : { 'var': 0x68, 'start': 0, 'size': 16, 'function': industry_layout_count },
  275. 'industry_town_count' : { 'var': 0x68, 'start': 16, 'size': 8, 'function': industry_town_count },
  276. }
  277. varact2vars_airports = {
  278. 'layout' : {'var': 0x40, 'start': 0, 'size': 32},
  279. }
  280. varact2vars_objects = {
  281. 'relative_x' : {'var': 0x40, 'start': 0, 'size': 8},
  282. 'relative_y' : {'var': 0x40, 'start': 8, 'size': 8},
  283. 'relative_pos' : {'var': 0x40, 'start': 0, 'size': 16},
  284. 'terrain_type' : { 'var' : 0x41, 'start': 0, 'size': 3 },
  285. 'tile_slope' : { 'var' : 0x41, 'start': 8, 'size': 5 },
  286. 'build_date' : { 'var' : 0x42, 'start': 0, 'size': 32 },
  287. 'animation_frame' : { 'var' : 0x43, 'start': 0, 'size': 8 },
  288. 'company_colour' : { 'var' : 0x43, 'start': 8, 'size': 8 },
  289. 'owner' : { 'var' : 0x44, 'start': 0, 'size': 8 },
  290. 'town_manhattan_dist' : { 'var' : 0x45, 'start': 0, 'size': 16 },
  291. 'town_zone' : { 'var' : 0x45, 'start': 16, 'size': 8 },
  292. 'town_euclidean_dist' : { 'var' : 0x46, 'start': 0, 'size': 32 },
  293. 'view' : { 'var' : 0x48, 'start': 0, 'size': 8 },
  294. 'random_bits' : { 'var' : 0x5F, 'start': 8, 'size': 8 },
  295. }
  296. varact2vars60x_objects = {
  297. 'nearby_tile_object_type' : { 'var' : 0x60, 'start': 0, 'size': 16, 'function': signed_tile_offset },
  298. 'nearby_tile_random_bits' : { 'var' : 0x61, 'start': 0, 'size': 8, 'function': signed_tile_offset },
  299. 'nearby_tile_slope' : { 'var' : 0x62, 'start': 0, 'size': 5, 'function': signed_tile_offset },
  300. 'nearby_tile_is_same_object' : { 'var' : 0x62, 'start': 8, 'size': 1, 'function': signed_tile_offset },
  301. 'nearby_tile_is_water' : { 'var' : 0x62, 'start': 9, 'size': 1, 'function': signed_tile_offset },
  302. 'nearby_tile_terrain_type' : { 'var' : 0x62, 'start': 10, 'size': 3, 'function': signed_tile_offset },
  303. 'nearby_tile_water_class' : { 'var' : 0x62, 'start': 13, 'size': 2, 'function': signed_tile_offset },
  304. 'nearby_tile_height' : { 'var' : 0x62, 'start': 16, 'size': 8, 'function': signed_tile_offset },
  305. 'nearby_tile_class' : { 'var' : 0x62, 'start': 24, 'size': 4, 'function': signed_tile_offset },
  306. 'nearby_tile_animation_frame' : { 'var' : 0x63, 'start': 0, 'size': 8, 'function': signed_tile_offset },
  307. 'object_count' : { 'var' : 0x64, 'start': 16, 'size': 8, 'function': industry_count },
  308. 'object_distance' : { 'var' : 0x64, 'start': 0, 'size': 16, 'function': industry_count },
  309. }
  310. varact2vars_railtype = {
  311. 'terrain_type' : {'var': 0x40, 'start': 0, 'size': 8},
  312. 'enhanced_tunnels': {'var': 0x41, 'start': 0, 'size': 8},
  313. 'level_crossing_status': {'var': 0x42, 'start': 0, 'size': 8},
  314. 'build_date': {'var': 0x43, 'start': 0, 'size': 32},
  315. 'random_bits' : {'var': 0x5F, 'start': 8, 'size': 2},
  316. }
  317. varact2vars_airporttiles = {
  318. 'terrain_type' : {'var': 0x41, 'start': 0, 'size': 8},
  319. 'town_radius_group': {'var': 0x42, 'start': 0, 'size': 3},
  320. 'relative_x': {'var': 0x43, 'start': 0, 'size': 8},
  321. 'relative_y': {'var': 0x43, 'start': 8, 'size': 8},
  322. 'relative_pos': {'var': 0x43, 'start': 0, 'size': 16},
  323. 'animation_frame': {'var': 0x44, 'start': 0, 'size': 8},
  324. }
  325. varact2vars60x_airporttiles = {
  326. 'nearby_tile_slope' : {'var': 0x60, 'start': 0, 'size': 5, 'function': signed_tile_offset},
  327. 'nearby_tile_is_same_airport' : {'var': 0x60, 'start': 8, 'size': 1, 'function': signed_tile_offset},
  328. 'nearby_tile_is_water' : {'var': 0x60, 'start': 9, 'size': 1, 'function': signed_tile_offset},
  329. 'nearby_tile_terrain_type' : {'var': 0x60, 'start': 10, 'size': 3, 'function': signed_tile_offset},
  330. 'nearby_tile_water_class' : {'var': 0x60, 'start': 13, 'size': 2, 'function': signed_tile_offset},
  331. 'nearby_tile_height' : {'var': 0x60, 'start': 16, 'size': 8, 'function': signed_tile_offset},
  332. 'nearby_tile_class' : {'var': 0x60, 'start': 24, 'size': 4, 'function': signed_tile_offset},
  333. 'nearby_tile_animation_frame' : {'var': 0x61, 'start': 0, 'size': 8, 'function': signed_tile_offset},
  334. 'nearby_tile_airporttile_id' : {'var': 0x62, 'start': 0, 'size': 16, 'function': signed_tile_offset},
  335. }
  336. varact2vars_towns = {
  337. 'is_city' : {'var': 0x40, 'start': 0, 'size': 1},
  338. 'cities_enabled' : {'var': 0x40, 'start': 1, 'size': 1, 'function': lambda var, info: expression.Not(var, var.pos)},
  339. 'population' : {'var': 0x82, 'start': 0, 'size': 16},
  340. 'has_church' : {'var': 0x92, 'start': 1, 'size': 1},
  341. 'has_stadium' : {'var': 0x92, 'start': 2, 'size': 1},
  342. 'town_zone_0_radius_square' : {'var': 0x94, 'start': 0, 'size': 16},
  343. 'town_zone_1_radius_square' : {'var': 0x96, 'start': 0, 'size': 16},
  344. 'town_zone_2_radius_square' : {'var': 0x98, 'start': 0, 'size': 16},
  345. 'town_zone_3_radius_square' : {'var': 0x9A, 'start': 0, 'size': 16},
  346. 'town_zone_4_radius_square' : {'var': 0x9C, 'start': 0, 'size': 16},
  347. 'num_houses' : {'var': 0xB6, 'start': 0, 'size': 16},
  348. 'percent_transported_passengers' : {'var': 0xCA, 'start': 0, 'size': 8, 'function': lambda var, info: muldiv(var, 101, 256)},
  349. 'percent_transported_mail' : {'var': 0xCB, 'start': 0, 'size': 8, 'function': lambda var, info: muldiv(var, 101, 256)},
  350. }
  351. varact2vars[0x00] = varact2vars_trains
  352. varact2vars60x[0x00] = varact2vars60x_vehicles
  353. varact2vars[0x01] = varact2vars_roadvehs
  354. varact2vars60x[0x01] = varact2vars60x_vehicles
  355. varact2vars[0x02] = varact2vars_ships
  356. varact2vars60x[0x02] = varact2vars60x_vehicles
  357. varact2vars[0x03] = varact2vars_aircraft
  358. varact2vars60x[0x03] = varact2vars60x_vehicles
  359. varact2vars[0x05] = varact2vars_canals
  360. varact2vars[0x09] = varact2vars_industrytiles
  361. varact2vars60x[0x09] = varact2vars60x_industrytiles
  362. varact2vars[0x0A] = varact2vars_industries
  363. varact2vars60x[0x0A] = varact2vars60x_industries
  364. varact2vars[0x0D] = varact2vars_airports
  365. varact2vars[0x0F] = varact2vars_objects
  366. varact2vars60x[0x0F] = varact2vars60x_objects
  367. varact2vars[0x10] = varact2vars_railtype
  368. varact2vars[0x11] = varact2vars_airporttiles
  369. varact2vars60x[0x11] = varact2vars60x_airporttiles
  370. varact2vars[0x12] = varact2vars_towns