diff --git a/asset/script/make_maps.py b/asset/script/make_maps.py index 5de25dbb..1d30df34 100644 --- a/asset/script/make_maps.py +++ b/asset/script/make_maps.py @@ -220,6 +220,26 @@ def load_move_type(): "terrain_id": 0x2c, }, # 22-25: trench, not used in story maps, doc: https://feheroes.fandom.com/wiki/Trenches + { + "index": 22, + "name": "Trench", + "terrain_id": None, + }, + { + "index": 23, + "name": "Trench", + "terrain_id": None, + }, + { + "index": 24, + "name": "Trench", + "terrain_id": None, + }, + { + "index": 25, + "name": "Trench", + "terrain_id": None, + }, { "index": 26, "name": "Pool", @@ -493,6 +513,11 @@ def make_map_tsa(): # run FEBuilderGBA to make TSA: https://github.com/laqieer/FEBuilderGBA/commit/fabcd487abe9f31c0d4578c61e17e6caded2257b os.system('%s --convertmap1picture --in=%s --outImg=%s --outTSA=%s' % (FEBuiderGBA, image_map_decreased_color_path, map_obj_img_path, map_tsa_path)) +def is_terrain_fluid(terrain): + if terrain is None: + return False + return terrain in (4, 5, 6, 7, 26) + def make_map_terrains(): for map_id, config in map_configs.items(): terrains = numpy.zeros((32, 32), dtype=numpy.uint8) @@ -504,6 +529,16 @@ def make_map_terrains(): terrains[2 * y][2 * x + 1] = terrain_id terrains[2 * y + 1][2 * x] = terrain_id terrains[2 * y + 1][2 * x + 1] = terrain_id + if terrain == 15: # bridge + terrain_left = config['field']['terrain'][7 - y][x - 1] if x > 0 else None + terrain_right = config['field']['terrain'][7 - y][x + 1] if x < 5 else None + terrain_top = config['field']['terrain'][7 - (y - 1)][x] if y > 0 else None + terrain_bottom = config['field']['terrain'][7 - (y + 1)][x] if y < 7 else None + if not is_terrain_fluid(terrain_left) and not is_terrain_fluid(terrain_right) and (is_terrain_fluid(terrain_top) or is_terrain_fluid(terrain_bottom)) and terrain_top != 15: # horizontal bridge, top is fluid + terrain_fluid = terrain_top if is_terrain_fluid(terrain_top) else terrain_bottom + assert is_terrain_fluid(terrain_fluid) + terrains[2 * y][2 * x] = terrain_configs[terrain_fluid]['terrain_id'] + terrains[2 * y][2 * x + 1] = terrain_configs[terrain_fluid]['terrain_id'] for change in config['field']['changes'].values(): terrain = config['field']['terrain'][change['y']][change['x']] if is_breakable(terrain): @@ -513,14 +548,24 @@ def make_map_terrains(): terrains[2 * (7 - change['y'])][2 * (change['x'] + 6) + 1] = base_terrain_id terrains[2 * (7 - change['y']) + 1][2 * (change['x'] + 6)] = base_terrain_id terrains[2 * (7 - change['y']) + 1][2 * (change['x'] + 6) + 1] = base_terrain_id + if base_terrain == 15: # wall on bridge + terrain_left = config['field']['terrain'][7 - y][x - 1] if x > 0 else None + terrain_right = config['field']['terrain'][7 - y][x + 1] if x < 5 else None + terrain_top = config['field']['terrain'][7 - (y - 1)][x] if y > 0 else None + terrain_bottom = config['field']['terrain'][7 - (y + 1)][x] if y < 7 else None + if not is_terrain_fluid(terrain_left) and not is_terrain_fluid(terrain_right) and (is_terrain_fluid(terrain_top) or is_terrain_fluid(terrain_bottom)) and terrain_top != 15: # horizontal bridge, top is fluid + terrain_fluid = terrain_top if is_terrain_fluid(terrain_top) else terrain_bottom + assert is_terrain_fluid(terrain_fluid) + terrains[2 * (7 - change['y'])][2 * (change['x'] + 6)] = terrain_configs[terrain_fluid]['terrain_id'] + terrains[2 * (7 - change['y'])][2 * (change['x'] + 6) + 1] = terrain_configs[terrain_fluid]['terrain_id'] if change['hp'] == '1': if change['type'] in ('W', 'E', 'Pillar'): - terrains[2 * (7 - change['y'])][2 * change['x']] = base_terrain_id - terrains[2 * (7 - change['y'])][2 * change['x'] + 1] = base_terrain_id + terrains[2 * (7 - change['y'])][2 * change['x']] = terrains[2 * (7 - change['y'])][2 * (change['x'] + 6)] + terrains[2 * (7 - change['y'])][2 * change['x'] + 1] = terrains[2 * (7 - change['y'])][2 * (change['x'] + 6) + 1] if change['type'] == 'N': # right bottom - terrains[2 * (7 - change['y']) + 1][2 * change['x'] + 1] = base_terrain_id + terrains[2 * (7 - change['y']) + 1][2 * change['x'] + 1] = terrains[2 * (7 - change['y']) + 1][2 * (change['x'] + 6) + 1] if change['type'] == 'S': # left top - terrains[2 * (7 - change['y'])][2 * change['x']] = base_terrain_id + terrains[2 * (7 - change['y'])][2 * change['x']] = terrains[2 * (7 - change['y'])][2 * (change['x'] + 6)] map_terrain_path = os.path.join(map_terrain_save_path, map_id + 'T.raw') with open(map_terrain_path, 'wb') as file: file.write(b'\x00') @@ -1242,6 +1287,7 @@ def print_unplayable_heroes(): # print_map_anims() # make_map_images() # decrease_map_colors() + # make_map_terrains() # make_map_tilesets() # make_map_changes() # make_common_map() diff --git a/data/terrain/S0101T.raw b/data/terrain/S0101T.raw index 2d3ccd85..42629ddf 100644 Binary files a/data/terrain/S0101T.raw and b/data/terrain/S0101T.raw differ diff --git a/data/terrain/S0202T.raw b/data/terrain/S0202T.raw index 575fa35b..86df9e81 100644 Binary files a/data/terrain/S0202T.raw and b/data/terrain/S0202T.raw differ diff --git a/data/terrain/S0205T.raw b/data/terrain/S0205T.raw index 850c9239..20e9871d 100644 Binary files a/data/terrain/S0205T.raw and b/data/terrain/S0205T.raw differ diff --git a/data/terrain/S0301T.raw b/data/terrain/S0301T.raw index 940c0d11..d90ddada 100644 Binary files a/data/terrain/S0301T.raw and b/data/terrain/S0301T.raw differ diff --git a/data/terrain/S0402T.raw b/data/terrain/S0402T.raw index 75b1c5c8..51d3a01d 100644 Binary files a/data/terrain/S0402T.raw and b/data/terrain/S0402T.raw differ diff --git a/data/terrain/S0505T.raw b/data/terrain/S0505T.raw index 6bc77ef8..5afb4114 100644 Binary files a/data/terrain/S0505T.raw and b/data/terrain/S0505T.raw differ diff --git a/data/terrain/S0701T.raw b/data/terrain/S0701T.raw index f2ea8bb0..3e651eb2 100644 Binary files a/data/terrain/S0701T.raw and b/data/terrain/S0701T.raw differ diff --git a/data/terrain/S0702T.raw b/data/terrain/S0702T.raw index 432149df..da653d72 100644 Binary files a/data/terrain/S0702T.raw and b/data/terrain/S0702T.raw differ diff --git a/data/terrain/S0703T.raw b/data/terrain/S0703T.raw index 1e3aedde..bde64f14 100644 Binary files a/data/terrain/S0703T.raw and b/data/terrain/S0703T.raw differ diff --git a/data/terrain/S0901T.raw b/data/terrain/S0901T.raw index 4d6cab8b..7cd1dc87 100644 Binary files a/data/terrain/S0901T.raw and b/data/terrain/S0901T.raw differ diff --git a/data/terrain/S1302T.raw b/data/terrain/S1302T.raw index 0a95b9b1..3f5bd8fc 100644 Binary files a/data/terrain/S1302T.raw and b/data/terrain/S1302T.raw differ diff --git a/data/terrain/S1403T.raw b/data/terrain/S1403T.raw index ecf18945..ccda9ab2 100644 Binary files a/data/terrain/S1403T.raw and b/data/terrain/S1403T.raw differ diff --git a/data/terrain/S1405T.raw b/data/terrain/S1405T.raw index 3755ed7c..2fbe7037 100644 Binary files a/data/terrain/S1405T.raw and b/data/terrain/S1405T.raw differ diff --git a/data/terrain/S2023T.raw b/data/terrain/S2023T.raw index e624141d..5b33f4ed 100644 Binary files a/data/terrain/S2023T.raw and b/data/terrain/S2023T.raw differ diff --git a/data/terrain/S2032T.raw b/data/terrain/S2032T.raw index e2610edb..f9e724b5 100644 Binary files a/data/terrain/S2032T.raw and b/data/terrain/S2032T.raw differ diff --git a/data/terrain/S2071T.raw b/data/terrain/S2071T.raw index a5ec7f60..264c67f8 100644 Binary files a/data/terrain/S2071T.raw and b/data/terrain/S2071T.raw differ diff --git a/data/terrain/S2103T.raw b/data/terrain/S2103T.raw index 67479f6a..58c01b39 100644 Binary files a/data/terrain/S2103T.raw and b/data/terrain/S2103T.raw differ diff --git a/data/terrain/S2111T.raw b/data/terrain/S2111T.raw index 16fd3947..6205225a 100644 Binary files a/data/terrain/S2111T.raw and b/data/terrain/S2111T.raw differ diff --git a/data/terrain/S2134T.raw b/data/terrain/S2134T.raw index 32bc510f..382ea605 100644 Binary files a/data/terrain/S2134T.raw and b/data/terrain/S2134T.raw differ diff --git a/data/terrain/S3021T.raw b/data/terrain/S3021T.raw index 4eaa0b17..0a3c5745 100644 Binary files a/data/terrain/S3021T.raw and b/data/terrain/S3021T.raw differ diff --git a/data/terrain/S3022T.raw b/data/terrain/S3022T.raw index 0682057d..fcbfe7ab 100644 Binary files a/data/terrain/S3022T.raw and b/data/terrain/S3022T.raw differ diff --git a/data/terrain/S3034T.raw b/data/terrain/S3034T.raw index 839d3bfa..9e49c5ad 100644 Binary files a/data/terrain/S3034T.raw and b/data/terrain/S3034T.raw differ diff --git a/data/terrain/S3041T.raw b/data/terrain/S3041T.raw index e8664ed8..fec42b42 100644 Binary files a/data/terrain/S3041T.raw and b/data/terrain/S3041T.raw differ diff --git a/data/terrain/S3042T.raw b/data/terrain/S3042T.raw index 731e75d7..f4149230 100644 Binary files a/data/terrain/S3042T.raw and b/data/terrain/S3042T.raw differ diff --git a/data/terrain/S3043T.raw b/data/terrain/S3043T.raw index 97acbfe1..80acd0fc 100644 Binary files a/data/terrain/S3043T.raw and b/data/terrain/S3043T.raw differ diff --git a/data/terrain/S3044T.raw b/data/terrain/S3044T.raw index 2451b7d8..55f9c244 100644 Binary files a/data/terrain/S3044T.raw and b/data/terrain/S3044T.raw differ diff --git a/data/terrain/S3051T.raw b/data/terrain/S3051T.raw index a855f96e..a0d61027 100644 Binary files a/data/terrain/S3051T.raw and b/data/terrain/S3051T.raw differ diff --git a/data/terrain/S3063T.raw b/data/terrain/S3063T.raw index 9bfff34e..b9c21b14 100644 Binary files a/data/terrain/S3063T.raw and b/data/terrain/S3063T.raw differ diff --git a/data/terrain/S3092T.raw b/data/terrain/S3092T.raw index 1e18ec68..dc12c7de 100644 Binary files a/data/terrain/S3092T.raw and b/data/terrain/S3092T.raw differ diff --git a/data/terrain/S4031T.raw b/data/terrain/S4031T.raw index f7fdfa01..abc0ce25 100644 Binary files a/data/terrain/S4031T.raw and b/data/terrain/S4031T.raw differ diff --git a/data/terrain/S4041T.raw b/data/terrain/S4041T.raw index 28a8dd62..45505780 100644 Binary files a/data/terrain/S4041T.raw and b/data/terrain/S4041T.raw differ diff --git a/data/terrain/S4044T.raw b/data/terrain/S4044T.raw index 84a2bf0f..497656ef 100644 Binary files a/data/terrain/S4044T.raw and b/data/terrain/S4044T.raw differ diff --git a/data/terrain/S4045T.raw b/data/terrain/S4045T.raw index c997cb84..39c822ae 100644 Binary files a/data/terrain/S4045T.raw and b/data/terrain/S4045T.raw differ diff --git a/data/terrain/S4063T.raw b/data/terrain/S4063T.raw index 8b10e509..718d5887 100644 Binary files a/data/terrain/S4063T.raw and b/data/terrain/S4063T.raw differ diff --git a/data/terrain/S4072T.raw b/data/terrain/S4072T.raw index b3d4a7b2..4b10d2d0 100644 Binary files a/data/terrain/S4072T.raw and b/data/terrain/S4072T.raw differ diff --git a/data/terrain/S4083T.raw b/data/terrain/S4083T.raw index 6524879a..a837b304 100644 Binary files a/data/terrain/S4083T.raw and b/data/terrain/S4083T.raw differ diff --git a/data/terrain/S4085T.raw b/data/terrain/S4085T.raw index 7d854943..b6dcfba0 100644 Binary files a/data/terrain/S4085T.raw and b/data/terrain/S4085T.raw differ diff --git a/data/terrain/S4104T.raw b/data/terrain/S4104T.raw index 05e80bf4..54c784aa 100644 Binary files a/data/terrain/S4104T.raw and b/data/terrain/S4104T.raw differ diff --git a/data/terrain/S4105T.raw b/data/terrain/S4105T.raw index f534ae77..8e91868c 100644 Binary files a/data/terrain/S4105T.raw and b/data/terrain/S4105T.raw differ diff --git a/data/terrain/S4112T.raw b/data/terrain/S4112T.raw index 4b612f54..3257842b 100644 Binary files a/data/terrain/S4112T.raw and b/data/terrain/S4112T.raw differ diff --git a/data/terrain/S4124T.raw b/data/terrain/S4124T.raw index d9dd8885..bf0eaaed 100644 Binary files a/data/terrain/S4124T.raw and b/data/terrain/S4124T.raw differ diff --git a/data/terrain/S6062T.raw b/data/terrain/S6062T.raw index 2597d5a2..23333e26 100644 Binary files a/data/terrain/S6062T.raw and b/data/terrain/S6062T.raw differ diff --git a/data/terrain/S6121T.raw b/data/terrain/S6121T.raw index 536299f0..4cf05d85 100644 Binary files a/data/terrain/S6121T.raw and b/data/terrain/S6121T.raw differ