From e751e240dba46793959a4479d795f0eca47becb6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 09:59:07 -0400 Subject: [PATCH 01/10] Fixed #12636 --- core/src/mindustry/logic/LStatements.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 219dd00e45..3f3e9288ae 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -440,11 +440,8 @@ public class LStatements{ //Q: why don't you just use arrays for this? //A: arrays aren't as easy to serialize so the code generator doesn't handle them - int c = 0; for(int i = 0; i < type.params.length; i++){ - - fields(table, type.params[i], i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); - + fields(table, type.params[i], type.params.length > 1 && LCanvas.isCompact(), i == 0 ? p1 : i == 1 ? p2 : i == 2 ? p3 : p4, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : i == 2 ? v -> p3 = v : v -> p4 = v); } } @@ -537,7 +534,7 @@ public class LStatements{ table.add(" = "); - tfield = field(table, type, str -> type = str).padRight(0f).get(); + tfield = field(table, type, str -> type = str).width(LCanvas.isCompact() ? 140f : 180f).padRight(0f).get(); table.button(b -> { b.image(Icon.pencilSmall); @@ -699,16 +696,7 @@ public class LStatements{ }else{ //"function"-type operations have the name at the left and arguments on the right if(op.func){ - if(LCanvas.isCompact()){ - table.left(); - table.table(c -> { - c.color.set(category().color); - c.left(); - funcs(c, table); - }).colspan(2).left(); - }else{ - funcs(table, table); - } + funcs(table, table); }else{ field(table, a, str -> a = str); From ab51304dd656009834091af3169a5dcd7ac6876d Mon Sep 17 00:00:00 2001 From: Cardillan <122014763+cardillan@users.noreply.github.com> Date: Sat, 12 Sep 2026 16:01:41 +0200 Subject: [PATCH 02/10] Fixes #12640: Unset keybinding not saved (#12641) --- core/src/mindustry/ui/dialogs/KeybindDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/ui/dialogs/KeybindDialog.java b/core/src/mindustry/ui/dialogs/KeybindDialog.java index 55799804f5..248aa3d78b 100644 --- a/core/src/mindustry/ui/dialogs/KeybindDialog.java +++ b/core/src/mindustry/ui/dialogs/KeybindDialog.java @@ -167,6 +167,7 @@ public class KeybindDialog extends Dialog{ buttons.button("@back", Icon.left, this::hide).size(bw, bh).get().addListener(blocker); buttons.button("@settings.unbindKey", Icon.cancel, () -> { keyBind.unset(); + keyBind.save(); hide(); }).size(bw, bh).get().addListener(blocker); }}; From 6df25c8308ab31eb86018556a8dcc55aa41b4afb Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 10:04:44 -0400 Subject: [PATCH 03/10] Reverted fix for #12223 --- core/src/mindustry/logic/LExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 1268dde9f4..d44c123a39 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1583,7 +1583,7 @@ public class LExecutor{ public void run(LExecutor exec){ if(net.client()) return; - Tile tile = world.tile(Mathf.round(x.numf()), Mathf.round(y.numf())); + Tile tile = world.tile(x.numi(), y.numi()); if(tile != null && block.obj() instanceof Block b){ switch(layer){ case ore -> { From 7501697f028d47cdb2b13b1dd22f2bb762e80f28 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 10:36:11 -0400 Subject: [PATCH 04/10] Fixed #12644 --- core/src/mindustry/ui/Fonts.java | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 397b42b472..6670ee5abd 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -346,7 +346,7 @@ public class Fonts{ @Override public float imageSize(){ - return size; + return size / Scl.scl(1f); } }; diff --git a/gradle.properties b/gradle.properties index fdb5e2a0ef..cab1cd4ae9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=5a9696f1d4 +archash=5f58c6eda0 From a341cff83f9e49f01e7cd2122e443db9c5ce5268 Mon Sep 17 00:00:00 2001 From: redloong Date: Sat, 12 Sep 2026 16:36:26 +0200 Subject: [PATCH 05/10] Refine Chinese translations in bundle_zh_CN.properties (#12631) * Refine Chinese translations in bundle_zh_CN.properties Updated various translations in the properties file for improved clarity and accuracy. * Update Chinese localization for various labels * Rename animated water settings to dynamic effects Updated animated water settings to reflect dynamic effects. * Update Chinese translations in bundle_zh_CN.properties --- core/assets/bundles/bundle_zh_CN.properties | 198 ++++++++++---------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index eebafe26fc..9f5b830cf6 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -50,7 +50,7 @@ mods.browser.add = 安装 mods.browser.reinstall = 重新安装 mods.browser.view-releases = 查看版本 mods.browser.noreleases = [scarlet]找不到任何版本\n[accent]无法找到该模组的任何版本。请检查一下该模组的仓库是否发布了版本。 -mods.browser.current = [lightgray]Most recent commit +mods.browser.current = [lightgray]最新提交 mods.browser.latest = [lightgray][最新] mods.browser.releases = 版本 mods.browser.fetching = 获取版本中... @@ -145,7 +145,7 @@ mods.initfailed = [red]⚠[] Mindustry 上一次启动失败。这可能是由 mods = 模组 mods.name = 模组: mods.none = [lightgray]未找到模组! -mods.restore = Restore Failed +mods.restore = 恢复失败 mods.guide = 模组指南 mods.report = 举报错误 mods.openfolder = 打开文件夹 @@ -164,7 +164,7 @@ mod.installed = [[已安装] mod.display = [gray]模组:[orange] {0} mod.enabled = [lightgray]已启用 mod.disabled = [red]未启用 -mod.failed = [red]Failed +mod.failed = [red]失败 mod.multiplayer.compatible = [gray]支持多人游戏 mod.disable = 禁用 mod.version = 版本: @@ -1237,9 +1237,9 @@ stat.buildspeedmultiplier = 建造速度倍率 stat.reactive = 反应 stat.immunities = 免疫 stat.healing = 治疗 -stat.status = Status Effect +stat.status = 状态效果 stat.efficiency = [stat]{0}% 效率 -stat.chance = [stat]{0}%[lightgray] chance of [white] +stat.chance = [stat]{0}%[lightgray] 概率 [white] stat.hitsize = 碰撞箱大小 stat.resettime = 重置时间 @@ -1288,7 +1288,7 @@ ability.stat.minspeed = [stat]{0}格/秒[lightgray] 最低速度 ability.stat.duration = [stat]{0} 秒[lightgray] 持续时间 ability.stat.buildtime = [stat]{0} 秒[lightgray] 建造时间 -bar.displaytoolarge = 尺寸太大\n(Max:{0}x{0}) +bar.displaytoolarge = 尺寸太大\n(上限:{0}x{0}) bar.onlycoredeposit = 仅可将资源丢入核心 bar.drilltierreq = 需要更高级的钻头 bar.nobatterypower = 电池电力储存不足 @@ -1299,7 +1299,7 @@ bar.cargounitcap = 达到货运单位上限 bar.drillspeed = 挖掘速度:{0}/秒 bar.pumpspeed = 泵送速度:{0}/秒 bar.efficiency = 效率:{0}% -bar.yield = Yield: +{0}% +bar.yield = 产量: +{0}% bar.boost = 超速:+{0}% bar.powerbuffer = 电池电力:{0}/{1} bar.powerbalance = 电力:{0}/秒 @@ -1435,8 +1435,8 @@ setting.distinctcontrolgroups.name = 每单位限制一个编队 setting.distinctcontrolgroups.description = 启用后,每个单位只能从属于一个编队。 setting.modcrashdisable.name = 游戏启动崩溃后禁用模组 setting.modcrashdisable.description = 启用后,若启动时模组崩溃,则会禁用所有模组以避免无休止的崩溃。 -setting.animatedwater.name = 动态液体 -setting.animatedwater.description = 是否开启液体表面的动画,如水和矿渣。 +setting.animatedwater.name = 动态效果 +setting.animatedwater.description = 是否显示水、矿渣和护盾等表面的动画。 setting.playerindicators.name = 玩家指示器 setting.playerindicators.description = 在地图上显示标记,来指示其他玩家的方向。 setting.showpings.name = 显示标记 @@ -1738,7 +1738,7 @@ rules.enemyteam = 敌方队伍 rules.playerteam = 玩家队伍 rules.title.waves = 波次 rules.title.resourcesbuilding = 资源与建筑 -rules.title.enemy = 敌对阵营 +rules.title.enemy = 敌人 rules.title.unit = 单位 rules.title.experimental = 实验性 rules.title.environment = 环境 @@ -2831,7 +2831,7 @@ lst.read = 从连接的内存读取数字。 lst.write = 向连接的内存写入数字。 lst.print = 添加文字到打印缓存\n使用[accent]打印文本[]后才会真正显示。 lst.printchar = 向打印缓存添加一个 UTF-16 字符或内容图标。\n直到使用[accent]打印文本[]后才会真正显示。 -lst.format = 用一个值替换文本缓冲区中的下一个占位符。\n如果占位符模式无效,则不会执行任何操作。\n占位模式:"{[accent]number 0-9[]}"\n示例:\n[accent]打印 "test {0}"\n格式 “示例”。 +lst.format = 用一个值替换文本缓冲区中的下一个占位符。\n如果占位符模式无效,则不会执行任何操作。\n占位模式:"{[accent]number 0-9[]}"\n示例:\n[accent]打印 "test {0}"\n格式化 “示例”。 lst.draw = 添加绘图操作到绘图缓存\n使用[accent]打印绘图[]后才会真正显示。 lst.drawflush = 将绘图缓存中的[accent]绘图[]队列刷新到显示屏。 lst.printflush = 将打印缓存中的[accent]打印[]队列刷新到信息板。 @@ -2924,84 +2924,84 @@ lglobal.@clientMobile = 如果运行代码的客户端是移动端,则为 true lglobal.@clientMusicPlaying = 如果当前正在播放任何音乐,则为True lglobal.@clientCurrentMusic = 正在播放的当前音乐的名称,或为null -lenum.type = 建筑和单位的类型,返回一个“类型”而非字符串\n例如对路由器使用,会返回[accent]@router[] lenum.shoot = 向某个位置瞄准/射击 lenum.shootp = 根据提前量向某个单位或建筑瞄准/射击 -lenum.config = 建筑设置,例如分类器所设置的筛选物品种类 -lenum.enabled = 建筑是否已启用 +laccess.totalitems = 含有的物品总数。 +laccess.firstitem = 含有的第一个物品,若为空则返回 null。 +laccess.totalliquids = 含有的液体总量。 +laccess.totalpower = 对于能储电的建筑,指存储的电量;对于其他建筑,以0~1表示供电满足率。 +laccess.itemcapacity = 该建筑可容纳的最大物品数量。 +laccess.liquidcapacity = 该建筑可容纳的最大液体量。 +laccess.powercapacity = 该建筑可存储的最大电量。 +laccess.powernetstored = 相连接电网的总储电量。 +laccess.powernetcapacity = 相连接电网的总储电容量。 +laccess.powernetin = 相连接的电网每秒输入的电力。 +laccess.powernetout = 相连接的电网每秒输出的电力。 +laccess.ammo = 炮塔当前的弹药数量。 +laccess.ammocapacity = 炮塔的最大弹药量。 laccess.currentammotype = 炮塔当前的弹药/液体 laccess.memorycapacity = 内存块中的单元数量 -laccess.color = 照明器发光的颜色 -laccess.controller = 单位的控制方\n如果单位由处理器控制,返回对应的处理器\n如果单位在编队中,返回编队的领队\n其他情况,返回单位自身 -laccess.dead = 单位或建筑是否已被摧毁或者已失效 -laccess.controlled = 若单位的控制方是处理器,返回 [accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回 [accent]@ctrlPlayer[]\n若单位在编队中,返回 [accent]@ctrlFormation[]\n其他情况,返回 0 +laccess.health = 当前生命值\n对于子弹,指其伤害值。 +laccess.maxhealth = 最大生命值\n对于子弹,指其基础伤害。 +laccess.heat = 耗热炮塔当前的热量值,范围为 0 到 1。 +laccess.shield = 单位当前的护盾值。 +laccess.armor = 护甲值;每次受击时的固定伤害减免。 +laccess.efficiency = 建筑的运行效率,以 1 为标准值。 laccess.progress = 进度,0 到 1 之间的数值。\n返回工厂生产、炮塔装填,或者建筑建造的进度 -laccess.speed = 单位的最高速度(格/秒) -laccess.size = 单位/建筑的大小或字符串的长度 -laccess.id = 单位/块/物品/液体的 ID。\n这是[accent]查询[]的反向操作。 +laccess.timescale = 影响建筑的时间缩放倍率,其中1为正常速度。 +laccess.rotation = 单位或炮塔的朝向角度(以度为单位)。\n对于大多数其他建筑,朝向值为 0 到 3。 +laccess.x = X 坐标(以格为单位)。 +laccess.y = Y 坐标(以格为单位)。 +laccess.velocityx = 单位的 X 轴速度,单位为格/秒。 +laccess.velocityy = 单位的 Y 轴速度,单位为格/秒。 +laccess.shootx = 单位或炮塔所瞄准目标的 X 坐标。 +laccess.shooty = 单位或炮塔所瞄准目标的 Y 坐标。 +laccess.camerax = 控制玩家镜头的 X 坐标。 +laccess.cameray = 控制玩家镜头的 Y 坐标。 +laccess.camerawidth = 控制玩家镜头的宽度(以格为单位)。 +laccess.cameraheight = 控制玩家镜头的高度(以格为单位)。 laccess.displaywidth = 显示屏的宽度(以像素为单位)。 laccess.displayheight = 显示屏的高度(以像素为单位)。 laccess.buffersize = 显示器图形缓冲区中未处理的命令数。 laccess.operations = 方块执行操作的次数。\n对于显示屏,返回[accent]打印绘图[]调用次数。 +laccess.size = 单位/建筑的大小或字符串的长度 +laccess.solid = 普通陆地单位是否不可通过该建筑。 +laccess.dead = 单位或建筑是否已被摧毁或者已失效 +laccess.range = 单位或炮塔的射程(以格为单位)。 +laccess.shooting = 单位或炮塔当前是否正在射击。 +laccess.boosting = 单位当前是否处于助推状态或正在飞越地形。 +laccess.minex = 单位所采矿物的 X 地块坐标,若未在采矿则为 -1。 +laccess.miney = 单位所采矿物的 Y 地块坐标,若未在采矿则为 -1。 +laccess.mining = 单位是否正在进行采矿。 +laccess.buildx = 单位正在建造的建筑 X 坐标,若未建造则为 -1。 +laccess.buildy = 单位正在建造的建筑 Y 坐标,若未建造则为 -1。 +laccess.pingx = 玩家标记的标记点位置的 X 坐标,若未标记则为 null。 +laccess.pingy = 玩家标记的标记点位置的 Y 坐标,若未标记则为 null。 +laccess.pingtext = 玩家标记的标记点文本内容,若无则为 null。 +laccess.building = 正在建造的建筑原始名称,若无则为 null。 +laccess.breaking = 正在拆除的建筑原始名称,若无则为 null。 +laccess.speed = 单位的最高速度(格/秒) +laccess.team = 单位或建筑的队伍 ID。 +lenum.type = 建筑和单位的类型,返回一个“类型”而非字符串\n例如对路由器使用,会返回[accent]@router[] +laccess.flag = 存储在单位身上的 flag。 +laccess.flying = 单位当前是否正在飞行。 +laccess.controlled = 若单位的控制方是处理器,返回 [accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回 [accent]@ctrlPlayer[]\n若单位在编队中,返回 [accent]@ctrlFormation[]\n其他情况,返回 0 +laccess.controller = 单位的控制方\n如果单位由处理器控制,返回对应的处理器\n如果单位在编队中,返回编队的领队\n其他情况,返回单位自身 +laccess.name = 控制该单位的玩家名称,若无则为 null。 +laccess.payloadcount = 当前持有的有效载荷数量。 +laccess.payloadtype = 最后获取的有效载荷类型,若无则为 null。 +laccess.totalpayload = 所有持有的有效载荷的总大小。 +laccess.payloadcapacity = 单位或建筑所能承载的最大综合有效载荷大小。 laccess.maxunits = 队伍能拥有的最大单位数。\n只能从核心中读取。 -laccess.totalitems = Total number of items contained. -laccess.firstitem = First item contained, or null if empty. -laccess.totalliquids = Total amount of liquid contained. -laccess.totalpower = For blocks with a buffered power store, the amount of power stored; for other blocks, buffer fullness from 0 to 1. -laccess.itemcapacity = Maximum number of items this building can hold. -laccess.liquidcapacity = Maximum amount of liquid this building can hold. -laccess.powercapacity = Maximum amount of power this building can store. -laccess.powernetstored = Total power stored in the connected power grid. -laccess.powernetcapacity = Total power storage capacity of the connected power grid. -laccess.powernetin = Power entering the connected power grid, per second. -laccess.powernetout = Power leaving the connected power grid, per second. -laccess.ammo = Current ammo count of a turret. -laccess.ammocapacity = Maximum ammo count of a turret. -laccess.health = Current health.\nFor bullets, their damage. -laccess.maxhealth = Maximum health.\nFor bullets, the base damage. -laccess.heat = Current heat of a turret that consumes heat, 0 to 1. -laccess.shield = Current shield amount of a unit. -laccess.armor = Armor value; flat damage reduction per hit. -laccess.efficiency = Operating efficiency of a building, where 1 is nominal. -laccess.timescale = Time scale multiplier affecting a building, where 1 is normal speed. -laccess.rotation = Facing angle of a unit or turret, in degrees.\nFor most other buildings, the 0 to 3 orientation. -laccess.x = X position, in tiles. -laccess.y = Y position, in tiles. -laccess.velocityx = X velocity of a unit, in tiles/sec. -laccess.velocityy = Y velocity of a unit, in tiles/sec. -laccess.shootx = X coordinate a unit or turret is aiming at. -laccess.shooty = Y coordinate a unit or turret is aiming at. -laccess.camerax = X position of the controlling player's camera. -laccess.cameray = Y position of the controlling player's camera. -laccess.camerawidth = Width of the controlling player's view, in tiles. -laccess.cameraheight = Height of the controlling player's view, in tiles. -laccess.solid = Whether this building blocks movement. -laccess.range = Range of a unit or turret, in tiles. -laccess.shooting = Whether a unit or turret is currently shooting. -laccess.boosting = Whether a unit is currently boosting or flying over terrain. -laccess.minex = X tile coordinate a unit is mining, or -1 if not mining. -laccess.miney = Y tile coordinate a unit is mining, or -1 if not mining. -laccess.mining = Whether a unit is currently mining. -laccess.buildx = X tile coordinate a unit is building at, or -1 if not building. -laccess.buildy = Y tile coordinate a unit is building at, or -1 if not building. -laccess.pingx = X coordinate a player is pinging, or null if not pinging. -laccess.pingy = Y coordinate a player is pinging, or null if not pinging. -laccess.pingtext = Text of a player's current ping, or null if not pinging. -laccess.building = Building a unit is currently constructing, or null. -laccess.breaking = Building a unit is currently deconstructing, or null. -laccess.team = Team ID of a unit or building. -laccess.flag = Numeric flag value stored on a unit. -laccess.flying = Whether a unit is currently airborne. -laccess.name = Name of the player controlling this unit, or null. -laccess.payloadcount = Number of payloads currently held. -laccess.payloadtype = Type of the last payload picked up, or null. -laccess.totalpayload = Combined size of all held payloads. -laccess.payloadcapacity = Maximum combined payload size a unit or building can carry. -laccess.selectedblock = Block currently selected by the controlling player, or null. -laccess.selectedrotation = Build rotation currently selected by the controlling player, 0 to 3. -laccess.bulletlifetime = Total lifetime of a bullet, in ticks. -laccess.bullettime = Time a bullet has existed, in ticks. +laccess.id = 单位/块/物品/液体的 ID。\n这是[accent]查询[]的反向操作。 +laccess.selectedblock = 玩家当前在建筑列表选中的方块,若无则为 null。 +laccess.selectedrotation = 玩家当前在建筑列表选择的建造旋转角度,范围为 0 到 3。 +laccess.bulletlifetime = 子弹可存在的总时长(以 tick 为单位)。 +laccess.bullettime = 子弹已存在的时长(以 tick 为单位)。 +lenum.enabled = 建筑是否已启用 +lenum.config = 建筑设置,例如分类器所设置的筛选物品种类 +laccess.color = 照明器发光的颜色 lcategory.unknown = 未知 lcategory.unknown.description = 未分类的指令 @@ -3111,7 +3111,7 @@ unitradar.output = 找到的单位存入该变量 control.of = 要控制的建筑 control.unit = 要瞄准的单位或建筑 -control.shoot = 是否射击 +control.shoot = 射击? unitlocate.enemy = 是否搜寻敌方建筑(0 或 false 则搜寻己方建筑) unitlocate.found = 若找到,在该变量中存入 true;未找到则存入 false @@ -3154,7 +3154,7 @@ lenum.colori = 索引位置,用于线和四边形标记,索引零表示第 lenum.wavetimer = 波次是否自动出现在计时器上。如果没有,按下播放按钮时会出现波次 lenum.wave = 当前波数,可以是非波次模式下的任何值 lenum.currentwavetime = 波次倒计时(以 tick 为单位) -lenum.waves = 波次是否可以生成 +lenum.waves = 波次是否可生成 lenum.wavesending = 是否可以通过播放按钮手动生成波次 lenum.attackmode = 游戏是否为进攻模式 lenum.wavespacing = 波次之间的时间间隔(以 tick 为单位) @@ -3221,8 +3221,8 @@ instruction.setrate = 设置速率 instruction.fetch = 获取对象 instruction.sync = 网络同步 instruction.clientdata = 客户端数据 -instruction.getflag = 获取flag -instruction.setflag = 设置flag +instruction.getflag = 获取 flag +instruction.setflag = 设置 flag instruction.setprop = 设置属性 instruction.playsound = 播放音效 instruction.playmusic = 播放音乐 @@ -3253,8 +3253,8 @@ cutsceneaction.label.pan = 移动 cutsceneaction.label.zoom = 缩放 cutsceneaction.label.stop = 停止 cutsceneaction.label.shake = 抖动 -cutsceneaction.label.gethud = 获取Hud -cutsceneaction.label.sethud = 设置Hud +cutsceneaction.label.gethud = 获取 Hud +cutsceneaction.label.sethud = 设置 Hud fetchtype.label.unit = 单位 fetchtype.label.player = 玩家控制单位 fetchtype.label.core = 核心 @@ -3294,8 +3294,8 @@ laccess.label.ammo = 弹药量 laccess.label.ammocapacity = 弹药容量 laccess.label.currentammotype = 当前弹药类型 laccess.label.memorycapacity = 内存块单元数量 -laccess.label.health = 生命值 -laccess.label.maxhealth = 最大生命值 +laccess.label.health = 生命值/伤害 +laccess.label.maxhealth = 最大生命值/基础伤害 laccess.label.heat = 热量 laccess.label.shield = 护盾 laccess.label.armor = 护甲 @@ -3309,10 +3309,10 @@ laccess.label.velocityx = X轴移动速度 laccess.label.velocityy = Y轴移动速度 laccess.label.shootx = 射击X坐标 laccess.label.shooty = 射击Y坐标 -laccess.label.camerax = 相机X坐标 -laccess.label.cameray = 相机Y坐标 -laccess.label.camerawidth = 相机宽度 -laccess.label.cameraheight = 相机高度 +laccess.label.camerax = 镜头X坐标 +laccess.label.cameray = 镜头Y坐标 +laccess.label.camerawidth = 镜头宽度 +laccess.label.cameraheight = 镜头高度 laccess.label.displaywidth = 显示屏宽度 laccess.label.displayheight = 显示屏高度 laccess.label.buffersize = 缓冲区大小 @@ -3321,18 +3321,18 @@ laccess.label.size = 大小/长度 laccess.label.solid = 实体 laccess.label.dead = 已摧毁/失效 laccess.label.range = 雷达范围 -laccess.label.shooting = 射击状态 -laccess.label.boosting = 助推状态 +laccess.label.shooting = 射击? +laccess.label.boosting = 助推? laccess.label.minex = 采矿X坐标 laccess.label.miney = 采矿Y坐标 -laccess.label.mining = 采矿状态 +laccess.label.mining = 采矿? laccess.label.buildx = 建造于X坐标 laccess.label.buildy = 建造于Y坐标 laccess.label.pingx = 标记点X坐标 laccess.label.pingy = 标记点Y坐标 laccess.label.pingtext = 标记点文本 -laccess.label.building = 建造状态 -laccess.label.breaking = 破坏状态 +laccess.label.building = 建造的建筑 +laccess.label.breaking = 破坏的建筑 laccess.label.speed = 速度 laccess.label.team = 队伍 laccess.label.type = 类型 @@ -3380,7 +3380,7 @@ lmarkercontrol.label.fontsize = 字体大小 lmarkercontrol.label.textheight = 文本高度 lmarkercontrol.label.textalign = 文本对齐 lmarkercontrol.label.linealign = 线对齐 -lmarkercontrol.label.labelflags = flag标签 +lmarkercontrol.label.labelflags = flag 标签 lmarkercontrol.label.texture = 纹理 lmarkercontrol.label.texturesize = 纹理大小 lmarkercontrol.label.posi = 位置 @@ -3388,7 +3388,7 @@ lmarkercontrol.label.uvi = 纹理位置范围 lmarkercontrol.label.colori = 颜色 logicrule.label.currentwavetime = 波次倒计时 logicrule.label.wavetimer = 有波次计时器? -logicrule.label.waves = 波次是否可以生成 +logicrule.label.waves = 波次可生成? logicrule.label.wave = 当前波数 logicrule.label.wavespacing = 波次间隔 logicrule.label.wavesending = 手动生成波次? @@ -3398,7 +3398,7 @@ logicrule.label.dropzoneradius = 敌人出生点半径 logicrule.label.unitcap = 单位上限 logicrule.label.maparea = 地图大小和有效范围 logicrule.label.lighting = 启用环境光? -logicrule.label.cangameover = 游戏可否结束 +logicrule.label.cangameover = 游戏可结束? logicrule.label.ambientlight = 环境光颜色 logicrule.label.unitlight = 单位光 logicrule.label.solarmultiplier = 太阳能板效率 @@ -3431,7 +3431,7 @@ lunitcontrol.label.itemtake = 从建筑取出物品 lunitcontrol.label.paydrop = 卸下载荷 lunitcontrol.label.paytake = 拾取载荷 lunitcontrol.label.payenter = 进入载荷 -lunitcontrol.label.flag = 赋予单位flag +lunitcontrol.label.flag = 赋予单位 flag lunitcontrol.label.mine = 采集矿物 lunitcontrol.label.build = 建造建筑 lunitcontrol.label.getblock = 用坐标获取类型 From 137c6201c04348d9231832abdabf45ad25a0ed24 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Sat, 12 Sep 2026 14:37:17 +0000 Subject: [PATCH 06/10] Automatic bundle update --- core/assets/bundles/bundle_zh_CN.properties | 36 ++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 9f5b830cf6..641ca482d2 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -2924,9 +2924,27 @@ lglobal.@clientMobile = 如果运行代码的客户端是移动端,则为 true lglobal.@clientMusicPlaying = 如果当前正在播放任何音乐,则为True lglobal.@clientCurrentMusic = 正在播放的当前音乐的名称,或为null +lenum.type = 建筑和单位的类型,返回一个“类型”而非字符串\n例如对路由器使用,会返回[accent]@router[] lenum.shoot = 向某个位置瞄准/射击 lenum.shootp = 根据提前量向某个单位或建筑瞄准/射击 +lenum.config = 建筑设置,例如分类器所设置的筛选物品种类 +lenum.enabled = 建筑是否已启用 +laccess.currentammotype = 炮塔当前的弹药/液体 +laccess.memorycapacity = 内存块中的单元数量 +laccess.color = 照明器发光的颜色 +laccess.controller = 单位的控制方\n如果单位由处理器控制,返回对应的处理器\n如果单位在编队中,返回编队的领队\n其他情况,返回单位自身 +laccess.dead = 单位或建筑是否已被摧毁或者已失效 +laccess.controlled = 若单位的控制方是处理器,返回 [accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回 [accent]@ctrlPlayer[]\n若单位在编队中,返回 [accent]@ctrlFormation[]\n其他情况,返回 0 +laccess.progress = 进度,0 到 1 之间的数值。\n返回工厂生产、炮塔装填,或者建筑建造的进度 +laccess.speed = 单位的最高速度(格/秒) +laccess.size = 单位/建筑的大小或字符串的长度 +laccess.id = 单位/块/物品/液体的 ID。\n这是[accent]查询[]的反向操作。 +laccess.displaywidth = 显示屏的宽度(以像素为单位)。 +laccess.displayheight = 显示屏的高度(以像素为单位)。 +laccess.buffersize = 显示器图形缓冲区中未处理的命令数。 +laccess.operations = 方块执行操作的次数。\n对于显示屏,返回[accent]打印绘图[]调用次数。 +laccess.maxunits = 队伍能拥有的最大单位数。\n只能从核心中读取。 laccess.totalitems = 含有的物品总数。 laccess.firstitem = 含有的第一个物品,若为空则返回 null。 laccess.totalliquids = 含有的液体总量。 @@ -2940,15 +2958,12 @@ laccess.powernetin = 相连接的电网每秒输入的电力。 laccess.powernetout = 相连接的电网每秒输出的电力。 laccess.ammo = 炮塔当前的弹药数量。 laccess.ammocapacity = 炮塔的最大弹药量。 -laccess.currentammotype = 炮塔当前的弹药/液体 -laccess.memorycapacity = 内存块中的单元数量 laccess.health = 当前生命值\n对于子弹,指其伤害值。 laccess.maxhealth = 最大生命值\n对于子弹,指其基础伤害。 laccess.heat = 耗热炮塔当前的热量值,范围为 0 到 1。 laccess.shield = 单位当前的护盾值。 laccess.armor = 护甲值;每次受击时的固定伤害减免。 laccess.efficiency = 建筑的运行效率,以 1 为标准值。 -laccess.progress = 进度,0 到 1 之间的数值。\n返回工厂生产、炮塔装填,或者建筑建造的进度 laccess.timescale = 影响建筑的时间缩放倍率,其中1为正常速度。 laccess.rotation = 单位或炮塔的朝向角度(以度为单位)。\n对于大多数其他建筑,朝向值为 0 到 3。 laccess.x = X 坐标(以格为单位)。 @@ -2961,13 +2976,7 @@ laccess.camerax = 控制玩家镜头的 X 坐标。 laccess.cameray = 控制玩家镜头的 Y 坐标。 laccess.camerawidth = 控制玩家镜头的宽度(以格为单位)。 laccess.cameraheight = 控制玩家镜头的高度(以格为单位)。 -laccess.displaywidth = 显示屏的宽度(以像素为单位)。 -laccess.displayheight = 显示屏的高度(以像素为单位)。 -laccess.buffersize = 显示器图形缓冲区中未处理的命令数。 -laccess.operations = 方块执行操作的次数。\n对于显示屏,返回[accent]打印绘图[]调用次数。 -laccess.size = 单位/建筑的大小或字符串的长度 laccess.solid = 普通陆地单位是否不可通过该建筑。 -laccess.dead = 单位或建筑是否已被摧毁或者已失效 laccess.range = 单位或炮塔的射程(以格为单位)。 laccess.shooting = 单位或炮塔当前是否正在射击。 laccess.boosting = 单位当前是否处于助推状态或正在飞越地形。 @@ -2981,27 +2990,18 @@ laccess.pingy = 玩家标记的标记点位置的 Y 坐标,若未标记则为 laccess.pingtext = 玩家标记的标记点文本内容,若无则为 null。 laccess.building = 正在建造的建筑原始名称,若无则为 null。 laccess.breaking = 正在拆除的建筑原始名称,若无则为 null。 -laccess.speed = 单位的最高速度(格/秒) laccess.team = 单位或建筑的队伍 ID。 -lenum.type = 建筑和单位的类型,返回一个“类型”而非字符串\n例如对路由器使用,会返回[accent]@router[] laccess.flag = 存储在单位身上的 flag。 laccess.flying = 单位当前是否正在飞行。 -laccess.controlled = 若单位的控制方是处理器,返回 [accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回 [accent]@ctrlPlayer[]\n若单位在编队中,返回 [accent]@ctrlFormation[]\n其他情况,返回 0 -laccess.controller = 单位的控制方\n如果单位由处理器控制,返回对应的处理器\n如果单位在编队中,返回编队的领队\n其他情况,返回单位自身 laccess.name = 控制该单位的玩家名称,若无则为 null。 laccess.payloadcount = 当前持有的有效载荷数量。 laccess.payloadtype = 最后获取的有效载荷类型,若无则为 null。 laccess.totalpayload = 所有持有的有效载荷的总大小。 laccess.payloadcapacity = 单位或建筑所能承载的最大综合有效载荷大小。 -laccess.maxunits = 队伍能拥有的最大单位数。\n只能从核心中读取。 -laccess.id = 单位/块/物品/液体的 ID。\n这是[accent]查询[]的反向操作。 laccess.selectedblock = 玩家当前在建筑列表选中的方块,若无则为 null。 laccess.selectedrotation = 玩家当前在建筑列表选择的建造旋转角度,范围为 0 到 3。 laccess.bulletlifetime = 子弹可存在的总时长(以 tick 为单位)。 laccess.bullettime = 子弹已存在的时长(以 tick 为单位)。 -lenum.enabled = 建筑是否已启用 -lenum.config = 建筑设置,例如分类器所设置的筛选物品种类 -laccess.color = 照明器发光的颜色 lcategory.unknown = 未知 lcategory.unknown.description = 未分类的指令 From 06163708bd073be2212c05395129c23d538b8fcd Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 10:49:45 -0400 Subject: [PATCH 07/10] Fixed misleading build UI for team-specific infinite resources --- core/src/mindustry/game/Rules.java | 4 ++++ core/src/mindustry/ui/fragments/PlacementFragment.java | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index 23ec0a69d0..95983c7e44 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -343,6 +343,10 @@ public class Rules{ return unitFactoryActivationDelay + teams.get(team).unitFactoryActivationDelay; } + public boolean isInfiniteResources(Team team){ + return infiniteResources || teams.get(team).infiniteResources; + } + /** A team-specific ruleset. */ public static class TeamRule{ /** Whether, when AI is enabled, ships should be spawned from the core. TODO remove / unnecessary? */ diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 54dcd456bb..04b3c75ef2 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -312,7 +312,7 @@ public class PlacementFragment{ button.update(() -> { //color unplacable things gray Building core = player.core(); - Color color = (state.rules.infiniteResources || (core != null && (core.items.has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources))) && player.isBuilder() ? Color.white : Color.gray; + Color color = (state.rules.isInfiniteResources(player.team()) || (core != null && (core.items.has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources))) && player.isBuilder() ? Color.white : Color.gray; button.forEach(elem -> elem.setColor(color)); button.setChecked(control.input.block == block); @@ -407,7 +407,7 @@ public class PlacementFragment{ line.label(() -> { Building core = player.core(); int stackamount = Math.round(stack.amount * state.rules.buildCostMultiplier); - if(core == null || state.rules.infiniteResources) return "*/" + stackamount; + if(core == null || state.rules.isInfiniteResources(player.team())) return "*/" + stackamount; int amount = core.items.get(stack.item); String color = (amount < stackamount / 2f ? "[scarlet]" : amount < stackamount ? "[accent]" : "[white]"); From 3d56fefb5175b22f39a15528b077a1e2bed487cc Mon Sep 17 00:00:00 2001 From: summoner Date: Sat, 12 Sep 2026 16:55:02 +0200 Subject: [PATCH 08/10] Translation: Update bundle_hu.properties (#12637) Translate new strings Follow the changes of the english bundle --- core/assets/bundles/bundle_hu.properties | 126 +++++++++++------------ 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index fbd163cde5..6904c9885c 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -2922,7 +2922,7 @@ lglobal.@clientName = A kódot futtató kliens játékosneve lglobal.@clientTeam = A kódot futtató kliens csapatazonosítója lglobal.@clientMobile = Igaz, ha a kódot futtató kliens egy hordozható eszköz, egyébként hamis lglobal.@clientMusicPlaying = Igaz, ha jelenleg folyamatban van bármilyen zene lejátszása -lglobal.@clientCurrentMusic = A jelenleg játszott zeneszám neve, vagy nulla +lglobal.@clientCurrentMusic = A jelenleg játszott zeneszám neve, vagy null lenum.type = Az épület/egység típusa.\nPéldául bármilyen elosztó esetén a [accent]@router[] értéket adja vissza.\nNem karakterlánc. lenum.shoot = Lövés egy adott pontra. @@ -2945,63 +2945,63 @@ laccess.displayheight = Egy kijelzőblokk magassága pixelben. laccess.buffersize = Üzenetek esetén: A tartalom hossza.\nKijelzők esetén: A feldolgozatlan grafikus parancsok száma. laccess.operations = A blokkon végrehajtott műveletek száma.\nKijelzők esetén a drawflush-műveletek számát adja vissza. laccess.maxunits = Egy csapat maximális egységeinek száma.\nCsak támaszpontokból érzékelhető. -laccess.totalitems = Total number of items contained. -laccess.firstitem = First item contained, or null if empty. -laccess.totalliquids = Total amount of liquid contained. -laccess.totalpower = For blocks with a buffered power store, the amount of power stored; for other blocks, buffer fullness from 0 to 1. -laccess.itemcapacity = Maximum number of items this building can hold. -laccess.liquidcapacity = Maximum amount of liquid this building can hold. -laccess.powercapacity = Maximum amount of power this building can store. -laccess.powernetstored = Total power stored in the connected power grid. -laccess.powernetcapacity = Total power storage capacity of the connected power grid. -laccess.powernetin = Power entering the connected power grid, per second. -laccess.powernetout = Power leaving the connected power grid, per second. -laccess.ammo = Current ammo count of a turret. -laccess.ammocapacity = Maximum ammo count of a turret. -laccess.health = Current health.\nFor bullets, their damage. -laccess.maxhealth = Maximum health.\nFor bullets, the base damage. -laccess.heat = Current heat of a turret that consumes heat, 0 to 1. -laccess.shield = Current shield amount of a unit. -laccess.armor = Armor value; flat damage reduction per hit. -laccess.efficiency = Operating efficiency of a building, where 1 is nominal. -laccess.timescale = Time scale multiplier affecting a building, where 1 is normal speed. -laccess.rotation = Facing angle of a unit or turret, in degrees.\nFor most other buildings, the 0 to 3 orientation. -laccess.x = X position, in tiles. -laccess.y = Y position, in tiles. -laccess.velocityx = X velocity of a unit, in tiles/sec. -laccess.velocityy = Y velocity of a unit, in tiles/sec. -laccess.shootx = X coordinate a unit or turret is aiming at. -laccess.shooty = Y coordinate a unit or turret is aiming at. -laccess.camerax = X position of the controlling player's camera. -laccess.cameray = Y position of the controlling player's camera. -laccess.camerawidth = Width of the controlling player's view, in tiles. -laccess.cameraheight = Height of the controlling player's view, in tiles. -laccess.solid = Whether this building blocks movement. -laccess.range = Range of a unit or turret, in tiles. -laccess.shooting = Whether a unit or turret is currently shooting. -laccess.boosting = Whether a unit is currently boosting or flying over terrain. -laccess.minex = X tile coordinate a unit is mining, or -1 if not mining. -laccess.miney = Y tile coordinate a unit is mining, or -1 if not mining. -laccess.mining = Whether a unit is currently mining. -laccess.buildx = X tile coordinate a unit is building at, or -1 if not building. -laccess.buildy = Y tile coordinate a unit is building at, or -1 if not building. -laccess.pingx = X coordinate a player is pinging, or null if not pinging. -laccess.pingy = Y coordinate a player is pinging, or null if not pinging. -laccess.pingtext = Text of a player's current ping, or null if not pinging. -laccess.building = Building a unit is currently constructing, or null. -laccess.breaking = Building a unit is currently deconstructing, or null. -laccess.team = Team ID of a unit or building. -laccess.flag = Numeric flag value stored on a unit. -laccess.flying = Whether a unit is currently airborne. -laccess.name = Name of the player controlling this unit, or null. -laccess.payloadcount = Number of payloads currently held. -laccess.payloadtype = Type of the last payload picked up, or null. -laccess.totalpayload = Combined size of all held payloads. -laccess.payloadcapacity = Maximum combined payload size a unit or building can carry. -laccess.selectedblock = Block currently selected by the controlling player, or null. -laccess.selectedrotation = Build rotation currently selected by the controlling player, 0 to 3. -laccess.bulletlifetime = Total lifetime of a bullet, in ticks. -laccess.bullettime = Time a bullet has existed, in ticks. +laccess.totalitems = A tárolt elemek teljes száma. +laccess.firstitem = Az első tárolt elem, vagy null, ha üres. +laccess.totalliquids = A tárolt folyadék teljes mennyisége. +laccess.totalpower = Pufferezett energiatárolóval rendelkező blokkoknál a tárolt energia mennyisége; más blokkoknál a puffer telítettsége 0-tól 1-ig. +laccess.itemcapacity = A maximális elemszám, amit ez az épület tárolni tud. +laccess.liquidcapacity = A maximális folyadékmennyiség, amit ez az épület tárolni tud. +laccess.powercapacity = A maximális energiamennyiség, amit ez az épület tárolni tud. +laccess.powernetstored = Az összekapcsolt energiahálózatban tárolt teljes energiamennyiség. +laccess.powernetcapacity = Az összekapcsolt energiahálózat teljes energiatárolási kapacitása. +laccess.powernetin = Az összekapcsolt energiahálózatba másodpercenként belépő energia. +laccess.powernetout = Az összekapcsolt energiahálózatból másodpercenként kilépő energia. +laccess.ammo = Egy lövegtorony jelenlegi lőszerkészlete. +laccess.ammocapacity = Egy lövegtorony maximális lőszerkészlete. +laccess.health = Jelenlegi életerő.\nLövedékek esetén azok sebzése. +laccess.maxhealth = Maximális életerő.\nLövedékek esetén az alapsebzés. +laccess.heat = Hőt fogyasztó lövegtorony jelenlegi hője, 0-tól 1-ig. +laccess.shield = Egy egység jelenlegi pajzsának mennyisége. +laccess.armor = Páncélzat értéke; fix sebzéscsökkentés találatonként. +laccess.efficiency = Egy épület működési hatásfoka, ahol az 1 a normális érték. +laccess.timescale = Egy épületre ható időskálaszorzó, ahol az 1 a normál sebesség. +laccess.rotation = Egy egység vagy lövegtorony irányszöge fokban.\nA legtöbb más épületnél a 0-tól 3-ig terjedő tájolás. +laccess.x = X-pozíció mezőkben. +laccess.y = Y-pozíció mezőkben. +laccess.velocityx = Egy egység X-irányú sebessége (mező/mp). +laccess.velocityy = Egy egység Y-irányú sebessége (mező/mp). +laccess.shootx = Annak a mezőnek az X-koordinátája, amire egy egység vagy lövegtorony céloz. +laccess.shooty = Annak a mezőnek az Y-koordinátája, amire egy egység vagy lövegtorony céloz. +laccess.camerax = Az irányító játékos kamerájának X-pozíciója. +laccess.cameray = Az irányító játékos kamerájának Y-pozíciója. +laccess.camerawidth = Az irányító játékos nézetének szélessége mezőkben. +laccess.cameraheight = Az irányító játékos nézetének magassága mezőkben. +laccess.solid = Meghatározza, hogy akadályozza-e ez az épület a mozgást. +laccess.range = Egy egység vagy lövegtorony hatótávolsága mezőkben. +laccess.shooting = Meghatározza, hogy éppen lő-e egy egység vagy lövegtorony. +laccess.boosting = Meghatározza, hogy gyorsít-e, vagy repül-e éppen a terep felett egy egység. +laccess.minex = Annak a mezőnek az X-koordinátája, amit egy egység bányászik, vagy -1, ha nem. +laccess.miney = Annak a mezőnek az Y-koordinátája, amit egy egység bányászik, vagy -1, ha nem. +laccess.mining = Meghatározza, hogy éppen bányászik-e egy egység. +laccess.buildx = Annak a mezőnek az X-koordinátája, ahol egy egység épít, vagy -1, ha nem. +laccess.buildy = Annak a mezőnek az Y-koordinátája, ahol egy egység épít, vagy -1, ha nem. +laccess.pingx = Annak a mezőnek az X-koordinátája, amit egy játékos pingel,\nvagy null, ha nem. +laccess.pingy = Annak a mezőnek az Y-koordinátája, amit egy játékos pingel,\nvagy null, ha nem. +laccess.pingtext = Egy játékos jelenlegi pingjének szövege, vagy null, ha nincs ping. +laccess.building = Az az épület, amit egy egység éppen épít, vagy null. +laccess.breaking = Az az épület, amit egy egység éppen lebont, vagy null. +laccess.team = Egy egység vagy épület csapatának azonosítója. +laccess.flag = Egy egységen tárolt számszerű jelző értéke. +laccess.flying = Meghatározza, hogy repül-e éppen egy egység. +laccess.name = Az egységet irányító játékos neve, vagy null. +laccess.payloadcount = A jelenleg hordozott rakományok száma. +laccess.payloadtype = A legutóbb felvett rakomány típusa, vagy null. +laccess.totalpayload = Az összes hordozott rakomány együttes mérete. +laccess.payloadcapacity = A maximális együttes rakományméret, amit egy egység vagy épület elbír. +laccess.selectedblock = Az irányító játékos által jelenleg kiválasztott blokk, vagy null. +laccess.selectedrotation = Az irányító játékos által jelenleg kiválasztott építési irány, 0-tól 3-ig. +laccess.bulletlifetime = Egy lövedék teljes élettartama tickekben. +laccess.bullettime = Az idő, amióta egy lövedék létezik, tickekben. lcategory.unknown = Ismeretlen lcategory.unknown.description = Nem kategorizált utasítások. @@ -3145,11 +3145,11 @@ lenum.boost = Erősítés indítása/leállítása. lenum.flushtext = Az írási puffer tartalmának ürítése a jelölőre, ha alkalmazható.\nHa a „fetch” igaz, akkor megpróbálja lekérni a tulajdonságokat a pálya nyelvi csomagjából vagy a játék csomagjából. lenum.texture = A textúra neve közvetlenül a játék textúra-atlaszából (úgynevezett „kebab-case” elnevezési stílus használatával).\nHa a „printFlush” igaz, akkor a szöveges puffer tartalmát használja szöveges argumentumként. -lenum.texturesize = A textúra mérete mezőben. A nulla érték a jelölő szélességét az eredeti textúra méretére skálázza. +lenum.texturesize = A textúra mérete mezőben. A null érték a jelölő szélességét az eredeti textúra méretére skálázza. lenum.autoscale = Meghatározza, hogy a jelölő a játékos nagyítási szintjéhez igazodik-e. -lenum.posi = Indexelt pozíció, vonal- és négyszögjelzőkhöz használatos, ahol a nulla az első pozíció. +lenum.posi = Indexelt pozíció, vonal- és négyszögjelzőkhöz használatos, ahol a null az első pozíció. lenum.uvi = A textúra pozíciója nullától egyig, négyzetjelölőkhöz használatos. -lenum.colori = Indexelt szín, vonal- és négyzetjelölőkhöz használatos, ahol a nulla az első szín. +lenum.colori = Indexelt szín, vonal- és négyzetjelölőkhöz használatos, ahol a null az első szín. lenum.wavetimer = Meghatározza, hogy a hullámok automatikusan indulnak-e az időzítő alapján. Ha nem, akkor a hullámok a lejátszásgomb megnyomásakor indulnak. lenum.wave = Jelenlegi hullámszám. Bármi lehet a nem-hullámalapú játékmódokban. @@ -3456,7 +3456,7 @@ radartarget.label.player = játékos radartarget.label.attacker = támadó radartarget.label.flying = légi radartarget.label.ground = földi -radartarget.label.boss = boss +radartarget.label.boss = főellenség tilelayer.label.floor = padló tilelayer.label.ore = érc tilelayer.label.block = blokk @@ -3522,7 +3522,7 @@ name.token.-lookup = = keresés name.token.type = típus name.token.get = lekérés name.token.team = csapat -name.token.angle = angle +name.token.angle = szög name.token.spawn = elhelyezés name.token.-bullet = = lövedék name.token.unit = egység From 60cc6a18392c25c241f7835fb104f16c1d475a1b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 11:00:48 -0400 Subject: [PATCH 09/10] Fixed #12647 --- core/src/mindustry/ui/dialogs/CustomRulesDialog.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index c0a72acaf6..f62b656764 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -177,7 +177,7 @@ public class CustomRulesDialog extends BaseDialog{ number("@rules.blockdamagemultiplier", f -> rules.blockDamageMultiplier = f, () -> rules.blockDamageMultiplier); if(Core.bundle.get("configure").toLowerCase().contains(ruleSearch)){ - current.button("@configure", + current.button("@configure", Icon.boxSmall, () -> loadoutDialog.show(999999, rules.loadout, i -> true, () -> rules.loadout.clear().add(new ItemStack(Items.copper, 100)), @@ -186,7 +186,7 @@ public class CustomRulesDialog extends BaseDialog{ } if(Core.bundle.get("bannedblocks").toLowerCase().contains(ruleSearch)){ - current.button("@bannedblocks", () -> bannedBlocks.show(rules.bannedBlocks)).left().width(300f).row(); + current.button("@bannedblocks", Icon.cancelSmall, () -> bannedBlocks.show(rules.bannedBlocks)).left().width(300f).row(); } check("@rules.hidebannedblocks", b -> rules.hideBannedBlocks = b, () -> rules.hideBannedBlocks); check("@bannedblocks.whitelist", b -> rules.blockWhitelist = b, () -> rules.blockWhitelist); @@ -207,7 +207,7 @@ public class CustomRulesDialog extends BaseDialog{ check("@rules.logicunitdeconstruct", b -> rules.logicUnitDeconstruct = b, () -> rules.logicUnitDeconstruct, () -> rules.logicUnitControl); if(Core.bundle.get("bannedunits").toLowerCase().contains(ruleSearch)){ - current.button("@bannedunits", () -> bannedUnits.show(rules.bannedUnits)).left().width(300f).row(); + current.button("@bannedunits", Icon.unitsSmall, () -> bannedUnits.show(rules.bannedUnits)).left().width(300f).row(); } check("@bannedunits.whitelist", b -> rules.unitWhitelist = b, () -> rules.unitWhitelist); @@ -234,7 +234,7 @@ public class CustomRulesDialog extends BaseDialog{ number("@rules.solarmultiplier", f -> rules.solarMultiplier = f, () -> rules.solarMultiplier); if(Core.bundle.get("rules.weather").toLowerCase().contains(ruleSearch)){ - current.button("@rules.weather", this::weatherDialog).width(250f).left().row(); + current.button("@rules.weather", Icon.rainSmall, this::weatherDialog).width(250f).left().row(); } category("light"); @@ -251,10 +251,6 @@ public class CustomRulesDialog extends BaseDialog{ } check("@rules.lighting.unitlight", b -> rules.unitLight = b, () -> rules.unitLight); - if(Core.bundle.get("rules.weather").toLowerCase().contains(ruleSearch)){ - current.button("@rules.weather", this::weatherDialog).width(250f).left().row(); - } - category("music"); Boolp allowMusic = () -> !rules.disableMusic; From 78646f512e087eccd3200c858ac480a2091b7ae9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 12 Sep 2026 11:50:15 -0400 Subject: [PATCH 10/10] Made small data patch sounds load as one-shot wavs instead of streams --- .../mindustry/editor/data/MapAudioView.java | 23 +++++++++++++++---- core/src/mindustry/logic/LStatements.java | 2 +- core/src/mindustry/mod/DataAudioLoader.java | 3 ++- gradle.properties | 2 +- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/editor/data/MapAudioView.java b/core/src/mindustry/editor/data/MapAudioView.java index 533b98e9a3..5074376fe5 100644 --- a/core/src/mindustry/editor/data/MapAudioView.java +++ b/core/src/mindustry/editor/data/MapAudioView.java @@ -38,10 +38,15 @@ public class MapAudioView implements AssetView{ Fi file = asset.getCacheFile(); var audioSource = (AudioSource)Core.assets.getOrNull(DataAudioLoader.prefix + asset.name, (Class)(type == DataAssetType.music ? Music.class : Sound.class)); - if(file == null || audioSource == null || !audioSource.valid()){ + if(file == null || audioSource == null || (!audioSource.valid() && !audioSource.isLazy())){ list.button(Icon.warning, Styles.graySquarei, iconMed, () -> ui.showInfo(file == null ? "@asset.broken" : "@asset.audio.invalid")).size(h); }else{ list.button(Icon.play, Styles.graySquarei, iconMed, () -> { + if(!audioSource.valid() && !audioSource.isLazy()){ + ui.showInfo("@asset.audio.invalid"); + return; + } + if(lastPlaying != null && lastPlaying.countPlaying() > 0){ lastPlaying.stop(); if(lastPlaying == audioSource){ @@ -56,16 +61,26 @@ public class MapAudioView implements AssetView{ lastPlaying = s; s.play(control.sound.uiBus); } - }).update(i -> i.getStyle().imageUp = audioSource != null && audioSource.countPlaying() > 0 ? Icon.pause : Icon.play).size(h); + }).update(i -> i.getStyle().imageUp = (!audioSource.isLazy() && !audioSource.valid()) ? Icon.warning : audioSource.countPlaying() > 0 ? Icon.pause : Icon.play).size(h); } float w = (mobile ? 390f : 450f); list.table(Styles.grayPanel, in -> { + in.left(); in.table(v -> { v.left(); - v.add("[accent]" + asset.name).labelAlign(Align.left).left().ellipsis(true).width(w / 2f); + v.add("[accent]" + asset.name).labelAlign(Align.left).left().ellipsis(true).width(audioSource instanceof Music ? w / 2f : w * 0.8f); v.row(); - v.add("[lightgray][[" + (audioSource == null ? "?" : UI.formatTime(audioSource.getLength() * 60f)) + "]").left(); + if(audioSource != null){ + Runnable addTime = () -> v.add("[lightgray][[" + UI.formatTime(audioSource.getLength() * 60f) + "]").left(); + + if(audioSource.valid()){ + addTime.run(); + }else if(audioSource instanceof Sound s){ + //force-load sounds when viewing so that length/invalid status is shown + s.checkLazyLoad(addTime); + } + } }).width(w / 2f).tooltip("dp-" + asset.name.replace(' ', '_')); if(audioSource instanceof Music m){ diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 3f3e9288ae..1491fa884c 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -2394,7 +2394,7 @@ public class LStatements{ private static String soundCategory(String entryName){ String normalized = entryName.replace('\\', '/'); int end = normalized.lastIndexOf('/'); - if(end < 0) return "Data Patch"; + if(end < 0) return "data patch"; int start = normalized.lastIndexOf('/', end - 1); return normalized.substring(start + 1, end); diff --git a/core/src/mindustry/mod/DataAudioLoader.java b/core/src/mindustry/mod/DataAudioLoader.java index ed32ce8d0f..4f523f5aa9 100644 --- a/core/src/mindustry/mod/DataAudioLoader.java +++ b/core/src/mindustry/mod/DataAudioLoader.java @@ -30,7 +30,8 @@ public class DataAudioLoader{ } Fi file = asset.getCacheFile(); - Sound sound = Vars.headless || file == null ? new Sound() : Sound.createStream(file); + //large sounds become streams, standard ones don't + Sound sound = Vars.headless || file == null ? new Sound() : file.length() > 100_000 ? Sound.createStream(file) : Sound.createLazy(file); loadedSounds.add(sound); Sounds.registerSound(sound, nextSoundId ++); diff --git a/gradle.properties b/gradle.properties index cab1cd4ae9..d2f03ad7ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=5f58c6eda0 +archash=68a04fab6e