Compare commits

...
21 Commits
Author SHA1 Message Date
Thinker8832 254fd3e28d Fix typo in split.container description (#12651) 2026-09-12 23:46:25 -04:00
EggleEgg 9a886aa582 Bugfix: overdriable dummy sddeq3e (#12653) 2026-09-12 23:46:09 -04:00
Anuken a51047a80d Merge remote-tracking branch 'origin/master' 2026-09-12 23:45:59 -04:00
Anuken 55dba0c156 Fixed #12650 2026-09-12 23:45:53 -04:00
WMF a98a7ba227 yet another requiredPlanets fix (#12649) 2026-09-12 23:28:09 -04:00
Anuken 56348b3e31 Fixed #12652 2026-09-12 23:21:40 -04:00
Anuken 89527f879b Fixed #12632 2026-09-12 12:41:42 -04:00
Anuken 78646f512e Made small data patch sounds load as one-shot wavs instead of streams 2026-09-12 11:50:15 -04:00
Anuken fd4eac0f81 Merge remote-tracking branch 'origin/master' 2026-09-12 11:00:55 -04:00
Anuken 60cc6a1839 Fixed #12647 2026-09-12 11:00:48 -04:00
summoner 3d56fefb51 Translation: Update bundle_hu.properties (#12637)
Translate new strings
Follow the changes of the english bundle
2026-09-12 10:55:02 -04:00
Anuken a5c178ae5a Merge remote-tracking branch 'origin/master' 2026-09-12 10:49:51 -04:00
Anuken 06163708bd Fixed misleading build UI for team-specific infinite resources 2026-09-12 10:49:45 -04:00
Github Actions 137c6201c0 Automatic bundle update 2026-09-12 14:37:17 +00:00
redloong a341cff83f 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
2026-09-12 10:36:26 -04:00
Anuken 7501697f02 Fixed #12644 2026-09-12 10:36:11 -04:00
Anuken 776214f7bb Merge remote-tracking branch 'origin/master' 2026-09-12 10:04:50 -04:00
Anuken 6df25c8308 Reverted fix for #12223 2026-09-12 10:04:44 -04:00
Cardillan ab51304dd6 Fixes #12640: Unset keybinding not saved (#12641) 2026-09-12 10:01:41 -04:00
Anuken e751e240db Fixed #12636 2026-09-12 09:59:07 -04:00
Anuken e675535cb7 Fixed fetch instruction layout 2026-09-11 03:02:08 -04:00
19 changed files with 250 additions and 217 deletions
+63 -63
View File
@@ -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
+89 -89
View File
@@ -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]打印[]队列刷新到信息板。
@@ -2945,63 +2945,63 @@ laccess.displayheight = 显示屏的高度(以像素为单位)。
laccess.buffersize = 显示器图形缓冲区中未处理的命令数。
laccess.operations = 方块执行操作的次数。\n对于显示屏,返回[accent]打印绘图[]调用次数。
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.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.health = 当前生命值\n对于子弹,指其伤害值。
laccess.maxhealth = 最大生命值\n对于子弹,指其基础伤害。
laccess.heat = 耗热炮塔当前的热量值,范围为 0 到 1。
laccess.shield = 单位当前的护盾值。
laccess.armor = 护甲值;每次受击时的固定伤害减免。
laccess.efficiency = 建筑的运行效率,以 1 为标准值。
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.solid = 普通陆地单位是否不可通过该建筑。
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.team = 单位或建筑的队伍 ID。
laccess.flag = 存储在单位身上的 flag。
laccess.flying = 单位当前是否正在飞行。
laccess.name = 控制该单位的玩家名称,若无则为 null。
laccess.payloadcount = 当前持有的有效载荷数量。
laccess.payloadtype = 最后获取的有效载荷类型,若无则为 null。
laccess.totalpayload = 所有持有的有效载荷的总大小。
laccess.payloadcapacity = 单位或建筑所能承载的最大综合有效载荷大小。
laccess.selectedblock = 玩家当前在建筑列表选中的方块,若无则为 null。
laccess.selectedrotation = 玩家当前在建筑列表选择的建造旋转角度,范围为 0 到 3。
laccess.bulletlifetime = 子弹可存在的总时长(以 tick 为单位)。
laccess.bullettime = 子弹已存在的时长(以 tick 为单位)。
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 = 用坐标获取类型
+1 -1
View File
@@ -2461,7 +2461,7 @@ split.pickup = 某些物品可以被核心單位撿起。\n撿起這個[accent]
split.pickup.mobile = 某些物品可以被核心單位撿起。\n撿起這個[accent]容器[],然後放到 [accent]重物裝載機[] 上。\n(要撿起或放下東西,請長按該物品。)
split.acquire = 您必須獲取一些鎢才能建造單位。
split.build = 單位必須被運送到牆的另一邊。\n在牆的兩側各放一個[accent]重物質量驅動器[]。\n通過按壓其中一個來設置連結,然後選擇另一個。
split.container = 類似於容器,單位也可以使用[accent]重物質量驅動器[]進行運輸。\n將一個單位兵工廠放置在重物裝載機旁邊以裝載它們,然後將它們送到牆的另一側以進攻敵方基地。
split.container = 類似於容器,單位也可以使用[accent]重物質量驅動器[]進行運輸。\n將一個單位兵工廠放置在重物質量驅動器旁邊以裝載它們,然後將它們送到牆的另一側以進攻敵方基地。
item.copper.description = 最基本的結構材料。在各種類型的方塊中廣泛使用。
item.copper.details = 銅,蕈孢星上異常常見的金屬。加工前結構脆弱。
+1
View File
@@ -413,6 +413,7 @@ public class Logic implements ApplicationListener{
//map is over, no more world processor objective stuff
state.rules.disableWorldProcessors = true;
state.markers.clear(); //TODO: should this optional?
Call.clearObjectives();
@@ -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){
+7
View File
@@ -17,6 +17,13 @@ public class MapMarkers implements Iterable<ObjectiveMarker>{
public Seq<ObjectiveMarker> mapMarkers = new Seq<>(false);
public Seq<ObjectiveMarker> lightMarkers = new Seq<>(false);
public void clear(){
worldMarkers.clear();
mapMarkers.clear();
lightMarkers.clear();
map.clear();
}
public void add(int id, ObjectiveMarker marker){
if(marker == null) return;
var prev = map.put(id, marker);
+4
View File
@@ -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? */
+9
View File
@@ -6,6 +6,7 @@ import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import arc.util.serialization.*;
import mindustry.content.*;
import mindustry.content.TechTree.*;
import mindustry.core.*;
@@ -554,6 +555,14 @@ public abstract class SaveVersion extends SaveFileReader{
public void readDataPatches(DataInput stream, SaveReadState saveState) throws IOException{
stream.readInt(); //version - ignored for now
//the requiredPlanets filter needs this, since the rules aren't read yet
if(headless){
try{
Planet planet = content.planet(new JsonReader().parse(saveState.ruleString).getString("planet", Planets.serpulo.name));
state.rules.planet = planet == null ? Planets.serpulo : planet;
}catch(Exception ignored){}
}
int total = stream.readInt();
Seq<DataAsset> assets = new Seq<>(total);
+1 -1
View File
@@ -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 -> {
+5 -19
View File
@@ -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);
@@ -1947,9 +1935,7 @@ public class LStatements{
fields(table, "team", team, s -> team = s);
if(type != FetchType.coreCount && type != FetchType.playerCount && type != FetchType.unitCount && type != FetchType.buildCount){
table.add(" # ");
fields(table, index, i -> index = i);
fields(table, "#", index, i -> index = i);
}
if(type == FetchType.buildCount || type == FetchType.build){
@@ -2408,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);
+2 -1
View File
@@ -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 ++);
+1 -1
View File
@@ -346,7 +346,7 @@ public class Fonts{
@Override
public float imageSize(){
return size;
return size / Scl.scl(1f);
}
};
@@ -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;
@@ -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);
}};
@@ -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]");
@@ -5,15 +5,14 @@ import arc.graphics.g2d.*;
import arc.math.*;
import arc.scene.ui.TextField.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import arc.util.io.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.graphics.*;
import mindustry.entities.units.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
@@ -39,18 +38,18 @@ public class TargetDummy extends Block{
underBullets = true;
targetable = false;
allowedInPayloads = false;
canOverdrive = false;
saveConfig = true;
config(FloatSeq.class, (TargetDummyBuild tile, FloatSeq config) -> {
if(config.size > 0){
tile.unitTeam = tile.team;
if(config.get(0) == 1) tile.unitTeam = Team.get(tile.dummyTeam());
}
if(config.size > 1) tile.boosting = config.get(1) == 1;
if(config.size > 2) tile.unitArmor = config.get(2);
if(config.size > 3) tile.resetTime = config.get(3);
if(config.size > 4) tile.dummySize = config.get(4);
config(int[].class, (TargetDummyBuild tile, int[] config) -> {
if(config.length != 5) return; //invalid, must have 5 values exactly
tile.unitTeam = tile.team;
if(config[0] == 1) tile.unitTeam = Team.get(tile.dummyTeam());
tile.boosting = config[1] == 1;
tile.unitArmor = config[2];
tile.resetTime = config[3];
tile.dummySize = Float.intBitsToFloat(config[4]);
});
}
@@ -241,15 +240,15 @@ public class TargetDummy extends Block{
t.background(Styles.black6);
t.defaults().left();
t.check(Core.bundle.get("rules.enemyteam"), unitTeam != team, b -> configureFloat(0, Mathf.num(b))).colspan(3).row();
t.check(Core.bundle.get("stat.flying"), boosting, b -> configureFloat(1, Mathf.num(b))).colspan(3).row();
t.check(Core.bundle.get("rules.enemyteam"), unitTeam != team, b -> configureInt(0, Mathf.num(b))).colspan(3).row();
t.check(Core.bundle.get("stat.flying"), boosting, b -> configureInt(1, Mathf.num(b))).colspan(3).row();
t.add(Core.bundle.get("stat.armor"));
t.field("" + (int)unitArmor, TextFieldFilter.digitsOnly, s -> configureFloat(2, Strings.parseInt(s))).valid(val -> Strings.parseInt(val, Integer.MAX_VALUE) < 100_000).width(200f).padLeft(8f).colspan(2).row();
t.field("" + (int)unitArmor, TextFieldFilter.digitsOnly, s -> configureInt(2, Strings.parseInt(s))).valid(val -> Strings.parseInt(val, Integer.MAX_VALUE) < 100_000).width(200f).padLeft(8f).colspan(2).row();
t.add(Core.bundle.get("stat.resettime"));
t.field(Strings.autoFixed(resetTime / 60f, 2), TextFieldFilter.floatsOnly, s -> configureFloat(3, Strings.parseFloat(s) * 60f)).valid(Strings::canParsePositiveFloat).padLeft(8f).growX();
t.field(Strings.autoFixed(resetTime / 60f, 2), TextFieldFilter.floatsOnly, s -> configureInt(3, (int)(Strings.parseFloat(s) * 60f))).valid(Strings::canParsePositiveFloat).padLeft(8f).growX();
t.add(StatUnit.seconds.localized()).padLeft(8).row();
t.add(Core.bundle.get("stat.hitsize"));
t.field("" + (dummySize/tilesize), TextFieldFilter.floatsOnly, s -> configureFloat(4, Strings.parseFloat(s) * tilesize))
t.field("" + (dummySize/tilesize), TextFieldFilter.floatsOnly, s -> configureInt(4, Float.floatToIntBits(Strings.parseFloat(s) * tilesize)))
.valid(val -> {
float parsed = Strings.parseFloat(val, Float.MAX_VALUE);
return parsed >= 0.1f && parsed <= 50f;
@@ -259,10 +258,10 @@ public class TargetDummy extends Block{
}
//helper to send the rest of values, since config does not support arrays
public void configureFloat(int index, float value){
FloatSeq seq = FloatSeq.with(Mathf.num(unitTeam != team), Mathf.num(boosting), unitArmor, resetTime, dummySize);
seq.set(index, value);
configure(seq);
public void configureInt(int index, int value){
int[] values = config();
values[index] = value;
configure(values);
}
public int dummyTeam(){
@@ -271,8 +270,9 @@ public class TargetDummy extends Block{
}
@Override
public Object config(){
return FloatSeq.with(Mathf.num(unitTeam != team), Mathf.num(boosting), unitArmor, resetTime, dummySize);
public int[] config(){
//note: float[] is not supported in build 160
return new int[]{Mathf.num(unitTeam != team), Mathf.num(boosting), (int)unitArmor, (int)resetTime, Float.floatToIntBits(dummySize)};
}
@Override
@@ -47,8 +47,10 @@ public class ItemModule extends BlockModule{
public void updateFlow(){
//update the flow at N fps at most
if(flowTimer.get(1, flowPollInterval)){
int len = content.items().size;
if(items.length != len) items = Arrays.copyOf(items, len);
if(flow == null){
if(flow == null || flow.length != len || cacheSums == null || cacheFlow == null){
if(cacheFlow == null || cacheFlow.length != items.length){
cacheFlow = new WindowedMean[items.length];
for(int i = 0; i < items.length; i++){
@@ -290,6 +292,10 @@ public class ItemModule extends BlockModule{
public void checkArrayCapacity(int size){
if(items.length != size) items = Arrays.copyOf(items, size);
cacheFlow = null;
cacheSums = null;
displayFlow = null;
flow = null;
}
@Override
@@ -20,9 +20,9 @@ public class LiquidModule extends BlockModule{
public static float flowVisualRefreshInterval = 15f;
private static final Interval flowTimer = new Interval(2);
private static WindowedMean[] cacheFlow;
private static float[] cacheSums;
private static float[] displayFlow;
private static @Nullable WindowedMean[] cacheFlow;
private static @Nullable float[] cacheSums;
private static @Nullable float[] displayFlow;
private static final Bits cacheBits = new Bits();
private float[] liquids = new float[content.liquids().size];
@@ -32,7 +32,10 @@ public class LiquidModule extends BlockModule{
public void updateFlow(){
if(flowTimer.get(1, flowPollInterval)){
if(flow == null){
int len = content.liquids().size;
if(liquids.length != len) liquids = Arrays.copyOf(liquids, len);
if(flow == null || flow.length != len || cacheSums == null || cacheFlow == null){
if(cacheFlow == null || cacheFlow.length != liquids.length){
cacheFlow = new WindowedMean[liquids.length];
for(int i = 0; i < liquids.length; i++){
@@ -152,6 +155,10 @@ public class LiquidModule extends BlockModule{
public void checkArrayCapacity(int size){
if(liquids.length != size) liquids = Arrays.copyOf(liquids, size);
cacheFlow = null;
cacheSums = null;
displayFlow = null;
flow = null;
}
@Override
+1 -1
View File
@@ -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=68a04fab6e