mirror of
https://github.com/Anuken/Mindustry.git
synced 2026-10-18 03:23:07 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
254fd3e28d | ||
|
|
9a886aa582 | ||
|
|
a51047a80d | ||
|
|
55dba0c156 | ||
|
|
a98a7ba227 | ||
|
|
56348b3e31 | ||
|
|
89527f879b | ||
|
|
78646f512e | ||
|
|
fd4eac0f81 | ||
|
|
60cc6a1839 | ||
|
|
3d56fefb51 | ||
|
|
a5c178ae5a | ||
|
|
06163708bd | ||
|
|
137c6201c0 | ||
|
|
a341cff83f | ||
|
|
7501697f02 | ||
|
|
776214f7bb | ||
|
|
6df25c8308 | ||
|
|
ab51304dd6 | ||
|
|
e751e240db | ||
|
|
e675535cb7 |
@@ -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
|
||||
|
||||
@@ -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 = 用坐标获取类型
|
||||
|
||||
@@ -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 = 銅,蕈孢星上異常常見的金屬。加工前結構脆弱。
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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? */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ++);
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user