Merge remote-tracking branch 'origin/master'

This commit is contained in:
Anuken
2026-02-08 22:25:49 -05:00
23 changed files with 595 additions and 466 deletions

View File

@@ -229,7 +229,7 @@ public class EntityIO{
s(type.equals("boolean") ? "bool" : type.charAt(0) + "", field);
}else if(instanceOf(type, "mindustry.ctype.Content") && !type.equals("mindustry.ai.UnitStance") && !type.equals("mindustry.ai.UnitCommand")){
if(write){
s("s", field + ".id");
s("s", field + " == null ? -1 : " + field + ".id");
}else{
st(field + "mindustry.Vars.content.getByID(mindustry.ctype.ContentType.$L, read.s())", BaseProcessor.simpleName(type).toLowerCase().replace("type", ""));
}

View File

@@ -1108,7 +1108,7 @@ ability.armorplate.description = Reduces damage taken while shooting
ability.shieldarc = Shield Arc
ability.shieldarc.description = Projects a force shield in an arc that absorbs or deflects bullets, missiles and units
ability.suppressionfield = Repair Suppression
ability.suppressionfield.description = Stops nearby repair buildings
ability.suppressionfield.description = Stops nearby repair buildings and build towers
ability.energyfield = Energy Field
ability.energyfield.description = Zaps nearby enemies
ability.energyfield.healdescription = Zaps nearby enemies and heals allies
@@ -2544,9 +2544,9 @@ unit.navanax.description = Fires explosive EMP projectiles, dealing significant
#Erekir
unit.stell.description = Fires standard bullets at enemy targets.
unit.locus.description = Fires alternating bullets at enemy targets.
unit.precept.description = Fires piercing cluster bullets at enemy targets. Less affected by harmful terrain.
unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. Less affected by harmful terrain.
unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. Less affected by harmful terrain.
unit.precept.description = Fires piercing cluster bullets at enemy targets. Less affected by liquid drag
unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. Less affected by liquid drag.
unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. Significantly less affected by liquid drag.
unit.merui.description = Fires long-range artillery at enemy ground targets. Can step over most terrain.
unit.cleroi.description = Fires dual shells at enemy targets. Targets enemy projectiles with point defense turrets. Can step over most terrain.
unit.anthicus.description = Fires long-range homing missiles at enemy targets. Can step over most terrain.

File diff suppressed because it is too large Load Diff

View File

@@ -101,7 +101,7 @@ coreattack = < ¡El núcleo está bajo ataque! >
nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nAniquilación inminente
database = Base de datos del núcleo
database.button = Base de datos
database.patched = Modified by data patches.
database.patched = Modificado por parches de datos.
viewfields = Ver campos del contenido
savegame = Guardar partida
loadgame = Cargar partida
@@ -821,7 +821,7 @@ sectors.redirect = Redireccionar plataformas de lanzamiento
sectors.rename = Renombrar sector
sectors.enemybase = [scarlet]Base enemiga
sectors.vulnerable = [scarlet]Vulnerable
sectors.underattack = [scarlet]¡Bajo ataque! [accent]{0}% dañado
sectors.underattack = [scarlet]¡Bajo ataque!
sectors.go = Ir
sector.abandon = Abandonar
sector.abandon.confirm = Los núcleos de este sector se auto-destruirán.\n¿Continuar?
@@ -881,12 +881,12 @@ sector.facility32m.name = Instalación 32 M
sector.taintedWoods.name = Bosques Infectados
sector.infestedCanyons.name = Cañones Infestados
sector.planetaryTerminal.name = Terminal de Lanzamiento Interplanetario
sector.coastline.name = Ruta Costera
sector.coastline.name = Litoral Húmedo
sector.navalFortress.name = Fortaleza Naval
sector.polarAerodrome.name = Aeródromo Polar
sector.atolls.name = Atolones
sector.testingGrounds.name = Campo de Pruebas
sector.perilousHarbor.name = Perilous Harbor
sector.perilousHarbor.name = Puerto Peligroso
sector.weatheredChannels.name = Canales Erosionados
sector.fallenVessel.name = Fallen Vessel
sector.mycelialBastion.name = Bastión Infestado
@@ -1057,7 +1057,7 @@ stat.ammo = Munición
stat.shieldhealth = Escudo
stat.cooldowntime = Enfriamiento
stat.regenerationrate = Tasa de regeneración
stat.activationtime = Activation Time
stat.activationtime = Tiempo de activación
stat.explosiveness = Explosividad
stat.basedeflectchance = Probabilidad base de desvío
stat.lightningchance = Probabilidad de descarga
@@ -1168,8 +1168,8 @@ bar.input = Entrada
bar.output = Salida
bar.strength = [stat]{0}[lightgray]x potencia
bar.regenerationrate = [stat]{0}/seg[lightgray] regeneración
bar.activationtimer = Activates in {0}
bar.activated = Activated
bar.activationtimer = Se activa en {0}
bar.activated = Activado
units.processorcontrol = [lightgray]Controlado desde el procesador
@@ -1178,9 +1178,9 @@ bullet.splashdamage = [stat]{0}[lightgray] daño en área ~[stat] {1}[lightgray]
bullet.incendiary = [stat]incendiaria
bullet.homing = [stat]rastreadora
bullet.armorpierce = [stat]perforación de armadura
bullet.armorweakness = [red]{0}%[lightgray] armor weakness
bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing
bullet.antiarmor = [stat]{0}x[lightgray] anti-armor
bullet.armorweakness = [red]{0}%[lightgray] debilidad contra armadura
bullet.armorpiercing = [stat]{0}%[lightgray] perforación de armadura
bullet.antiarmor = [stat]{0}x[lightgray] anti-armadura
bullet.maxdamagefraction = [stat]{0}%[lightgray] daño límite
bullet.suppression = [stat]{0} seg[lightgray] supresión de reparación ~ [stat]{1}[lightgray] casillas
bullet.interval = [stat]{0}/seg[lightgray] balas por intervalo:
@@ -1304,7 +1304,7 @@ setting.unitlaseropacity.name = Opacidad de rayo de minado de la unidad
setting.bridgeopacity.name = Opacidad de puentes
setting.playerchat.name = Mostrar chat de burbuja de jugadores
setting.showweather.name = Efectos visuales climáticos
setting.hidedisplays.name = Ocultar monitores lógicos
setting.hidedisplays.name = Ocultar pantallas lógicas
setting.macnotch.name = Adaptar la interfaz para mostrar la muesca
setting.macnotch.description = Es necesario reiniciar para aplicar los cambios
steam.friendsonly = Solo amigos
@@ -1529,27 +1529,27 @@ rules.randomwaveai.info = Hace que las unidades aparecidas en oleadas ataquen es
rules.placerangecheck.info = Previene que los jugadores construyan algo cerca de las estructuras enemigas. Cuando se intenta construir una torreta, el rango es aumentado, de modo que la torreta no podrá alcanzar al enemigo.
rules.onlydepositcore.info = Evita que las unidades depositen materiales en cualquier estructura a excepción del nucleo.
database-category.item = Items
database-category.liquid = Fluids
database-category.unit = Units
database-category.block = Blocks
database-category.status = Status Effects
database-category.sector = Sectors
database-category.team = Factions
database-category.item = Recursos
database-category.liquid = Fluidos
database-category.unit = Unidades
database-category.block = Bloques
database-category.status = Efectos de Estado
database-category.sector = Sectores
database-category.team = Facciones
database-tag.turret = Turret
database-tag.production = Production
database-tag.distribution = Distribution
database-tag.liquid = Liquid
database-tag.power = Power
database-tag.defense = Defense
database-tag.crafting = Crafting
database-tag.units = Units
database-tag.effect = Utility
database-tag.logic = Logic
database-tag.unit-air = Air
database-tag.unit-naval = Naval
database-tag.unit-ground = Ground
database-tag.turret = Torretas
database-tag.production = Producción
database-tag.distribution = Distribución
database-tag.liquid = Líquidos
database-tag.power = Energía
database-tag.defense = Defensa
database-tag.crafting = Fabricación
database-tag.units = Unidades
database-tag.effect = Utilidad
database-tag.logic = Lógica
database-tag.unit-air = Aereas
database-tag.unit-naval = Navales
database-tag.unit-ground = Terrestres
wallore = (Muro)
@@ -2113,7 +2113,7 @@ hint.waveFire = Cuando las torretas [accent]Wave[] usen agua como munición, apa
hint.generator = Los [accent]Generadores de combustión[] querman carbón para transmitir energía a bloques adyacentes.\n\nEl alcance de transmisión de energía se puede extender usando [accent]Nodos de energía[].
hint.guardian = Los [accent]Guardianes[] poseen una robusta armadura. Municiones débiles como el [accent]Cobre[] o el [accent]Plomo[] no son [scarlet]effectivas[] contra él.\n\nUsa torretas de mayor categoría o por ejemplo, munición de [accent]Grafito[] en torretas [accent]Salvo[] para derribar a los Guardianes con más facilidad.
hint.coreUpgrade = Los núcleos se pueden mejorar [accent]construyendo núcleos de mayor calidad encima[].\n\nColoca un núcleo [accent]Foundation[] sobre el núcleo [accent]Shard[]. Asegúrate de que no hay obstáculos cerca.
hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles.
hint.serpuloCoreZone = :core-shard: [accent]Núcleos[] Adicionales pueden ser construidos en: Casillas de[accent]Núcleo[].
hint.cannotUpgrade = Un ícono [red]:tree:[] sobre una unidad dentro de la carga indica que su versión mejorada no se ha investigado aún.\n\nLas mejoras de unidades deben investigarse en el [accent]:tree: arbol de tecnologías[] antes de poder ser producidas en los reconstructores.
hint.presetLaunch = Las zonas de aterrizaje de los [accent]sectores grises[], como el [accent]Bosque Congelado[], son accesibles desde cualquier lugar. No requieren capturar sectores adyacentes.\n\nLos [accent]sectores numerados[], como este, son [accent]opcionales[].
hint.presetDifficulty = Este sector tiene un [scarlet]alto nivel de amenaza enemiga[].\n[accent]No es recomendable[] viajar a sectores como estos sin las tecnologías adecuadas y preparación.
@@ -2142,12 +2142,12 @@ gz.zone2 = Cualquier estructura en el área será destruida al comenzar una olea
gz.zone3 = Ahora comenzará una oleada.\nPrepárate.
gz.finish = Construye más torretas, extrae más recursos,\ny defiéndete de todas las oleadas para [accent]capturar este sector[].
fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[].
fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units.
fungalpass.tutorial1 = Usa [accent]unidades[] para defender construcciones y atacar al enemigo.\nInvestiga y construye una :ground-factory: [accent]fábrica terrestre[].
fungalpass.tutorial2 = Selecciona unidades :dagger: [accent]Dagger[] en la fábrica.\nProduce 3 unidades.
frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace.
frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed.
frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[].
frontier.tutorial1 = El :additive-reconstructor: [accent]Reconstructor aditivo[]\nmejora unidades de primera categoría a segunda categoría\nusando :silicon: silicio y :graphite: grafito.\n\n[accent]Investiga y reconstruye\nun []:dagger:[accent] dagger a un []:mace:[accent] mace.
frontier.tutorial2 = Oleadas enemigas enviadas [accent]indefinidamente[] hasta que todos los núcleos enemigos sean [unlaunched]destruidos.
frontier.tutorial3 = [accent]Ataca rápidamente la base enemiga para evitar que las oleadas se vuelvan demasiado altas[].
atolls.destroy1 = Destroy the 2 enemy [accent]foundation cores[] first.\n[accent]Gain access to thorium[].
atolls.mega1 = Enter [accent]command mode[] and select the :mega:[accent]Mega[] units.
@@ -2198,7 +2198,7 @@ aegis.tungsten = El tungsteno puede ser minado usando un [accent]taladro de impa
split.pickup = Algunos bloques pueden ser recogidos por la unidad del núcleo.\nRecoge este [accent]contenedor[] y suéltalo sobre el [accent]puerto de carga[].\n(Las teclas por defecto son [ para recoger y ] para soltar la carga)
split.pickup.mobile = Algunos bloques pueden ser recogidos por la unidad del núcleo.\nRecoge este [accent]contenedor[] y suéltalo sobre el [accent]puerto de carga[].\n(Para recoger o soltar algo, mantenlo pulsado.)
split.acquire = Necesitas recolectar tungsteno para construir unidades.
split.acquire = Recolecta tungsteno para construir unidades.
split.build = Debes transportar las unidades al otro lado del muro.\nConstruye dos [accent]catapultas electromagnéticas de carga[], uno a cada lado del muro.\nEnlázalos pulsando sobre uno, y luego seleccionando el otro.
split.container = Igual que los contenedores, las unidades también se pueden transportar usando [accent]catapultas electromagnéticas de carga[].\nConstruye un fabricador de unidades adyacente a una catapulta electromagnética, así podrás enviarlas através del muro para atacar la base enemiga.
@@ -2355,8 +2355,8 @@ block.core-nucleus.details = La tercera y última iteración.
block.vault.description = Almacena una gran cantidad de objetos de cada tipo. Su contenido se puede recuperar con un descargador.
block.container.description = Almacena una pequeña cantidad de objetos de cada tipo. Su contenido se puede recuperar con un descargador.
block.unloader.description = Descarga el objeto seleccionado de bloques cercanos.
block.launch-pad.description = Lanza lotes de recursos a los sectores seleccionados.
block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time.
block.launch-pad.description = Lanza lotes de recursos al sector seleccionado.
block.advanced-launch-pad.description = Lanza lotes de recursos al sector seleccionado. Solo acepta un tipo de recurso a la vez.
block.advanced-launch-pad.details = Sistema sub orbital para el transporte punto a punto de recursos.
block.landing-pad.description = Recibe objetos de las plataformas de lanzamiento de otros sectores. Requiere grandes cantidades de agua para protegerse contra los impactos de los aterrizajes.
block.duo.description = Dispara balas sencillas a los enemigos.
@@ -2435,7 +2435,7 @@ block.vent-condenser.description = Condensa gases en agua. Consume energía.
block.plasma-bore.description = Si se coloca mirando hacia un muro con minerales, genera objetos indefinidamente. Requiere pequeñas cantidades de energía.
block.large-plasma-bore.description = Un láser de plasma más grande, capaz de extraer tungsteno y torio. Requiere hidrógeno y energía.
block.cliff-crusher.description = Tritura paredes, extrayendo arena indefinidamente. Requiere energía. Su eficiencia depende del tipo de pared.
block.large-cliff-crusher.description = Tritura paredes, extrayendo arena indefinidamente. Requiere energía y ozono. Su eficiencia depende del tipo de pared. Opcionalmente consume tungsteno para incrementar su eficiencia.
block.large-cliff-crusher.description = Tritura paredes, extrayendo arena indefinidamente. Requiere energía y ozono. Su eficiencia depende del tipo de pared. Opcionalmente consume grafito para incrementar su eficiencia.
block.impact-drill.description = Si se coloca sobre un mineral, extraerá ráfagas de objetos indefinidamente. Requiere energía y agua.
block.eruption-drill.description = Un taladro de impacto mejorado, capaz de extraer torio. Requiere hidrógeno.
block.reinforced-conduit.description = Mueve fluidos en una dirección. Sus lados no se conectarán con otros tipos de bloques, salvo que también sean tuberías.
@@ -2528,7 +2528,7 @@ unit.risso.description = Dispara un enjambre de misiles y proyectiles a enemigos
unit.minke.description = Dispara proyectiles simples variados a enemigos terrestres.
unit.bryde.description = Dispara misiles de artillería de largo alcance a enemigos.
unit.sei.description = Dispara un enjambre de misiles y proyectiles perforantes a enemigos.
unit.omura.description = Dispara un rayo perforante de largo alcance. Construye unidades Flare.
unit.omura.description = Dispara un rayo perforante de largo alcance.
unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras.
unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras.
unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras.
@@ -2564,7 +2564,7 @@ lst.print = Añade texto a la cola para imprimir texto.\nNo mostrará nada hasta
lst.printchar = Añade un carácter UFT-16 o un ícono de contenido al búfer de impresión.\nNo muestra nada hasta que [accent]Print Flush[] sea usado.
lst.format = Reemplaza el siguiente marcador de posición en el búfer de texto con un valor.\nNo hace nada si el patrón del marcador de posición es invalido.\nPatrón del marcador de posición: "{[accent]número 0-9[]}"\nEjemplo:\n[accent]print "test {0}"\nformat "ejemplo"
lst.draw = Añade una operación a la cola para dibujar.\nNo mostrará nada hasta que se use [accent]Draw Flush[].
lst.drawflush = Muestra los datos en cola de operaciones [accent]Draw[] en un monitor gráfico.
lst.drawflush = Muestra los datos en cola de operaciones [accent]Draw[] en una pantalla lógica.
lst.printflush = Muestra los datos en cola de operaciones de [accent]Print[] en un bloque de mensaje.
lst.getlink = Obtiene el número de enlace de procesador. Inicia en 0.
lst.control = Controla el estado de una estructura.
@@ -2669,7 +2669,7 @@ laccess.displaywidth = Ancho de un bloque de pantalla, en pixeles.
laccess.displayheight = Alto de un bloque de pantalla, en pixeles.
laccess.buffersize = Número de comandos sin ejecutar en el buffer gráfico de una pantalla.
laccess.operations = Número de operaciones ejecutadas en el bloque.\nPara pantallas, retorna el número de operaciones drawflush.
laccess.maxunits = Maximum units that a team can have.\nCan only be sensed from cores.
laccess.maxunits = Unidades máximas que un equipo puede tener.\nSolo puede ser obtenido de los núcleos.
lcategory.unknown = Desconocido
lcategory.unknown.description = Instrucciones no clasificadas.
@@ -2686,7 +2686,7 @@ lcategory.unit.description = Da órdenes a las unidades.
lcategory.world = Mundo
lcategory.world.description = Controla cómo se comporta el mundo.
graphicstype.clear = Llena todo el monitor con un color.
graphicstype.clear = Llena toda la pantalla con un color.
graphicstype.color = Establece el color para próximas operaciones de dibujo.
graphicstype.col = Es equivalente a "color", pero agrupado en un único valor.\nLos colores agrupados se escriben como códigos hexadecimales usando un [accent]%[] como prefijo.\nPor ejemplo: [accent]%ff0000[] es el color rojo.
graphicstype.stroke = Establece el ancho de la línea.
@@ -2696,7 +2696,7 @@ graphicstype.linerect = Dibuja las aristas de un rectángulo.
graphicstype.poly = Rellena un polígono regular.
graphicstype.linepoly = Dibuja las aristas de un polígono regular.
graphicstype.triangle = Rellena un triángulo.
graphicstype.image = Dibuja una imagen de algún contenido.\nEjemplo: [accent]@router[] o [accent]@dagger[].
graphicstype.image = Dibuja una imagen de algún contenido o copia el contenido de otra pantalla .\nEjemplo: [accent]@router[] o [accent]@dagger[] o una pantalla [accent]display1[].
graphicstype.print = Dibuja texto desde el buffer de escritura.\nLimpia el buffer de escritura.
lenum.always = Siempre "true".

View File

@@ -101,7 +101,7 @@ coreattack = < Lõi đang bị tấn công! >
nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM ĐÁP NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
database = Cơ sở dữ liệu cốt lõi
database.button = Cơ sở dữ liệu
database.patched = Modified by data patches.
database.patched = Đã chỉnh sửa thông qua bản vá dữ liệu.
viewfields = Xem Các Trường Nội Dung
savegame = Lưu trò chơi
loadgame = Tải lại màn chơi
@@ -907,12 +907,12 @@ sector.desolateRift.description = Một vùng cực kỳ nguy hiểm. Tài nguy
sector.nuclearComplex.description = Một cơ sở từng sản xuất và chế biến thori, đã biến thành đống đổ nát.\n[lightgray]Nghiên cứu thori và nhiều công dụng của nó.\n\nKẻ địch có mặt ở đây với số lượng rất lớn, liên tục lùng sục những kẻ tấn công.
sector.fungalPass.description = Khu vực chuyển tiếp giữa vùng núi cao và vùng đất thấp hơn, đầy bào tử. Một căn cứ trinh sát nhỏ của địch được đặt tại đây.\nPhá hủy nó.\nSử dụng đơn vị Dagger. Phá hủy hai lõi của địch.
sector.biomassFacility.description = Nguồn gốc của bào tử. Đây là cơ sở mà chúng được nghiên cứu và sản xuất ban đầu.\nNghiên cứu công nghệ có ở đây. Nuôi cấy bào tử để sản xuất nhiên liệu và chất dẻo.\n\n[lightgray]Khi cơ sở này sụp đổ, các bào tử đã được giải phóng. Không có gì trong hệ sinh thái địa phương có thể cạnh tranh với một dạng sống xâm lấn mạnh như vậy.
sector.windsweptIslands.description = Xa hơn đường bờ biển là chuỗi đảo xa xôi này. Hồ sơ cho thấy họ đã từng có công trình sản xuất [accent]Nhựa[].\n\nChống lại các lực lượng hải quân của kẻ địch. Thiết lập căn cứ trên quần đảo. Nghiên cứu các nhà máy này.
sector.windsweptIslands.description = Xa hơn đường bờ biển là chuỗi đảo xa xôi này. Hồ sơ cho thấy họ đã từng có công trình sản xuất [accent]Nhựa[].\n\nChống lại các lực lượng thủy quân của kẻ địch. Thiết lập căn cứ trên quần đảo. Nghiên cứu các nhà máy này.
sector.extractionOutpost.description = Một tiền đồn xa, được kẻ địch xây dựng với mục đích phóng nguồn lực sang các phân khu khác.\n\nCông nghệ vận chuyển qua lại giữa các phân khu rất cần thiết cho việc mở rộng chinh phục. Phá hủy căn cứ. Nghiên cứu bệ phóng của họ.
sector.impact0078.description = Đây là tàn tích của tàu vận chuyển giữa các vì sao đã từng đến được hệ sao này.\n\nLấy càng nhiều càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào.
sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng các lõi tới các hành tinh lân cận. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất đơn vị hải quân. Loại bỏ kẻ địch càng nhanh càng tốt. Nghiên cứu cấu trúc phóng.
sector.coastline.description = Phát hiện tàn dư công nghệ của các đơn vị hải quân tại địa điểm này. Đẩy lùi các cuộc tấn công của kẻ địch, chiếm phân khu này, và lấy công nghệ.
sector.navalFortress.description = Kẻ địch đã thiết lập một căn cứ từ xa, trên đảo tự nhiên. Phá hủy tiền đồn này. Chiếm công nghệ chế tạo đơn vị hải quân tiên tiến của địch và nghiên cứu nó.
sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng các lõi tới các hành tinh lân cận. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất đơn vị thủy quân. Loại bỏ kẻ địch càng nhanh càng tốt. Nghiên cứu cấu trúc phóng.
sector.coastline.description = Phát hiện tàn dư công nghệ của các đơn vị thủy quân tại địa điểm này. Đẩy lùi các cuộc tấn công của kẻ địch, chiếm phân khu này, và lấy công nghệ.
sector.navalFortress.description = Kẻ địch đã thiết lập một căn cứ từ xa, trên đảo tự nhiên. Phá hủy tiền đồn này. Chiếm công nghệ chế tạo đơn vị thủy quân tiên tiến của địch và nghiên cứu nó.
sector.onset.name = The Onset
sector.aegis.name = Aegis
@@ -1877,7 +1877,7 @@ block.landing-pad.name = Bệ đáp
block.segment.name = Segment
block.ground-factory.name = Nhà máy Bộ binh
block.air-factory.name = Nhà máy Không quân
block.naval-factory.name = Nhà máy Hải quân
block.naval-factory.name = Nhà máy Thủy quân
block.additive-reconstructor.name = Máy tái thiết cấp cộng
block.multiplicative-reconstructor.name = Máy tái thiết cấp nhân
block.exponential-reconstructor.name = Máy tái thiết cấp mũ
@@ -2113,7 +2113,7 @@ hint.waveFire = Tháp súng [accent]Wave[] có nước làm đạn sẽ tự đ
hint.generator = :combustion-generator: [accent]Máy phát điện đốt cháy[] đốt than và truyền năng lượng cho các khối liền kề.\n\nPhạm vi truyền tải năng lượng có thể được mở rộng với :power-node: [accent]Chốt điện[].
hint.guardian = [accent]Trùm[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng tháp súng tiên tiến hơn hoặc sử dụng :graphite: [accent]Than chì[] làm đạn :duo:Duo/:salvo:Salvo đạn dược để hạ gục Trùm.
hint.coreUpgrade = Các lõi có thể được nâng cấp bằng cách [accent]đặt lõi cấp cao hơn trên chúng[].\n\nĐặt một lõi :core-foundation: [accent]Trụ sở[] trên lõi :core-shard: [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó.
hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles.
hint.serpuloCoreZone = :core-shard: [accent]Các lõi[] bổ sung có thể được xây trên nền :core-zone: [accent]Vùng đặt lõi[].
hint.cannotUpgrade = Một biểu tượng [red]:tree:[] phía trên một gói hàng đơn vị thể hiện rằng phiên bản nâng cấp chưa được nghiên cứu.\n\nĐơn vị nâng cấp phải được nghiên cứu trong [accent]:tree: cây công nghệ[] trước khi chúng được sản xuất trong các máy tái thiết.
hint.presetLaunch = [accent]Khu vực đáp[] xám, như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các vùng đất lân cận.\n\n[accent]Các phân khu được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[].
hint.presetDifficulty = Phân khu này có [scarlet]mối đe dọa thù địch cao[].\nPhóng đến phân khu như vậy [accent]không được khuyến khích[] nếu không có công nghệ và chuẩn bị phù hợp.
@@ -2142,33 +2142,33 @@ gz.zone2 = Bất kỳ thứ gì được xây dựng trong bán kính này sẽ
gz.zone3 = Một đợt sẽ bắt đầu ngay bây giờ.\nHãy chuẩn bị.
gz.finish = Đặt thêm các tháp súng, khai thác thêm nguyên liệu,\nvà vượt qua tất cả các đợt để [accent]chiếm phân khu[].
fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[].
fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units.
fungalpass.tutorial1 = Dùng [accent]các đơn vị[] để phòng thủ công trình và tấn công kẻ địch.\nNghiên cứu và đặt một :ground-factory: [accent]nhà máy lục quân[].
fungalpass.tutorial2 = Chọn đơn vị :dagger: [accent]Dagger[] trong nhà máy.\nSản xuất 3 đơn vị.
frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace.
frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed.
frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[].
frontier.tutorial1 = :additive-reconstructor: [accent]Máy tái thiết cấp cộng[]\nnâng cấp đơn vị bậc 1 thành bậc 2\nng :silicon: silicon :graphite: than chì.\n\n[accent]Nghiên cứu và và tái thiết\nmột []:dagger:[accent] dagger thành một []:mace:[accent] mace.
frontier.tutorial2 = Các đợt được gửi [accent]vô hạn[] đến khi tất cả lõi kẻ địch [unlaunched]bị tiêu diệt.
frontier.tutorial3 = [accent]Tấn công căn cứ kẻ địch nhanh chóng để ngăn việc các đợt lên cao[].
atolls.destroy1 = Destroy the 2 enemy [accent]foundation cores[] first.\n[accent]Gain access to thorium[].
atolls.mega1 = Enter [accent]command mode[] and select the :mega:[accent]Mega[] units.
atolls.mega2 = Select the \ue87b [accent]Load Units[] command to have Mega units to pick up ground units.
atolls.mega3 = Move the Mega units [accent]above[] ground units to load them in.
atolls.mega4 = [accent]Drop ground units here to attack.
atolls.mega5 = Select the \ue879 [accent]Unload Payload[] command to have Mega units drop their carried units.
atolls.mega6 = Units will be [accent]automatically dropped[] while the \ue879 Unload Payload command is selected.
atolls.mega7 = Mega units [accent]will not[] drop ground units while they are above walls or deep water.
atolls.mega8 = [accent]Drop naval units here to attack.[]
atolls.attack1 = 1: Drop ground units here to attack from this location.
atolls.attack2 = 2: Alternatively, drop naval units here to launch a surprise attack.
atolls.carry1 = Carrying ground units requires :mega:[accent]Mega[] units.
atolls.carry2 = 1: Command Mega units to [accent]move over[] the ground units.
atolls.carry3 = 2: Select the \ue87b [accent]Load Units[] command in order to pick up the ground units with the Mega units.
atolls.carry4 = 3: Command and move the Mega carriers [accent]loaded with units[].
atolls.carry5 = 4: Select the \ue879 [accent]'Unload Payload'[] command in order for the Mega units to drop the ground units.
atolls.carry6 = These steps can be reviewed [accent]here[].
atolls.carry7 = Follow these instructions to airdrop more units near the enemy base.
atolls.noairunit = This base is too well-fortified to destroy with air units.
atolls.2strategies = There are two strategies to destroy this base.
atolls.destroy1 = Tiêu diệt 2 [accent]lõi trụ sở[] trước.\n[accent]Tiếp cận quặng thori[].
atolls.mega1 = Vào [accent]chế độ mệnh lệnh[] và chọn các đơn vị :mega:[accent]Mega[].
atolls.mega2 = Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để các đơn vị Mega nhận các đơn vị lục quân.
atolls.mega3 = Di chuyển các đơn vị Mega [accent]phía trên[] các đơn vị lục quân để nhận chúng.
atolls.mega4 = [accent]Thả các đơn vị lục quân ở đây để tấn công.
atolls.mega5 = Chọn lệnh \ue879 [accent]Dỡ Khối Hàng[] để các đơn vị Mega thả các đơn vị chúng đã mang theo.
atolls.mega6 = Các đơn vị sẽ [accent]được thả tự động[] ngay khi lệnh \ue879 Dỡ Khối Hàng được chọn.
atolls.mega7 = Các đơn vị Mega[accent]sẽ không[] thả đơn vị lục quân khi chúng ở trên tường hoặc nước sâu.
atolls.mega8 = [accent]Thả các đơn vị thủy quân ở đây để tấn công.[]
atolls.attack1 = 1: Thả các đơn vị lục quân ở đây để tấn công từ vị trí này.
atolls.attack2 = 2: Ngoài ra, thả các đơn vị thủy quân ở đây để tấn công bất ngờ.
atolls.carry1 = Mang các đơn vị lục quân cần có các đơn vị :mega:[accent]Mega[].
atolls.carry2 = 1: Ra lệnh các đơn vị Mega để [accent]di chuyển bên trên[] các đơn vị lục quân.
atolls.carry3 = 2: Chọn lệnh \ue87b [accent]Nhận Đơn Vị[] để yêu cầu nhận các đơn vị lục quân với các đơn vị Mega.
atolls.carry4 = 3: Ra lệnh và di chuyển Mega [accent]chứa các đơn vị[].
atolls.carry5 = 4: Chọn lệnh \ue879 [accent]'Dỡ Khối Hàng'[] để các đơn vị Mega thả các đơn vị lục quân.
atolls.carry6 = Những bước này có thể xem lại [accent]ở đây[].
atolls.carry7 = Làm theo các bước hướng dẫn để không vận thêm nhiều đơn vị gần căn cứ kẻ địch.
atolls.noairunit = Căn cứ này được phòng thủ quá kiên cố nên không thể bị phá hủy bằng không quân.
atolls.2strategies = Có hai chiến lược để phá hủy căn cứ này.
onset.mine = Nhấn để khai thác :beryllium: [accent]beryl[] từ tường.\n\nSử dụng [accent][[WASD] để di chuyển.
onset.mine.mobile = Nhấp để khai thác :beryllium: [accent]beryl[] từ tường.
@@ -2198,7 +2198,7 @@ aegis.tungsten = Tungsten có thể khai thác bằng [accent]khoan thủy lực
split.pickup = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nNhấn vào [accent]thùng chứa[] và đặt nó lên [accent]máy nạp vật phẩm[].\n(Phím mặc định là [[ và ] để mang theo và thả)
split.pickup.mobile = Một số khối có thể được mang theo bởi đơn vị từ lõi.\nNhấp vào [accent]thùng chứa[] và đặt nó lên [accent]máy nạp vật phẩm[].\n(Để mang theo hoặc thả thứ gì đó, ấn giữ nó một chút.)
split.acquire = Bạn cần một số tungsten để sản xuất đơn vị.
split.acquire = Khai thác một ít tungsten để sản xuất đơn vị.
split.build = Đơn vị phải được vận chuyển đến phía bên kia của tường.\nĐặt hai [accent]Máy phóng từ trường khối hàng[], một ở mỗi bên của tường.\nĐặt liên kết bằng cách nhấp vào một trong số chúng, sau đó chọn cái còn lại.
split.container = Tương tự như thùng chứa, đơn vị cũng có thể được vận chuyển bằng [accent]Máy phóng từ trường khối hàng[].\nĐặt một máy chế tạo đơn vị cạnh máy phóng từ trường để nạp chúng, sau đó gửi chúng qua tường để tấn công căn cứ địch.
@@ -2385,7 +2385,7 @@ block.payload-conveyor.description = Di chuyển những khối hàng lớn, ch
block.payload-router.description = Tách những khối hàng đầu vào thành 3 hướng đầu ra. Hoạt động như một bộ lọc khi được thiết lập. Từ tính. Sử dụng ở những môi trường không trọng lực.
block.ground-factory.description = Sản xuất đơn vị bộ binh. Các đơn vị đầu ra có thể được sử dụng trực tiếp, hoặc đưa vào máy tái thiết để nâng cấp.
block.air-factory.description = Sản xuất đơn vị không quân. Các đơn vị đầu ra có thể được sử dụng trực tiếp, hoặc đưa vào máy tái thiết để nâng cấp.
block.naval-factory.description = Sản xuất đơn vị hải quân. Các đơn vị đầu ra có thể được sử dụng trực tiếp, hoặc đưa vào máy tái thiết để nâng cấp.
block.naval-factory.description = Sản xuất đơn vị thủy quân. Các đơn vị đầu ra có thể được sử dụng trực tiếp, hoặc đưa vào máy tái thiết để nâng cấp.
block.additive-reconstructor.description = Nâng cấp đơn vị đầu vào lên cấp thứ hai.
block.multiplicative-reconstructor.description = Nâng cấp đơn vị đầu vào lên cấp thứ ba.
block.exponential-reconstructor.description = Nâng cấp đơn vị đầu vào lên cấp thứ bốn.
@@ -2669,7 +2669,7 @@ laccess.displaywidth = Độ rộng của một khối hiển thị tính bằng
laccess.displayheight = Độ cao của một khối hiển thị tính bằng pixel.
laccess.buffersize = Với khối thông điệp: Độ dài của nội dung.\nVới khối hiển thị: Số lượng chỉ lệnh đồ họa chưa thực hiện.
laccess.operations = Số thao tác thực hiện trên khối.\nVới khối hiển thị, trả về số thao tác drawflush.
laccess.maxunits = Maximum units that a team can have.\nCan only be sensed from cores.
laccess.maxunits = Số lượng đơn vị tối đa mà một đội có thể có.\nChỉ có thể nhận được từ các lõi.
lcategory.unknown = Không xác định
lcategory.unknown.description = Chỉ lệnh không được phân loại.

View File

@@ -469,14 +469,14 @@ editor.rules = 规则
editor.generation = 生成
editor.objectives = 目标
editor.locales = 本地化语言包
editor.patches.guide = Patch Guide
editor.patches = Content Patches
editor.patch = Patchset: {0}
editor.patches.none = [lightgray]No patchsets loaded.
editor.patches.errors = Patchset Errors
editor.patches.importerror = Failed to import patchset
editor.patches.delete.confirm = Are you sure you want to delete this patchset?
editor.patch.fields = {0} fields
editor.patches.guide = 数据包指南
editor.patches = 数据包
editor.patch = 补丁集: {0}
editor.patches.none = [lightgray]未加载补丁集。
editor.patches.errors = 补丁集出错
editor.patches.importerror = 导入补丁集失败
editor.patches.delete.confirm = 您确定要删除此补丁集吗?
editor.patch.fields = {0} 处变动
editor.worldprocessors = 世界处理器
editor.worldprocessors.editname = 命名
editor.worldprocessors.none = [lightgray]未找到世界处理器!\n请在地图编辑器中添加或使用下方的 \ue813 添加按钮。
@@ -608,8 +608,8 @@ toolmode.fillteams = 填充队伍
toolmode.fillteams.description = 填充队伍而不是方块。
toolmode.fillerase = 填充擦除
toolmode.fillerase.description = 擦除相同类型的方块。
toolmode.fillcliffs = Fill Cliffs
toolmode.fillcliffs.description = Turns walls into cliffs.
toolmode.fillcliffs = 填充悬崖
toolmode.fillcliffs.description = 将墙壁转换为悬崖。
toolmode.drawteams = 绘制队伍
toolmode.drawteams.description = 绘制队伍颜色而不是方块。
#unused
@@ -812,7 +812,7 @@ sectors.wave = 波次:
sectors.stored = 贮存:
sectors.resume = 继续
sectors.launch = 发射
sectors.nolaunchcandidate = No Launch Sector
sectors.nolaunchcandidate = 无可用发射区块
sectors.viewsubmission = \ue80d 查看提交
sectors.select = 选择
sectors.launchselect = 选择发射目的地
@@ -826,7 +826,7 @@ sectors.go = 进入
sector.abandon = 遗弃
sector.abandon.confirm = 该区块的核心将自毁。\n确定吗
sector.curcapture = 区块已占领
sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled
sector.lockdown = [red]:warning:[accent] 区块正受到攻击。\n[lightgray]生产、研究、发射台物流已停用。
sector.curlost = 区块已失守
sector.missingresources = [scarlet]建造核心所需的资源不足
sector.attacked = 区块 [accent]{0}[white] 正在遭受攻击!
@@ -1015,8 +1015,8 @@ stat.frequency = 频率
stat.targetsair = 攻击空中单位
stat.targetsground = 攻击地面单位
stat.crushdamage = 碾压伤害
stat.legsplashdamage = Leg Splash Damage
stat.legsplashrange = Leg Splash Range
stat.legsplashdamage = 践踏伤害
stat.legsplashrange = 践踏范围
stat.itemsmoved = 移动速度
stat.launchtime = 发射间隔
stat.shootrange = 范围
@@ -1056,7 +1056,7 @@ stat.reload = 开火速率
stat.ammo = 弹药
stat.shieldhealth = 护盾容量
stat.cooldowntime = 冷却时间
stat.regenerationrate = Regeneration Rate
stat.regenerationrate = 恢复率
stat.activationtime = Activation Time
stat.explosiveness = 爆炸性
stat.basedeflectchance = 基础反射概率
@@ -1167,7 +1167,7 @@ bar.launchcooldown = 发射冷却
bar.input = 输入
bar.output = 输出
bar.strength = [stat]{0}[lightgray]x 效率
bar.regenerationrate = [stat]{0}/sec[lightgray] regen rate
bar.regenerationrate = [stat]{0}/[lightgray] 恢复率
bar.activationtimer = Activates in {0}
bar.activated = Activated
@@ -1434,8 +1434,8 @@ rules.hidebannedblocks = 隐藏禁用的建筑
rules.infiniteresources = 无限资源
rules.fillitems = 填满核心
rules.onlydepositcore = 资源仅可丢入核心
rules.coreunloaders = Allow Core Unloaders
rules.coreunloaders.info = When enabled, Serpulo unloaders can take items from the core.\nDoes not affect Erekir unloaders.
rules.coreunloaders = 允许装卸器贴核使用
rules.coreunloaders.info = 当启用时,赛普罗的装卸器可以从核心提取物品。\n不影响埃里克尔的管道装卸器。
rules.derelictrepair = 允许修复残骸建筑
rules.reactorexplosions = 允许反应堆爆炸
rules.coreincinerates = 核心焚烧溢出资源
@@ -1457,8 +1457,8 @@ rules.buildaitier = AI 建造等级
rules.rtsai = RTS AI
rules.rtsai.campaign = RTS 进攻 AI
rules.rtsai.campaign.info = 让敌方单位更智能地组队攻击玩家基地。
rules.clearsectoronloss = Clear Sector On Loss
rules.clearsectoronloss.info = When the sector is lost, player buildings from the previous attempt will not carry over.
rules.clearsectoronloss = 重置丢失区块
rules.clearsectoronloss.info = 如果该区块失守,玩家在前一次尝试中建造的建筑将不会保留。
rules.rtsminsquadsize = 最小部队规模
rules.rtsmaxsquadsize = 最大部队规模
rules.rtsminattackweight = 最低进攻强度
@@ -1466,10 +1466,10 @@ rules.cleanupdeadteams = 清除已败队伍建筑PvP
rules.corecapture = 摧毁后占领核心
rules.polygoncoreprotection = 建造区域按核心位置平分
rules.placerangecheck = 敌方建筑周围禁建
rules.protectcores = Protect Cores
rules.protectcores.info = When disabled, the core no-build radius won't affect this team.\nPlayers won't be assigned to unprotected teams.
rules.checkplacement = Check Placement
rules.checkplacement.info = When disabled, buildings of this team are ignored in placement range checks.
rules.protectcores = 核心保护
rules.protectcores.info = 禁用后,核心禁建区将不会影响该队伍。\n玩家不会被分配到不受保护的队伍。
rules.checkplacement = 建筑放置检查
rules.checkplacement.info = 禁用后,该队伍的建筑物在放置范围检查中将被忽略。
rules.enemyCheat = 敌人无限资源
rules.blockhealthmultiplier = 建筑生命倍率
rules.blockdamagemultiplier = 建筑伤害倍率
@@ -1480,8 +1480,8 @@ rules.unitdamagemultiplier = 单位伤害倍率
rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率
rules.unitminespeedmultiplier = 单位采矿速度倍率
rules.logicunitcontrol = Logic Unit Control
rules.logicunitbuild = Logic Unit Building
rules.logicunitdeconstruct = Logic Unit Deconstruction
rules.logicunitbuild = 逻辑控制单位建造
rules.logicunitdeconstruct = 逻辑控制单位拆除
rules.solarmultiplier = 太阳能发电倍率
rules.unitcapvariable = 核心可增加单位上限
rules.unitpayloadsexplode = 携带的载荷与单位一起爆炸

View File

@@ -1617,7 +1617,7 @@ public class Blocks{
}};
cyanogenSynthesizer = new HeatCrafter("cyanogen-synthesizer"){{
requirements(Category.crafting, with(Items.carbide, 50, Items.silicon, 80, Items.beryllium, 90));
requirements(Category.crafting, with(Items.carbide, 80, Items.silicon, 120, Items.beryllium, 140, Items.oxide, 40));
heatRequirement = 20f;
maxEfficiency = 1f;
@@ -2770,8 +2770,8 @@ public class Blocks{
}};
fluxReactor = new VariableReactor("flux-reactor"){{
requirements(Category.power, with(Items.graphite, 300, Items.carbide, 100, Items.oxide, 100, Items.silicon, 600, Items.surgeAlloy, 200));
powerProduction = 265f;
requirements(Category.power, with(Items.graphite, 240, Items.carbide, 60, Items.oxide, 80, Items.silicon, 480, Items.surgeAlloy, 120));
powerProduction = 18000f / 60f;
maxHeat = 150f;
consumeLiquid(Liquids.cyanogen, 9f / 60f);
@@ -4510,8 +4510,8 @@ public class Blocks{
shootEffect = Fx.shootBigColor;
smokeEffect = Fx.shootSmokeSquareSparse;
ammoMultiplier = 1;
hitColor = backColor = trailColor = Pal.graphiteAmmoBack;
frontColor = Pal.graphiteAmmoFront;
hitColor = backColor = trailColor = Pal.siliconAmmoBack;
frontColor = Color.valueOf("dae1ee");
trailWidth = 6f;
trailLength = 6;
hitEffect = despawnEffect = Fx.hitSquaresColor;
@@ -4597,7 +4597,7 @@ public class Blocks{
outlineColor = Pal.darkOutline;
liquidCapacity = 50f;
liquidConsumed = 15f / 60f;
liquidConsumed = 18f / 60f;
targetInterval = 5f;
newTargetInterval = 30f;
targetUnderBlocks = false;
@@ -4613,6 +4613,7 @@ public class Blocks{
Liquids.ozone, new ContinuousFlameBulletType(){{
damage = 60f;
length = r;
ammoMultiplier = 1.2f;
knockback = 1f;
pierceCap = 2;
buildingDamageMultiplier = 0.3f;
@@ -4623,7 +4624,6 @@ public class Blocks{
Liquids.cyanogen, new ContinuousFlameBulletType(){{
damage = 130f;
rangeChange = 70f;
ammoMultiplier = 1.5f;
length = r + rangeChange;
knockback = 2f;
pierceCap = 3;
@@ -4746,10 +4746,10 @@ public class Blocks{
lifetime = 190f;
height = 19f;
width = 17f;
reloadMultiplier = 0.65f;
reloadMultiplier = 0.7f;
splashDamageRadius = 110f;
rangeChange = 8f;
splashDamage = 150f;
splashDamage = 180f;
scaledSplashDamage = true;
hitColor = backColor = trailColor = Color.valueOf("a0b380");
frontColor = Color.valueOf("e4ffd6");
@@ -4772,7 +4772,26 @@ public class Blocks{
shrinkY = 0.1f;
buildingDamageMultiplier = 0.25f;
status = StatusEffects.corroded;
statusDuration = 300f;
statusDuration = 60f * 8f;
fragBullets = 1;
fragBullet = new EmptyBulletType(){{
damage = 0f;
lifetime = 60f * 2.5f;
bulletInterval = 20f;
hitEffect = despawnEffect = Fx.none;
intervalBullet = new EmptyBulletType(){{
splashDamage = 15f;
collidesGround = true;
collidesAir = false;
collides = false;
hitEffect = despawnEffect = Fx.none;
pierce = true;
instantDisappear = true;
splashDamageRadius = 90f;
buildingDamageMultiplier = 0f;
}};
}};
}}
);
@@ -4894,8 +4913,8 @@ public class Blocks{
collidesTiles = false;
shootEffect = Fx.shootBig2;
smokeEffect = Fx.shootSmokeDisperse;
frontColor = Pal.graphiteAmmoFront;
backColor = trailColor = hitColor = Pal.graphiteAmmoBack;
frontColor = Color.valueOf("dae1ee");
backColor = trailColor = hitColor = Pal.siliconAmmoBack;
ammoMultiplier = 4f;
lifetime = 34f;
@@ -5213,6 +5232,7 @@ public class Blocks{
speed = 4.6f;
maxRange = 6f;
lifetime = 60f * 5.5f;
hitSize = 10f;
outlineColor = Pal.darkOutline;
engineColor = trailColor = Pal.redLight;
engineLayer = Layer.effect;
@@ -5293,13 +5313,14 @@ public class Blocks{
shootEffect = Fx.shootBig;
smokeEffect = Fx.shootSmokeMissileColor;
hitColor = Color.valueOf("ffd37f");
ammoMultiplier = 3f;
ammoMultiplier = 5f;
reloadMultiplier = 0.8f;
spawnUnit = new MissileUnitType("scathe-missile-phase"){{
speed = 4f;
speed = 2.5f;
maxRange = 6f;
lifetime = 60f * 6.1f;
lifetime = 60f * 9.77f;
hitSize = 10f;
outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("ffd37f");
engineLayer = Layer.effect;
@@ -5337,10 +5358,9 @@ public class Blocks{
deathExplosionEffect = Fx.massiveExplosion;
shootOnDeath = true;
shake = 10f;
bullet = new ExplosionBulletType(400f, 120f){{
//stats must be mirrored to the bullet that the unit uses
bullet = new ExplosionBulletType(320f, 120f){{
reloadMultiplier = 0.8f;
ammoMultiplier = 3f;
ammoMultiplier = 5f;
hitColor = engineColor;
shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{
@@ -5364,7 +5384,7 @@ public class Blocks{
width = height = 18f;
collidesTiles = false;
splashDamageRadius = 56f;
splashDamage = 164f;
splashDamage = 120f;
backColor = trailColor = hitColor = engineColor;
frontColor = Color.white;
smokeEffect = Fx.shootBigSmoke2;
@@ -5385,10 +5405,10 @@ public class Blocks{
rotation = 180f;
y = -9f;
color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f);
interval = 7f;
interval = 15f;
}});
abilities.add(new ForceFieldAbility(90f, 0f, 2000f, 999999999f));
abilities.add(new ForceFieldAbility(120f, 0f, 3000f, 999999999f));
}};
}},
@@ -5399,13 +5419,13 @@ public class Blocks{
hitColor = Color.valueOf("f7e97e");
ammoMultiplier = 1f;
rangeChange = -8f*9f;
reloadMultiplier = 0.9f;
spawnUnit = new MissileUnitType("scathe-missile-surge"){{
speed = 4.4f;
maxRange = 6f;
lifetime = 60f * 1.4f;
hitSize = 10f;
outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("f7e97e");
engineLayer = Layer.effect;
@@ -5436,7 +5456,6 @@ public class Blocks{
bullet = new ExplosionBulletType(1800f, 40f){{
//mirror stats
ammoMultiplier = 1f;
rangeChange = -8f*9f;
reloadMultiplier = 0.9f;
lightning = 10;
lightningDamage = 45f;
@@ -5461,7 +5480,7 @@ public class Blocks{
spawnUnit = new MissileUnitType("scathe-missile-surge-split"){{
speed = 4.8f;
maxRange = 6f;
lifetime = 60f * 3.5f;
lifetime = 60f * 3.7f;
outlineColor = Pal.darkOutline;
engineColor = trailColor = Color.valueOf("f7e97e");
engineLayer = Layer.effect;

View File

@@ -905,6 +905,16 @@ public class Fx{
Drawf.light(e.x, e.y, 20f, e.color, 0.6f * e.fout());
}),
squareWaveEffect = new Effect(14, 40f, e -> {
rand.setSeed(e.id);
color(Color.white, e.color, rand.random(0.8f, 1.5f) * e.fin());
stroke(rand.random(0.4f, 0.8f) + e.fout() * 2);
float rot = rand.random(45f, 180f) * e.fin();
float rotation = rand.random(0, 1) > 0.5f ? rot : -rot;
Lines.square(e.x, e.y, e.fin() * rand.random(4f, 11f) + 4f, e.rotation + rand.random(360f) + rotation);
Drawf.light(e.x, e.y, 23f, e.color, e.fout() * 0.7f);
}),
hitFuse = new Effect(14, e -> {
color(Color.white, Pal.surge, e.fin());

View File

@@ -192,8 +192,8 @@ public class StatusEffects{
corroded = new StatusEffect("corroded"){{
color = Color.valueOf("e4ffd6");
intervalDamage = 25f;
intervalDamageTime = 30f;
intervalDamage = 20f;
intervalDamageTime = 15f;
effectChance = 0.1f;
effect = Fx.corrosionVapor;

View File

@@ -2826,7 +2826,7 @@ public class UnitTypes{
y = -1f;
heatColor = Color.valueOf("f9350f");
cooldownTime = 30f;
bullet = new BasicBulletType(7f, 120){{
bullet = new BasicBulletType(7f, 10){{
sprite = "missile-large";
width = 7.5f;
height = 13f;
@@ -2891,7 +2891,7 @@ public class UnitTypes{
weapons.add(new Weapon("vanquish-weapon"){{
shootSound = Sounds.shootTank;
layerOffset = 0.0001f;
reload = 70f;
reload = 80f;
shootY = 71f / 4f;
shake = 5f;
recoil = 4f;
@@ -2904,17 +2904,18 @@ public class UnitTypes{
heatColor = Color.valueOf("f9350f");
cooldownTime = 80f;
bullet = new BasicBulletType(8f, 190){{
bullet = new BasicBulletType(8f, 150f){{
sprite = "missile-large";
width = 9.5f;
height = 13f;
lifetime = 18f;
height = 18f;
lifetime = 16f;
hitSize = 6f;
shootEffect = Fx.shootTitan;
smokeEffect = Fx.shootSmokeTitan;
pierceCap = 2;
pierce = true;
pierceBuilding = true;
hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white;
trailWidth = 3.1f;
@@ -2922,19 +2923,21 @@ public class UnitTypes{
hitEffect = despawnEffect = Fx.blastExplosion;
splashDamageRadius = 20f;
splashDamage = 50f;
maxRange = 190f;
fragOnHit = false;
pierceFragCap = 1;
fragRandomSpread = 0f;
fragSpread = 10f;
fragBullets = 5;
fragVelocityMin = 1f;
despawnSound = Sounds.explosionDull;
fragBullet = new BasicBulletType(8f, 35){{
fragBullet = new BasicBulletType(8f, 35f){{
sprite = "missile-large";
width = 8f;
height = 12f;
lifetime = 15f;
height = 16f;
lifetime = 10f;
hitSize = 4f;
hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white;
@@ -2951,7 +2954,7 @@ public class UnitTypes{
for(float f : new float[]{34f / 4f, -36f / 4f}){
int fi = i ++;
weapons.add(new Weapon("vanquish-point-weapon"){{
reload = 35f + fi * 5;
reload = 22 + fi * 5;
x = 48f / 4f;
y = f;
shootY = 5.5f;
@@ -2960,16 +2963,21 @@ public class UnitTypes{
rotateSpeed = 2f;
shootSound = Sounds.shootStell;
bullet = new BasicBulletType(4.5f, 25){{
bullet = new BasicBulletType(12f, 50f){{
sprite = "missile-large";
width = 6.5f;
height = 11f;
shrinkY = 0f;
shrinkX = 0.2f;
lifetime = 15f;
shootEffect = Fx.sparkShoot;
smokeEffect = Fx.shootBigSmoke;
hitColor = backColor = trailColor = Color.valueOf("feb380");
frontColor = Color.white;
trailWidth = 1.5f;
trailLength = 4;
hitEffect = despawnEffect = Fx.hitBulletColor;
trailWidth = 2.5f;
trailLength = 5;
hitEffect = Fx.blastExplosion;
despawnEffect = Fx.hitBulletColor;
}};
}});
}
@@ -3358,7 +3366,7 @@ public class UnitTypes{
drag = 0.1f;
hitSize = 21f;
rotateSpeed = 3f;
health = 2900;
health = 2700;
armor = 7f;
fogRadius = 40f;
stepShake = 0f;
@@ -3473,9 +3481,9 @@ public class UnitTypes{
trailColor = engineColor = Pal.techBlue;
engineSize = 1.75f;
engineLayer = Layer.effect;
speed = 3.7f;
speed = 3.35f;
maxRange = 6f;
lifetime = 60f * 1.5f;
lifetime = 60f * 1.66f;
outlineColor = Pal.darkOutline;
health = 55;
lowAltitude = true;
@@ -3533,9 +3541,9 @@ public class UnitTypes{
region = "tecta-shield";
radius = 45f;
angle = 82f;
regen = 40f / 60f;
regen = 45f / 60f;
cooldown = 60f * 8f;
max = 2200f;
max = 2500f;
y = -20f;
width = 8f;
whenShooting = false;
@@ -3581,14 +3589,14 @@ public class UnitTypes{
velocityRnd = 0.33f;
heatColor = Color.red;
bullet = new MissileBulletType(4.2f, 60){{
bullet = new MissileBulletType(4.2f, 51){{
homingPower = 0.2f;
weaveMag = 4;
weaveScale = 4;
lifetime = 55f;
shootEffect = Fx.shootBig2;
smokeEffect = Fx.shootSmokeTitan;
splashDamage = 70f;
splashDamage = 60f;
splashDamageRadius = 30f;
frontColor = Color.white;
hitSound = Sounds.none;
@@ -3679,7 +3687,7 @@ public class UnitTypes{
shadow = 10f;
shootStatus = StatusEffects.slow;
shootStatusDuration = reload + 1f;
shootStatusDuration = reload + 170f;
shoot.shots = 1;
heatColor = Color.red;
@@ -3901,13 +3909,31 @@ public class UnitTypes{
width = 7f;
height = 12f;
lifetime = 18f;
//floating point inaccuracy makes 0.6f show as -39%
buildingDamageMultiplier = 0.599999f;
shootEffect = Fx.sparkShoot;
smokeEffect = Fx.shootBigSmoke;
hitColor = backColor = trailColor = Pal.suppress;
frontColor = Color.white;
trailWidth = 1.5f;
trailLength = 5;
hitEffect = despawnEffect = Fx.hitBulletColor;
hitEffect = despawnEffect = new MultiEffect(Fx.hitSquaresColor, Fx.squareWaveEffect);
fragOnDespawn = false;
fragBullets = 2;
fragBullet = new BasicBulletType(3f, 15){{
width = 5f;
height = 8f;
lifetime = 14f;
fragVelocityMax = 1f;
fragVelocityMin = 0.7f;
buildingDamageMultiplier = 0.5f;
hitColor = backColor = trailColor = Pal.suppress;
frontColor = Color.white;
trailWidth = 1.2f;
trailLength = 4;
hitEffect = despawnEffect = Fx.hitBulletColor;
}};
}};
}});
}};
@@ -4046,7 +4072,7 @@ public class UnitTypes{
health = 6000f;
armor = 4f;
hitSize = 36f;
payloadCapacity = Mathf.sqr(3f) * tilePayload;
payloadCapacity = Mathf.sqr(4f) * tilePayload;
researchCostMultiplier = 0f;
targetAir = false;

View File

@@ -13,6 +13,7 @@ import arc.util.serialization.*;
import arc.util.serialization.JsonValue.*;
import mindustry.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*;
import mindustry.core.GameState.*;
import mindustry.entities.*;
import mindustry.game.EventType.*;
@@ -699,7 +700,7 @@ public class NetClient implements ApplicationListener{
unit == null ? 0f : unit.vel.x, unit == null ? 0f : unit.vel.y,
dead ? null : unit.mineTile,
player.boosting, player.shooting, ui.chatfrag.shown(), control.input.isBuilding,
player.isBuilder() && unit != null ? unit.plans : null,
player.selectedBlock, player.selectedRotation, player.isBuilder() && unit != null ? unit.plans : null,
Core.camera.position.x, Core.camera.position.y,
Core.camera.width, Core.camera.height
);

View File

@@ -647,7 +647,7 @@ public class NetServer implements ApplicationListener{
float xVelocity, float yVelocity,
Tile mining,
boolean boosting, boolean shooting, boolean chatting, boolean building,
@Nullable Queue<BuildPlan> plans,
Block selectedBlock, int selectedRotation, @Nullable Queue<BuildPlan> plans,
float viewX, float viewY, float viewWidth, float viewHeight
){
NetConnection con = player.con;
@@ -686,6 +686,8 @@ public class NetServer implements ApplicationListener{
player.typing = chatting;
player.shooting = shooting;
player.boosting = boosting;
player.selectedBlock = selectedBlock;
player.selectedRotation = selectedRotation;
@Nullable var unit = player.unit();

View File

@@ -100,6 +100,17 @@ public class Units{
unit.remove();
}
/** Removes a unit after spawning the death effects. */
@Remote(called = Loc.server)
public static void unitSafeDeath(Unit unit){
if(unit == null) return;
unit.type.deathExplosionEffect.at(unit.x, unit.y, unit.hitSize / 8f);
float shake = unit.type.deathShake < 0 ? unit.hitSize / 3f : unit.type.deathShake;
Effect.shake(shake, shake, unit);
unit.type.deathSound.at(unit, 1f, unit.type.deathSoundVolume);
unit.remove();
}
/** @return whether a new instance of a unit of this team can be created. */
public static boolean canCreate(Team team, UnitType type){
return !type.useUnitCap || (team.data().countType(type) < getCap(team) && !type.isBanned());

View File

@@ -38,13 +38,18 @@ public class ShieldArcAbility extends Ability{
if(penX > penY){
b.vel.x *= -1;
b.vel.y *= paramField.reflectVel;
}else{
b.vel.y *= -1;
b.vel.x *= paramField.reflectVel;
}
b.owner = paramUnit;
b.team = paramUnit.team;
b.time += 1f;
b.time = b.lifetime * paramField.reflectTime;
if(paramField.reflectBuildingDamage > 0f){
b.buildingDamageMultiplier = paramField.reflectBuildingDamage;
}
}else{
b.absorb();
@@ -75,13 +80,10 @@ public class ShieldArcAbility extends Ability{
(Tmp.v1.set(unit).add(unit.deltaX, unit.deltaY).within(paramPos, paramField.radius + paramField.width) || unit.within(paramPos, paramField.radius + paramField.width)) &&
(Angles.within(paramPos.angleTo(unit), paramUnit.rotation + paramField.angleOffset, paramField.angle / 2f) || Angles.within(paramPos.angleTo(unit.x + unit.deltaX, unit.y + unit.deltaY), paramUnit.rotation + paramField.angleOffset, paramField.angle / 2f))){
if(unit.isMissile() && unit.killable() && paramField.missileUnitMultiplier >= 0f){
unit.remove();
unit.type.deathSound.at(unit);
unit.type.deathExplosionEffect.at(unit);
if(unit.isMissile() && paramField.missileUnitMultiplier >= 0f){
Call.unitSafeDeath(unit);
Fx.absorb.at(unit);
Fx.circleColorSpark.at(unit.x, unit.y,paramUnit.team.color);
paramField.pushEffect.at(unit.x, unit.y,paramUnit.team.color);
// consider missile hp and gamerule to damage the shield
paramField.data -= unit.health() * paramField.missileUnitMultiplier * Vars.state.rules.unitDamage(unit.team);
@@ -98,8 +100,8 @@ public class ShieldArcAbility extends Ability{
// get out
unit.move(Tmp.v1.set(unit).sub(paramUnit).setLength(overlapDst + 0.01f));
if(Mathf.chanceDelta(0.5f*Time.delta)){
Fx.circleColorSpark.at(unit.x,unit.y,paramUnit.team.color);
if(Mathf.chanceDelta(0.3f * Time.delta)){
paramField.pushEffect.at(unit.x, unit.y, paramUnit.team.color);
}
}
}
@@ -124,6 +126,12 @@ public class ShieldArcAbility extends Ability{
public float width = 6f;
/** Bullet deflection chance. -1 to disable */
public float chanceDeflect = -1f;
/** Multiplier for reflected bullet building damage. -1 to disable */
public float reflectBuildingDamage = 1f;
/** Velocity multiplier for reflected bullets on the opposite axis. Negative values = concave, positive values = convex */
public float reflectVel = 1f;
/** Time multiplier for reflected bullets. */
public float reflectTime = 1f - 0.5f;
/** Deflection sound. */
public Sound deflectSound = Sounds.none;
public Sound breakSound = Sounds.shieldBreakSmall;
@@ -142,6 +150,7 @@ public class ShieldArcAbility extends Ability{
public boolean offsetRegion = false;
/** If true, enemy units are pushed out. */
public boolean pushUnits = true;
public Effect pushEffect = Fx.circleColorSpark;
/** State. */
protected float widthScale, alpha;
@@ -154,8 +163,10 @@ public class ShieldArcAbility extends Ability{
t.add(abilityStat("repairspeed", Strings.autoFixed(regen * 60f, 2)));
t.row();
t.add(abilityStat("cooldown", Strings.autoFixed(cooldown / 60f, 2)));
t.row();
t.add(abilityStat("deflectchance", Strings.autoFixed(chanceDeflect *100f, 2)));
if(chanceDeflect > 0f){
t.row();
t.add(abilityStat("deflectchance", Strings.autoFixed(chanceDeflect *100f, 2)));
}
}
@Override

View File

@@ -157,7 +157,7 @@ public class BulletType extends Content implements Cloneable{
public float extraRangeMargin = 0f;
/** Range initialized in init(). */
public float range = 0f;
/** When used in a turret with multiple ammoo types, this can be set to a non-zero value to influence minRange */
/** When used in a turret with multiple ammo types, this can be set to a non-zero value to influence minRange */
public float minRangeChange = 0f;
/** % of block health healed **/
public float healPercent = 0f;
@@ -173,11 +173,13 @@ public class BulletType extends Content implements Cloneable{
public boolean makeFire = false;
/** Whether this bullet will always hit blocks under it. */
public boolean hitUnder = false;
/** Whether to create hit effects on despawn. Forced to true if this bullet has any special effects like splash damage. */
/** Whether to create hit effects on despawn. Forced to true if this bullet has any special effects like splash damage. Disable setDefaults to avoid override */
public boolean despawnHit = false;
/** If true, this bullet will create bullets when it hits anything, not just when it despawns. */
/** If true, this bullet will create bullets when it hits anything */
public boolean fragOnHit = true;
/** If false, this bullet will not create fraags when absorbed by a shield. */
/** If true, this bullet will create bullets when it despawns */
public boolean fragOnDespawn = true;
/** If false, this bullet will not create frags when absorbed by a shield. */
public boolean fragOnAbsorb = true;
/** If true, unit armor is ignored in damage calculations. */
public boolean pierceArmor = false;
@@ -269,7 +271,7 @@ public class BulletType extends Content implements Cloneable{
/** Random offset of trail effect. */
public float trailSpread = 0f;
/** Rotation/size parameter that is passed to trail. Usually, this controls size. */
public float trailParam = 2f;
public float trailParam = 2f;
/** Whether the parameter passed to the trail is the bullet rotation, instead of a flat value. */
public boolean trailRotation = false;
/** Interpolation for trail width as function of bullet lifetime */
@@ -527,16 +529,20 @@ public class BulletType extends Content implements Cloneable{
}
public void hit(Bullet b){
hit(b, b.x, b.y);
hit(b, b.x, b.y, true);
}
public void hit(Bullet b, float x, float y){
hit(b, b.x, b.y, true);
}
public void hit(Bullet b, float x, float y, boolean createFrags){
hitEffect.at(x, y, b.rotation(), hitColor);
hitSound.at(x, y, hitSoundPitch + Mathf.range(hitSoundPitchRange), hitSoundVolume);
Effect.shake(hitShake, hitShake, b);
if(fragOnHit){
if(createFrags && fragOnHit){
if(delayFrags && fragBullet != null && fragBullet.delayFrags){
Time.run(0f, () -> createFrags(b, x, y));
}else{
@@ -596,7 +602,7 @@ public class BulletType extends Content implements Cloneable{
}
public void createFrags(Bullet b, float x, float y){
if(fragBullet != null && (fragOnAbsorb || !b.absorbed) && !(b.frags >= pierceFragCap && pierceFragCap > 0)){
if(fragBullet != null && (fragOnAbsorb || !b.absorbed) && (pierceFragCap < 0 || b.frags < pierceFragCap)){
for(int i = 0; i < fragBullets; i++){
float len = Mathf.random(fragOffsetMin, fragOffsetMax);
float a = b.rotation() + Mathf.range(fragRandomSpread / 2) + fragAngle + fragSpread * i - (fragBullets - 1) * fragSpread / 2f;
@@ -620,15 +626,11 @@ public class BulletType extends Content implements Cloneable{
/** Called when the bullet reaches the end of its lifetime or is destroyed by something external. */
public void despawned(Bullet b){
if(despawnHit){
hit(b);
hit(b, b.x, b.y, false);
}else{
createUnits(b, b.x, b.y);
}
if(!fragOnHit){
createFrags(b, b.x, b.y);
}
despawnEffect.at(b.x, b.y, b.rotation(), hitColor);
despawnSound.at(b, 1f + Mathf.range(hitSoundPitchRange));
@@ -641,15 +643,13 @@ public class BulletType extends Content implements Cloneable{
Fx.trailFade.at(b.x, b.y, trailWidth, trailColor, b.trail.copy());
}
//if the bullet never created any frags and is removed (probably by hitting something), it needs to spawn those
//TODO: disabled for now as this makes vanquish significantly more powerful
if(b.frags == 0 && !fragOnHit && fragBullet != null){
// createFrags(b, b.x, b.y);
if(b.frags == 0 && fragOnDespawn && fragBullet != null){
createFrags(b, b.x, b.y);
}
}
public float buildingDamage(Bullet b){
return b.damage() * buildingDamageMultiplier;
return b.damage() * b.buildingDamageMultiplier;
}
public float shieldDamage(Bullet b){
@@ -960,6 +960,7 @@ public class BulletType extends Content implements Cloneable{
bullet.hitSize = hitSize;
bullet.mover = mover;
bullet.damage = (damage < 0 ? this.damage : damage) * bullet.damageMultiplier();
bullet.buildingDamageMultiplier = buildingDamageMultiplier;
//reset trail
if(bullet.trail != null){
bullet.trail.clear();

View File

@@ -45,6 +45,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
transient @Nullable Tile aimTile;
transient float aimX, aimY;
transient float originX, originY;
transient float buildingDamageMultiplier;
transient @Nullable Mover mover;
transient boolean absorbed, hit;
transient @Nullable Trail trail;

View File

@@ -21,6 +21,7 @@ import mindustry.net.Administration.*;
import mindustry.net.*;
import mindustry.net.Packets.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.storage.*;
import mindustry.world.blocks.storage.CoreBlock.*;
@@ -37,6 +38,8 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
transient @Nullable NetConnection con;
@ReadOnly Team team = Team.sharded;
@SyncLocal boolean typing, shooting, boosting;
@SyncLocal @Nullable Block selectedBlock;
@SyncLocal int selectedRotation;
@SyncLocal float mouseX, mouseY;
/** command the unit had before it was controlled. */
@Nullable @NoSync UnitCommand lastCommand;

View File

@@ -276,6 +276,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case mining -> mining() ? 1 : 0;
case mineX -> mining() ? mineTile.x : -1;
case mineY -> mining() ? mineTile.y : -1;
case buildX -> isBuilding() ? buildPlan().x : -1;
case buildY -> isBuilding() ? buildPlan().y : -1;
case armor -> armorOverride >= 0f ? armorOverride : armor;
case flag -> flag;
case speed -> type.speed * 60f / tilesize * speedMultiplier;
@@ -289,6 +291,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case payloadCapacity -> type.payloadCapacity / tilePayload;
case size -> hitSize / tilesize;
case color -> Color.toDoubleBits(team.color.r, team.color.g, team.color.b, 1f);
case selectedRotation -> controller instanceof Player p ? p.selectedRotation : 0;
default -> Float.NaN;
};
}
@@ -304,6 +307,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
(pay.payloads().isEmpty() ? null :
pay.payloads().peek() instanceof UnitPayload p1 ? p1.unit.type :
pay.payloads().peek() instanceof BuildPayload p2 ? p2.block() : null) : null;
case building -> isBuilding() && !buildPlan().breaking ? buildPlan().tile().build : null;
case breaking -> isBuilding() && buildPlan().breaking ? buildPlan().tile().build : null;
case selectedBlock -> controller instanceof Player p ? p.selectedBlock : null;
default -> noSensed;
};
}

View File

@@ -944,6 +944,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
block = null;
}
player.selectedBlock = block;
player.selectedRotation = rotation;
wasShooting = player.shooting;
//only reset the controlled type and control a unit after the timer runs out

View File

@@ -392,11 +392,12 @@ public class TypeIO{
}
public static void writeBlock(Writes write, Block block){
write.s(block.id);
write.s(block == null ? -1 : block.id);
}
public static Block readBlock(Reads read){
return content.block(read.s());
short id = read.s();
return id == -1 ? null : content.block(id);
}
/** @return the maximum acceptable amount of plans to send over the network */

View File

@@ -51,6 +51,10 @@ public enum LAccess{
mineX,
mineY,
mining,
buildX,
buildY,
building,
breaking,
speed,
team,
type,
@@ -64,6 +68,8 @@ public enum LAccess{
payloadCapacity,
maxUnits,
id,
selectedBlock,
selectedRotation,
//values with parameters are considered controllable
enabled("to"), //"to" is standard for single parameter access

View File

@@ -212,8 +212,19 @@ public class ConstructBlock extends Block{
@Override
public double sense(LAccess sensor){
if(sensor == LAccess.progress) return Mathf.clamp(progress);
return super.sense(sensor);
return switch(sensor){
case progress -> Mathf.clamp(progress);
case breaking -> activeDeconstruct ? 1 : 0;
default -> super.sense(sensor);
};
}
@Override
public Object senseObject(LAccess sensor){
return switch(sensor){
case building -> current;
default -> super.senseObject(sensor);
};
}
@Override

View File

@@ -13,6 +13,7 @@ import mindustry.game.Teams.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.io.*;
import mindustry.logic.*;
import mindustry.type.*;
import mindustry.world.*;
import mindustry.world.blocks.ConstructBlock.*;
@@ -264,5 +265,21 @@ public class BuildTurret extends BaseTurret{
}
}
}
@Override
public double sense(LAccess sensor){
return switch(sensor){
case buildX, buildY -> unit.sense(sensor);
default -> super.sense(sensor);
};
}
@Override
public Object senseObject(LAccess sensor){
return switch(sensor){
case building, breaking -> unit.senseObject(sensor);
default -> super.senseObject(sensor);
};
}
}
}