From f2ae0f603fb3f6cfedd5af823bac22b9a2f6fb30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E6=82=A6=E8=A7=A3=E8=AF=B4?= Date: Sun, 20 Oct 2024 20:59:05 +0800 Subject: [PATCH] Cross Line Train To sign --- .../tjmetro/mod/block/base/IRailwaySign.java | 33 ++++- .../mod/client/DynamicTextureCache.java | 8 ++ .../tjmetro/mod/client/RouteMapGenerator.java | 121 ++++++++++++++++++ .../resources/assets/tjmetro/lang/en_us.json | 7 + .../tjmetro/textures/sign/to_subway.png | Bin 0 -> 4069 bytes fabric/src/main/resources/fabric.mod.json | 3 +- icons/to_subway.svg | 27 ++++ 7 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 fabric/src/main/resources/assets/tjmetro/textures/sign/to_subway.png create mode 100644 icons/to_subway.svg diff --git a/fabric/src/main/java/ziyue/tjmetro/mod/block/base/IRailwaySign.java b/fabric/src/main/java/ziyue/tjmetro/mod/block/base/IRailwaySign.java index d8aaa65..a40d7be 100644 --- a/fabric/src/main/java/ziyue/tjmetro/mod/block/base/IRailwaySign.java +++ b/fabric/src/main/java/ziyue/tjmetro/mod/block/base/IRailwaySign.java @@ -84,7 +84,9 @@ static boolean signIsLine(String signId) { static boolean signIsPlatform(String signId) { List platforms = Arrays.asList("platform", "platform_flipped", - SignType.BOUND_FOR_TEXT.signId, SignType.BOUND_FOR_TEXT_FLIPPED.signId); + SignType.BOUND_FOR_TEXT.signId, SignType.BOUND_FOR_TEXT_FLIPPED.signId, + SignType.TRAIN_TO_TEXT.signId, SignType.TRAIN_TO_TEXT_FLIPPED.signId, + SignType.CROSS_LINE_TRAIN_TO_TEXT.signId, SignType.CROSS_LINE_TRAIN_TO_TEXT_FLIPPED.signId); return platforms.contains(signId); } @@ -109,6 +111,10 @@ static Identifier getExitSignResource(String signId, String exitLetter, String e static Identifier getPlatformSignResource(String signId, long platformId, IGui.HorizontalAlignment horizontalAlignment, float paddingScale, float aspectRatio, int backgroundColor, int textColor, int transparentColor, boolean forceMTRFont) { if (signId.equals(SignType.BOUND_FOR_TEXT.signId) || signId.equals(SignType.BOUND_FOR_TEXT_FLIPPED.signId)) { return DynamicTextureCache.instance.getBoundFor(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont).identifier; + } else if (signId.equals(SignType.TRAIN_TO_TEXT.signId) || signId.equals(SignType.TRAIN_TO_TEXT_FLIPPED.signId)) { + return DynamicTextureCache.instance.getTrainTo(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont).identifier; + } else if (signId.equals(SignType.CROSS_LINE_TRAIN_TO_TEXT.signId) || signId.equals(SignType.CROSS_LINE_TRAIN_TO_TEXT_FLIPPED.signId)) { + return DynamicTextureCache.instance.getCrossLineTrainTo(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont).identifier; } else { if (forceMTRFont) { return org.mtr.mod.client.DynamicTextureCache.instance.getDirectionArrow(platformId, false, false, horizontalAlignment, false, paddingScale, aspectRatio, backgroundColor, textColor, transparentColor).identifier; @@ -157,6 +163,12 @@ enum SignType ACCESSIBLE_PASSAGE_TEXT_FLIPPED("accessible_passage", "accessible_passage", true, true), TOILET_TEXT("toilet", "toilet", false, false), TOILET_TEXT_FLIPPED("toilet", "toilet", false, true), + TO_SUBWAY_TEXT("to_subway", "to_subway", false, false), + TO_SUBWAY_TEXT_FLIPPED("to_subway", "to_subway", false, true), + TRAIN_TO_TEXT("to_subway", "train_to", false, false), + TRAIN_TO_TEXT_FLIPPED("to_subway", "train_to", false, true), + CROSS_LINE_TRAIN_TO_TEXT("to_subway", "cross_line_train_to", false, false), + CROSS_LINE_TRAIN_TO_TEXT_FLIPPED("to_subway", "cross_line_train_to", false, true), TIANJIN_METRO_LOGO("tianjin_metro_logo", false), TIANJIN_METRO_MOD_LOGO("tianjin_metro_mod_logo", false), @@ -180,6 +192,7 @@ enum SignType ESCALATOR("escalator", false), ESCALATOR_FLIPPED("escalator", true), TOILET("toilet", false), + TO_SUBWAY("to_subway", false), // Tianjin Binhai Mass Transit (BMT, Tianjin Metro Line 9) NO_ENTRY_BMT_TEXT("no_entry_bmt", "no_entry_bmt", false, false), @@ -208,25 +221,33 @@ enum SignType public final String signId; public final SignResource sign; - SignType(String texture, String translation, boolean flipTexture, boolean flipCustomText, boolean hasCustomText, int backgroundColor) { - this.signId = String.format(this.toString().contains("BMT") ? "\1_TJMETRO_%s" : "\0_TJMETRO_%s", this.toString()).toLowerCase(); // Make sure that signs will always order in front of custom signs, and BMT signs are after TRT ;) + SignType(String texture, String translation, boolean flipTexture, boolean flipCustomText, boolean hasCustomText, boolean small, int backgroundColor) { + this.signId = String.format(this.toString().contains("BMT") ? "\1_TJMETRO_%s" : "\0_TJMETRO_%s", this).toLowerCase(); // Make sure that signs will always order in front of custom signs, and BMT signs are after TRT ;) final JsonObject object = new JsonObject(); object.addProperty("id", this.signId); object.addProperty("textureResource", Reference.MOD_ID + ":textures/sign/" + texture + ".png"); object.addProperty("flipTexture", flipTexture); object.addProperty("customText", hasCustomText ? "sign.tjmetro." + translation : ""); object.addProperty("flipCustomText", flipCustomText); - object.addProperty("small", true); + object.addProperty("small", small); object.addProperty("backgroundColor", backgroundColor); this.sign = new SignResource(new JsonReader(object)); } SignType(String texture, String translation, boolean flipTexture, boolean flipCustomText) { - this(texture, translation, flipTexture, flipCustomText, true, 0); + this(texture, translation, flipTexture, flipCustomText, true, true, 0); + } + + SignType(String texture, String translation, boolean flipTexture, boolean flipCustomText, boolean small) { + this(texture, translation, flipTexture, flipCustomText, true, small, 0); } SignType(String texture, boolean flipTexture) { - this(texture, texture, flipTexture, false, false, 0); + this(texture, texture, flipTexture, false, false, true, 0); + } + + SignType(String texture, boolean flipTexture, boolean small) { + this(texture, texture, flipTexture, false, false, small, 0); } } } diff --git a/fabric/src/main/java/ziyue/tjmetro/mod/client/DynamicTextureCache.java b/fabric/src/main/java/ziyue/tjmetro/mod/client/DynamicTextureCache.java index 9e623fa..dd3370d 100644 --- a/fabric/src/main/java/ziyue/tjmetro/mod/client/DynamicTextureCache.java +++ b/fabric/src/main/java/ziyue/tjmetro/mod/client/DynamicTextureCache.java @@ -114,6 +114,14 @@ public DynamicResource getBoundFor(long platformId, IGui.HorizontalAlignment hor return getResource(String.format("tjmetro_bound_for_%s_%s_%s_%s_%s_%s_%s", platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), () -> RouteMapGenerator.generateBoundFor(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), DefaultRenderingColor.TRANSPARENT); } + public DynamicResource getTrainTo(long platformId, IGui.HorizontalAlignment horizontalAlignment, float aspectRatio, float paddingScale, int backgroundColor, int textColor, boolean forceMTRFont) { + return getResource(String.format("tjmetro_train_to_%s_%s_%s_%s_%s_%s_%s", platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), () -> RouteMapGenerator.generateTrainTo(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), DefaultRenderingColor.TRANSPARENT); + } + + public DynamicResource getCrossLineTrainTo(long platformId, IGui.HorizontalAlignment horizontalAlignment, float aspectRatio, float paddingScale, int backgroundColor, int textColor, boolean forceMTRFont) { + return getResource(String.format("tjmetro_cross_line_train_to_%s_%s_%s_%s_%s_%s_%s", platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), () -> RouteMapGenerator.generateCrossLineTrainTo(platformId, horizontalAlignment, aspectRatio, paddingScale, backgroundColor, textColor, forceMTRFont), DefaultRenderingColor.TRANSPARENT); + } + public DynamicResource getSignText(String string, IGui.HorizontalAlignment horizontalAlignment, float paddingScale, int backgroundColor, int textColor) { return getResource(String.format("tjmetro_sign_text_%s_%s_%s_%s_%s", string, horizontalAlignment, paddingScale, backgroundColor, textColor), () -> RouteMapGenerator.generateSignText(string, horizontalAlignment, paddingScale, backgroundColor, textColor), DefaultRenderingColor.TRANSPARENT); } diff --git a/fabric/src/main/java/ziyue/tjmetro/mod/client/RouteMapGenerator.java b/fabric/src/main/java/ziyue/tjmetro/mod/client/RouteMapGenerator.java index 5a4ebde..29879a1 100644 --- a/fabric/src/main/java/ziyue/tjmetro/mod/client/RouteMapGenerator.java +++ b/fabric/src/main/java/ziyue/tjmetro/mod/client/RouteMapGenerator.java @@ -48,6 +48,7 @@ public class RouteMapGenerator implements IGui protected static int fontSizeSmall; public static final int MIN_VERTICAL_SIZE = 5; + public static final Identifier SUBWAY_LOGO_RESOURCE = new Identifier(Reference.MOD_ID, "textures/sign/to_subway.png"); public static final Identifier TRAIN_LOGO_RESOURCE = new Identifier(Reference.MOD_ID, "textures/sign/train.png"); public static final Identifier TRAIN_BMT_LOGO_RESOURCE = new Identifier(Reference.MOD_ID, "textures/sign/to_subway_bmt.png"); public static final Identifier EXIT_RESOURCE = new Identifier(Init.MOD_ID, "textures/block/sign/exit_letter_blank.png"); @@ -857,6 +858,126 @@ public static NativeImage generateBoundFor(long platformId, HorizontalAlignment return null; } + public static NativeImage generateTrainTo(long platformId, HorizontalAlignment horizontalAlignment, float aspectRatio, float paddingScale, int backgroundColor, int textColor, boolean forceMTRFont) { + try { + final int height = scale; + final int width = (int) (height * aspectRatio); + final int padding = Math.round(height * paddingScale); + final int tileSize = height - padding * 2; + final boolean leftToRight = horizontalAlignment == HorizontalAlignment.LEFT; + + ObjectArrayList destinations = new ObjectArrayList<>(); + getRouteStream(platformId, (simplifiedRoute, currentStationIndex) -> { + final String tempMarker; + switch (simplifiedRoute.getCircularState()) { + case CLOCKWISE: + tempMarker = TEMP_CIRCULAR_MARKER_CLOCKWISE; + break; + case ANTICLOCKWISE: + tempMarker = TEMP_CIRCULAR_MARKER_ANTICLOCKWISE; + break; + default: + tempMarker = ""; + } + + destinations.add(tempMarker + simplifiedRoute.getPlatforms().get(currentStationIndex).getDestination()); + }); + final boolean isTerminating = destinations.isEmpty(); + final DynamicTextureCache.Text trainTo; + if (isTerminating) { + trainTo = DynamicTextureCache.instance.getText(IGuiExtension.mergeTranslation("gui.tjmetro.terminus_cjk", "gui.tjmetro.terminus"), width - padding * 2, height, tileSize * 3 / 5, tileSize * 3 / 10, padding, horizontalAlignment, forceMTRFont); + } else { + String destinationString = IGui.mergeStations(destinations); + final boolean isClockwise = destinationString.startsWith(TEMP_CIRCULAR_MARKER_CLOCKWISE); + final boolean isAnticlockwise = destinationString.startsWith(TEMP_CIRCULAR_MARKER_ANTICLOCKWISE); + destinationString = destinationString.replace(TEMP_CIRCULAR_MARKER_CLOCKWISE, "").replace(TEMP_CIRCULAR_MARKER_ANTICLOCKWISE, ""); + if (!destinationString.isEmpty()) { + if (isClockwise) { + destinationString = IGuiExtension.insertTranslation("gui.mtr.clockwise_via_cjk", "gui.mtr.clockwise_via", 1, destinationString); + } else if (isAnticlockwise) { + destinationString = IGuiExtension.insertTranslation("gui.mtr.anticlockwise_via_cjk", "gui.mtr.anticlockwise_via", 1, destinationString); + } else { + destinationString = IGuiExtension.insertTranslation("gui.tjmetro.train_to_cjk", "gui.tjmetro.train_to", 1, destinationString); + } + } + trainTo = DynamicTextureCache.instance.getText(destinationString, width - padding * 2 - tileSize, height, tileSize * 3 / 5, tileSize * 3 / 10, padding, horizontalAlignment, forceMTRFont); + } + + final NativeImage nativeImage = new NativeImage(NativeImageFormat.RGBA, width, height, false); + nativeImage.fillRect(0, 0, width, height, invertColor(backgroundColor)); + + drawResource(nativeImage, SUBWAY_LOGO_RESOURCE, leftToRight ? 0 : width - tileSize, padding, tileSize, tileSize, false, 0.0F, 1.0F, textColor, false); + drawString(nativeImage, trainTo, leftToRight ? tileSize : width - tileSize, height / 2, horizontalAlignment, VerticalAlignment.CENTER, backgroundColor, textColor, false); + clearColor(nativeImage, invertColor(backgroundColor)); + + return nativeImage; + } catch (Exception e) { + TianjinMetro.LOGGER.error(e.getMessage(), e); + } + + return null; + } + + public static NativeImage generateCrossLineTrainTo(long platformId, HorizontalAlignment horizontalAlignment, float aspectRatio, float paddingScale, int backgroundColor, int textColor, boolean forceMTRFont) { + try { + final int height = scale; + final int width = (int) (height * aspectRatio); + final int padding = Math.round(height * paddingScale); + final int tileSize = height - padding * 2; + final boolean leftToRight = horizontalAlignment == HorizontalAlignment.LEFT; + + ObjectArrayList destinations = new ObjectArrayList<>(); + getRouteStream(platformId, (simplifiedRoute, currentStationIndex) -> { + final String tempMarker; + switch (simplifiedRoute.getCircularState()) { + case CLOCKWISE: + tempMarker = TEMP_CIRCULAR_MARKER_CLOCKWISE; + break; + case ANTICLOCKWISE: + tempMarker = TEMP_CIRCULAR_MARKER_ANTICLOCKWISE; + break; + default: + tempMarker = ""; + } + + destinations.add(tempMarker + simplifiedRoute.getPlatforms().get(currentStationIndex).getDestination()); + }); + final boolean isTerminating = destinations.isEmpty(); + final DynamicTextureCache.Text trainTo; + if (isTerminating) { + trainTo = DynamicTextureCache.instance.getText(IGuiExtension.mergeTranslation("gui.tjmetro.terminus_cjk", "gui.tjmetro.terminus"), width - padding * 2, height, tileSize * 3 / 5, tileSize * 3 / 10, padding, horizontalAlignment, forceMTRFont); + } else { + String destinationString = IGui.mergeStations(destinations); + final boolean isClockwise = destinationString.startsWith(TEMP_CIRCULAR_MARKER_CLOCKWISE); + final boolean isAnticlockwise = destinationString.startsWith(TEMP_CIRCULAR_MARKER_ANTICLOCKWISE); + destinationString = destinationString.replace(TEMP_CIRCULAR_MARKER_CLOCKWISE, "").replace(TEMP_CIRCULAR_MARKER_ANTICLOCKWISE, ""); + if (!destinationString.isEmpty()) { + if (isClockwise) { + destinationString = IGuiExtension.insertTranslation("gui.mtr.clockwise_via_cjk", "gui.mtr.clockwise_via", 1, destinationString); + } else if (isAnticlockwise) { + destinationString = IGuiExtension.insertTranslation("gui.mtr.anticlockwise_via_cjk", "gui.mtr.anticlockwise_via", 1, destinationString); + } else { + destinationString = IGuiExtension.insertTranslation("gui.tjmetro.cross_line_train_to_cjk", "gui.tjmetro.cross_line_train_to", 1, destinationString); + } + } + trainTo = DynamicTextureCache.instance.getText(destinationString, width - padding * 2 - tileSize, height, tileSize * 3 / 5, tileSize * 3 / 10, padding, horizontalAlignment, forceMTRFont); + } + + final NativeImage nativeImage = new NativeImage(NativeImageFormat.RGBA, width, height, false); + nativeImage.fillRect(0, 0, width, height, invertColor(backgroundColor)); + + drawResource(nativeImage, SUBWAY_LOGO_RESOURCE, leftToRight ? 0 : width - tileSize, padding, tileSize, tileSize, false, 0.0F, 1.0F, textColor, false); + drawString(nativeImage, trainTo, leftToRight ? tileSize : width - tileSize, height / 2, horizontalAlignment, VerticalAlignment.CENTER, backgroundColor, textColor, false); + clearColor(nativeImage, invertColor(backgroundColor)); + + return nativeImage; + } catch (Exception e) { + TianjinMetro.LOGGER.error(e.getMessage(), e); + } + + return null; + } + public static NativeImage generateSignText(String string, HorizontalAlignment horizontalAlignment, float paddingScale, int backgroundColor, int textColor) { try { final int height = scale; diff --git a/fabric/src/main/resources/assets/tjmetro/lang/en_us.json b/fabric/src/main/resources/assets/tjmetro/lang/en_us.json index c8e8fbb..5a1c7d7 100644 --- a/fabric/src/main/resources/assets/tjmetro/lang/en_us.json +++ b/fabric/src/main/resources/assets/tjmetro/lang/en_us.json @@ -72,6 +72,10 @@ "gui.tjmetro.bound_for_bmt_cjk": "开往 %s", "gui.tjmetro.bound_for_cjk": "%s方向", "gui.tjmetro.bound_for": "To %s", + "gui.tjmetro.train_to_cjk": "开往%s", + "gui.tjmetro.train_to": "To %s", + "gui.tjmetro.cross_line_train_to_cjk": "跨线车往%s", + "gui.tjmetro.cross_line_train_to": "Cross Line Train To %s", "sign.tjmetro.tianjin_metro": "天津地铁|Tianjin Metro", "sign.tjmetro.train": "列车|Train", @@ -88,6 +92,9 @@ "sign.tjmetro.bound_for": "方向|To", "sign.tjmetro.accessible_passage": "无障碍通道|Accessible Passage", "sign.tjmetro.toilet": "卫生间|Toilet", + "sign.tjmetro.to_subway": "乘车|To Subway", + "sign.tjmetro.train_to": "开往|To", + "sign.tjmetro.cross_line_train_to": "跨线车往|Cross Line Train To", "sign.tjmetro.no_entry_bmt": "乘客止步|No Entry", "sign.tjmetro.to_subway_bmt": "乘车|To Subway", "sign.tjmetro.exit_bmt": "出口|Exit", diff --git a/fabric/src/main/resources/assets/tjmetro/textures/sign/to_subway.png b/fabric/src/main/resources/assets/tjmetro/textures/sign/to_subway.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7ae15021206809bacf4571bf6680830867741d GIT binary patch literal 4069 zcmcIn2UL?;+P+^x2}m7`6j4GDB|wrd1yT?MDFRCb0Sh(=DH0*YBoIIc0&8KUC^Dm1 zaL`d;6cLxQs0_q{$|B0DsLP7Pl|j}9qAV~X*)NLx^Uv9tf6jl-=H$yQ-}65AEziC8 z>A}7 zP6V4L6_dDpX`+CXE|wu^02VJvmvMQ?0wpd{ut_BG#SdL<#p6VLU;Jt>4$P4S3X(*j znQ}o)=JHrxW-^b($1m~2Ely`61Y&`bi%S=$NEGaJU;Ia2HqzHmlkvEZ5M{D2K0v=9 zZVe|27bukra4Zsq$b(@jj=>@cXsUk`GD{;)co{2`r4wMVHN~t_nDoy!Zsi@B^I4X?<OJT9;3b>G4j5IHy7gI=si7;2dCGrFa4~tGsBnnwHs(?=MV(@85 zw)i}@P%0O55uJ#{+)Vtd+phEI+(ZftQ;0CkfQigRI+e(zu)K+MijYC4vzRcKM*AH4f5r9bwDOX; zl1&2Sf zR>St#7d^pm%;#*u&heYtVk!68I&f>qT`_d9kJZ<|;IL1fDr?W}GS;)38U6A(P^yNW z;M&EBTGcIAI91&Tcg7p0UPKN5(U?Ez$VG z(vj|fE&)9dv&&m1FckC+EIjX~F;F1w`_7V4010C%d-QISOeLW;AzeZ4OxBnX2a&34=C_Y z`(|6&iLgQD-4o|+(;q4M&Boha`ESki81@_fqSkSo2KV~YP)vs^Q*fhTv0z| z-U+gsE7zS_IDyg7oQEzxzP;5D$YkL;>roLA=RL#P|Hb|mG%-)&irlV{Mf~u_J)f@%c0OQYi+f|9HZ z$^$7tjM8OS*sEt5KuIxXn&aV}HZntXhat44+D^?v>CWCU(+n9vrKj!G2T{7pB%|^; zEA_$MP*a>%H}4QsO2lZ0yP;CIVcq;r;5o-2;dmmrhMCmm3&9i#qp@oP>)nQ1H_(9Y z3j-~_4Vc-E>y8M)Myx?XQzFR159?ApLGvPvCK8K|ivRuqw+0OFz=6@-5Ob+kHwO{p zm)lE-MNwv&oP8k4Pz#)aF~O)j-0qK%15{9^ekNuinLy1~)EE_lBV^fRAgydjLq3J-N$i$%8BM ziR9vAA0|vEeP@rKZTogvr^~Tf=^gL(hLqerX07%rPL9~U_`M2T@q7j?HhR|?H8OUo zg)ruj8M*g^Y16`yzrFPX35OSYp_pb56Ik9JF6~2T&xXQLTFc+|7yRIBx;q3sE?Sj) zLt0uNb66dC^Zb24Xu)02qsC^93o2t=z}$T`+z|6#us$SfNc)1=_`#BS>ry}Cs@d3u z`Gd={4%8DgRsr%@R4w6{J#+RTiP>^vTZ<;K@1l>BZP9{k%<#dsTZRMUSFF{0B0_J4 zI6tQPd3G~`ZA?ZffKU41$II`IB^yhp(+W7pKwb^Getmw|=BMcEhX{<-PeU1|Np z30zlYZu?n$t2iQdZVtMWwRPRXs|Dsj!zq5+{jw+G`P<98OGIni%qvoAaA4NcYus$!vyP9`<1-gJ%iwtaX zeF)fTTGkhlMZgvYpUNx*?_4uFzK%WQZ}9_dZ_=#VN;W94jx+#YG~iDr`#@^`nMbc; zC1h=Veo%}TS|+dRbA5jO5Hy&d^40A4214PpRvNGi9N4w^`tzyTPhXpXC6*aQ-RJ#4 zt?j>_#I(FnM6bu+wg;Da<&%HTwuP9q{)-28B1hnSjgRxQzULbfETtgN-uPLagb>(V zhEA~hQ>vmN*#o}e0}56s0;f9aB9EU2_l9+KIoo0wg0^a> zM0BWrH}!R)))QQ7TARkP89R2zr z6N`tclnAr3TwDp59pOIppDbTlyY{^9GB{!uTmp#Q<$c)mO54wZJmy0{N_ zYIfh8;*nF8PsHWV+_CBkD{3mBw?PSWOCC7tuUH??j4A4_FQtb`<6E<{Bd?IR8rOHnRMraFOd7Zq`oKW`lcv$fApqix#x&H=5m@FCq literal 0 HcmV?d00001 diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 533801b..de2d22c 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -8,7 +8,8 @@ "ZiYueCommentary" ], "contributors": [ - "user111192" + "user111192", + "白云-burgeoning" ], "contact": { "homepage": "https://modrinth.com/mod/tianjin-metro", diff --git a/icons/to_subway.svg b/icons/to_subway.svg new file mode 100644 index 0000000..ed59edc --- /dev/null +++ b/icons/to_subway.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + +