From e2674cb63f0c29bcdc0c7e956b18f227dc2ea616 Mon Sep 17 00:00:00 2001 From: laqieer Date: Sun, 25 Aug 2024 14:25:47 +0800 Subject: [PATCH] Fix terrain for bridges on map Horizontal bridge's width becomes half --- asset/script/make_maps.py | 54 +++++++++++++++++++++++++++++++++++--- data/terrain/S0101T.raw | Bin 1024 -> 1024 bytes data/terrain/S0202T.raw | Bin 1024 -> 1024 bytes data/terrain/S0205T.raw | Bin 1024 -> 1024 bytes data/terrain/S0301T.raw | Bin 1024 -> 1024 bytes data/terrain/S0402T.raw | Bin 1024 -> 1024 bytes data/terrain/S0505T.raw | Bin 1024 -> 1024 bytes data/terrain/S0701T.raw | Bin 1024 -> 1024 bytes data/terrain/S0702T.raw | Bin 1024 -> 1024 bytes data/terrain/S0703T.raw | Bin 1024 -> 1024 bytes data/terrain/S0901T.raw | Bin 1024 -> 1024 bytes data/terrain/S1302T.raw | Bin 1024 -> 1024 bytes data/terrain/S1403T.raw | Bin 1024 -> 1024 bytes data/terrain/S1405T.raw | Bin 1024 -> 1024 bytes data/terrain/S2023T.raw | Bin 1024 -> 1024 bytes data/terrain/S2032T.raw | Bin 1024 -> 1024 bytes data/terrain/S2071T.raw | Bin 1024 -> 1024 bytes data/terrain/S2103T.raw | Bin 1024 -> 1024 bytes data/terrain/S2111T.raw | Bin 1024 -> 1024 bytes data/terrain/S2134T.raw | Bin 1024 -> 1024 bytes data/terrain/S3021T.raw | Bin 1024 -> 1024 bytes data/terrain/S3022T.raw | Bin 1024 -> 1024 bytes data/terrain/S3034T.raw | Bin 1024 -> 1024 bytes data/terrain/S3041T.raw | Bin 1024 -> 1024 bytes data/terrain/S3042T.raw | Bin 1024 -> 1024 bytes data/terrain/S3043T.raw | Bin 1024 -> 1024 bytes data/terrain/S3044T.raw | Bin 1024 -> 1024 bytes data/terrain/S3051T.raw | Bin 1024 -> 1024 bytes data/terrain/S3063T.raw | Bin 1024 -> 1024 bytes data/terrain/S3092T.raw | Bin 1024 -> 1024 bytes data/terrain/S4031T.raw | Bin 1024 -> 1024 bytes data/terrain/S4041T.raw | Bin 1024 -> 1024 bytes data/terrain/S4044T.raw | Bin 1024 -> 1024 bytes data/terrain/S4045T.raw | Bin 1024 -> 1024 bytes data/terrain/S4063T.raw | Bin 1024 -> 1024 bytes data/terrain/S4072T.raw | Bin 1024 -> 1024 bytes data/terrain/S4083T.raw | Bin 1024 -> 1024 bytes data/terrain/S4085T.raw | Bin 1024 -> 1024 bytes data/terrain/S4104T.raw | Bin 1024 -> 1024 bytes data/terrain/S4105T.raw | Bin 1024 -> 1024 bytes data/terrain/S4112T.raw | Bin 1024 -> 1024 bytes data/terrain/S4124T.raw | Bin 1024 -> 1024 bytes data/terrain/S6062T.raw | Bin 1024 -> 1024 bytes data/terrain/S6121T.raw | Bin 1024 -> 1024 bytes 44 files changed, 50 insertions(+), 4 deletions(-) diff --git a/asset/script/make_maps.py b/asset/script/make_maps.py index 5de25dbb8..1d30df34c 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 2d3ccd8511d4de076225c10705d433124acf3e4f..42629ddf4af486a2a112093ce4eeb3952e24c4f8 100644 GIT binary patch delta 29 jcmZqRXyBM|oJ~N05eO!KWE7eBaK+?IMvKh{8SR+>f@c<2%i7| diff --git a/data/terrain/S0402T.raw b/data/terrain/S0402T.raw index 75b1c5c83bd2fdcdf5bf108fc609ff189f8b8651..51d3a01d24efba9cd7809475561772595e818bd5 100644 GIT binary patch delta 47 scmZqRXyBOOItTK5yqul1DjL}R0o>dAF diff --git a/data/terrain/S0505T.raw b/data/terrain/S0505T.raw index 6bc77ef8ea18ce452893c2cd1795d37eb4dec7f6..5afb4114546e26015ec50bfb19859f0b083a0dac 100644 GIT binary patch delta 27 jcmZqRXyBN9fKhp(^0LV%85JhJoHh9{qr&FJjIm4rl)MU{ delta 25 hcmZqRXyBNrpgd7|*~FJJ6Q9nTyqHm8^J2zWCIEoA3HAU0 diff --git a/data/terrain/S0701T.raw b/data/terrain/S0701T.raw index f2ea8bb03b3e43e32d2f962dfd01ca4218593a39..3e651eb28b86ee1a5c2f4bae2c10c4f2a20e2a0a 100644 GIT binary patch delta 62 ycmZqRXyBOO$RjGs2n3=)z{oiHBcsT~L^U=LkB0}$TetwOf{_s-wmFe;J`(_a1q{sq delta 27 jcmZqRXyBOOI5AOSVxro_<#H33&Y7IZsIWPaaXu3Ojc*D6 diff --git a/data/terrain/S0702T.raw b/data/terrain/S0702T.raw index 432149dfae99f7b9347bbb903675cc6b2ef6f38a..da653d7200770ad3a0dfa0de6f60da48442b2cc4 100644 GIT binary patch delta 21 ccmZqRXyBOOJW<(UV)KE?%8U-1n;C1F08;MP03Zqkt^fc4 diff --git a/data/terrain/S1405T.raw b/data/terrain/S1405T.raw index 3755ed7c1517fe688e6a1cde58d54d1c85c169e3..2fbe70374ffc3e72f3e6ef36d46f6d8542889f59 100644 GIT binary patch delta 27 ecmZqRXyDku%*Z7mzz75&a`Hz;k$*PQtn1qElpJX&=0swYB2#5dx diff --git a/data/terrain/S2032T.raw b/data/terrain/S2032T.raw index e2610edb1ef7bded4c904fa8d0536ef991fe7e81..f9e724b5ae9136bcb4d766f9a8263821a62c115a 100644 GIT binary patch delta 22 ecmZqRXyBO8I$4!bW#Y;?laDegY))mI%>)2l7YGOd delta 21 dcmZqRXyBO8I&o>j#HR_9QyFD8Co;}w0svt(2weaG diff --git a/data/terrain/S2071T.raw b/data/terrain/S2071T.raw index a5ec7f6015a617b6d95bd67bef23970ed352cec4..264c67f8ea7487f2a606e22f04fed5d6c8d8b722 100644 GIT binary patch delta 45 vcmZqRXyBO8JTci};$a6a0RcuJ5D?(unf#GaWU?Zo1`9|C#Mzw4IG+gs5mgI4 delta 27 jcmZqRXyBNruz2F)gvrW`a+4JqH6~{=N^DMKoX-RRev$}w diff --git a/data/terrain/S2103T.raw b/data/terrain/S2103T.raw index 67479f6a205218992a5c4f48ec995ce90563c821..58c01b39074a78b0d250bb0936d65938709f7d70 100644 GIT binary patch delta 36 pcmZqRXyBOO%3%luj6g8?BcsT~#3d7-)=X|>beZ_nW)stYMgYav43+=@ delta 28 icmZqRXyBOOIx$sdV&am?s*Ev{6B$#0w9O`_|BL{RBMGGd diff --git a/data/terrain/S2111T.raw b/data/terrain/S2111T.raw index 16fd39473161f7fdd0a9541b0001fb34e04d05e4..6205225accdd810864d6db1e82a1e43cfab00120 100644 GIT binary patch delta 23 ecmZqRXyDl3&d6qHC@jp#IQb)^$mT@G`Ah&r+Xd(V delta 16 XcmZqRXyDl3&Nw-pQDt*B<5VU9D&qv+ diff --git a/data/terrain/S2134T.raw b/data/terrain/S2134T.raw index 32bc510f6342432cd4aea64eb418e4c15c94735f..382ea605045d7c36f960033355250bc5b88b4a5d 100644 GIT binary patch delta 32 icmZqRXyBM|n9I;m7z!qTWE7eBaK+?I#)?f${}}<5p$bF* delta 20 ccmZqRXyBM|cp|gQWOl};iJTRinEo>Y07>Wv9{>OV diff --git a/data/terrain/S3021T.raw b/data/terrain/S3021T.raw index 4eaa0b17258d5cf49e5c2278daa8643b9d168cd6..0a3c5745e9afea9b9114ec192e3f808003dff984 100644 GIT binary patch delta 15 WcmZqRXyDl3$~duAVRI_uY$gCGV+8X6 delta 16 XcmZqRXyDl3$~ZZdQDJi`<7_4XDwzb< diff --git a/data/terrain/S3022T.raw b/data/terrain/S3022T.raw index 0682057dbb600bbf542d2d0bc043bef7275fb2a3..fcbfe7ab08f81f46ebda0050b7c368424786ebfe 100644 GIT binary patch delta 21 dcmZqRXyBM|bmG#w${+$mWHN@k{`QGYGQ) delta 19 bcmZqRXyBNruz2F)CzF>m%4}ZD7|R3zPC5sQ diff --git a/data/terrain/S3041T.raw b/data/terrain/S3041T.raw index e8664ed89dc8231101e78aac3294ce9fd2938213..fec42b421e766a6305c8a652b5fac66d7e623423 100644 GIT binary patch delta 39 mcmZqRXyBOO$s!=Y$T;~UqsYcYB}Og~2LeDsn-?<1GXVgp;Rs&< delta 22 ecmZqRXyBOOIWbdeW3mF{KJB03+N5FaQ7m diff --git a/data/terrain/S3063T.raw b/data/terrain/S3063T.raw index 9bfff34e7c56f326b2d7c0cdb1982781ba02e1d6..b9c21b1430a8d945c69fbf0a1dc1f09366473a91 100644 GIT binary patch delta 27 ecmZqRXyDku%*Z7mzz75&a`Hz;k9(dfH7+XN=mskTISK0Ff992mk;8 diff --git a/data/terrain/S4031T.raw b/data/terrain/S4031T.raw index f7fdfa011a14c000189377456f93e96f2e2145d3..abc0ce25bd64dbebc2fe4342edd33febd413015f 100644 GIT binary patch delta 27 hcmZqRXyBO8JTci};$gRmoC=dQ8KZ!l&4(FnnE;Lg39SGC delta 26 gcmZqRXyBNruz2F)w8@%`3P2n+ak0YY#f-5`0DTe&{Qv*} diff --git a/data/terrain/S4041T.raw b/data/terrain/S4041T.raw index 28a8dd62d1875f70a878d852e40fd225ba276b89..4550578084ff4d93b109bcca872665b2bba56869 100644 GIT binary patch delta 15 WcmZqRXyDl3$T-naVRItmd?o-UR|Km7 delta 16 XcmZqRXyDl3$T&HXQDbu^<8&qfDuo2r diff --git a/data/terrain/S4044T.raw b/data/terrain/S4044T.raw index 84a2bf0f86d9e3db4d94248784ca3b56ede9e059..497656ef49ab0a97cc5dba725a86ca65e2303177 100644 GIT binary patch delta 17 YcmZqRXyBO8%_Jl=`6Hvq#)a|B05L)Zp8x;= delta 13 UcmZqRXyBO8J#n?f#>KJB03-kfGynhq diff --git a/data/terrain/S4045T.raw b/data/terrain/S4045T.raw index c997cb844032cd7c4c7450d07ea705752e6c1f5c..39c822aedc7d3ddb409a72d89e87112a2b7ca832 100644 GIT binary patch delta 23 ecmZqRXyBO8$s#1g$T;~UqsYX@q|MBXf0+PKCcYE03~h(asU7T diff --git a/data/terrain/S4063T.raw b/data/terrain/S4063T.raw index 8b10e509fae430cd703f9778b993ecacaa0fc4bb..718d58878c3d189d708f6a7cf861ced5fcc781cf 100644 GIT binary patch delta 34 mcmZqRXyDku$;cuk#K<`LBcsSWp!lQyFJ70RU3<2VVdH diff --git a/data/terrain/S4083T.raw b/data/terrain/S4083T.raw index 6524879a1ca9778541aa8a9e81d8ce9c0e9e68d5..a837b3045b66329edfc5f6905c431cbec3ac1319 100644 GIT binary patch delta 25 ccmZqRXyBO8%q1Ye2m~N<@<&FIjSJ(M0YyOt!2kdN delta 13 UcmZqRXyBO8JaMty#)a|B03)mgDgXcg diff --git a/data/terrain/S4085T.raw b/data/terrain/S4085T.raw index 7d854943a4259f234644df260cf0b108037be4bf..b6dcfba02181a9c4e4401e91a26dbdd0761f269d 100644 GIT binary patch delta 27 jcmZqRXyBOOJh53}W3n0}i;xf_ diff --git a/data/terrain/S4112T.raw b/data/terrain/S4112T.raw index 4b612f546f741d7c9ddcd97076f11c92e38b365d..3257842bebdec398114684e4f3c08ef9807e653b 100644 GIT binary patch delta 38 ncmZqRXyDku%sBC}9gh$YFaiOHocxhdWO5>75>R{-(|<+)u}um~ delta 32 lcmZqRXyDku%s5$@QEsv#qsHV+#)!!a8I?f%%?}ynnE;Mg2(ADC diff --git a/data/terrain/S4124T.raw b/data/terrain/S4124T.raw index d9dd888548c9fb84b9ecadf8174efeff060dd180..bf0eaaed2ddc5e33a8e1567888baf0279b81c05b 100644 GIT binary patch delta 13 UcmZqRXyBOOK2hCnV{0`t03T=sk^lez delta 11 ScmZqRXyBNrkh(E-HZuSgcLUo1 diff --git a/data/terrain/S6062T.raw b/data/terrain/S6062T.raw index 2597d5a20f5ad82dfc1bee6b3cbbb5903b452667..23333e261b5d51964b378453f1c1e92d3a7bd654 100644 GIT binary patch delta 16 XcmZqRXyDl3$vF8Wqr&D)#_3D|E$sz9 delta 16 XcmZqRXyDl3$v8QaQDSo<<9sFnDy;<8 diff --git a/data/terrain/S6121T.raw b/data/terrain/S6121T.raw index 536299f058ec8e151ca490a1b133f2e57198c53d..4cf05d85ef7ed483213c705bffd3ef92aff90919 100644 GIT binary patch delta 19 acmZqRXyBOKz?eEQb-_ecyUoswdzk=4Uk1tm delta 18 ZcmZqRXyBNrkUBAS!NgRB&8m#InE*Zl28jRw