diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 3adb752..0c1c6a2 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -1,1125 +1,1183 @@ -block.meld-sunder.name = Sunder -block.meld-sunder.description = Fires clumps of Debris flak at enemy targets.\n[accent]Sticks shrapnel in targets![] +block.meld2-sunder.name = Sunder +block.meld2-sunder.description = Fires clumps of Debris flak at enemy targets.\n[accent]Sticks shrapnel in targets![] +block.meld2-sunder.details = Animated by a ball of [meld2-aether]Aether[]; I'd joke about not scaring the lil goober but it doesn't have any feelings. -block.meld-shredstorm.name = Shredstorm -block.meld-shredstorm.description = Sprays debris shrapnel or silver buckshot at enemy targets.\n[accent]Spread is focused towards the aim direction. +block.meld2-shredstorm.name = Shredstorm +block.meld2-shredstorm.description = Sprays debris shrapnel or silver buckshot at enemy targets.\n[accent]Spread is focused towards the aim direction. +block.meld2-shredstorm.details = Sunder's cousin. -block.meld-flurry.name = Flurry -block.meld-flurry.description = Charges and flings canisters of sticky Carbolith dust which spark on a delay.\n[accent]High damage vs force projectors[]\n\n[red]Warning: Putting hard matterials with sludge in will clog the machinery![]\n\n[accent]Armored![] +block.meld2-flurry.name = Flurry +block.meld2-flurry.description = Charges and flings canisters of sticky Carbolith dust which spark on a delay.\n[accent]High damage vs force projectors[]\n\n[red]Warning: Putting hard matterials with sludge in will clog the machinery![]\n\n[accent]Armored![] -block.meld-molotov.name = Molotov -block.meld-molotov.description = Launches an [#cbdbfc]Aspect[]-filled Silver shell at ground targets over long distances, blasting shrapnel out of targets for extra damage. \n[accent]High armor piercing damage on impact.\nDoubles the damage armoured units take![] +block.meld2-molotov.name = Molotov +block.meld2-molotov.description = Launches an [#cbdbfc]Aspect[]-filled Silver shell at ground targets over long distances, blasting shrapnel out of targets for extra damage. \n[accent]High armor piercing damage on impact.\nDoubles the damage armoured units take![] -block.meld-grandeur.name = Grandeur -block.meld-grandeur.description = Flings a compacted ball of material at targets. over long distances \n[accent]Small amounts of armor piercing on hit\n\nEffects vary based on ammo type[] +block.meld2-grandeur.name = Grandeur +block.meld2-grandeur.description = Flings a compacted ball of material at targets. over long distances \n[accent]Small amounts of armor piercing on hit\n\nEffects vary based on ammo type[] -block.meld-downpour.name = Downpour -block.meld-downpour.description = Barages ground targets with 30 [#89828c]Mercury[]-filled Silver thorns each burst. Slow reload speed. \n[accent]High burst damage and armor piercing. Inflicts Mercury Poisoning![] +block.meld2-downpour.name = Downpour +block.meld2-downpour.description = Barages ground targets with 30 [#89828c]Mercury[]-filled Silver thorns each burst. Slow reload speed. \n[accent]High burst damage and armor piercing. Inflicts Mercury Poisoning![] -block.meld-vivalo.name = Vivalo -block.meld-vivalo.description = Atomizes and fires a jet of crystalline particles which pierce armor. [accent]\n\nQuick rotation speed and increased coolant effectiveness.\n\nEffects vary based on ammo type, ranging from Laceration to Shattering[] -block.meld-vivalo.details = This design was cut down to be as light as possible to be quickly cosntructed and deployed. Crystals would be crushed in the base, stored in the drum for quick feeding and then be accellerated. The drum was placed on the opposite side of the accelerator to shift the center of mass towards the middle, enabling quick turning. The design's fragility was easly compensated for with walls from its front, but sustained fire would quickly destroy it. +block.meld2-vivalo.name = Vivalo +block.meld2-vivalo.description = Atomizes and fires a jet of crystalline particles which pierce armor. [accent]\n\nQuick rotation speed and increased coolant effectiveness.\n\nEffects vary based on ammo type, ranging from Laceration to Shattering[] +block.meld2-vivalo.details = This design was cut down to be as light as possible to be quickly constructed and deployed. Crystals would be crushed in the base, stored in the drum for quick feeding and then be accelerated. The drum was placed on the opposite side of the accelerator to shift the center of mass towards the middle, enabling quick turning. The design's fragility was easily compensated for with walls from its front, but sustained fire would quickly destroy it. -block.meld-vivisection.name = Vivisection -block.meld-vivisection.description = Assembles and launches [#4bb66b]Resonarum[] sawblades.\n[accent]Lacerates targets without armor[] +block.meld2-vinca.name = Vinca +block.meld2-vinca.description = Sprays down targets with high pressured armor piercing crystalline particulate suspended in [#cbdbfc]Aspect[].\n[accent]Sticks shrapnel in targets![] -block.meld-tantrum.name = Tantrum -block.meld-tantrum.description = Compacts and puffs out clouds of [#8872da]Rift[] using a Silver piston, dealing heavy knockback.\n[accent]Reduces target's drag[] +block.meld2-vivisection.name = Vivisection +block.meld2-vivisection.description = Assembles and launches [#4bb66b]Resonarum[] sawblades.\n[accent]Lacerates targets without armor[] -block.meld-earthbound-infuser.name = Earthbound Infuser -block.meld-earthbound-infuser.description = Infuses Debris with vent fumes to synthesize Carbolith.\n\nRequires [#cbdbfc]Aspect[] to run, can siphon [#5b4739]Fumes[] from vents. +block.meld2-tantrum.name = Tantrum +block.meld2-tantrum.description = Compacts and puffs out clouds of [#8872da]Rift[] using a Silver piston, dealing heavy knockback.\n[accent]Reduces target's drag[] -block.meld-gas-kiln.name = Gas-fired Kiln -block.meld-gas-kiln.description = Heats materials using [#cbdbfc]Aspect[], often used for [red]primitive[] refinement processes like smelting or ceramic blasting.\n\n[accent]Carbolith + Tenbris -> Shadesteel + [#5b4739]Fumes[]\nSilver -> Annealed Silver\n\nClay-Mallows + Quartz Strata + Likestone Sediments -> Glassy-Mallows\n\nClay-Mallows + Likestone Sediments + Likestone Sediments + Debris -> Crucible-Plating\nDebris + Shadesteel -> Crucible Platings +block.meld2-earthbound-infuser.name = Earthbound Infuser +block.meld2-earthbound-infuser.description = Infuses Debris with vent fumes to synthesize Carbolith.\n\nRequires [#cbdbfc]Aspect[] to run, can siphon [#5b4739]Fumes[] from vents. +block.meld2-gas-kiln.name = Gas-fired Kiln +block.meld2-gas-kiln.description = Heats materials using [#cbdbfc]Aspect[], often used for [red]primitive[] refinement processes like smelting or ceramic blasting.\n\n[accent]Carbolith + Tenbris -> Shadesteel + [#5b4739]Fumes[]\nSilver -> Annealed Silver\n\nClay-Mallows + Quartz Strata + Likestone Sediments -> Glassy-Mallows\n\nClay-Mallows + Likestone Sediments + Debris -> Crucible-Plating\nDebris + Shadesteel -> Crucible Platings -block.meld-rotary-kiln.name = Rotary Kiln -block.meld-rotary-kiln.description = Burns mass amounts of [#cbdbfc]Aspect[] as fuel, heats materials to process them in bulk.\n\n[accent]Carbolith + Tenbris -> Shadesteel + [#5b4739]Fumes[]\nSilver -> Annealed Silver\n\nClay-Mallows + Quartz Strata + Likestone Sediments -> Glassy-Mallows\n\nClay-Mallows + Likestone Sediments + Likestone Sediments + Debris -> Crucible-Plating\nDebris + Shadesteel -> Crucible Platings +block.meld2-rotary-kiln.name = Rotary Kiln +block.meld2-rotary-kiln.description = Burns mass amounts of [#cbdbfc]Aspect[] as fuel, heats materials to process them in bulk.\n\n[accent]Carbolith + Tenbris -> Shadesteel + [#5b4739]Fumes[]\nSilver -> Annealed Silver\n\nClay-Mallows + Quartz Strata + Likestone Sediments -> Glassy-Mallows\n\nClay-Mallows + Likestone Sediments + Debris -> Crucible-Plating\nDebris + Shadesteel -> Crucible Platings -block.meld-pneumatic-extruder.name = Pneumatic Extruder -block.meld-pneumatic-extruder.description = Extrudes material into pipes, uses [#cbdbfc]Aspect[] to run. [accent]\n\nDebris + Elnar -> Aspect Pipe\n\nSilver/Annealed Silver + Debris -> Aspect Pipe +block.meld2-pneumatic-extruder.name = Pneumatic Extruder +block.meld2-pneumatic-extruder.description = Extrudes material into pipes and capsules, uses [#cbdbfc]Aspect[] to run. [accent]\n\nDebris + Elnar -> Aspect Pipe\n\nSilver/Annealed Silver + Debris -> Aspect Pipe\n\nGlassy-Mallows + Silver/Annealed Silver + Storming Aspect -> [red]Aspect Bombs[] +block.meld2-storm-iris.name = Storm Iris +block.meld2-storm-iris.description = Converts stable [meld2-aether]Aether[] into charged [meld2-thundering-aether]Thundering Aether[] +block.meld2-storm-iris.details = The storm is here.\n\n[red]PANIC[]\n\nTides washed upon the Bassalt Groves, but it would not falter.\n\nHeavy rains of biomass and crystals peltered the roofs of the facility, but it would not falter.\n\nThen came the void...\n\nThe flooding was never preventable, it was inevitable.\n\nBasalt groves filled with light.\nForgotten and entombed yet in the night... -block.meld-heating-basin.name = Heating Basin -block.meld-heating-basin.description = Runs [#b89f47]Nectar[] through pipes laced with Carbolith dust over geothermal sources to extract [#89828c]Mercury[], producing loads of Debris as a byproduct. +block.meld2-heating-basin.name = Heating Basin +block.meld2-heating-basin.description = Runs [#b89f47]Nectar[] through pipes laced with Carbolith dust over geothermal sources to extract [#89828c]Mercury[], producing loads of Debris as a byproduct. -block.meld-peat-masher.name = Peat Masher -block.meld-peat-masher.description = Grinds up Compacted Masses extracting Bramble Vines and Starving Masses in the process.\n\nRequires [#cbdbfc]Aspect[] and [#89828c]Mercury[] to run. Acts as a fluid router for [#89828c]Mercury[] and [#cbdbfc]Aspect[].\n\n[accent]Becomes net positive on [#89828c]Mercury[] when operated over geothermal sources[] +block.meld2-peat-masher.name = Peat Masher +block.meld2-peat-masher.description = Grinds up Compacted Masses extracting Bramble Vines and Starving Masses in the process.\n\nRequires [#cbdbfc]Aspect[] and [#89828c]Mercury[] to run. Acts as a fluid router for [#89828c]Mercury[] and [#cbdbfc]Aspect[].\n\n[accent]Becomes net positive on [#89828c]Mercury[] when operated over geothermal sources[] -block.meld-bramble-press.name = Bramble Press -block.meld-bramble-press.description = Presses Bramble vines for [#89828c]Mercury[], producing tiny amounts of [#89413e]Ooze[]. Acts as a fluid router for [#89828c]Mercury[]\n\n[accent]Plated[] +block.meld2-bramble-press.name = Bramble Press +block.meld2-bramble-press.description = Presses Bramble vines for [#89828c]Mercury[], producing tiny amounts of [#89413e]Ooze[]. Acts as a fluid router for [#89828c]Mercury[]\n\n[accent]Plated[] -block.meld-electrum-amalgamator.name = Electrum Amalgamator -block.meld-electrum-amalgamator.description = Directly blasts native gold deposits with [#cbdbfc]Aspect[], using [#89828c]Mercury[] to extract an amalgam from the powder, then combines the mush with Silver and Debris to create Electrum.\n\nProduces some [#e6c700]Ichor[] as a byproduct.\n\n[accent]Input liquid requirements based on efficiency. -block.meld-electrum-amalgamator.details = An alternative to mining Electrum off the walls. Though not very efficient, itt'll have to do. +block.meld2-electrum-amalgamator.name = Electrum Amalgamator +block.meld2-electrum-amalgamator.description = Directly blasts native gold deposits with [#cbdbfc]Aspect[], using [#89828c]Mercury[] to extract an amalgam from the powder, then combines the mush with Silver and Debris to create Electrum.\n\nProduces some [#e6c700]Ichor[] as a byproduct.\n\n[accent]Input liquid requirements based on efficiency. +block.meld2-electrum-amalgamator.details = An alternative to mining Electrum off the walls. Though not very efficient, itt'll have to do. -block.meld-amalgam-decomposer.name = Amalgam Decomposer -block.meld-amalgam-decomposer.description = Grinds Electrum down and blasts it using high amounts of [#cbdbfc]Aspect[] till the remainder is pieces of Debris and [#e6c700]Ichor[]. -block.meld-amalgam-decomposer.details = Doesn't it look happier?\nI guess so, but what's that to the right?\nWeren't you told? That's a dissonitre crystal.\n...Isn't that what they powder up at the-\n[red][] +block.meld2-amalgam-decomposer.name = Amalgam Decomposer +block.meld2-amalgam-decomposer.description = Grinds Electrum down and blasts it using high amounts of [#cbdbfc]Aspect[] till the remainder is pieces of Debris and [#e6c700]Ichor[]. +block.meld2-amalgam-decomposer.details = Doesn't it look happier?\nI guess so, but what's that to the right?\nWeren't you told? That's a dissonitre crystal.\n...Isn't that what they powder up at the-\n[red][] -block.meld-dissonance-inducer.name = Dissonance Inducer -block.meld-dissonance-inducer.description = Mimics a sedentary Dissonitre incubation environment for [#ea9ad6]Meld[], growing batches of crystals, and offgassing some [#cb8650]Aether[] in the process.\n\nRequires Resonarum and [#8872da]Rift[] to run. +block.meld2-dissonance-inducer.name = Dissonance Inducer +block.meld2-dissonance-inducer.description = Mimics a sedentary Dissonitre incubation environment for [#ea9ad6]Meld[], growing batches of crystals, and offgassing some [#cb8650]Aether[] in the process.\n\nRequires Resonarum and [#8872da]Rift[] to run. -block.meld-warp-aggregator.name = Warp Aggregator -block.meld-warp-aggregator.description = Processes massive batches of glass waste over [accent]heat sources[] producing [#b460e2]Warp[].\n\nReturns noteable amounts of useful glass materials. -block.meld-warp-aggregator.details = ...it's a box.\n\na box which crafts\n\na crate?\n\nwell I suppose it's quite the crafty crate... +block.meld2-warp-aggregator.name = Warp Aggregator +block.meld2-warp-aggregator.description = Processes massive batches of glass waste over [accent]heat sources[] producing [#b460e2]Warp[].\n\nReturns noteable amounts of useful glass materials. +block.meld2-warp-aggregator.details = ...it's a box.\n\na box which crafts\n\na crate?\n\nwell I suppose it's quite the crafty crate... -block.meld-glassblower.name = Glassblower -block.meld-glassblower.description = Melts down globules and extrudes them into a fine crystalline cloth, releasing [#cb8650]Aether[] in the process.\n\nRequires Riplom and power to run.\n\n[accent]Input liquid requirements based on efficiency.[] +block.meld2-glassblower.name = Glassblower +block.meld2-glassblower.description = Melts down globules and extrudes them into a fine crystalline cloth, releasing [#cb8650]Aether[] in the process.\n\nRequires Riplom and power to run.\n\n[accent]Input liquid requirements based on efficiency.[] -block.meld-vitric-weaver.name = Vitric Weaver -block.meld-vitric-weaver.description = Weaves Dissonitre into a fine crystalline cloth.\n\nUntangles [#8872da]Rift[] input into [#cb8650]Aether[] in the process, requiring Riplom to run.\n\n[accent]Input liquid requirements based on efficiency.[] +block.meld2-vitric-weaver.name = Vitric Weaver +block.meld2-vitric-weaver.description = Weaves Dissonitre into a fine crystalline cloth.\n\nUntangles [#8872da]Rift[] input into [#cb8650]Aether[] in the process, requiring Riplom to run.\n\n[accent]Input liquid requirements based on efficiency.[] -block.meld-brick-conglomerator.name = Conglomeration Rig -block.meld-brick-conglomerator.description = Crushes up Carbolith and mixes it with vent fumes and [#e6c700]Ichor[], then presses the slurry into Bricks. Requires [#cbdbfc]Aspect[] to run. +block.meld2-brick-conglomerator.name = Conglomeration Rig +block.meld2-brick-conglomerator.description = Crushes up Carbolith and mixes it with vent fumes and [#e6c700]Ichor[], then presses the slurry into Bricks. Requires [#cbdbfc]Aspect[] to run. -block.meld-silver-husk.name = Silver Husk -block.meld-silver-husk.description = Buildable, [accent]insulated[] protection. Slowly regenerates when fed [#cbdbfc]Aspect[].\n\n[accent]Plated[] +block.meld2-silver-husk.name = Silver Husk +block.meld2-silver-husk.description = Buildable, [accent]insulated[] protection. Slowly regenerates when fed [#cbdbfc]Aspect[].\n\n[accent]Plated[] -block.meld-shadesteel-shingles.name = Shadesteel Shingles -block.meld-shadesteel-shingles.description = Mundane and bulky. -block.meld-shadesteel-shingles.details = Brick of Shadesteel bricks of Shadesteel ingots. +block.meld2-shadesteel-shingles.name = Shadesteel Shingles +block.meld2-shadesteel-shingles.description = Mundane and bulky. +block.meld2-shadesteel-shingles.details = Brick of Shadesteel bricks of Shadesteel ingots. -block.meld-barricade.name = Barricade -block.meld-barricade.description = Provides cover against enemy projectiles.\nQuick to build.\n\nEasy way to store Compacted Bricks/Stony Gloop outside of the core for onsite use.\n\n[accent]Armored.[] +block.meld2-barricade.name = Barricade +block.meld2-barricade.description = Provides cover against enemy projectiles.\nQuick to build.\n\nEasy way to store Compacted Bricks/Stony Gloop outside of the core for onsite use.\n\n[accent]Armored.[] -block.meld-sandbank.name = Sandbank -block.meld-sandbank.description = Provides cover against enemy projectiles.\nSoaks a lot of damage, but takes extra damage each hit.\n\n[red]Squishi! (45)[] -block.meld-sandbank.details = If pink sludge can build walls out of clay, why can't we!\nBecause... I see your point +block.meld2-sandbank.name = Sandbank +block.meld2-sandbank.description = Provides cover against enemy projectiles.\nSoaks a lot of damage, but takes extra damage each hit.\n\n[red]Squishi! (45)[] +block.meld2-sandbank.details = If pink sludge can build walls out of clay, why can't we!\nBecause... I see your point -block.meld-nullifier.name = [red]Nullifier -block.meld-nullifier.description = Constructs a devistating [#cbdbfc]Aspect[]-filled paylod that [red]decimates[] hostile buildings and units alike.\n\n[red]Annihilates its immediate surroundings on destruction, don't get too close![] +block.meld2-nullifier.name = [red]Nullifier +block.meld2-nullifier.description = Constructs a devistating [#cbdbfc]Aspect[]-filled paylod that [red]decimates[] hostile buildings and units alike.\n\n[red]Annihilates its immediate surroundings on destruction, don't get too close![] -block.meld-sonar-spire.name = Sonar Spire -block.meld-sonar-spire.description = Provides vission and [accent]Rallies[] nearby units. -block.meld-sonar-spire.details = Initially an aether flarestack build to help travelers find their way, morphed into an important building to rally biological and mechanical troops alike. +block.meld2-sonar-spire.name = Sonar Spire +block.meld2-sonar-spire.description = Provides vission and [accent]Rallies[] nearby units. +block.meld2-sonar-spire.details = Initially an aether flarestack build to help travelers find their way, morphed into an important building to rally biological and mechanical troops alike. -block.meld-movement-anchor.name = Movement Anchor -block.meld-movement-anchor.description = Targets and [accent]Anchor[]s enemy units. +block.meld2-movement-anchor.name = Movement Anchor +block.meld2-movement-anchor.description = Targets and [accent]Anchor[]s enemy units. -block.meld-gauze.name = Gauze -block.meld-gauze.description = Weaves a [accent]Resonarum[] thread using [#5b4739]Fumes[], automatically applying it to connected blocks. +block.meld2-gauze.name = Gauze +block.meld2-gauze.description = Weaves a [accent]Resonarum[] thread using [#5b4739]Fumes[], automatically applying it to connected blocks. -block.meld-bruisekit.name = Bruisekit -block.meld-bruisekit.description = Regenerates target block's health.\n\nPrioritises large, functional blocks and works at half speed on 1x1s.\n\nHeals up to 4x more health based on how low target health% is, down to 50%. +block.meld2-bruisekit.name = Bruisekit +block.meld2-bruisekit.description = Regenerates target block's health.\n\nPrioritises large, functional blocks and works at half speed on 1x1s.\n\nHeals up to 4x more health based on how low target health% is, down to 50%. -block.meld-mercurial-diffuser.name = Mercurial Diffuser -block.meld-mercurial-diffuser.description = Puffs clouds which intoxicate [#ea9ad6]Meld[] units. Applies a coating of [#89828c]Mercury[] to allied units. +block.meld2-lamp-psi.name = Lamp Psi +block.meld2-lamp-psi.description = WHAT DO YOU MEAN IT'S CALLED A LAMP PSI, WASN'T "I AM PSI" CONFUSING ENOUGH\n\n[gray]yeah, duh, it's a cruel joke\n\ngod, the engineering team is so st-\n\ngal, don't get yourself exported to colony's reach\n\nI hate this fucking job[]\n\nA wall made from Iampsi... "becomes radiant" when given As-\n[gray]ok fuck this im not doing it anymore, get me out of *wheezing*\n\n\n[red][] +block.meld2-lamp-psi.details = God is dead. -block.meld-ping-tower.name = Ping Tower -block.meld-ping-tower.description = uses debris pieces to fire a burst of snoar pings which highlight enemies hit through fog.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. -block.meld-ping-tower.details = Whilst unable to rally allies, it helped give vital information on the [#ea9ad6]Meld[]'s whereabouts. Finding openings in an attack wave may prove vital to the survival of a task force. +block.meld2-mercurial-diffuser.name = Mercurial Diffuser +block.meld2-mercurial-diffuser.description = Puffs clouds which intoxicate [#ea9ad6]Meld[] units. Applies a coating of [#89828c]Mercury[] to allied units. -block.meld-overseer-fabricator.name = Overseer Fabricator -block.meld-overseer-fabricator.description = Uses debris pieces to passively fabricate limited-duration [accent]Overseers[] to assist in nearby construction and [accent]Rally[] nearby allies.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. -block.meld-overseer-fabricator.details = An older model of the sonar spire.\nThough low, the debris upkeep ended up being too restrictive for certain locations, so a new building was developed to help unshroud areas of importance. +block.meld2-ping-tower.name = Ping Tower +block.meld2-ping-tower.description = uses debris pieces to fire a burst of snoar pings which highlight enemies hit through fog.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. +block.meld2-ping-tower.details = Whilst unable to rally allies, it helped give vital information on the [#ea9ad6]Meld[]'s whereabouts. Finding openings in an attack wave may prove vital to the survival of a task force. -block.meld-fluid-sprayer.name = Fluid Sprayer -block.meld-fluid-sprayer.description = Continually charges up and fires a burst of pellets that spread liquid as they travel.\n[accent]Only functions above 75% pressure![] +block.meld2-overseer-fabricator.name = Overseer Fabricator +block.meld2-overseer-fabricator.description = Uses debris pieces to passively fabricate limited-duration [accent]Overseers[] to assist in nearby construction and [accent]Rally[] nearby allies.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. +block.meld2-overseer-fabricator.details = An older model of the sonar spire.\nThough low, the debris upkeep ended up being too restrictive for certain locations, so a new building was developed to help unshroud areas of importance. -block.meld-environmental-drencher.name = Environmental Drencher -block.meld-environmental-drencher.description = Continually charges up and fires a ring of pellets that spread liquid as they travel.\n[accent]Only functions above 83% pressure![] +block.meld2-fluid-sprayer.name = Fluid Sprayer +block.meld2-fluid-sprayer.description = Continually charges up and fires a burst of pellets that spread liquid as they travel.\n[accent]Only functions above 75% pressure![] -block.meld-chute.name = Chute -block.meld-chute.description = Transports items fowards. Only holds a single item. +block.meld2-environmental-drencher.name = Environmental Drencher +block.meld2-environmental-drencher.description = Continually charges up and fires a ring of pellets that spread liquid as they travel.\n[accent]Only functions above 83% pressure![] -block.meld-glasswork-chute.name = Glasswork Chute -block.meld-glasswork-chute.description = Forms, then transports batches of items. Conducts power like a wire, double in speed while fed. -block.meld-glasswork-chute.details = You wanted a better chute? You've got one now.\n +block.meld2-chute.name = Chute +block.meld2-chute.description = Transports items fowards. Only holds a single item. -block.meld-chute-router.name = Chute Router -block.meld-chute-router.description = Routes items to three sides. Only accepts items from the back. Can be configured as a sorter. +block.meld2-plated-chute.name = Plated Chute +block.meld2-plated-chute.description = Transports items fowards, blocks items from non-distrib blocks at the sides. Only holds a single item.\n\n[accent]Plated[] -block.meld-chute-crossing.name = Chute Crossing -block.meld-chute-crossing.description = Lets items cross through without intersecting with eachother. +block.meld2-glasswork-chute.name = Glasswork Chute +block.meld2-glasswork-chute.description = Forms, then transports batches of items. Conducts power like a wire, double in speed while fed. +block.meld2-glasswork-chute.details = You wanted a better chute? You've got one now.\n -block.meld-chute-overflow.name = Chute Overflow -block.meld-chute-overflow.description = Routes items to the front, or to the sides if blocked. \n\nAccepts items from the back, or the sides if empty. +block.meld2-chute-router.name = Chute Router +block.meld2-chute-router.description = Routes items to three sides. Only accepts items from the back. Can be configured as a sorter. -block.meld-chute-bridge.name = Chute Bridge -block.meld-chute-bridge.description = Moves items over a single tile. Bypasses structures and terrain. +block.meld2-chute-crossing.name = Chute Crossing +block.meld2-chute-crossing.description = Lets items cross through without intersecting with eachother. -block.meld-chute-unloader.name = Chute Unloader -block.meld-chute-unloader.description = Unloads selected item out of adjacent blocks.\n[accent]Works on cores![] +block.meld2-chute-overflow.name = Chute Overflow +block.meld2-chute-overflow.description = Routes items to the front, or to the sides if blocked. \n\nAccepts items from the back, or the sides if empty. -block.meld-unloading-hub.name = Unloading Hub -block.meld-unloading-hub.description = Rapidly unloads the selected item out of adjacent blocks.\n[accent]Heavly Armored![]\n\n[]Works on cores![]\n\n[red]Damages all neary buildings on destruction![] -block.meld-unloading-hub.details = This will cost [#cbdbfc]Aspect[] to run in the java port, hehehe~ +block.meld2-chute-bridge.name = Chute Bridge +block.meld2-chute-bridge.description = Moves items over a single tile. Bypasses structures and terrain. -block.meld-channel-face.name = Channel Face -block.meld-channel-face.description = Acts as a fluid junction. Transmits fluid without storing it. No risk of explosion. +block.meld2-chute-unloader.name = Chute Unloader +block.meld2-chute-unloader.description = Unloads selected item out of adjacent blocks.\n[accent]Works on cores![] -block.meld-channel-node.name = Channel Node -block.meld-channel-node.description = Acts as a fluid router. Fluids can be input or output from any side. Stores a small amount of fluid. +block.meld2-unloading-hub.name = Unloading Hub +block.meld2-unloading-hub.description = Rapidly unloads the selected item out of adjacent blocks.\n[accent]Heavly Armored![]\n\n[]Works on cores![]\n\n[red]Damages all neary buildings on destruction![] +block.meld2-unloading-hub.details = This will cost [#cbdbfc]Aspect[] to run in the java port, hehehe~ -block.meld-aspect-outlet.name = Aspect Outlet -block.meld-aspect-outlet.description = Decompresses [#cb8650]Aether[] into highly volatile [#cbdbfc]Aspect[] at a ratio of 1:10.\n\nWorks as an output terminal for a fluid network. +block.meld2-channel-face.name = Channel Face +block.meld2-channel-face.description = Acts as a fluid junction. Transmits fluid without storing it. No risk of explosion. -block.meld-aspect-channel.name = Aspect Channel -block.meld-aspect-channel.description = Acts as a directional router.\n\nWhen transporting [#cb8650]Aether[], fills nearby buildings with highly volatile [#cbdbfc]Aspect[].\n\nWorks as an insulated input/output terminal for a fluid network.\n\n[accent]Plated![] +block.meld2-channel-node.name = Channel Node +block.meld2-channel-node.description = Acts as a fluid router. Fluids can be input or output from any side. Stores a small amount of fluid. -block.meld-pressure-vent.name = Pressure Vent -block.meld-pressure-vent.description = Acts as a fluid router. Releases stored vapor into the atmosphere. +block.meld2-aspect-outlet.name = Aspect Outlet +block.meld2-aspect-outlet.description = Decompresses [#cb8650]Aether[] into highly volatile [#cbdbfc]Aspect[] at a ratio of 1:10.\n\nWorks as an output terminal for a fluid network. -block.meld-manual-valve.name = Manual Valve -block.meld-manual-valve.description = Acts as a fluid junction. Can be toggled to control if fluids can pass through. +block.meld2-aspect-channel.name = Aspect Channel +block.meld2-aspect-channel.description = Acts as a directional router.\n\nWhen transporting [#cb8650]Aether[], fills nearby buildings with highly volatile [#cbdbfc]Aspect[].\n\nWorks as an insulated input/output terminal for a fluid network.\n\n[accent]Plated![] -block.meld-intake-valve.name = Intake Valve -block.meld-intake-valve.description = Acts as a fluid junction. Can be toggled to control if fluids can pass through.\n\n[accent]Can compact/de-compact incoming sources of fluids into the channel network.[]\n\n[accent]Plated![] -block.meld-intake-valve.details = Yes, it works. +block.meld2-aspect-bomb.name = Aspect Bomb +block.meld2-aspect-bomb.description = Have you ever tried using a channel director on a node full of aspect? Like Yeah, that's a standardised building now.\n\n[gray]Who thought shoving a bunch of explosive capsules in a pipe would be so effective... +block.meld2-aspect-bomb.details = Apparently like the annealed silver and glass for like the channels comes from the bombs themselves, isn't that crazy? -block.meld-valve-controller.name = Valve Controller -block.meld-valve-controller.description = Acts as a fluid junction. Enables the targeted block when surrounded by blocks with fluids over its threshold.\n\nThreshold/State can be configured. -block.meld-valve-controller.details = Scidustry players, Ikaru is calling YOU. +block.meld2-pressure-vent.name = Pressure Vent +block.meld2-pressure-vent.description = Acts as a fluid router. Releases stored vapor into the atmosphere. -block.meld-channel-director.name = Channel Director -block.meld-channel-director.description = When used with other fluid blocks, [red]restricts[] the flow of fluids to one direction only. +block.meld2-manual-valve.name = Manual Valve +block.meld2-manual-valve.description = Acts as a fluid junction. Can be toggled to control if fluids can pass through. -block.meld-pipebox.name = Pipebox -block.meld-pipebox.description = Routes fluids to the sides.\n\nCan be toggled to rotate the connections. +block.meld2-intake-valve.name = Intake Valve +block.meld2-intake-valve.description = Acts as a fluid junction. Can be toggled to control if fluids can pass through.\n\n[accent]Can compact/de-compact incoming sources of fluids into the channel network.[]\n\n[accent]Plated![] +block.meld2-intake-valve.details = Yes, it works. -block.meld-channel-director-pressurized.name = Pressurized Channel Director -block.meld-channel-director-pressurized.description = Acts as a conduit. Transmits fluid from one side to the other. Stores a tiny amount of fluid.\n[accent]Transports at 200% pressure.[]\n\n[red]Will chain destruct![] +block.meld2-valve-controller.name = Valve Controller +block.meld2-valve-controller.description = Acts as a fluid junction. Enables the targeted block when surrounded by blocks with fluids over its threshold.\n\nThreshold/State can be configured. +block.meld2-valve-controller.details = Scidustry players, Ikaru is calling YOU. -block.meld-blossoming-channel.name = Blossoming Channel -block.meld-blossoming-channel.description = Acts as a conduit. Transmits fluid from one side to the other. Stores a small amount of fluid.\n[accent]Transports at 500% pressure.[]\n\n[red]Will chain destruct![] +block.meld2-channel-director.name = Channel Director +block.meld2-channel-director.description = When used with other fluid blocks, [red]restricts[] the flow of fluids to one direction only. -block.meld-compartmentalized-node.name = Compartmentalized Node -block.meld-compartmentalized-node.description = Acts as a fluid router. Liquid can be input or output from any side.\n\nSeparately stores [#b89f47]Nectar[], [#89828c]Mercury[], [#7d312f]Blood[] and [#89413e]Ooze[]. When supplied Debris while full with all four fluids, slowly voids its contents. -block.meld-compartmentalized-node.details = Yes, it's dumb that the name goes one character off the UI frag. I'm triggered by this too. +block.meld2-pipebox.name = Pipebox +block.meld2-pipebox.description = Routes fluids to the sides.\n\nCan be toggled to rotate the connections. -block.meld-channel-hub.name = Channel Hub -block.meld-channel-hub.description = Acts as a fluid router. Liquid can be input or output from any side.\n\nStores 100 nodes worth of fluid.\n\n[accent]Plated![] +block.meld2-channel-director-pressurized.name = Pressurized Channel Director +block.meld2-channel-director-pressurized.description = Acts as a conduit. Transmits fluid from one side to the other. Stores a tiny amount of fluid.\n[accent]Transports at 200% pressure.[]\n\n[red]Will chain destruct![] -block.meld-filtration-unit.name = Filtration Unit -block.meld-filtration-unit.description = Acts as a filter. Outputs [#89828c]Mercury[] to any side.\n\nWhen powered with [#cbdbfc]Aspect[] while containing [#89828c]Mercury[], filters out Debris and Starving masses from [#7d312f]Blood[] and [#b89f47]Nectar[], producing some [#89828c]Mercury[] in the process.\n\n[accent]Halts when fully pressurized with [#89828c]Mercury[]![] +block.meld2-blossoming-channel.name = Blossoming Channel +block.meld2-blossoming-channel.description = Acts as a conduit. Transmits fluid from one side to the other. Stores a small amount of fluid.\n[accent]Transports at 500% pressure.[]\n\n[red]Will chain destruct![] -block.meld-neutralization-chamber.name = Neutralization Chamber -block.meld-neutralization-chamber.description = Uses [#89828c]Mercury[] and Elderflesh to soak up [#7d312f]Blood[], producing miniscule amounts of power in the process.\nActs as a fluid router for [#7d312f]Blood[].\n\n[scarlet]Explodes when fully pressurized with [#7d312f]Blood[]![] +block.meld2-compartmentalized-node.name = Compartmentalized Node +block.meld2-compartmentalized-node.description = Acts as a fluid router. Liquid can be input or output from any side.\n\nSeparately stores [#b89f47]Nectar[], [#89828c]Mercury[], [#7d312f]Blood[] and [#89413e]Ooze[]. When supplied Debris while full with all four fluids, slowly voids its contents. +block.meld2-compartmentalized-node.details = Yes, it's dumb that the name goes one character off the UI frag. I'm triggered by this too. -block.meld-conductive-pile.name = Conductive Pile -block.meld-conductive-pile.description = It's a pile of electrum coils which is conductive. Go figure what you can use this for.\n\n[accent]And I guess it stores a tiny bit of power[]\n\n[red]...Squishi? (80)[] +block.meld2-channel-hub.name = Channel Hub +block.meld2-channel-hub.description = Acts as a fluid router. Liquid can be input or output from any side.\n\nStores 100 nodes worth of fluid.\n\n[accent]Plated![] -block.meld-connector.name = Connector -block.meld-connector.description = Projects lasers which share power between the node and its target.\n\n[accent]Plated[] +block.meld2-filtration-unit.name = Filtration Unit +block.meld2-filtration-unit.description = Acts as a filter. Outputs [#89828c]Mercury[] to any side.\n\nWhen powered with [#cbdbfc]Aspect[] while containing [#89828c]Mercury[], filters out Debris and Starving masses from [#7d312f]Blood[] and [#b89f47]Nectar[], producing some [#89828c]Mercury[] in the process.\n\n[accent]Halts when fully pressurized with [#89828c]Mercury[]![] -block.meld-substation.name = Substation -block.meld-substation.description = Projects lasers which share power between the station and its target. Stores power in an internal buffer.\n\n[accent]Plated![] +block.meld2-neutralization-chamber.name = Neutralization Chamber +block.meld2-neutralization-chamber.description = Uses [#89828c]Mercury[] and Elderflesh to soak up [#7d312f]Blood[], producing miniscule amounts of power in the process.\nActs as a fluid router for [#7d312f]Blood[].\n\n[scarlet]Explodes when fully pressurized with [#7d312f]Blood[]![] -block.meld-powerbank.name = Powerbank -block.meld-powerbank.description = Stores large amounts of power and releases it in times of defict. -block.meld-powerbank.details = Accumulates [#cb8650]Aether[] from the atmosphere as Dissonitre is stimulated, and burns it off as [#cbdbfc]Aspect[] when power runs dry.\n\nThere must be some structure which generates power directly from [#cbdbfc]Aspect[]... +block.meld2-conductive-pile.name = Conductive Pile +block.meld2-conductive-pile.description = It's a pile of electrum coils which is conductive. Go figure what you can use this for.\n\n[accent]And I guess it stores a tiny bit of power[]\n\n[red]...Squishi? (80)[] -block.meld-glass-burner.name = Glass Burner [red](PS) -block.meld-glass-burner.description = Burns Dissonitre based material with bits of Riplom stabalized with [#8872da]Rift[], producing minute amounts of power.\n\n[red]Paceholder sprite![] +block.meld2-connector.name = Connector +block.meld2-connector.description = Projects lasers which share power between the node and its target.\n\n[accent]Plated[] -block.meld-dissonance-discharger.name = Discharge Outlet [red](PS) -block.meld-dissonance-discharger.description = Crushes Dissonitre and focuses the resulting Aether into [#cbdbfc]Aspect[] efficiently using resonarum lenses, producing some power in the process.\n\n[scarlet]Explodes when fully pressurized with [#cbdbfc]Aspect[]![]\n\n[red]Placeholder Sprite![] +block.meld2-substation.name = Substation +block.meld2-substation.description = Projects lasers which share power between the station and its target. Stores power in an internal buffer.\n\n[accent]Plated![] + +block.meld2-powerbank.name = Powerbank +block.meld2-powerbank.description = Stores large amounts of power and releases it in times of defict. +block.meld2-powerbank.details = Accumulates [#cb8650]Aether[] from the atmosphere as Dissonitre is stimulated, and burns it off as [#cbdbfc]Aspect[] when power runs dry.\n\nThere must be some structure which generates power directly from [#cbdbfc]Aspect[]... + +block.meld2-glass-burner.name = Glass Burner [red](PS) +block.meld2-glass-burner.description = Burns Dissonitre based material with bits of Riplom stabalized with [#8872da]Rift[], producing minute amounts of power.\n\n[red]Paceholder sprite![] + +block.meld2-dissonance-discharger.name = Discharge Outlet [red](PS) +block.meld2-dissonance-discharger.description = Crushes Dissonitre and focuses the resulting Aether into [#cbdbfc]Aspect[] efficiently using resonarum lenses, producing some power in the process.\n\n[scarlet]Explodes when fully pressurized with [#cbdbfc]Aspect[]![]\n\n[red]Placeholder Sprite![] block.sludge-decomposer.name = Sludge Decomposer block.sludge-decomposer.description = Decomposes [#e6c700]Ichor[] and [#89413e]Ooze[], generating power and [#cbdbfc]Aspect[]. block.sludge-decomposer. -block.meld-purification-chamber.name = Purification Chamber -block.meld-purification-chamber.description = Blasts Starving Masses over high heat decomposing them into [#7d312f]Blood[], producing some power in the proceess.\n\nRequires [#89828c]Mercury[] and [#cbdbfc]Aspect[] to run.\n\n[scarlet]Explodes when fully pressurized with [#7d312f]Blood[]![] +block.meld2-purification-chamber.name = Purification Chamber +block.meld2-purification-chamber.description = Blasts Starving Masses over high heat decomposing them into [#7d312f]Blood[], producing some power in the proceess.\n\nRequires [#89828c]Mercury[] and [#cbdbfc]Aspect[] to run.\n\n[scarlet]Explodes when fully pressurized with [#7d312f]Blood[]![] -block.meld-thermo-matting.name = Thermo matting [red](PS)[] -block.meld-thermo-matting.description = Passively obtains power from meld digestion over [#e6c700]Ichor[] sources, extracting some [#e6c700]Ichor[] in the process.\n\n[red]PLACEHOLDER SPRITE[] -block.meld-thermo-matting.details = ...appears to be little to no waste left behind. +block.meld2-thermo-matting.name = Thermo matting [red](PS)[] +block.meld2-thermo-matting.description = Passively obtains power from meld digestion over [#e6c700]Ichor[] sources, extracting some [#e6c700]Ichor[] in the process.\n\n[red]PLACEHOLDER SPRITE[] +block.meld2-thermo-matting.details = ...appears to be little to no waste left behind. //Production -block.meld-aether-accumulator.name = Aether Accumulator -block.meld-aether-accumulator.description = Collects [#cb8650]Aether[] from suitable sources. +block.meld2-aether-accumulator.name = Aether Accumulator +block.meld2-aether-accumulator.description = Collects [#cb8650]Aether[] from suitable sources. + +block.meld2-fumehood.name = Fumehood +block.meld2-fumehood.description = Placed over sources of aspects or gasses. + +block.meld2-crystal-cracker.name = Crystal Cracker +block.meld2-crystal-cracker.description = Breaks open Dissonitre crystals over [accent]aspect soil[] as a source of [meld2-thundering-aether]Thundering Aether[].\n\nActs as a liquid router for its output between adjacent blocks. +block.meld2-crystal-cracker.details = ...mandatory "..." entry added in post recording in transcript + +block.meld2-crush-weaver.name = Crush Weaver +block.meld2-crush-weaver.description = "Efficiently" weaves Dissonitre into Vitric Mesh over [accent]aspect soil[]. Requires [#cbdbfc]Aspect[] to run. +block.meld2-crush-weaver.details = ...your guess as to how this building works is as good as mine + +block.meld2-aspect-discharger.name = Aspect Discharger +block.meld2-aspect-discharger.description = Converts [#cbdbfc]Aspect[]s to [accent]power[] over [accent]aspect soil[]. +block.meld2-aspect-discharger.details = ...alchemy magic bubllshit + +block.meld2-aether-vitrifier.name = Aether Vitrifier +block.meld2-aether-vitrifier.description = Grows Dissonitre with [#cbdbfc]Aether[] over [accent]aspect soil[] using [accent]power[]. +block.meld2-aether-vitrifier.details = ...less alchemy bullshit + +block.meld2-aether-cracker.name = Aether Cracker +block.meld2-aether-cracker.description = Cracks [#cb8650]Aether[] into [#8872da]Rift[] over [accent]ichor vents[]. Siphons some [#e6c700]Ichor[] in the process. Shares [#cb8650]Aether[] out the sides. \n\n[accent]Excess fluids are released to avoid overpressurizing [red]including input [#cb8650]Aether[]![].[] -block.meld-fumehood.name = Fumehood -block.meld-fumehood.description = Placed over sources of aspects or gasses. +block.meld2-vitric-stimulator-ruined.name = Vitric Stimu1ator [lightgray](Ruined)[] +block.meld2-vitric-stimulator.description = Harvests [#8872da]Rift[] from suitable sources using Vitric Meshes to filter the air, producing a small amount of glass waste.\n\nRequires Power to run.\n\n[orange]Inefficient, deconstruction is advised[] +block.meld2-vitric-stimulator.details = If only those vents could be harvested from... -block.meld-crystal-cracker.name = Crystal Cracker -block.meld-crystal-cracker.description = Breaks open Dissonitre crystals over [accent]aspect soil[] as a source of [#cb8650]Aether[]. +block.meld2-flarestack-filter.name = Flarestack Filter +block.meld2-flarestack-filter.description = Harvests [#8872da]Rift[] from suitable sources by neutralizing the impurities from the air.\n\nRequires Resonarum and Riplom to run. +block.meld2-flarestack-filter.details = Neutralizes the Aether content of an impure [accent]rift vent[] by focusing it into Aspect and combusting it with Riplom, but requires a constant supply of lenses to function. -block.meld-crush-weaver.name = Crush Weaver -block.meld-crush-weaver.description = "Efficiently" weaves Dissonitre into Vitric Mesh. Requires [#cbdbfc]Aspect[] to run. -block.meld-crush-weaver.details = ...your guess as to how this building works is as good as mine +block.meld2-filtrative-feeder.name = Filtrative Feeder +block.meld2-filtrative-feeder.description = Processes batches of [#e6c700]Ichor[] over [accent]meld floors[], aquiring some [#ea9ad6]Meld[] and pieces of Debris each batch processed.\n\nRequires a tiny trickle of power.\n\n[accent]Input liquid requirements based on efficiency. +block.meld2-filtrative-feeder.details = If you can't beat em... -block.meld-aether-cracker.name = Aether Cracker -block.meld-aether-cracker.description = Cracks [#cb8650]Aether[] into [#8872da]Rift[] over [accent]ichor vents[]. Siphons some [#e6c700]Ichor[] in the process. Shares [#cb8650]Aether[] out the sides. \n\n[accent]Excess fluids are released to avoid overpressurizing [red]including input [#cb8650]Aether[]![].[] +block.meld2-siphon.name = Siphon +block.meld2-siphon.description = Pumps [#89828c]Mercury[] fluid deposits at [accent]half pressure[]. Uses Compacted Bricks/Stony Gloop to repair stability. \n\nStability is [red]limited[] and deposits will break open if exhausted! \n\n[gray]Deposit repairing is a WIP and will only be added if there's enough of a need. -block.meld-vitric-stimulator-ruined.name = Vitric Stimu1ator [lightgray](Ruined)[] -block.meld-vitric-stimulator.description = Harvests [#8872da]Rift[] from suitable sources using Vitric Meshes to filter the air, producing a small amount of glass waste.\n\nRequires Power to run.\n\n[orange]Inefficient, deconstruction is advised[] -block.meld-vitric-stimulator.details = If only those vents could be harvested from... +block.meld2-sap-extractor.name = Sap Extractor +block.meld2-sap-extractor.description = Extracts [#b89f47]Nectar[] from suitable sources. Needs to be attached to a [#BE7E60]Mangrove Heart[] or a [accent]Nectar Fissure[] over Nectar or Mercury floors. -block.meld-flarestack-filter.name = Flarestack Filter -block.meld-flarestack-filter.description = Harvests [#8872da]Rift[] from suitable sources by neutralizing the impurities from the air.\n\nRequires Resonarum and Riplom to run. -block.meld-flarestack-filter.details = Neutralizes the Aether content of an impure [accent]rift vent[] by focusing it into Aspect and combusting it with Riplom, but requires a constant supply of lenses to function. +block.meld2-displacement-pump.name = Displacement Pump +block.meld2-displacement-pump.description = Dumps Debris into fluids to retrive a steady supply of fluid indefinitely. Requires [#cbdbfc]Aspect[] to run.\n\n[accent]Plated[] -block.meld-filtrative-feeder.name = Filtrative Feeder -block.meld-filtrative-feeder.description = Processes batches of [#e6c700]Ichor[] over [accent]meld floors[], aquiring some [#ea9ad6]Meld[] and pieces of Debris each batch processed.\n\nRequires a tiny trickle of power.\n\n[accent]Input liquid requirements based on efficiency. -block.meld-filtrative-feeder.details = If you can't beat em... +block.meld2-elemental-blaster.name = Elemental Blaster +block.meld2-elemental-blaster.description = Blasts deposits for items indefinitely. Requires [#cbdbfc]Aspect[] to run.\n\nCan be boosted with [#ea9ad6]Meld[] to double harvesting speed. -block.meld-siphon.name = Siphon -block.meld-siphon.description = Pumps [#89828c]Mercury[] fluid deposits at [accent]half pressure[]. Uses Compacted Bricks/Stony Gloop to repair stability. \n\nStability is [red]limited[] and deposits will break open if exhausted! \n\n[gray]Deposit repairing is a WIP and will only be added if there's enough of a need. +block.meld2-grinder-quarry.name = Grinder Quarry +block.meld2-grinder-quarry.description = Rips up the land it's placed on, and harvests from ore deposits indefinitely.\n\nRequires [#cbdbfc]Aspect[] to run.\n\n[accent]Connects to adjacent Depots![]\n\nPipe in [accent]explosives[], [accent]stronger fuels[], [accent]grinding particulate[], or [accent]solvents[], to rip up the ground faster, or increase its yield. -block.meld-sap-extractor.name = Sap Extractor -block.meld-sap-extractor.description = Extracts [#b89f47]Nectar[] from suitable sources. Needs to be attached to a [#BE7E60]Mangrove Heart[] or a [accent]Nectar Fissure[] over Nectar or Mercury floors. +block.meld2-pneumatic-pulsar.name = Pneumatic Pulsar +block.meld2-pneumatic-pulsar.description = Blasts a single deposit for items indefinitely while maintained. Requires [#cb8650]Aether[] to run.\n\n[red]Explosions damage everything around them, high maintenance![] -block.meld-displacement-pump.name = Displacement Pump -block.meld-displacement-pump.description = Dumps Debris into fluids to retrive a steady supply of fluid indefinitely. Requires [#cbdbfc]Aspect[] to run.\n\n[accent]Plated[] +block.meld2-elemental-sampler.name = Elemental Sampler +block.meld2-elemental-sampler.description = Samples deposits for items indefinitely. Requires [#cbdbfc]Aspect[] and [#8872da]Rift[] to run.\n\nCan be boosted with [#b460e2]Warp[] to double harvesting speed.\n\n[accent]More efficient against soft tissue[] +block.meld2-elemental-sampler.details = It wants to return home. -block.meld-elemental-blaster.name = Elemental Blaster -block.meld-elemental-blaster.description = Blasts deposits for items indefinitely. Requires [#cbdbfc]Aspect[] to run.\n\nCan be boosted with [#ea9ad6]Meld[] to double harvesting speed. +block.meld2-harbinger-of-decay.name = Harbinger of Decay +block.meld2-harbinger-of-decay.description = Channels meld from pools into itself. +block.meld2-harbinger-of-decay.details = Somebody wants their shot of resonarum, hehehe~ -block.meld-pneumatic-pulsar.name = Pneumatic Pulsar -block.meld-pneumatic-pulsar.description = Blasts a single deposit for items indefinitely while maintained. Requires [#cb8650]Aether[] to run.\n\n[red]Explosions damage everything around them, high maintenance![] +block.meld2-elemental-blaster.details = Developed late into the incursion. Previous mining methods were subject to failure at the whims of mechanical parts corroding. -block.meld-elemental-sampler.name = Elemental Sampler -block.meld-elemental-sampler.description = Samples deposits for items indefinitely. Requires [#cbdbfc]Aspect[] and [#8872da]Rift[] to run.\n\nCan be boosted with [#b460e2]Warp[] to double harvesting speed.\n\n[accent]More efficient against soft tissue[] -block.meld-elemental-sampler.details = It wants to return home. +block.meld2-techno-dredger.name = Techno Dredger +block.meld2-techno-dredger.description = Collects massive amounts of lose pieces of technoscrap. Requires [#cbdbfc]Aspect[] to run. -block.meld-harbinger-of-decay.name = Harbinger of Decay -block.meld-harbinger-of-decay.description = Channels meld from pools into itself. -block.meld-harbinger-of-decay.details = Somebody wants their shot of resonarum, hehehe~ +block.meld2-earthen-grinder.name = Earthen Grinder +block.meld2-earthen-grinder.description = Crushes up earthen stone and mixes it with [#b89f47]Nectar[] & [#8872da]Rift[] to make Stony Gloop. -block.meld-elemental-blaster.details = Developed late into the incursion. Previous mining methods were subject to failure at the whims of mechanical parts corroding. -block.meld-techno-dredger.name = Techno Dredger -block.meld-techno-dredger.description = Collects massive amounts of lose pieces of technoscrap. Requires [#cbdbfc]Aspect[] to run. +block.meld2-elemental-folder.name = Electrum Folder +block.meld2-electrum-folder.description = Purifies, and folds native electrum deposits into sheets. Able to process deposits poisoned by [#89828c]Mercury[].\n\nRequires [#cbdbfc]Aspect[] to run. -block.meld-earthen-grinder.name = Earthen Grinder -block.meld-earthen-grinder.description = Crushes up earthen stone and mixes it with [#b89f47]Nectar[] & [#8872da]Rift[] to make Stony Gloop. +block.meld2-pad-omega.name = Pad: Trench +block.meld2-pad-omega.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] +block.meld2-pad-omega.details = A callback to the good ol' days +block.meld2-pad-psi.name = Pad: Psi +block.meld2-pad-psi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] +block.meld2-pad-psi.details = Lasor. -block.meld-elemental-folder.name = Electrum Folder -block.meld-electrum-folder.description = Purifies, and folds native electrum deposits into sheets. Able to process deposits poisoned by [#89828c]Mercury[].\n\nRequires [#cbdbfc]Aspect[] to run. +block.meld2-pad-phi.name = Pad: Phi +block.meld2-pad-phi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] +block.meld2-pad-phi.details = Golden ratio? What's that? -block.meld-pad-omega.name = Pad: Trench -block.meld-pad-omega.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] -block.meld-pad-omega.details = A callback to the good ol' days +block.meld2-aspect-incinerator.name = Aspect Incinerator +block.meld2-aspect-incinerator.description = Incinerates items when fed [meld2-aspect]Aspect[].\n\nBuffers items otherwise. +block.meld2-aspect-incinerator.details = Shoulda been named output terminal or smthing -block.meld-pad-psi.name = Pad: Psi -block.meld-pad-psi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] -block.meld-pad-psi.details = Lasor. +block.meld2-core-raft-dormant.name = Core: Raft[lightgray](Dormant)[] +block.meld2-core-raft-dormant.description = Core of the base. Allows units to pass through freely. [accent]Activates when inside a powered facility.[] +block.meld2-core-raft-dormant.details = Cheap bunker with intra-sector item transport and radar built in. -block.meld-pad-phi.name = Pad: Phi -block.meld-pad-phi.description = Outpost of the base. Only one can be active at a time.\n[red]Cannot support a base alone.[] -block.meld-pad-phi.details = Golden ratio? What's that? +block.meld2-core-raft.name = Core: Raft +block.meld2-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost.\n\n[accent]Requires an adjacent incinerator to void excess items.[] +block.meld2-core-raft.details = A great logistics hub. Equipped with single-use launch thrusters. -block.meld-aspect-incinerator.name = Aspect Incinerator -block.meld-aspect-incinerator.description = Incinerates items when fed [meld-aspect]Aspect[].\n\nBuffers items otherwise. -block.meld-aspect-incinerator.details = Shoulda been named output terminal or smthing +block.meld2-core-bunker.name = Core: Bunker +block.meld2-core-bunker.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost. +block.meld2-core-bunker.details = A great logistics hub. Equipped with single-use launch thrusters. -block.meld-core-raft-dormant.name = Core: Raft[lightgray](Dormant)[] -block.meld-core-raft-dormant.description = Core of the base. Allows units to pass through freely. [accent]Activates when inside a powered facility.[] -block.meld-core-raft-dormant.details = Cheap bunker with intra-sector item transport and radar built in. +block.meld2-buffer.name = Buffer +block.meld2-buffer.description = Stores a small amount of items with separate capacities per type. Can be unloaded to empty its contents.\n\n[accent]Connects to the core![]\n\n[accent]Lightly Armored![] -block.meld-core-raft.name = Core: Raft -block.meld-core-raft.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost.\n\n[accent]Requires an adjacent incinerator to void excess items.[] -block.meld-core-raft.details = A great logistics hub. Equipped with single-use launch thrusters. +block.meld2-depot.name = Depot +block.meld2-depot.description = Stores a small amount of items with separate capacities per type.\n\nOutputs its contents to adjacent blocks, can be configured to only output one type of item. -block.meld-core-bunker.name = Core: Bunker -block.meld-core-bunker.description = Core of the base. Allows units to pass through freely. Once all are destroyed, the sector is lost. -block.meld-core-bunker.details = A great logistics hub. Equipped with single-use launch thrusters. +block.meld2-interface.name = Interface +block.meld2-interface.description = Stores a small amount of items with separate capacities per type. Can be unloaded to empty its contents. Can connect to the core!\n\nGround units can walk over this. -block.meld-buffer.name = Buffer -block.meld-buffer.description = Stores a small amount of items with separate capacities per type. Can be unloaded to empty its contents. Does not connect to the core. +block.meld2-launch-station.name = Launch Station +block.meld2-launch-station.description = Pulls units in, and propels them in the target direction.\n\nFueled by [meld2-aspect]Aspect[]. +block.meld2-launch-station.details = The beta version of the launch station was developed into something useful for kart racing, while the version chosen for deployment was refined to be highly consistent (inconsistently). -block.meld-interface.name = Interface -block.meld-interface.description = Stores a small amount of items with separate capacities per type. Can be unloaded to empty its contents. Can connect to the core!\n\nGround units can walk over this. +block.meld2-logistic-docks.name = Logistic Docks +block.meld2-logistic-docks.description = Attempts to set nearby unit's items to a certain threshold, using adjacent buildings as storage. +block.meld2-logistic-docks.details = Is this some type of florafest?\n\nNo mate, it's trains.\n\nooh -block.meld-shark-factory.name = Shark Autoforge -block.meld-shark-factory.description = Pumps out Shark units using Silver and Carbolith.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. +block.meld2-friction-pad.name = Friction Pad +block.meld2-friction-pad.description = Increases the drag of units, and removes the boost from Launch Stations.\n\nCan only be placed on shallow liquids, always replaced by other buildings. +block.meld2-friction-pad.details = Drifting? More like a floormat. -block.meld-remora-factory.name = Remora Autoforge -block.meld-remora-factory.description = Pumps out Remora units using Debris, Electrum and Vitric Mesh.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. +block.meld2-shark-factory.name = Shark Autoforge +block.meld2-shark-factory.description = Pumps out Shark units using Silver and Carbolith.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. -block.meld-narwhal-factory.name = Narwhal Autoforge -block.meld-narwhal-factory.description = Pumps out Narwhal units using Carbolith, Compacted Bricks and Stony Gloop.\n\nRequires a sizeable amount of [#cbdbfc]Aspect[] and [#e6c700]Ichor[] to run, getting quicker corosponding to the supply.\n\n[accent]Lightly Armored[] +block.meld2-remora-factory.name = Remora Autoforge +block.meld2-remora-factory.description = Pumps out Remora units using Debris, Electrum and Vitric Mesh.\n\nRequires a large amount of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. -block.meld-hammerhead-factory.name = Hammerhead Bioforge -block.meld-hammerhead-factory.description = Rapidly Gestates Hammerhead units using Debris, Riplom and Resonarum.\n\nRequires a sizeable amount of [#8872da]Rift[] and a trickle of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. +block.meld2-narwhal-factory.name = Narwhal Autoforge +block.meld2-narwhal-factory.description = Pumps out Narwhal units using Carbolith, Compacted Bricks and Stony Gloop.\n\nRequires a sizeable amount of [#cbdbfc]Aspect[] and [#e6c700]Ichor[] to run, getting quicker corosponding to the supply.\n\n[accent]Lightly Armored[] -block.meld-astrea-factory.name = Astrea Autoforge -block.meld-astrea-factory.description = Pumps out Astrea units using Debris and Electrum.\n\nRequires a sizeable amount of [#cbdbfc]Aspect[] and [#89828c]Mercury[] to run, getting quicker corosponding to the supply. +block.meld2-hammerhead-factory.name = Hammerhead Bioforge +block.meld2-hammerhead-factory.description = Rapidly Gestates Hammerhead units using Debris, Riplom and Resonarum.\n\nRequires a sizeable amount of [#8872da]Rift[] and a trickle of [#cbdbfc]Aspect[] to run, getting quicker corosponding to the supply. + +block.meld2-astrea-factory.name = Astrea Autoforge +block.meld2-astrea-factory.description = Pumps out Astrea units using Debris and Electrum.\n\nRequires a sizeable amount of [#cbdbfc]Aspect[] and [#89828c]Mercury[] to run, getting quicker corosponding to the supply. //Manggrove blocks -block.meld-swamp-root-heart.name = [#BE7E60]Mangrove Heart[] -block.meld-swamp-root-heart.description = Harvestable for [#b89f47]Nectar[]. Never changes form.\n\n[red]Can't be deconstructed.\n\nMust be targeted directly to be attacked![] +block.meld2-swamp-root-heart.name = [#BE7E60]Mangrove Heart[] +block.meld2-swamp-root-heart.description = Harvestable for [#b89f47]Nectar[]. Never changes form.\n\n[red]Can't be deconstructed.\n\nMust be targeted directly to be attacked![] -block.meld-swamp-root-dormant.name = [#BE7E60]Mangrove Root (Dormant)[] -block.meld-swamp-root-dormant.description = Can [#89828c]blossom[] or [#4181B9]sprout leaves[]. Increases the global swamp unit capacity.\n\n[red]Can't be deconstructed.\n\nMust be targeted directly to be attacked![] +block.meld2-swamp-root-dormant.name = [#BE7E60]Mangrove Root (Dormant)[] +block.meld2-swamp-root-dormant.description = Can [#89828c]blossom[] or [#4181B9]sprout leaves[]. Increases the global swamp unit capacity.\n\n[red]Can't be deconstructed.\n\nMust be targeted directly to be attacked![] -block.meld-swamp-mangrove-large.name = [#BE7E60]Mangrove Effigy[] -block.meld-swamp-mangrove-large.description = Acts as a hub for resources in the swamp. +block.meld2-swamp-mangrove-large.name = [#BE7E60]Mangrove Effigy[] +block.meld2-swamp-mangrove-large.description = Acts as a hub for resources in the swamp. -block.meld-swamp-mangrove-large-awake.name = [#4181B9]Awakened Mangrove Effigy[] -block.meld-swamp-mangrove-large-awake.description = Acts as a hub for resources in the swamp. Spreads blood through silt. +block.meld2-swamp-mangrove-large-awake.name = [#4181B9]Awakened Mangrove Effigy[] +block.meld2-swamp-mangrove-large-awake.description = Acts as a hub for resources in the swamp. Spreads blood through silt. -block.meld-swamp-plant-thorn-crawler.name = [#89828c]Thorn[] [#BE7E60]Crawler[] -block.meld-swamp-plant-thorn-crawler.description = Fires off 2 bursts of needles in 3 directions. Bursts into a pool of [#b89f47]Nectar[] and drops of [#89413e]Ooze[] upon destruction. +block.meld2-swamp-plant-thorn-crawler.name = [#89828c]Thorn[] [#BE7E60]Crawler[] +block.meld2-swamp-plant-thorn-crawler.description = Fires off 2 bursts of needles in 3 directions. Bursts into a pool of [#b89f47]Nectar[] and drops of [#89413e]Ooze[] upon destruction. //Meld blocks -block.meld-meld-node.name = Meld Node -block.meld-meld-node.description = Keeps the surounding swampland frozen. Spawnpoint for [#ea9ad6]Meld[] creatures during waves. +block.meld2-meld-node.name = Meld Node +block.meld2-meld-node.description = Keeps the surounding swampland frozen. Spawnpoint for [#ea9ad6]Meld[] creatures during waves. -block.meld-meld-surpressor.name = Meld Surpressor -block.meld-meld-surpressor.description = Keeps the surounding swampland frozen. Constructed on top of core zones. Spawnpoint for [#ea9ad6]Meld[] creatures during waves.\n\n[red]Armored[] +block.meld2-meld-surpressor.name = Meld Surpressor +block.meld2-meld-surpressor.description = Keeps the surounding swampland frozen. Constructed on top of core zones. Spawnpoint for [#ea9ad6]Meld[] creatures during waves.\n\n[red]Armored[] -block.meld-meld-synapse.name = Meld Synapse -block.meld-meld-synapse.description = Stabalizes surounding crystal barriers. Once no synapses remain, the entire wall crumbles. +block.meld2-meld-synapse.name = Meld Synapse +block.meld2-meld-synapse.description = Stabalizes surounding crystal barriers. Once no synapses remain, the entire wall crumbles. -block.meld-meld-capsule.name = Meld Capsule -block.meld-meld-capsule.description = Projects a barrier against physical attacks. Requires gasseous [#ea9ad6]Meld[] to run. +block.meld2-meld-capsule.name = Meld Capsule +block.meld2-meld-capsule.description = Projects a barrier against physical attacks. Requires gasseous [#ea9ad6]Meld[] to run. -block.meld-meld-amplifier.name = Meld Amplifier -block.meld-meld-amplifier.description = Pulses [#ea9ad6]Amplification[] to all allies in range. +block.meld2-meld-amplifier.name = Meld Amplifier +block.meld2-meld-amplifier.description = Pulses [#ea9ad6]Amplification[] to all allies in range. -block.meld-meld-beacon.name = Meld Beacon -block.meld-meld-beacon.description = Fumigates areas with [#ea9ad6]Meld[] making nearby constructs very durable, while constantly chipping away at enemy targets within the cloud. -block.meld-meld-beacon.details = Often seen near debris fields still being processed. +block.meld2-meld-beacon.name = Meld Beacon +block.meld2-meld-beacon.description = Fumigates areas with [#ea9ad6]Meld[] making nearby constructs very durable, while constantly chipping away at enemy targets within the cloud. +block.meld2-meld-beacon.details = Often seen near debris fields still being processed. -block.meld-pipeline.name = Pipeline -block.meld-pipeline.description = Meld construct which acts as a pipe. +block.meld2-pipeline.name = Pipeline +block.meld2-pipeline.description = Meld construct which acts as a pipe. -block.meld-pipeline-router.name = Pipeline Router -block.meld-pipeline-router.description = Meld construct which acts as a fluid router.. +block.meld2-pipeline-router.name = Pipeline Router +block.meld2-pipeline-router.description = Meld construct which acts as a fluid router.. -block.meld-pipeline-overpass.name = Pipeline Overpass -block.meld-pipeline-overpass.description = Meld construct which acts as a bridge +block.meld2-pipeline-overpass.name = Pipeline Overpass +block.meld2-pipeline-overpass.description = Meld construct which acts as a bridge -block.meld-pipeline-crossing.name = Pipeline Crossing -block.meld-pipeline-crossing.description = Meld construct which acts as a fluid junction. +block.meld2-pipeline-crossing.name = Pipeline Crossing +block.meld2-pipeline-crossing.description = Meld construct which acts as a fluid junction. -block.meld-blocker.name = Crystal Barrier -block.meld-blocker.description = Nigh indestructable crystaline formation of [#ea9ad6]Meld[]. Often demolished as a result of a broken Synapse, or from the floor melting underneath.\n\n[red]Heavly armored[] +block.meld2-blocker.name = Crystal Barrier +block.meld2-blocker.description = Nigh indestructable crystaline formation of [#ea9ad6]Meld[]. Often demolished as a result of a broken Synapse, or from the floor melting underneath.\n\n[red]Heavly armored[] -block.meld-blocker-large.name = Large Crystal Barrier -block.meld-blocker-large.description = Nigh indestructable crystaline formation of [#ea9ad6]Meld[]. Often demolished as a result of a broken Synapse, or from the floor melting underneath.\n\n[red]Heavly armored[] +block.meld2-blocker-large.name = Large Crystal Barrier +block.meld2-blocker-large.description = Nigh indestructable crystaline formation of [#ea9ad6]Meld[]. Often demolished as a result of a broken Synapse, or from the floor melting underneath.\n\n[red]Heavly armored[] -block.meld-stone-blocker.name = Carbonic Barrier -block.meld-stone-blocker.description = Artificial formation of [accent]Carbon Stone[]. Often demolished as a result of a broken Synapse, or from sustained firepower.\n\n[red]Heavly armored[] +block.meld2-stone-blocker.name = Carbonic Barrier +block.meld2-stone-blocker.description = Artificial formation of [accent]Carbon Stone[]. Often demolished as a result of a broken Synapse, or from sustained firepower.\n\n[red]Heavly armored[] -block.meld-stone-blocker-large.name = Large Carbonic Barrier -block.meld-stone-blocker-large.description = Artificial formation of [accent]Carbon Stone[]. Often demolished as a result of a broken Synapse, or from sustained firepower.\n\n[red]Heavly armored[] +block.meld2-stone-blocker-large.name = Large Carbonic Barrier +block.meld2-stone-blocker-large.description = Artificial formation of [accent]Carbon Stone[]. Often demolished as a result of a broken Synapse, or from sustained firepower.\n\n[red]Heavly armored[] -block.meld-mallow-blocker.name = Mallow Barrier -block.meld-mallow-blocker.description = Artificial formation of [accent]Mallow Sand[]. Often demolished as a result of a nearby explosion, or from sustained firepower.\n\n[red]Squishi! (60)[] +block.meld2-mallow-blocker.name = Mallow Barrier +block.meld2-mallow-blocker.description = Artificial formation of [accent]Mallow Sand[]. Often demolished as a result of a nearby explosion, or from sustained firepower.\n\n[red]Squishi! (60)[] -block.meld-mallow-blocker-large.name = Large Mallow Barrier -block.meld-mallow-blocker-large.description = Artificial formation of [accent]Mallow Sand[]. Often demolished as a result of a nearby explosion, or from sustained firepower.\n\n[red]Squishi! (60)[] +block.meld2-mallow-blocker-large.name = Large Mallow Barrier +block.meld2-mallow-blocker-large.description = Artificial formation of [accent]Mallow Sand[]. Often demolished as a result of a nearby explosion, or from sustained firepower.\n\n[red]Squishi! (60)[] -block.meld-meld-cultivator.name = Meld Cultivator -block.meld-meld-cultivator.description = Houses blobs which release gasseous [#ea9ad6]Meld[]. +block.meld2-meld-cultivator.name = Meld Cultivator +block.meld2-meld-cultivator.description = Houses blobs which release gasseous [#ea9ad6]Meld[]. -block.meld-meld-pumpjack.name = Meld Pumpjack -block.meld-meld-pumpjack.description = Harvests industrial quantities of [#e6c700]Ichor[]. +block.meld2-meld-pumpjack.name = Meld Pumpjack +block.meld2-meld-pumpjack.description = Harvests industrial quantities of [#e6c700]Ichor[]. -block.meld-aether-compressor.name = Aether Compressor -block.meld-aether-compressor.description = Houses [#ea9ad6]Meld[] which compacts the surounding [#cb8650]Aether[] into the insides of the construct. +block.meld2-aether-compressor.name = Aether Compressor +block.meld2-aether-compressor.description = Houses [#ea9ad6]Meld[] which compacts the surounding [#cb8650]Aether[] into the insides of the construct. -block.meld-spawning-pool.name = Spawning Pool -block.meld-spawning-pool.description = Uses massive amounts of [#e6c700]Ichor[] to incubate batches of larva. +block.meld2-spawning-pool.name = Spawning Pool +block.meld2-spawning-pool.description = Uses massive amounts of [#e6c700]Ichor[] to incubate batches of larva. -block.meld-jilla-incubator.name = Jilla Incubator -block.meld-jilla-incubator.description = Entombs pairs of larvae in crystal inside [#cb8650]Aether[] environment to form Jilla constructs.\nBursts open into a Gilla and a pair of Killas when destroyed. -block.meld-jilla-incubator.details = Not a suitable place to live... +block.meld2-jilla-incubator.name = Jilla Incubator +block.meld2-jilla-incubator.description = Entombs pairs of larvae in crystal inside [#cb8650]Aether[] environment to form Jilla constructs.\nBursts open into a Gilla and a pair of Killas when destroyed. +block.meld2-jilla-incubator.details = Not a suitable place to live... -block.meld-craig-incubator.name = Craig Incubator -block.meld-craig-incubator.description = Forms a metalic shell around larvae trios in an [#cb8650]Ichor[] environment to form Craig constructs. The residual stone is formed into an Afraig with each batch.\nBursts open into several Craigs and Afraigs when destroyed.\n\n[red]Lightly Armored[] -block.meld-craig-incubator.details = Not the usual way to make Craigs, as often Blobs are made to posess the constructs. +block.meld2-craig-incubator.name = Craig Incubator +block.meld2-craig-incubator.description = Forms a metalic shell around larvae trios in an [#cb8650]Ichor[] environment to form Craig constructs. The residual stone is formed into an Afraig with each batch.\nBursts open into several Craigs and Afraigs when destroyed.\n\n[red]Lightly Armored[] +block.meld2-craig-incubator.details = Not the usual way to make Craigs, as often Blobs are made to posess the constructs. -block.meld-gilla-incubator.name = Gilla Incubator -block.meld-gilla-incubator.description = Entombs pairs of larvae in crystal inside [#cb8650]Aether[] environment to form Gilla constructs.\nBursts open into a Gilla and a pair of Killas when destroyed. -block.meld-gilla-incubator.details = Not a suitable place to live... +block.meld2-gilla-incubator.name = Gilla Incubator +block.meld2-gilla-incubator.description = Entombs pairs of larvae in crystal inside [#cb8650]Aether[] environment to form Gilla constructs.\nBursts open into a Gilla and a pair of Killas when destroyed. +block.meld2-gilla-incubator.details = Not a suitable place to live... -block.meld-meld-cluster-large.name = Large Meld Cluster -block.meld-meld-cluster-large.description = A pile of [#ea9ad6]Meld[] which has overgrown an [#cb8650]Aether[] vent. Good source of starting debris. +block.meld2-meld-cluster-large.name = Large Meld Cluster +block.meld2-meld-cluster-large.description = A pile of [#ea9ad6]Meld[] which has overgrown an [#cb8650]Aether[] vent. Good source of starting debris. -block.meld-craig-coffer.name = Craig Coffer -block.meld-craig-coffer.description = Bursts open into Craigs upon destruction. Shoots nearby hostiles, taking damage in the process without Meld. +block.meld2-craig-coffer.name = Craig Coffer +block.meld2-craig-coffer.description = Bursts open into Craigs upon destruction. Shoots nearby hostiles, taking damage in the process without Meld. -block.meld-jilla-coffer.name = Jilla Coffer -block.meld-jilla-coffer.description = Bursts open into Jilla upon destruction. +block.meld2-jilla-coffer.name = Jilla Coffer +block.meld2-jilla-coffer.description = Bursts open into Jilla upon destruction. -block.meld-braig-coffer.name = Braig Coffer -block.meld-braig-coffer.description = Bursts open into Braigs upon destruction. Locks onto a target's position, then fires a burst of rocks. +block.meld2-braig-coffer.name = Braig Coffer +block.meld2-braig-coffer.description = Bursts open into Braigs upon destruction. Locks onto a target's position, then fires a burst of rocks. -block.meld-pointago-coffer.name = Pointago Coffer -block.meld-pointago-coffer.description = Bursts open into multiple Pointago upon destruction. Locks onto a target's, then fires a 3 round burst of sharp rocks. +block.meld2-pointago-coffer.name = Pointago Coffer +block.meld2-pointago-coffer.description = Bursts open into multiple Pointago upon destruction. Locks onto a target's, then fires a 3 round burst of sharp rocks. -block.meld-meld-cannon.name = Meld Cannon -block.meld-meld-cannon.description = Lobs globs of [meld-meld]Meld[] at enemies, suppressing them. +block.meld2-meld-cannon.name = Meld Cannon +block.meld2-meld-cannon.description = Lobs globs of [meld2-meld]Meld[] at enemies, suppressing them. -block.meld-meld-spewer.name = Meld Spewer -block.meld-meld-spewer.description = Sprays focused jets of [#e6c700]Ichor[] toward targets doing huge focused knockback, healing any allied building in the way. +block.meld2-meld-spewer.name = Meld Spewer +block.meld2-meld-spewer.description = Sprays focused jets of [#e6c700]Ichor[] toward targets doing huge focused knockback, healing any allied building in the way. -block.meld-tracker-encampment.name = Tracker Encampment -block.meld-tracker-encampment.description = Launches off larvel missiles which do bonus damage on direct hit. Dislodges from its base when destroyed.\n\n[red]Heavly armored[] +block.meld2-tracker-encampment.name = Tracker Encampment +block.meld2-tracker-encampment.description = Launches off larvel missiles which do bonus damage on direct hit. Dislodges from its base when destroyed.\n\n[red]Heavly armored[] -block.meld-scorcher-nest.name = Scorcher Nest -block.meld-scorcher-nest.description = Crystalizes a scorcher crystal, which fuels 4 indipendantly targeted jets of flame. Bursts open into numerous Scorchers on destruction. +block.meld2-scorcher-nest.name = Scorcher Nest +block.meld2-scorcher-nest.description = Crystalizes a scorcher crystal, which fuels 4 indipendantly targeted jets of flame. Bursts open into numerous Scorchers on destruction. -bloock.meld-splurger-nset.name = Splurger Nest -bloock.meld-splurger-nset.description = Fires off bundles of limited life Splurgers. -bloock.meld-splurger-nset.details = Sploot +bloock.meld2-splurger-nset.name = Splurger Nest +bloock.meld2-splurger-nset.description = Fires off bundles of limited life Splurgers. +bloock.meld2-splurger-nset.details = Sploot //Fringe blocks -block.meld-aether-plug.name = Aether Plug -block.meld-aether-plug.description = Siphons [#cb8650]Aether[] from suitable sources. +block.meld2-aether-plug.name = Aether Plug +block.meld2-aether-plug.description = Siphons [#cb8650]Aether[] from suitable sources. -block.meld-data-coagulator.name = Data Coagulator -block.meld-data-coagulator.description = Scribes massive amounts of [#9ccaed]Liquid Data[] into sheets of Technoscrap to create Fragments. +block.meld2-data-coagulator.name = Data Coagulator +block.meld2-data-coagulator.description = Scribes massive amounts of [#9ccaed]Liquid Data[] into sheets of Technoscrap to create Fragments. -block.meld-rubble-refinery.name = Rubble Refinery -block.meld-rubble-refinery.description = Blasts and centrifuges cracked industrial rubble for essential resources.\n\nRequires [#cbdbfc]Aspect[] to run. +block.meld2-rubble-refinery.name = Rubble Refinery +block.meld2-rubble-refinery.description = Blasts and centrifuges cracked industrial rubble for essential resources.\n\nRequires [#cbdbfc]Aspect[] to run. -block.meld-metal-siev.name = Metal Sieve -block.meld-metal-siev.description = Filters through cracked industrial rubble for Silver and Electrum, producing some starving masses in the process.\n\nRequires [#89828c]Mercury[] to run. +block.meld2-metal-siev.name = Metal Sieve +block.meld2-metal-siev.description = Filters through cracked industrial rubble for Silver and Electrum, producing some starving masses in the process.\n\nRequires [#89828c]Mercury[] to run. -block.meld-container.name = Container -block.meld-container.description = Stores items with separate capacities per type. +block.meld2-container.name = Container +block.meld2-container.description = Stores items with separate capacities per type. -block.meld-crate.name = Crate -block.meld-crate.description = Stores a small amount of items with separate capacities per type. -block.meld-crate.details = Often used as a locker substitute in industrial compounds. +block.meld2-crate.name = Crate +block.meld2-crate.description = Stores a small amount of items with separate capacities per type. +block.meld2-crate.details = Often used as a locker substitute in industrial compounds. -block.meld-drill-turret.name = Drill Turret -block.meld-drill-turret.description = Focuses [#cbdbfc]Aspect[] into an armor piercing beam. +block.meld2-drill-turret.name = Drill Turret +block.meld2-drill-turret.description = Focuses [#cbdbfc]Aspect[] into an armor piercing beam. -block.meld-repair-turret.name = Repair Turret -block.meld-repair-turret.description = Focuses [#cbdbfc]Aspect[] into repair packets. +block.meld2-repair-turret.name = Repair Turret +block.meld2-repair-turret.description = Focuses [#cbdbfc]Aspect[] into repair packets. -block.meld-shield-battery.name = Shield Battery -block.meld-shield-battery.description = Spouts garbled [#9ccaed]Liquid Data[], often connected to Force Barrier walls. Requires [#cbdbfc]Aspect[] to run, and some starting [#9ccaed]Liquid Data[]. -block.meld-shield-battery.details = Infinite useless data. +block.meld2-shield-battery.name = Shield Battery +block.meld2-shield-battery.description = Spouts garbled [#9ccaed]Liquid Data[], often connected to Force Barrier walls. Requires [#cbdbfc]Aspect[] to run, and some starting [#9ccaed]Liquid Data[]. +block.meld2-shield-battery.details = Infinite useless data. -block.meld-access-point.name = Access Point -block.meld-access-point.description = Plugs into an Encrypter to power it. -block.meld-access-point.details = Im not sure how this works... +block.meld2-access-point.name = Access Point +block.meld2-access-point.description = Plugs into an Encrypter to power it. +block.meld2-access-point.details = Im not sure how this works... -block.meld-encrypter.name = Encrypter -block.meld-encrypter.description = Harvests [accent]Fragments[] and [accent]Memory Shards[]. -block.meld-encrypter.details = No seriously, how does "encrypting" data give memory shards? Shoudn't it give Technoscrap? +block.meld2-encrypter.name = Encrypter +block.meld2-encrypter.description = Harvests [accent]Fragments[] and [accent]Memory Shards[]. +block.meld2-encrypter.details = No seriously, how does "encrypting" data give memory shards? Shoudn't it give Technoscrap? -block.meld-data-miner.name = Data Miner -block.meld-data-miner.description = Connects to exposed data cores, and mines small amounts of [#9ccaed]Liquid Data[]. -block.meld-data-miner.details = Also if Liquid Data is raw data then is encryption inserting liquid data into a medium or is it changing it somehow. +block.meld2-data-miner.name = Data Miner +block.meld2-data-miner.description = Connects to exposed data cores, and mines small amounts of [#9ccaed]Liquid Data[]. +block.meld2-data-miner.details = Also if Liquid Data is raw data then is encryption inserting liquid data into a medium or is it changing it somehow. -block.meld-decryption-module.name = Decryption Module -block.meld-decryption-module.description = Connects to exposed data cores, and rapidly pulls [#9ccaed]Liquid Data[] from [accent]Technoscrap[] using small amounts of [#9ccaed]Liquid Data[]. -block.meld-decryption-module.details = Seriously who thought of theese names??? +block.meld2-decryption-module.name = Decryption Module +block.meld2-decryption-module.description = Connects to exposed data cores, and rapidly pulls [#9ccaed]Liquid Data[] from [accent]Technoscrap[] using small amounts of [#9ccaed]Liquid Data[]. +block.meld2-decryption-module.details = Seriously who thought of theese names??? -block.meld.data-coagulator.name = Data Coagulator -block.meld-data-coagulator.description = Deposits mass amounts of data onto technoscrap. The process consumes excess technoscrap. -block.meld-data-coagulator.details = Wait so if storage is Technoscrap which results in Fragments, then are memory shards like encrypted zip bombs? +block.meld2.data-coagulator.name = Data Coagulator +block.meld2-data-coagulator.description = Deposits mass amounts of data onto technoscrap. The process consumes excess technoscrap. +block.meld2-data-coagulator.details = Wait so if storage is Technoscrap which results in Fragments, then are memory shards like encrypted zip bombs? -block.meld-indoctrinator.name = Indoctrinator -block.meld-indoctrinator.description = Enlightens [accent]Technoscrap into [accent]Grating Chunks[] -block.meld-indoctrinator.details = YOU LOSE MATERIAL DOING THIS??? +block.meld2-indoctrinator.name = Indoctrinator +block.meld2-indoctrinator.description = Enlightens [accent]Technoscrap into [accent]Grating Chunks[] +block.meld2-indoctrinator.details = YOU LOSE MATERIAL DOING THIS??? //Parts -block.meld-p-part-a0-0a-data-resonator.name = Data Resonator -block.meld-p-part-a0-0a-data-resonator.description = Specialized fuel cell which provides power output to movement-based abilities. +block.meld2-p-part-a0-0a-data-resonator.name = Data Resonator +block.meld2-p-part-a0-0a-data-resonator.description = Specialized fuel cell which provides power output to movement-based abilities. -block.meld-p-part-a0-1a-targeting-matrix.name = Targeting Matrix -block.meld-p-part-a0-1a-targeting-matrix.description = Holds a processor capable of more advanced targeting processes such as repairing allied structures or assisting in construction. +block.meld2-p-part-a0-1a-targeting-matrix.name = Targeting Matrix +block.meld2-p-part-a0-1a-targeting-matrix.description = Holds a processor capable of more advanced targeting processes such as repairing allied structures or assisting in construction. //environmental blocks //storm planes -block.meld-storm-dissonitre-cluster.name = Dissonitre Cluster -block.meld-storm-dissonitre-cluster.description = Vitric cluster, glistens when infused with [#cb8650]Aether[]. Good source of Dissonitre. Regrows when lightning strikes. -block.meld-storm-dissonitre-cluster.details = So uh... factory? +block.meld2-storm-dissonitre-cluster.name = Dissonitre Cluster +block.meld2-storm-dissonitre-cluster.description = Vitric cluster, glistens when infused with [#cb8650]Aether[]. Good source of Dissonitre. Regrows when lightning strikes. +block.meld2-storm-dissonitre-cluster.details = So uh... factory? -block.meld-mallow-cluster-large.name = Large Mallow Cluster -block.meld-mallow-cluster-large.description = Explodes when destroyed, spraying Dissonitre onto all nearby units. -block.meld-mallow-cluster-large.details = So uh... factory? +block.meld2-mallow-cluster-large.name = Large Mallow Cluster +block.meld2-mallow-cluster-large.description = Explodes when destroyed, spraying Dissonitre onto all nearby units. +block.meld2-mallow-cluster-large.details = So uh... factory? //Resource blocks -block.meld-debris-deposit.name = Debris Deposit -block.meld-silver-deposit.name = Silver Deposit -block.meld-electrum-deposit.name = Electrum Deposit -block.meld-carbolith-deposit.name = Carbolith -block.meld-resonarum-deposit.name = Resonarum Deposit -block.meld-resonarum-outcrop.name = Resonarum Outcrop -block.meld-earthen-wall-gloop.name = Stony Gloop -block.meld-earthen-wall-fissure.name = Nectar Fissure -block.meld-peat-mangrove-chunks.name = Elderflesh -block.meld-peat-mangrove-chunks-planty.name = Compacted Masses -block.meld-peat-mangrove-chunks-awoken.name = Blossoming Elderflesh +block.meld2-debris-deposit.name = Debris Deposit +block.meld2-silver-deposit.name = Silver Deposit +block.meld2-electrum-deposit.name = Electrum Deposit +block.meld2-carbolith-deposit.name = Carbolith +block.meld2-resonarum-deposit.name = Resonarum Deposit +block.meld2-resonarum-outcrop.name = Resonarum Outcrop +block.meld2-earthen-wall-gloop.name = Stony Gloop +block.meld2-earthen-wall-fissure.name = Nectar Fissure +block.meld2-peat-mangrove-chunks.name = Elderflesh +block.meld2-peat-mangrove-chunks-planty.name = Compacted Masses +block.meld2-peat-mangrove-chunks-awoken.name = Blossoming Elderflesh -block.meld-gale-wall.name = Gale Wall -block.meld-gale-shale-wall.name = Gale Shale Wall -block.meld-gale-shale.name = Gale Shale +block.meld2-gale-wall.name = Gale Wall +block.meld2-gale-shale-wall.name = Gale Shale Wall +block.meld2-gale-shale.name = Gale Shale -block.meld-resonant-stone-wall.name = Resonarum Stone Wall +block.meld2-resonant-stone-wall.name = Resonarum Stone Wall //Items -item.meld-debris.name = Debris -item.meld-debris.description = Used in many kinds of constructs on Ikaru. Refineable. -item.meld-debris.details = Broken down pieces of metal which the [#ea9ad6]Meld[] couldn't digest. +item.meld2-debris.name = Debris +item.meld2-debris.description = Used in many kinds of constructs on Ikaru. Refineable. +item.meld2-debris.details = Broken down pieces of metal which the [#ea9ad6]Meld[] couldn't digest. + +item.meld2-carbolith.name = Carbolith +item.meld2-carbolith.description = Used for structural support and as a fuel source. +item.meld2-carbolith.details = Carbon rich stone, not quite graphite. Different to the medication. -item.meld-carbolith.name = Carbolith -item.meld-carbolith.description = Used for structural support and as a fuel source. -item.meld-carbolith.details = Carbon rich stone, not quite graphite. Different to the medication. +item.meld2-tenbris.name = Tenbris +item.meld2-tenbris.description = Raw material, valued for its ability to insulate aspect when refined. +item.meld2-tenbris.details = Fume infused hematite, more malleable and less brittle but less hard than usual. -item.meld-tenbris.name = Tenbris -item.meld-tenbris.description = Raw material, valued for its ability to insulate aspect when refined. -item.meld-tenbris.details = Fume infused hematite, more malleable and less brittle but less hard than usual. +item.meld2-motis.name = Motis +item.meld2-motis.description = Raw material, valued for its natural magnetism. +item.meld2-motis.details = Fume infused magnetite, more malleable and less brittle but less hard than usual. -item.meld-motis.name = Motis -item.meld-motis.description = Raw material, valued for its natural magnetism. -item.meld-motis.details = Fume infused magnetite, more malleable and less brittle but less hard than usual. +item.meld2-shadesteel.name = Shadesteel +item.meld2-shadesteel.description = Not just some rock anymore.\nDurable building material. +item.meld2-shadesteel.details = IT'S NOT IRON I SWEAR -item.meld-shadesteel.name = Shadesteel -item.meld-shadesteel.description = Not just some rock anymore.\nDurable building material. -item.meld-shadesteel.details = IT'S NOT IRON I SWEAR +item.meld2-elnar-dust.name = Elnar Dust +item.meld2-elnar-dust.description = Raw material, valued for its ability to conduct aspect. +item.meld2-elnar-dust.details = Often found accumulating as specs in streams, which run through rich Elnar deposits.\n\nNative mineral to Ikaru, unknown composition. Likely aspect based... -item.meld-elnar-dust.name = Elnar Dust -item.meld-elnar-dust.description = Raw material, valued for its ability to conduct aspect. -item.meld-elnar-dust.details = Often found accumulating as specs in streams, which run through rich Elnar deposits.\n\nNative mineral to Ikaru, unknown composition. Likely aspect based... +item.meld2-compacted-brick.name = Compacted Bricks +item.meld2-compacted-brick.description = Used as a form of concrete for building foundations and power infastructure alongside Stony Gloop and Electrum Sheets. +item.meld2-compacted-brick.details = Bonk -item.meld-compacted-brick.name = Compacted Bricks -item.meld-compacted-brick.description = Used as a form of concrete for building foundations and power infastructure alongside Stony Gloop and Electrum Sheets. -item.meld-compacted-brick.details = Bonk +item.meld2-stony-gloop.name = Stony Gloop +item.meld2-stony-gloop.description = Used as a motar for building foundations and power infastructure alongside Compacted Bricks and Electrum Sheets. +item.meld2-stony-gloop.details = Bloop -item.meld-stony-gloop.name = Stony Gloop -item.meld-stony-gloop.description = Used as a motar for building foundations and power infastructure alongside Compacted Bricks and Electrum Sheets. -item.meld-stony-gloop.details = Bloop +item.meld2-silver.name = Silver +item.meld2-silver.description = Used in electrical components and structures. Integral part in most basic units. +item.meld2-silver.details = Undigestable by the [#ea9ad6]Meld[].\n\nGreat capsule for [#cbdbfc]Aspect[]. -item.meld-silver.name = Silver -item.meld-silver.description = Used in electrical components and structures. Integral part in most basic units. -item.meld-silver.details = Undigestable by the [#ea9ad6]Meld[].\n\nGreat capsule for [#cbdbfc]Aspect[]. +item.meld2-annealed-silver.name = Annealed Silver +item.meld2-annealed-silver.description = Highly refined and attuned. Makes for a great aspect conductor. +item.meld2-annealed-silver.details = An easily made aspect superconductor. -item.meld-annealed-silver.name = Annealed Silver -item.meld-annealed-silver.description = Highly refined and attuned. Makes for a great aspect conductor. -item.meld-annealed-silver.details = An easily made aspect superconductor. +item.meld2-iampsi.name = Iampsi +item.meld2-iampsi.description = Hardy mineral found accumulating in deposits under dried riverbeds, or as spikes above surface.\n\nDecomposable for Silver and Quartz Strata, useful for grinding. +item.meld2-iampsi.details = Radiance. -item.meld-iampsi.name = Iampsi -item.meld-iampsi.description = Hardy mineral found accumulating in deposits under dried riverbeds, or as spikes above surface.\n\nDecomposable for Silver and Quartz Strata, useful for grinding. -item.meld-iampsi.details = Radiance. +item.meld2-sandy-particulate.name = Sandy Particulate +item.meld2-sandy-particulate.description = Can't be mined by drill, crumbles too easily. Must be quarried.\n\nCan be filtered through for Quartz Strata. +item.meld2-sandy-particulate.details = Him. -item.meld-sandy-particulate.name = Sandy Particulate -item.meld-sandy-particulate.description = Can't be mined by drill, crumbles too easily. Must be quarried.\n\nCan be filtered through for Quartz Strata. -item.meld-sandy-particulate.details = Him. +item.meld2-quartz-strata.name = Quartz Strata +item.meld2-quartz-strata.description = Silicon oxide grains and crystals of various sizes, ready for industrial or military use.\n\nToo disorderly to be used in electronics raw. +item.meld2-quartz-strata.details = Me... -item.meld-quartz-strata.name = Quartz Strata -item.meld-quartz-strata.description = Silicon oxide grains and crystals of various sizes, ready for industrial or military use.\n\nToo disorderly to be used in electronics raw. -item.meld-quartz-strata.details = Me... +item.meld2-likestone-sediments.name = Likestone Sediments +item.meld2-likestone-sediments.description = Claystone deposited bessides old rivers. Acts as a great glass flux. +item.meld2-likestone-sediments.details = Family. -item.meld-likestone-sediments.name = Likestone Sediments -item.meld-likestone-sediments.description = Claystone deposited bessides old rivers. Acts as a great glass flux. -item.meld-likestone-sediments.details = Family. +item.meld2-electrum-sheet.name = Electrum Sheet +item.meld2-electrum-sheet.description = Refined material used in power transmission and advanced unit production. +item.meld2-electrum-sheet.details = Also functions as a capsule for [#cbdbfc]Aspect[]. -item.meld-electrum-sheet.name = Electrum Sheet -item.meld-electrum-sheet.description = Refined material used in power transmission and advanced unit production. -item.meld-electrum-sheet.details = Also functions as a capsule for [#cbdbfc]Aspect[]. +item.meld2-crucible-plating.name = Crucible Plating +item.meld2-crucible-plating.description = Versatile ceramic often used as an armor plating, or in the chambers of the more industrial high aspect appliances.\n\nMade from a variety of processing chains. +item.meld2-crucible-plating.details = Composition unknown. -item.meld-crucible-plating.name = Crucible Plating -item.meld-crucible-plating.description = Versatile ceramic often used as an armor plating, or in the chambers of the more industrial high aspect appliances.\n\nMade from a variety of processing chains. -item.meld-crucible-plating.details = Composition unknown. +item.meld2-aspect-pipe.name = Aspect Pipe +item.meld2-aspect-pipe.description = Insulated hull with a conductive core, used to transport aspects safely.\n\nMade from a variety of processing chains. +item.meld2-aspect-pipe.details = Looks like a swiss roll.\n\nWhat's a "swiss"?\n\nduno, probably like a word which good- a word which means good tasting\n\nWhat a silly word!\nnShould be replaced with delicious\n\nyeah but then it's too literally... literal with its name -item.meld-aspect-pipe.name = Aspect Pipe -item.meld-aspect-pipe.description = Insulated hull with a conductive core, used to transport aspects safely.\n\nMade from a variety of processing chains. -item.meld-aspect-pipe.details = Looks like a swiss roll.\n\nWhat's a "swiss"?\n\nduno, probably like a word which good- a word which means good tasting\n\nWhat a silly word!\nnShould be replaced with delicious\n\nyeah but then it's too literally... literal with its name +item.meld2-vitric-mesh.name = Vitric Mesh +item.meld2-vitric-mesh.description = An intricate piece of glasswork which captures [#cb8650]Aether[] when stimulated with power, building on itself. +item.meld2-vitric-mesh.details = The design is of Meld origin, first being seen woven by constructs native to the Badlands. It is unknown what purpose they served. -item.meld-vitric-mesh.name = Vitric Mesh -item.meld-vitric-mesh.description = An intricate piece of glasswork which captures [#cb8650]Aether[] when stimulated with power, building on itself. -item.meld-vitric-mesh.details = The design is of Meld origin, first being seen woven by constructs native to the Badlands. It is unknown what purpose they served. +item.meld2-shiny-globule.name = Shiny Globule +item.meld2-shiny-globule.description = Melted remains of glass hardened into shiny globules. Best disposed of safely, or recycled. +item.meld2-shiny-globule.details = Glassy remains of a once intricate craft.\n\nAn intresting natural phenomina. Seems to pulsate with a faint yet deep orange glow. -item.meld-shiny-globule.name = Shiny Globule -item.meld-shiny-globule.description = Melted remains of glass hardened into shiny globules. Best disposed of safely, or recycled. -item.meld-shiny-globule.details = Glassy remains of a once intricate craft.\n\nAn intresting natural phenomina. Seems to pulsate with a faint yet deep orange glow. +item.meld2-stormstruck-shell.name = Stormstruck Shell +item.meld2-stormstruck-shell.description = A crystalline weave of Dissonitre around a polished Resonarum clump.\nHighly unstable... +item.meld2-stormstruck-shell.details = An unatural abomination of two opposing forces, held together by some unknown force. -item.meld-stormstruck-shell.name = Stormstruck Shell -item.meld-stormstruck-shell.description = A crystalline weave of Dissonitre around a polished Resonarum clump.\nHighly unstable... -item.meld-stormstruck-shell.details = An unatural abomination of two opposing forces, held together by some unknown force. +item.meld2-resonarum.name = Resonarum +item.meld2-resonarum.description = Used in high-energy [#cbdbfc]Aspect[] appliences such as [red]Nullifiers[]. +item.meld2-resonarum.details = Pulsates with an erie green glow. Appears to passively mend itself. -item.meld-resonarum.name = Resonarum -item.meld-resonarum.description = Used in high-energy [#cbdbfc]Aspect[] appliences such as [red]Nullifiers[]. -item.meld-resonarum.details = Pulsates with an erie green glow. Appears to passively mend itself. +item.meld2-dissonitre.name = Dissonitre +item.meld2-dissonitre.description = Rare alternative source of [#cb8650]Aether[] sourced from the Storm Planes and Badlands. Somewhat unstable. +item.meld2-dissonitre.details = Produces a distorted clicking sound. -item.meld-dissonitre.name = Dissonitre -item.meld-dissonitre.description = Rare alternative source of [#cb8650]Aether[] sourced from the Storm Planes and Badlands. Somewhat unstable. -item.meld-dissonitre.details = Produces a distorted clicking sound. +item.meld2-clay-mallow.name = Clay-Mallow +item.meld2-clay-mallow.description = Clay from the Badlands. Easly moulded to form containers, but difficult to aquire by blasting soil. +item.meld2-clay-mallow.details = A delicate substance valued for its malleability and ability to keep its shape, along with its velvety texture. -item.meld-clay-mallow.name = Clay-Mallow -item.meld-clay-mallow.description = Clay from the Badlands. Easly moulded to form containers, but difficult to aquire by blasting soil. -item.meld-clay-mallow.details = A delicate substance valued for its malleability and ability to keep its shape, along with its velvety texture. +item.meld2-glass-mallow.name = Glass-Mallow +item.meld2-glass-mallow.description = Refined clay from the Badlands, more glass than ceramic. +item.meld2-glass-mallow.details = A glossy, crystalline substance. -item.meld-glass-mallow.name = Glass-Mallow -item.meld-glass-mallow.description = Refined clay from the Badlands, more glass than ceramic. -item.meld-glass-mallow.details = A glossy, crystalline substance. +item.meld2-riplom.name = Riplom +item.meld2-riplom.description = Shale from the Storm Planes. A great flux for glasswork, though not much practical use found. Slightly volatile. +item.meld2-riplom.details = Looks almost fungal. Seems to absorb [#cbdbfc]Aspect[] from its suroundings. -item.meld-riplom.name = Riplom -item.meld-riplom.description = Shale from the Storm Planes. A great flux for glasswork, though not much practical use found. Slightly volatile. -item.meld-riplom.details = Looks almost fungal. Seems to absorb [#cbdbfc]Aspect[] from its suroundings. +item.meld2-riploko.name = Riploko +item.meld2-riploko.description = Riplom which has been infused with [#cbdbfc]Aspect[]. Ready to explode! +item.meld2-riploko.details = Oh no... -item.meld-riploko.name = Riploko -item.meld-riploko.description = Riplom which has been infused with [#cbdbfc]Aspect[]. Ready to explode! -item.meld-riploko.details = Oh no... +item.meld2-technoscrap.name = Technoscrap +item.meld2-technoscrap.description = Used in advanced storage logistics and basic Core blocks. +item.meld2-technoscrap.details = Used as a data storage medium. Has large amounts of data inscribed onto it at any given time.\nThere's data in the walls... Delicious! -item.meld-technoscrap.name = Technoscrap -item.meld-technoscrap.description = Used in advanced storage logistics and basic Core blocks. -item.meld-technoscrap.details = Used as a data storage medium. Has large amounts of data inscribed onto it at any given time.\nThere's data in the walls... Delicious! +item.meld2-grating-chunk.name = Grating Chunk +item.meld2-grating-chunk.description = No apparent use found. Panneling for the floors of the facilities which dot Ikaru. +item.meld2-grating-chunk.details = Despite the description made to imform you about what use you have for chunks, large swobs of chunks are used as the base of most of our structures. While database entries about this technology have been locked away from you, take detours from the path and find databanks. They will teach you how to produce and use theese chunks. -item.meld-grating-chunk.name = Grating Chunk -item.meld-grating-chunk.description = No apparent use found. Panneling for the floors of the facilities which dot Ikaru. -item.meld-grating-chunk.details = Despite the description made to imform you about what use you have for chunks, large swobs of chunks are used as the base of most of our structures. While database entries about this technology have been locked away from you, take detours from the path and find databanks. They will teach you how to produce and use theese chunks. +item.meld2-fragment.name = Fragment +item.meld2-fragment.description = Used to defragment the database to unlock new technology, and in advanced unit production. +item.meld2-fragment.details = Miscellaneous, disorganised pieces of data collected from the previous incursion. Often more useful than not. -item.meld-fragment.name = Fragment -item.meld-fragment.description = Used to defragment the database to unlock new technology, and in advanced unit production. -item.meld-fragment.details = Miscellaneous, disorganised pieces of data collected from the previous incursion. Often more useful than not. +item.meld2-memory-shard.name = Memory Shard +item.meld2-memory-shard.description = Used to defragment the database to unlock new technology, and in certain Liquid Data sources. +item.meld2-memory-shard.details = Rare pieecs of Technoscrap leaking organized [#9ccaed]Liquid Data[] into the sky. Appears to come from faulty databases, though the exact phenominon which unwravels technoscrap is still unknown. -item.meld-memory-shard.name = Memory Shard -item.meld-memory-shard.description = Used to defragment the database to unlock new technology, and in certain Liquid Data sources. -item.meld-memory-shard.details = Rare pieecs of Technoscrap leaking organized [#9ccaed]Liquid Data[] into the sky. Appears to come from faulty databases, though the exact phenominon which unwravels technoscrap is still unknown. +item.meld2-bioscrap-graft.name = Bioscrap Graft +item.meld2-bioscrap-graft.description = Used to defragment the database to unlock new technology, and in certain regenerative appliences. +item.meld2-bioscrap-graft.details = Crafully assembled piece of technoscrap with some Earthen Soil and Aether packed in..\nThe first attempts at resonarum farming. While they did not prove to be useful on an indistrial scale, samples have found use instead in regenerative technology and data generation, propagating their use. -item.meld-bioscrap-graft.name = Bioscrap Graft -item.meld-bioscrap-graft.description = Used to defragment the database to unlock new technology, and in certain regenerative appliences. -item.meld-bioscrap-graft.details = Crafully assembled piece of technoscrap with some Earthen Soil and Aether packed in..\nThe first attempts at resonarum farming. While they did not prove to be useful on an indistrial scale, samples have found use instead in regenerative technology and data generation, propagating their use. +item.meld2-abberation-core.name = Abberation Core +item.meld2-abberation-core.description = Used to defragment the database to unlock new technology, and in certain Liquid Data slources. +item.meld2-abberation-core.details = Spouts random garbles of [#9ccaed]Liquid Data[] when energised. Quite the crude construct compared to other sources. -item.meld-abberation-core.name = Abberation Core -item.meld-abberation-core.description = Used to defragment the database to unlock new technology, and in certain Liquid Data slources. -item.meld-abberation-core.details = Spouts random garbles of [#9ccaed]Liquid Data[] when energised. Quite the crude construct compared to other sources. +item.meld2-industrial-rubble.name = Industrial Rubble +item.meld2-industrial-rubble.description = Lucrative source of essential materials when cracked.\n[gray]Edible to the Meld.[] +item.meld2-industrial-rubble.details = Large clusters can be found primerally in containers next to debris. Better maintained containers may have more refined parts. -item.meld-industrial-rubble.name = Industrial Rubble -item.meld-industrial-rubble.description = Lucrative source of essential materials when cracked.\n[gray]Edible to the Meld.[] -item.meld-industrial-rubble.details = Large clusters can be found primerally in containers next to debris. Better maintained containers may have more refined parts. +item.meld2-industrial-rubble-cracked.name = Industrial Rubble (Cracked) +item.meld2-industrial-rubble-cracked.description = Refinable for a slew of essential materials. +item.meld2-industrial-rubble-cracked.details = Corrosion resistant materials exposed after digestive processes and percussive damage.\nStrata recognises most miscalaneous items as cracked industrial rubble. Keep them out of the containers during evacuation!\n...Who's going t -item.meld-industrial-rubble-cracked.name = Industrial Rubble (Cracked) -item.meld-industrial-rubble-cracked.description = Refinable for a slew of essential materials. -item.meld-industrial-rubble-cracked.details = Corrosion resistant materials exposed after digestive processes and percussive damage.\nStrata recognises most miscalaneous items as cracked industrial rubble. Keep them out of the containers during evacuation!\n...Who's going t +item.meld2-astral-fulgurite.name = Astral Fulgurite +item.meld2-astral-fulgurite.description = Refineable for a slew of glassy materials. +item.meld2-astral-fulgurite.details = Looks like a weave of beutiful dissonitre glass with resonarum, wrapped around some Riplo shale.\n\nWho was this made by? -item.meld-astral-fulgurite.name = Astral Fulgurite -item.meld-astral-fulgurite.description = Refineable for a slew of glassy materials. -item.meld-astral-fulgurite.details = Looks like a weave of beutiful dissonitre glass with resonarum, wrapped around some Riplo shale.\n\nWho was this made by? +item.meld2-grazing-bar.name = Grazing Bar +item.meld2-grazing-bar.description = A bar of highly compacted dehydrated flora with a [#b89f47]Nectar[] center. Fragments easly with a loud cracking sound, but soft on the inside. +item.meld2-grazing-bar.details = I have no mouth and I must TASTE. -item.meld-grazing-bar.name = Grazing Bar -item.meld-grazing-bar.description = A bar of highly compacted dehydrated flora with a [#b89f47]Nectar[] center. Fragments easly with a loud cracking sound, but soft on the inside. -item.meld-grazing-bar.details = I have no mouth and I must TASTE. +item.meld2-meld-shard.name = Meld Shard +item.meld2-meld-shard.description = Vague lifeform in crystal form. Use unknown. +item.meld2-meld-shard.details = DO NOT TAKE THIS HOME.\nWh-?\nNO.\nBut it's still frozen...\nLook- just put it in the chute and lets get out of here\nWhat chute?\nDo you know where "the chute" is?\nI- I don't actually. I thought you knew.\nI uh... wasn't told about a chute\nI was told there would be a chute when I was being shiped over\nYou're the one with the authority here, what do we do?\nYou shoudn't be telling me what t- oh. I... don't know.\nI want to see what happens when it melts. How it'll behave.\nIm done being screwed over, lets see... -item.meld-meld-shard.name = Meld Shard -item.meld-meld-shard.description = Vague lifeform in crystal form. Use unknown. -item.meld-meld-shard.details = DO NOT TAKE THIS HOME.\nWh-?\nNO.\nBut it's still frozen...\nLook- just put it in the chute and lets get out of here\nWhat chute?\nDo you know where "the chute" is?\nI- I don't actually. I thought you knew.\nI uh... wasn't told about a chute\nI was told there would be a chute when I was being shiped over\nYou're the one with the authority here, what do we do?\nYou shoudn't be telling me what t- oh. I... don't know.\nI want to see what happens when it melts. How it'll behave.\nIm done being screwed over, lets see... +item.meld2-larval-plating.name = Larval Plating +item.meld2-larval-plating.description = Some sort of juvinile plating piece. No uses found. +item.meld2-larval-plating.details = As the incursion continued, constructs were made from more modular pieces. Being able to meld together pieces of metal into building constructs via buildbeam was a huge breakthrough for the [#ea9ad6]Meld[]. -item.meld-larval-plating.name = Larval Plating -item.meld-larval-plating.description = Some sort of juvinile plating piece. No uses found. -item.meld-larval-plating.details = As the incursion continued, constructs were made from more modular pieces. Being able to meld together pieces of metal into building constructs via buildbeam was a huge breakthrough for the [#ea9ad6]Meld[]. +item.meld2-larva.name = Larva +item.meld2-larva.description = Writhing metalic hunk with segments. Often seen in incubation structures that manufacture new constructs. -item.meld-larva.name = Larva -item.meld-larva.description = Writhing metalic hunk with segments. Often seen in incubation structures that manufacture new constructs. +item.meld2-metalic-chunk.name = Metalic Chunk +item.meld2-metalic-chunk.description = Some sort of metalalic hunk. No uses found.\n[gray]Edible to the Meld.[] +item.meld2-metalic-chunk.details = Found on most mid-incursion constructs due to the sheer availability of non-native metal. -item.meld-metalic-chunk.name = Metalic Chunk -item.meld-metalic-chunk.description = Some sort of metalalic hunk. No uses found.\n[gray]Edible to the Meld.[] -item.meld-metalic-chunk.details = Found on most mid-incursion constructs due to the sheer availability of non-native metal. +item.meld2-metalic-globule.name = Metalic Globule +item.meld2-metalic-globule.description = Some sort of metalalic blob. No uses found. +item.meld2-metalic-globule.details = Found on most pre-incursion constructs alongside Larval Plating. A conglomero of metals native to Ikaru. -item.meld-metalic-globule.name = Metalic Globule -item.meld-metalic-globule.description = Some sort of metalalic blob. No uses found. -item.meld-metalic-globule.details = Found on most pre-incursion constructs alongside Larval Plating. A conglomero of metals native to Ikaru. +item.meld2-stony-particulate.name = Stony Particulate +item.meld2-stony-particulate.description = Grains of carbon stone. +item.meld2-stony-particulate.details = Glued together by the [#ea9ad6]Meld[] using some unknown process. -item.meld-stony-particulate.name = Stony Particulate -item.meld-stony-particulate.description = Grains of carbon stone. -item.meld-stony-particulate.details = Glued together by the [#ea9ad6]Meld[] using some unknown process. +item.meld2-aspect-bomb.name = Aspect Bomb +item.meld2-aspect-bomb.description = Intricate glasswork and silver capsule containing volatile [meld2-storming-aspect]Storming Aspect[].\n\nA primary high explosive usable both as an extremely potent ammo, and for use in industrial mining applications.\n\nPerfect to load into units for kamikaze runs. +item.meld2-aspect-bomb.details = Legends of the blue wolf roaming these lands once took an entire crystalline fortification down... with just aspect and pipes. -item.meld-bramble-vine.name = Bramble Vine -item.meld-bramble-vine.description = Thick biological strands coursing with [#89828c]Mercury[].\nContains trace amounts of [#89413e]Ooze[] +item.meld2-gunpowder.name = Gunpowder +item.meld2-gunpowder.description = A self oxidising, rapidly decomposing powder who's deflagration produces supersonic shockwaves.\n\nHighly useful in mining explosives, can be manufactured into many standardised ammo types. +item.meld2-gunpowder.details = Doesn't beat aspect bombing. -item.meld-compacted-masses.name = Compacted Masses -item.meld-compacted-masses.description = Cluster of biological material wrapped with [accent]Bramble Vines[]. +item.meld2-bramble-vine.name = Bramble Vine +item.meld2-bramble-vine.description = Thick biological strands coursing with [#89828c]Mercury[].\nContains trace amounts of [#89413e]Ooze[] -item.meld-starving-masses.name = Starving Masses -item.meld-starving-masses.description = Shriveled up cluster of biological material. Acts as a great filtratium medium. The texture's quite dry. -item.meld-starving-masses.details = Hey stop eating that, we don't know what it's mad-\nShut it, I've been locked in here for ages\nBut that doesn't mean you should eat that, it's probably starving\nFor what? The sludge they keep giving me to drink?\n...would you like to try that? +item.meld2-compacted-masses.name = Compacted Masses +item.meld2-compacted-masses.description = Cluster of biological material wrapped with [accent]Bramble Vines[]. -item.meld-elderflesh.name = Elderflesh -item.meld-elderflesh.description = Twisted biological strands coursing with [#b89f47]Nectar[].\nConstitutes the flora of the Mercury Swamps. +item.meld2-starving-masses.name = Starving Masses +item.meld2-starving-masses.description = Shriveled up cluster of biological material. Acts as a great filtratium medium. The texture's quite dry. +item.meld2-starving-masses.details = Hey stop eating that, we don't know what it's mad-\nShut it, I've been locked in here for ages\nBut that doesn't mean you should eat that, it's probably starving\nFor what? The sludge they keep giving me to drink?\n...would you like to try that? -item.meld-blossoming-elderflesh.name = Blossoming Elderflesh -item.meld-blossoming-elderflesh.description = Puffballs of fine biological grains and slits intertwined with larger strands.\n[gray]Edible to the Meld.[] +item.meld2-elderflesh.name = Elderflesh +item.meld2-elderflesh.description = Twisted biological strands coursing with [#b89f47]Nectar[].\nConstitutes the flora of the Mercury Swamps. -item.meld-coagulated-vigor.name = Coagulated Vigor -item.meld-coagulated-vigor.description = An eternally burning daemon's flesh, constantly in a cancerous state. One must imagine Icarus happy.\n[gray]Edible to the Meld.[] +item.meld2-blossoming-elderflesh.name = Blossoming Elderflesh +item.meld2-blossoming-elderflesh.description = Puffballs of fine biological grains and slits intertwined with larger strands.\n[gray]Edible to the Meld.[] -item.meld-homunculus-chunk.name = Homunculus Chunk -item.meld-homunculus-chunk.description = Chunks of... something?\nNot quite human.\n[gray]Edible to the Meld.[] +item.meld2-coagulated-vigor.name = Coagulated Vigor +item.meld2-coagulated-vigor.description = An eternally burning daemon's flesh, constantly in a cancerous state. One must imagine Icarus happy.\n[gray]Edible to the Meld.[] + +item.meld2-homunculus-chunk.name = Homunculus Chunk +item.meld2-homunculus-chunk.description = Chunks of... something?\nNot quite human.\n[gray]Edible to the Meld.[] //Liquids -liquid.meld-aether.name = [#cb8650]Aether -liquid.meld-aether.description = Passively collected by certain structures. Found in abundance from [accent]aether vents[]. -liquid.meld-aether.details = Contains an abundance of primordial aspects. +liquid.meld2-aether.name = [#cb8650]Aether +liquid.meld2-aether.description = Passively collected by certain structures. Found in abundance from [accent]aether vents[]. +liquid.meld2-aether.details = Contains an abundance of primordial aspects. -liquid.meld-aspect.name = [#cbdbfc]Aspect -liquid.meld-aspect.description = Unstable alternative power source. Refinable. -liquid.meld-aspect.details = Mixed primordial aspects. +liquid.meld2-aspect.name = [#cbdbfc]Aspect +liquid.meld2-aspect.description = Unstable alternative power source. Refinable. +liquid.meld2-aspect.details = Mixed primordial aspects. -liquid.meld-fumes.name = [#5b4739]Fumes -liquid.meld-fumes.description = Passively seeps into conductive materials. Used for a variety of metallurgic and restorative appliances. -liquid.meld-fumes.details = Smoggy primordial aspects. +liquid.meld2-fumes.name = [#5b4739]Fumes +liquid.meld2-fumes.description = Passively seeps into conductive materials. Used for a variety of metallurgic and restorative appliances. +liquid.meld2-fumes.details = Smoggy primordial aspects. -liquid.meld-pollutant-mixture.name = [#cb8650][#6b4e4e]Pollutant Mix[] -liquid.meld-pollutant-mixture.description = A mix of common aspects in the atmosphere of Ikaru. Emitted by [accent]aether vents[].\n\nCan be used in place of [#cb8650]Aether[] -liquid.meld-pollutant-mixture.details = A mixture of secondary aspects. +liquid.meld2-pollutant-mixture.name = [#cb8650][#6b4e4e]Pollutant Mix[] +liquid.meld2-pollutant-mixture.description = A mix of common aspects in the atmosphere of Ikaru. Emitted by [accent]aether vents[].\n\nCan be used in place of [#cb8650]Aether[] +liquid.meld2-pollutant-mixture.details = A mixture of secondary aspects. -liquid.meld-thundering-aether.name = [#e98b66]Thundering Aether[] -liquid.meld-thundering-aether.description = Cackles and crackles, an energy inbetween.\n\nCan be used in place of [#cb8650]Aether[] -liquid.meld-thundering-aether.details = Crickling and crackling, cackling and cack- auegh... dammit\n\nwait, is this thing still on?\n\nFith... fith- sixed? nono... has t-[red][] +liquid.meld2-thundering-aether.name = [#e98b66]Thundering Aether[] +liquid.meld2-thundering-aether.description = Cackles and crackles, an energy inbetween.\n\nCan be used in place of [#cb8650]Aether[] +liquid.meld2-thundering-aether.details = Crickling and crackling, cackling and cack- auegh... dammit\n\nwait, is this thing still on?\n\nFith... fith- sixed? nono... has t-[red][] -liquid.meld-bound-aspect.name = [#a451c8]Bound Aspect[] -liquid.meld-bound-aspect.description = A highly energy dense, stable fuel.\n\nCan be used in place of [#cbdbfc]Aspect[] -liquid.meld-bound-aspect.details = Confusing mixture of primordial aspects +liquid.meld2-bound-aspect.name = [#a451c8]Bound Aspect[] +liquid.meld2-bound-aspect.description = A highly energy dense, stable fuel.\n\nCan be used in place of [#cbdbfc]Aspect[] +liquid.meld2-bound-aspect.details = Confusing mixture of primordial aspects -liquid.meld-storming-aspect.name = [#ffffff]Storming Aspect[] -liquid.meld-storming-aspect.description = Sparks and flashes, dancing on the monitor.\n\nCan be used in place of [#cbdbfc]Aspect[] -liquid.meld-storming-aspect.details = Hexing dance of primordial aspects +liquid.meld2-storming-aspect.name = [#ffffff]Storming Aspect[] +liquid.meld2-storming-aspect.description = Sparks and flashes, dancing on the monitor.\n\nCan be used in place of [#cbdbfc]Aspect[] +liquid.meld2-storming-aspect.details = Hexing dance of primordial aspects -liquid.meld-nectar.name = [#b89f47]Nectar -liquid.meld-nectar.description = Used as a potent coolant. Can be refined into [#89828c]Mercury[] over high heat with the right reagents. Encourages a slight mending effect on units. -liquid.meld-nectar.details = Blood of the swamp. +liquid.meld2-nectar.name = [#b89f47]Nectar +liquid.meld2-nectar.description = Used as a potent coolant. Can be refined into [#89828c]Mercury[] over high heat with the right reagents. Encourages a slight mending effect on units. +liquid.meld2-nectar.details = Blood of the swamp. -liquid.meld-mercury.name = [#89828c]Mercury -liquid.meld-mercury.description = Used as lubricant. Acts as a potent toxin inside creatures of [#ea9ad6]Meld[] origin. -liquid.meld-mercury.details = The database gets a bit... dubious with autoanalysis of substances. Remeber to clarify what stats like heat capacity and temperature mean with any survivors. +liquid.meld2-mercury.name = [#89828c]Mercury +liquid.meld2-mercury.description = Used as lubricant. Acts as a potent toxin inside creatures of [#ea9ad6]Meld[] origin. +liquid.meld2-mercury.details = The database gets a bit... dubious with autoanalysis of substances. Remeber to clarify what stats like heat capacity and temperature mean with any survivors. -liquid.meld-blood.name = [#7d312f]Blood -liquid.meld-blood.description = [gray]...\nwhat?[] -liquid.meld-blood.details = Lifeforce of the swamp.\n\n[accent]Cycle[] +liquid.meld2-blood.name = [#7d312f]Blood +liquid.meld2-blood.description = [gray]...\nwhat?[] +liquid.meld2-blood.details = Lifeforce of the swamp.\n\n[accent]Cycle[] -liquid.meld-ooze.name = [#89413e]Ooze -liquid.meld-ooze.description = No apparent use found. Cold to the touch. -liquid.meld-ooze.details = Comprises most of the Mercury Swamp's terrain. Very dense, yet still quite runny.\n\n[accent]Decay[] +liquid.meld2-ooze.name = [#89413e]Ooze +liquid.meld2-ooze.description = No apparent use found. Cold to the touch. +liquid.meld2-ooze.details = Comprises most of the Mercury Swamp's terrain. Very dense, yet still quite runny.\n\n[accent]Decay[] -liquid.meld-rift.name = [#8872da]Rift -liquid.meld-rift.description = Refinable into [#b460e2]Warp[]. Released from [#cb8650]Aether[] fused with Carbolith under high heat. -liquid.meld-rift.details = Jumbled primordial aspects. +liquid.meld2-rift.name = [#8872da]Rift +liquid.meld2-rift.description = Refinable into [#b460e2]Warp[]. Released from [#cb8650]Aether[] fused with Carbolith under high heat. +liquid.meld2-rift.details = Jumbled primordial aspects. -liquid.meld-warp.name = [#b460e2]Warp -liquid.meld-warp.description = Used in utility buildings as fuel and in higher tier unit construction.\n\n[scarlet]Highly unstable[] +liquid.meld2-warp.name = [#b460e2]Warp +liquid.meld2-warp.description = Used in utility buildings as fuel and in higher tier unit construction.\n\n[scarlet]Highly unstable[] -liquid.meld-ichor.name = [#e6c700]Ichor -liquid.meld-ichor.description = Major food source for the [#ea9ad6]Meld[]. Fuels [#ea9ad6]Meld[] construct birthing and a major component in sustainable power systems/mass-produced infastructure. +liquid.meld2-ichor.name = [#e6c700]Ichor +liquid.meld2-ichor.description = Major food source for the [#ea9ad6]Meld[]. Fuels [#ea9ad6]Meld[] construct birthing and a major component in sustainable power systems/mass-produced infastructure. -liquid.meld-liquid-data.name = [#9ccaed]Liquid Data[] -liquid.meld-liquid-data.description = Fluid form of data pulled from technoscrap and other related materials. -liquid.meld-liquid-data.details = Appears to act as an alternative power source of sorts. +liquid.meld2-liquid-data.name = [#9ccaed]Liquid Data[] +liquid.meld2-liquid-data.description = Fluid form of data pulled from technoscrap and other related materials. +liquid.meld2-liquid-data.details = Appears to act as an alternative power source of sorts. -liquid.meld-null.name = [red]Null -liquid.meld-null.description = Byproduct of technoscrap cracking. Often vanishes without a trace. +liquid.meld2-null.name = [red]Null +liquid.meld2-null.description = Byproduct of technoscrap cracking. Often vanishes without a trace. -liquid.meld-meld.name = [#ea9ad6]Meld[] -liquid.meld-meld.description = Slowly disolves most metals and organics, save for a group of materials. -liquid.meld-meld.details = The original lifeform on Ikaru in gaseous state. +liquid.meld2-meld.name = [#ea9ad6]Meld[] +liquid.meld2-meld.description = Slowly disolves most metals and organics, save for a group of materials. +liquid.meld2-meld.details = The original lifeform on Ikaru in gaseous state. //Aspect Groups -aspect-group.meld-aether = [meld-aether]Aether -aspect-group.meld-aspect = [meld-aspect]Aspect -aspect-group.meld-fumes = [meld-fumes]Fumes -aspect-group.meld-outlet-fuel = Outlet Fuel +aspect-group.meld2-aether = [meld2-aether]Aether +aspect-group.meld2-aspect = [meld2-aspect]Aspect +aspect-group.meld2-fumes = [meld2-fumes]Fumes +aspect-group.meld2-aqua = [#6fd37a]Aqua[] +aspect-group.meld2-outlet = Outlet Fuel //Units //Internal -unit.meld-observer.name = Observer -unit.meld-observer.description = Commander of the Dormant Raft core. Fields a large build radius and [accent]Rallies[] nearby allies. Cannot mine resources, and comes with a reduced build speed. -unit.meld-observer. +unit.meld2-observer.name = Observer +unit.meld2-observer.description = Commander of the Dormant Raft core. Fields a large build radius and [accent]Rallies[] nearby allies. Cannot mine resources, and comes with a reduced build speed. +unit.meld2-observer. //Strata units -unit.meld-bulbhead.name = Bulbhead -unit.meld-bulbhead.description = Commander of the Raft core. Shoots sonar pulses and [accent]Rallies[] nearby allies. Repairs allied structures. Can reconstitute itself using appropriate liquids, or with enough time.\n\nHovers over buildings and solid floors at a reduced speed. -unit.meld-bulbhead.details = The classic. +unit.meld2-bulbhead.name = Bulbhead +unit.meld2-bulbhead.description = Commander of the Raft core. Shoots sonar pulses and [accent]Rallies[] nearby allies. Repairs allied structures. Can reconstitute itself using appropriate liquids, or with enough time.\n\nHovers over buildings and solid floors at a reduced speed. +unit.meld2-bulbhead.details = The classic. -unit.meld-bulbhead-sonar.name = Bulbhead Overseer +unit.meld2-bulbhead-sonar.name = Bulbhead Overseer -unit.meld-omega.name = Omega -unit.meld-omega.description = Commander of the Omega pad. Launches canisters of shrapnel and [accent]Rallies[] nearby allies.\n\nHas a personal shield generator feeding into a force projector which gets faster at lower shield integrety. Can reconstitute itself using appropriate liquids. -unit.meld-omega.details = The other classic. +unit.meld2-omega.name = Omega +unit.meld2-omega.description = Commander of the Omega pad. Launches canisters of shrapnel and [accent]Rallies[] nearby allies.\n\nHas a personal shield generator feeding into a force projector which gets faster at lower shield integrety. Can reconstitute itself using appropriate liquids. +unit.meld2-omega.details = The other classic. -unit.meld-psi.name = Psi -unit.meld-psi.description = Commander of the Psi pad. Charges up and fires beams of [#cbdbfc]Aspect[], doing [red]devistating[] damage, and [accent]Rallies[] nearby allies.\n\nHas a personal shield generator which gets faster at lower shield integrety. Can reconstitute itself using appropriate liquids. -unit.meld-psi.details = ...you sure this will work?\n\nI've tested it before, how badly could this end? +unit.meld2-psi.name = Psi +unit.meld2-psi.description = Commander of the Psi pad. Charges up and fires beams of [#cbdbfc]Aspect[], doing [red]devistating[] damage, and [accent]Rallies[] nearby allies.\n\nHas a personal shield generator which gets faster at lower shield integrety. Can reconstitute itself using appropriate liquids. +unit.meld2-psi.details = ...you sure this will work?\n\nI've tested it before, how badly could this end? -unit.meld-phi.name = Phi -unit.meld-phi.description = Commander of the Phi pad. Launches armor-piercing spines which release ooze foam upon hitting the ground, and [accent]Rallies[] nearby allies.\n\nCan reconstitute itself using appropriate liquids, or with enough time.\n\n[accent]Lightly armored[] -unit.meld-phi.details = ...you sure this will work?\n\nI've tested it before, how badly could this end? +unit.meld2-phi.name = Phi +unit.meld2-phi.description = Commander of the Phi pad. Launches armor-piercing spines which release ooze foam upon hitting the ground, and [accent]Rallies[] nearby allies.\n\nCan reconstitute itself using appropriate liquids, or with enough time.\n\n[accent]Lightly armored[] +unit.meld2-phi.details = ...you sure this will work?\n\nI've tested it before, how badly could this end? -unit.meld-outcast.name = Outcast -unit.meld-outcast.description = Old commander of the Bunker core. Drops whirling mines that sap health from targets hit. -unit.meld-outcast.details = Not a classic. Still cool though. +unit.meld2-outcast.name = Outcast +unit.meld2-outcast.description = Old commander of the Bunker core. Drops whirling mines that sap health from targets hit. +unit.meld2-outcast.details = Not a classic. Still cool though. -unit.meld-iguana.name = Iguana -unit.meld-iguana.description = Commander of the Bunker core. Launches out sap vortexes which prime after a short delay. [accent]Rallies[] nearby allies. Quick omnidirectional movement.\n\n[accent]Plated[] -unit.meld-iguana.details = One hell of an alien. +unit.meld2-iguana.name = Iguana +unit.meld2-iguana.description = Commander of the Bunker core. Launches out sap vortexes which prime after a short delay. [accent]Rallies[] nearby allies. Quick omnidirectional movement.\n\n[accent]Plated[] +unit.meld2-iguana.details = One hell of an alien. -unit.meld-shark.name = Shark -unit.meld-shark.description = Launches salvos of missiles which sap target's health. Can hover on land at a reduced speed. An [accent]excellent[] scout.\n[red]Struggles against force fields.[] -unit.meld-shark.details = Enables the other mechanized fish, especially Remora and Narwhal. +unit.meld2-shark.name = Shark +unit.meld2-shark.description = Launches salvos of missiles which sap target's health. Can hover on land at a reduced speed. An [accent]excellent[] scout.\n[red]Struggles against force fields.[] +unit.meld2-shark.details = Enables the other mechanized fish, especially Remora and Narwhal. -unit.meld-narwhal.name = Narwhal -unit.meld-narwhal.description = Launches short-ranged orbital strikes. Hovers over deep bodies of liquid. Charges an energy field channeled from its spike when moving quickly which bounces units away.\n\n[gray]If only there was some way to launch them as missiles...[]\n\n[accent]Plated[] +unit.meld2-narwhal.name = Narwhal +unit.meld2-narwhal.description = Launches short-ranged orbital strikes. Hovers over deep bodies of liquid. Charges an energy field channeled from its spike when moving quickly which bounces units away.\n\n[gray]If only there was some way to launch them as missiles...[]\n\n[accent]Plated[] -unit.meld-reef.name = Reef -unit.meld-reef.description = Mines deposits. Slowly regenerates health. +unit.meld2-reef.name = Reef +unit.meld2-reef.description = Mines deposits. Slowly regenerates health. -unit.meld-bloodied-reef.name = Bloodied Reef -unit.meld-bloodied-reef.description = ??? +unit.meld2-bloodied-reef.name = Bloodied Reef +unit.meld2-bloodied-reef.description = ??? -unit.meld-forlorn-reef.name = Forlorn Reef -unit.meld-forlorn-reef.description = ??? +unit.meld2-forlorn-reef.name = Forlorn Reef +unit.meld2-forlorn-reef.description = ??? -unit.meld-shambling-reef.name = Shambling Reef -unit.meld-shambling-reef.description = ??? +unit.meld2-shambling-reef.name = Shambling Reef +unit.meld2-shambling-reef.description = ??? -unit.meld-astrea.name = Astrea -unit.meld-astrea.description = Launches armor-piercing spines at targets. Crawls over obstructions. -unit.meld-astrea.details = Has a taste for carbonic barriers. It's up to you as to what to do about them. +unit.meld2-astrea.name = Astrea +unit.meld2-astrea.description = Launches armor-piercing spines at targets. Crawls over obstructions. +unit.meld2-astrea.details = Has a taste for carbonic barriers. It's up to you as to what to do about them. -unit.meld-remora.name = Remora -unit.meld-remora.description = Launches homing spears which sap target's health, pulling targets further back after traveling a certain distance. -unit.meld-remora.details = Despite being abiotic, Remora help Sharks tank damage on the battlefield while Sharks provide intel on where enemies are. A symbiotic relationship for the two mechanized fish. +unit.meld2-remora.name = Remora +unit.meld2-remora.description = Launches homing spears which sap target's health, pulling targets further back after traveling a certain distance. +unit.meld2-remora.details = Despite being abiotic, Remora help Sharks tank damage on the battlefield while Sharks provide intel on where enemies are. A symbiotic relationship for the two mechanized fish. -unit.meld-hammerhead.name = Hammerhead [red](PS)[] -unit.meld-hammerhead.description = Launches piercing shards at enemies, making them take more knockback from other sources. Slowly regenerates from combat.\n\nCan be affected by most helpful effects.\n\n[purple]Biological![]\n\n[red]PLACEHOLDER SPRITES[] +unit.meld2-hammerhead.name = Hammerhead [red](PS)[] +unit.meld2-hammerhead.description = Launches piercing shards at enemies, making them take more knockback from other sources. Slowly regenerates from combat.\n\nCan be affected by most helpful effects.\n\n[purple]Biological![]\n\n[red]PLACEHOLDER SPRITES[] -unit.meld-dragonfly.name = Dragonfly -unit.meld-dragonfly.description = Revs up a needle launcher when hovering in place. -unit.meld-dragonfly. +unit.meld2-dragonfly.name = Dragonfly +unit.meld2-dragonfly.description = Revs up a needle launcher when hovering in place. +unit.meld2-dragonfly. //Fringe units -unit.meld-enforcer.name = Enforcer -unit.meld-enforcer.description = Commander of squads during the incursion. Launches sprays of pellets towards targets and missiles with heavy knockback. Can reconstitute itself using appropriate liquids. -unit.meld-enforcer.details = General commander unit used alongside specialists during the incursion. +unit.meld2-enforcer.name = Enforcer +unit.meld2-enforcer.description = Commander of squads during the incursion. Launches sprays of pellets towards targets and missiles with heavy knockback. Can reconstitute itself using appropriate liquids. +unit.meld2-enforcer.details = General commander unit used alongside specialists during the incursion. -unit.meld-impaler.name = Impaler -unit.meld-impaler.description = Pierces targets with shrapnel blasts at short range. Deploys autoturrets from its thorax.\n\n[accent]Plated[] -unit.meld-impaler.details = Designed during the incursion to aid with problems arising due to armored constructs. Not very good against larger targets. +unit.meld2-impaler.name = Impaler +unit.meld2-impaler.description = Pierces targets with shrapnel blasts at short range. Deploys autoturrets from its thorax.\n\n[accent]Plated[] +unit.meld2-impaler.details = Designed during the incursion to aid with problems arising due to armored constructs. Not very good against larger targets. -unit.meld-impaler-autoturret.name = Impaler Autoturret +unit.meld2-impaler-autoturret.name = Impaler Autoturret -unit.meld-time-keeper.name = Time Keeper -unit.meld-time-keeper.description = Lacerates targets with a spray of particulate resonarum. Slowly regenerates health over time. \n\n[accent]Lightly armored[] -unit.meld-time-keeper.details = A heavy crowd control option. An expiriment with grafting resonarum which came to fruition. +unit.meld2-time-keeper.name = Time Keeper +unit.meld2-time-keeper.description = Lacerates targets with a spray of particulate resonarum. Slowly regenerates health over time. \n\n[accent]Lightly armored[] +unit.meld2-time-keeper.details = A heavy crowd control option. An expiriment with grafting resonarum which came to fruition. -unit.meld-purifier.name = Purifier -unit.meld-purifier.description = Drills through enemy structures and units alike. Can reconstitute itself using appropriate liquids. -unit.meld-purifier.details = A model predating the incursion built with local materials. +unit.meld2-purifier.name = Purifier +unit.meld2-purifier.description = Drills through enemy structures and units alike. Can reconstitute itself using appropriate liquids. +unit.meld2-purifier.details = A model predating the incursion built with local materials. //Meld units -unit.meld-jilla.name = Jilla -unit.meld-jilla.description = [#ea9ad6]First form worm/crystal bug[]\nStabalized crystal enables spurting flame indefinitely with no reprecussion. -unit.meld-jilla.details = Oddly enough, Jilla are not observed to form legs in their maturity, resembling a worm more than a crystal bug. Jilla were thought to be patient zero for new crystal bug forms, though exploring deeper into the caves lead to the discovery of something else... +unit.meld2-jilla.name = Jilla +unit.meld2-jilla.description = [#ea9ad6]First form worm/crystal bug[]\nStabalized crystal enables spurting flame indefinitely with no reprecussion. +unit.meld2-jilla.details = Oddly enough, Jilla are not observed to form legs in their maturity, resembling a worm more than a crystal bug. Jilla were thought to be patient zero for new crystal bug forms, though exploring deeper into the caves lead to the discovery of something else... + +unit.meld2-billa.name = Billa +unit.meld2-billa.description = [#ea9ad6]Seccond form worm/crystal bug[]\nConstruct sprints fowards upon being awoken, carying a bifrucated head to spurts flame in three directions.\n\n[red]Heavly Armored![] +unit.meld2-billa.details = Billas are an anomaly among cavern crystal bugs, their anatomy resembling that of a coffer.\n\nWhilst Jilla have a stabalised crystal, Billa do not. -unit.meld-scorcher.name = Scorcher -unit.meld-scorcher.description = [#ea9ad6]Small swarmling crystal bug[]\nConstruct observed to take constant damage while spurting its flame. -unit.meld-scorcher.details = Scorchers are likely the original crystal bug. Jillas are quick and often aggresive, while Scorchers are observed around their home, too fragile to venture outwards. +unit.meld2-scorcher.name = Scorcher +unit.meld2-scorcher.description = [#ea9ad6]Small swarmling crystal bug[]\nConstruct observed to take constant damage while spurting its flame. +unit.meld2-scorcher.details = Scorchers are likely the original crystal bug. Jillas are quick and often aggresive, while Scorchers are observed around their home, too fragile to venture outwards. -unit.meld-gilla.name = Gilla -unit.meld-gilla.description = [#ea9ad6]Second form crystal bug[]\nBulky form allows the construct to survive longer while spurting flame. +unit.meld2-gilla.name = Gilla +unit.meld2-gilla.description = [#ea9ad6]Second form crystal bug[]\nBulky form allows the construct to survive longer while spurting flame. -unit.meld-killa-armored.name = Killa (Armored) -unit.meld-killa-armored.description = [#ea9ad6]Second form crystal bug[]\nObserved to launch dissolving globules at hostile targets, being catapulted away from the threat. \n\n[red]Lightly armored[] -unit.meld-killa-armored.details = Constantly weighed down by their shell, Killa are the only armored constructs known to use Resonarum. +unit.meld2-killa-armored.name = Killa (Armored) +unit.meld2-killa-armored.description = [#ea9ad6]Second form crystal bug[]\nObserved to launch dissolving globules at hostile targets, being catapulted away from the threat. \n\n[red]Lightly armored[] +unit.meld2-killa-armored.details = Constantly weighed down by their shell, Killa are the only armored constructs known to use Resonarum. -unit.meld-killa.name = Killa -unit.meld-killa.description = [#ea9ad6]Second form boosting crystal bug[]\nThrusters enable quick movement and resistance to being swept back by wind. -unit.meld-killa.details = Theese lil goobers have developed somewhat of a tolerance for Resonarum through being high off it their entire lives, and they're ready to use that insatiable addiction to bypass your defenses. +unit.meld2-killa.name = Killa +unit.meld2-killa.description = [#ea9ad6]Second form boosting crystal bug[]\nThrusters enable quick movement and resistance to being swept back by wind. +unit.meld2-killa.details = Theese lil goobers have developed somewhat of a tolerance for Resonarum through being high off it their entire lives, and they're ready to use that insatiable addiction to bypass your defenses.\n\nHey, didn't I tell you to be profe-\n\nprofeshishishut up, can't I have a bit of fu-\n\nNO.\n\nJesus... double standards much. -unit.meld-craig.name = Craig -unit.meld-craig.description = [#ea9ad6]First form scrap heap[]\nLow durability and an unstable weapon, but often comes in swarms. -unit.meld-craig.details = Composed of materials frequently found in [#e6c700]Ichor[]. +unit.meld2-craig.name = Craig +unit.meld2-craig.description = [#ea9ad6]First form scrap heap[]\nLow durability and an unstable weapon, but often comes in swarms. +unit.meld2-craig.details = Composed of materials frequently found in [#e6c700]Ichor[]. -unit.meld-afraig.name = Afraig -unit.meld-afraig.description = [#ea9ad6]First form bezerking scrap heap[]\nWhen splurging flame, the construct launches itself towards the direction of shooting. Beware [#ea9ad6]Amplified[] Afraigs.\n\n[red]Armored[] +unit.meld2-afraig.name = Afraig +unit.meld2-afraig.description = [#ea9ad6]First form nuisance scrap heap[]\nWhen splurging flame, the construct is pushed back causing minimal damage to the target.\n\n[red]Armored[] -unit.meld-braig.name = Braig -unit.meld-braig.description = [#ea9ad6]Second form artillery scrap heap[]\nThe construct stays at range to shoot, while being armed with a Craig's blaster.\n\nActs as a small seige engine, able to take cover in [#ea9ad6]Meld Capsules & Beacons[]. +unit.meld2-braig.name = Braig +unit.meld2-braig.description = [#ea9ad6]Second form artillery scrap heap[]\nThe construct stays at range to shoot, while being armed with a Craig's blaster.\n\nActs as a small seige engine, able to take cover in [#ea9ad6]Meld Capsules & Beacons[]. -unit.meld-poisag.name = Poisag -unit.meld-poisag.description = [#ea9ad6]Second form shielding scrap heap[]\nObserved launching miniturized [#ea9ad6]Meld Capsules[], deploying on hit/near to units.\n\nDangerous when combined with constructs that can effectively use the protection, or when ammo is limited.\n\n[red]Lightly armored[] +unit.meld2-poisag.name = Poisag +unit.meld2-poisag.description = [#ea9ad6]Second form shielding scrap heap[]\nObserved launching miniturized [#ea9ad6]Meld Capsules[], deploying on hit/near to units.\n\nDangerous when combined with constructs that can effectively use the protection, or when ammo is limited.\n\n[red]Lightly armored[] -unit.meld-pointago.name = Pointago -unit.meld-pointago.description = [#ea9ad6]Second form incubating scrap heap[]\nConstruct stays at range after shooting, but will often run fowards afterwards.\n\nObserved to cary an incubator that can form crystals, which the heap consumes for a burst of energy. +unit.meld2-pointago.name = Pointago +unit.meld2-pointago.description = [#ea9ad6]Second form berserker scrap heap[]\nConstruct stays at range after shooting, but will often run fowards afterwards.\n\nConstruct is easily agitated when threatened, and has been observed to kamikaze into a defense after being damaged. -unit.meld-graig.name = Graig -unit.meld-graig.description = [#ea9ad6]Megalith nest scrap heap?[]\nObserved to birth Craigs en-masse. Armored with multiple of Braig's and Craig's weapons, the construct can defend itself well.\n\nTheorised to be a fragment off of a larger scrap heap.\n\n[red]Heavly armored[] +unit.meld2-graig.name = Graig +unit.meld2-graig.description = [#ea9ad6]Megalith nest scrap heap?[]\nObserved to birth Craigs en-masse. Armored with multiple of Braig's and Craig's weapons, the construct can defend itself well.\n\nTheorised to be a fragment off of a larger scrap heap.\n\n[red]Heavly armored[] -unit.meld-wuba.name = Wuba -unit.meld-wuba.description = [#ea9ad6]First form kamekaze worm[]\nWhen threatened or means of protecting its colony, the construct blasts off its shell and attempts to detonate. +unit.meld2-wuba.name = Wuba +unit.meld2-wuba.description = [#ea9ad6]First form kamekaze worm[]\nWhen threatened or means of protecting its colony, the construct blasts off its shell and attempts to detonate. -unit.meld-wuba-exploding.name = Wuba [red](Exploding!)[] -unit.meld-wuba-exploding.description = A large, volatile blob, soon to detonate.\n\n[#ea9ad6]Blob![] -unit.meld-wuba-exploding.details = It can think??? +unit.meld2-wuba-exploding.name = Wuba [red](Exploding!)[] +unit.meld2-wuba-exploding.description = A large, volatile blob, soon to detonate.\n\n[#ea9ad6]Blob![] +unit.meld2-wuba-exploding.details = It can think??? -unit.meld-uwubba.name = Uwubba -unit.meld-uwubba.description = [#ea9ad6]First form kamekaze worm[]\nA wuba encased in a stony shell, not too different to an armored killa.\n\n[red]Heavly Armored![] -unit.meld-uwubba.details = Yknow theres probably a joke to be made here. +unit.meld2-uwubba.name = Uwubba +unit.meld2-uwubba.description = [#ea9ad6]First form kamekaze worm[]\nA wuba encased in a stony shell, not too different to an armored killa.\n\n[red]Heavly Armored![] +unit.meld2-uwubba.details = Yknow theres probably a joke to be made here. -unit.meld-ontragga.name = Ontragga -unit.meld-ontragga.description = [#ea9ad6]Second form seige worm[]\nConstruct creeps foward shielding numerous wuba inside from harm whilst sporting a heavy aether cannon which fires in three round bursts.\n\nThis construct is a [accent]high priority target[] and [red]must[] be taken out before it breaches a defensive perimeter, [red]DO NOT LET IT LEAK.[]\n\n[red]Plated![]\n\n[orange]Biomechanical![] -unit.meld-ontragga.details = Yknow theres probably a joke to be made here. +unit.meld2-ontragga.name = Ontragga +unit.meld2-ontragga.description = [#ea9ad6]Second form seige worm[]\nConstruct creeps foward shielding numerous wuba inside from harm whilst sporting a heavy aether cannon which fires in three round bursts.\n\nThis construct is a [accent]high priority target[] and [red]must[] be taken out before it breaches a defensive perimeter, [red]DO NOT LET IT LEAK.[]\n\n[red]Plated![]\n\n[orange]Biomechanical![] +unit.meld2-ontragga.details = Yknow theres probably a joke to be made here. -unit.meld-globkin.name = Globkin -unit.meld-globkin.description = [#ea9ad6]Guardian skirmisher nest construct[]\n\nConstruct jolts backwards after launching a blast of shrapnel from its cannons, containing several blobs that detonate if not dealt with.\n\nDistract with moble units or drop overseer pings on it to prevent it from recoiling past defensive lines.\n\n[red]Plated![] +unit.meld2-globkin.name = Globkin +unit.meld2-globkin.description = [#ea9ad6]Guardian skirmisher nest construct[]\n\nConstruct jolts backwards after launching a blast of shrapnel from its cannons, containing several blobs that detonate if not dealt with.\n\nDistract with moble units or drop overseer pings on it to prevent it from recoiling past defensive lines.\n\n[red]Plated![] -unit.meld-allegro.name = Allegro -unit.meld-allegro.description = [#ea9ad6]Guardian phalanx nest construct[]\nConstruct comes with a localised storm projector organ which bursts a cloud of vaporous meld periodically.\n\nReconstitutes all constructs in range and dissolves nearby enemy units with its spewers, recoiling backwards to stick in front of a defensive perimeter.\n\n[red]FOCUS FIRE AND DESTROY ON SIGHT.\nDO NOT GET ENGAGE IN CLOSE COMBAT.\nYOU HAVE BEEN WARNED[] +unit.meld2-allegro.name = Allegro +unit.meld2-allegro.description = [#ea9ad6]Guardian phalanx nest construct[]\nConstruct comes with a localised storm projector organ which bursts a cloud of vaporous meld periodically.\n\nReconstitutes all constructs in range and dissolves nearby enemy units with its spewers, recoiling backwards to stick in front of a defensive perimeter.\n\n[red]FOCUS FIRE AND DESTROY ON SIGHT.\nDO NOT GET ENGAGE IN CLOSE COMBAT.\nYOU HAVE BEEN WARNED[] -unit.meld-impovrished.name = Impovrished -unit.meld-impovrished.description = [#ea9ad6]Guardian battery nest construct[]\nConstruct is an amalgamation of common combat scrap heaps.\n\nOften hides behind other artillery units while using its cannons/snipers to provide fire support.\n\Scatters miniturized [#ea9ad6]Meld Capsules[] from its tip.\n\n[red]Construct is a dangerous source of attrophy, engage in flanking manuvours and DESTROY on identification.[]\n\n[red]Plated!\n\n[orange]Biomechanical![] -unit.meld-impovrished.details = A mock of a mock-\nan effegy of fraud, yet with real bite. +unit.meld2-impovrished.name = Impovrished +unit.meld2-impovrished.description = [#ea9ad6]Guardian battery nest construct[]\nConstruct is an amalgamation of common combat scrap heaps.\n\nOften hides behind other artillery units while using its cannons/snipers to provide fire support.\n\Scatters miniaturised [#ea9ad6]Meld Capsules[] from its tip.\n\n[red]Construct is a dangerous source of attrophy, engage in flanking manuvours and DESTROY on identification.[]\n\n[red]Plated!\n\n[orange]Biomechanical![] +unit.meld2-impovrished.details = A mock of a mock-\nan effegy of fraud, yet with real bite. -unit.meld-tracker.name = Tracker -unit.meld-tracker.description = [#ea9ad6]First form artillery support primitive scrap heap[]\n\nConstruct appears to be a mobile form of an incubator, who's sole purpose is to form projectiles and guide them towards targets. +unit.meld2-tracker.name = Tracker +unit.meld2-tracker.description = [#ea9ad6]First form artillery support primitive scrap heap[]\n\nConstruct appears to be a mobile form of an incubator, who's sole purpose is to form projectiles and guide them towards targets. -unit.meld-tracker-projectile.name = Tracker Projectile -unit.meld-tracker-projectile.description = [#ea9ad6]Projectile construct[]\nConstruct is manufactured inside [accent]Tracker[] constructs and is directed towards its target through some unknown guidance mechanism. +unit.meld2-tracker-projectile.name = Tracker Projectile +unit.meld2-tracker-projectile.description = [#ea9ad6]Projectile construct[]\nConstruct is manufactured inside [accent]Tracker[] constructs and is directed towards its target through some unknown guidance mechanism. -unit.meld-fletch.name = Fletch -unit.meld-fletch.description = [#ea9ad6]First form hovercraft mimic[]\nThis construct appears to mimic [accent]Shark[] units? Im not sure what it's suposed to be other than that... -unit.meld-fletch.details = Our test with "thrusters" is sucsessful. Blobslingers mounetd on a metal hull prove effective against invader's constructs, and Mercury will not prove problematic with steering handled asynchronously by crystals. +unit.meld2-fletch.name = Fletch +unit.meld2-fletch.description = [#ea9ad6]First form hovercraft mimic[]\nThis construct appears to mimic [accent]Shark[] units? Im not sure what it's suposed to be other than that... +unit.meld2-fletch.details = Our test with "thrusters" is sucsessful. Blobslingers mounetd on a metal hull prove effective against invader's constructs, and Mercury will not prove problematic with steering handled asynchronously by crystals. -unit.meld-kathid.name = Kathid -unit.meld-kathid.description = [#ea9ad6]First form nestling crystal bug[]\nTheories about how [#ea9ad6]Meld[] forms colonies have circulated around since its discovery.\n\nOne theory is armored constructs like Kathids use their piercing flame to penetrate stone, like they do to metal. That woudn't account for the giant rock formations spotted around.\n\n[red]Armored[] +unit.meld2-kathid.name = Kathid +unit.meld2-kathid.description = [#ea9ad6]First form nestling crystal bug[]\nTheories about how [#ea9ad6]Meld[] forms colonies have circulated around since its discovery.\n\nOne theory is armored constructs like Kathids use their piercing flame to penetrate stone, like they do to metal. That wouldn't account for the giant rock formations spotted around.\n\n[red]Armored[] -unit.meld-katika.name = Katika -unit.meld-katika.description = [#ea9ad6]First form hydra crystal bug[]\nConstruct appears to be a malformed Kathid without a hardened shell with multiple heads, though there is little evidence to go off of.\n\nMaybe an error in creation propagated by its usefulness?\n\nDespite the appearence, the blob controlling the construct acts as one whole entity. -unit.meld-katika.details = Theres some joke about evolution to be had here. +unit.meld2-katika.name = Katika +unit.meld2-katika.description = [#ea9ad6]First form hydra crystal bug[]\nConstruct appears to be a malformed Kathid without a hardened shell with multiple heads, though there is little evidence to go off of.\n\nMaybe an error in creation propagated by its usefulness?\n\nDespite the appearence, the blob controlling the construct acts as one whole entity. +unit.meld2-katika.details = Theres some joke about evolution to be had here. -unit.meld-kithlid.name = Kithlid -unit.meld-kithlid.description = [#ea9ad6]Megalith nest crystal bug[]\nConstruct has been observed constantly pumping out [#ea9ad6]Jilla[] constructs in missile form when engaging threats.\n\nWhilst [#ea9ad6]Kithlid[] often turn quickly to face their targets, their ability to do so is hindered when charging up a barage of flame.\n\nEnsure that all parts of a Kithlid are thoughroughly dealt with after breaching the construct's shell.\n\n[red]Heavly armored[] +unit.meld2-kithlid.name = Kithlid +unit.meld2-kithlid.description = [#ea9ad6]Megalith nest crystal bug[]\nConstruct has been observed constantly pumping out [#ea9ad6]Jilla[] constructs in missile form when engaging threats.\n\nWhilst [#ea9ad6]Kithlid[] often turn quickly to face their targets, their ability to do so is hindered when charging up a barage of flame.\n\nEnsure that all parts of a Kithlid are thoughroughly dealt with after breaching the construct's shell.\n\n[red]Heavly armored[] -unit.meld-pester.name = Pester -unit.meld-pester.description = [#ea9ad6]Small sprayer flier[]\nBlasts targets with a burst of flame. Requires time to recharge.\nDamages units and buildings caught under its wake. +unit.meld2-pester.name = Pester +unit.meld2-pester.description = [#ea9ad6]Small sprayer flier[]\nBlasts targets with a burst of flame. Requires time to recharge.\nDamages units and buildings caught under its wake. -unit.meld-spillway.name = Spillway -unit.meld-spillway.description = [#ea9ad6]First form projectile carrier[]\nBirthed in its final form rather than being composed of multiple units, yet bursts open into [#ea9ad6]Craigs[] and [#ea9ad6]Wubbas.[].\n\nReffer to [accent][] for more information on this construct's center. +unit.meld2-spillway.name = Spillway +unit.meld2-spillway.description = [#ea9ad6]First form projectile carrier[]\nBirthed in its final form rather than being composed of multiple units, yet bursts open into [#ea9ad6]Craigs[] and [#ea9ad6]Wubbas.[].\n\nReffer to [accent][] for more information on this construct's center. -unit.meld-spillway-projectile.name = Spillway Core -unit.meld-spillway-projectile.description = [#ea9ad6]Projectile construct[]\nWhile the core looks inconspicuous at first, two eye indents have been observed.\n\nIt is not certain if the core or the spillway controls the unit, but both burst into multiple constructs on destruction. +unit.meld2-spillway-projectile.name = Spillway Core +unit.meld2-spillway-projectile.description = [#ea9ad6]Projectile construct[]\nWhile the core looks inconspicuous at first, two eye indents have been observed.\n\nIt is not certain if the core or the spillway controls the unit, but both burst into multiple constructs on destruction. -unit.meld-gala.name = Gala -unit.meld-gala.description = [#ea9ad6]Small blob carrier[]\nCaries blobs to wherever they're needed. Sometimes the construct will sacrifice itself, crashing down from the skies to release its blobs on hostiles. +unit.meld2-gala.name = Gala +unit.meld2-gala.description = [#ea9ad6]Small blob carrier[]\nCaries blobs to wherever they're needed. Sometimes the construct will sacrifice itself, crashing down from the skies to release its blobs on hostiles. -unit.meld-blob.name = Blob -unit.meld-blob.description = [#ea9ad6]Blob![]\nA blob. What more is there to say?\n\nBlob blob blob blob blob.\n\n[#ea9ad6]Blob![]\n\nIt explodes after a delay, dealing massive damage.\n[gray]Don'y you remember what happened last time we got near one of tho-[][red][] -unit.meld-blob.details = You cut me off!\nJust like the blob did to our power yes yes, I know what happened last time...\nYou forgot to mention how theese are found on the weird structures this thing comes from\nThat'll have to wait for another entry then. +unit.meld2-blob.name = Blob +unit.meld2-blob.description = [#ea9ad6]Blob![]\nA blob. What more is there to say?\n\nBlob blob blob blob blob.\n\n[#ea9ad6]Blob![]\n\nIt explodes after a delay, dealing massive damage.\n[gray]Don'y you remember what happened last time we got near one of tho-[][red][] +unit.meld2-blob.details = You cut me off!\nJust like the blob did to our power yes yes, I know what happened last time...\nYou forgot to mention how theese are found on the weird structures this thing comes from\nThat'll have to wait for another entry then. -unit.meld-splurger.name = Splurger -unit.meld-splurger.description = [#ea9ad6]Tiny shelled blob[]\nThey gave the dam blobs armor, why the hell would you give it armor?\n\nIf this is some sort of prank like last time I swear ill-[red][]\n\n [red]Plated![] -unit.meld-splurger.details = You cut me off!\nJust like the blob did to our power yes yes, I know what happened last time...\nYou forgot to mention how theese are found on the weird structures this thing comes from\nThat'll have to wait for another entry then. +unit.meld2-splurger.name = Splurger +unit.meld2-splurger.description = [#ea9ad6]Tiny shelled blob[]\nThey gave the dam blobs armor, why the hell would you give it armor?\n\nIf this is some sort of prank like last time I swear ill-[red][]\n\n [red]Plated![] +unit.meld2-splurger.details = You cut me off!\nJust like the blob did to our power yes yes, I know what happened last time...\nYou forgot to mention how theese are found on the weird structures this thing comes from\nThat'll have to wait for another entry then. -unit.meld-zip.name = Zip -unit.meld-zip.description = [#ea9ad6]Light spawner missile[]\nSpotted in swarms that flock between colonies. Beware the [#ea9ad6]Jilla[] they cary. +unit.meld2-zip.name = Zip +unit.meld2-zip.description = [#ea9ad6]Light spawner missile[]\nSpotted in swarms that flock between colonies. Beware the [#ea9ad6]Jilla[] they cary. -unit.meld-inator.name = Inator -unit.meld-inator.description = [#ea9ad6]First form skirmishing fulgarian[]\nConstruct is the first observed which has no visible forms of [#ea9ad6]Meld[] protrusions. Im not sure how it operates...\n\n[orange]Fully mechanical![] -unit.meld-inator.details = The first mechanical unit truely added into the mod. There was an attempt with a flying unit before this, but it never made it past testing. +unit.meld2-inator.name = Inator +unit.meld2-inator.description = [#ea9ad6]First form skirmishing fulgarian[]\nConstruct is the first observed which has no visible forms of [#ea9ad6]Meld[] protrusions. Im not sure how it operates...\n\n[orange]Fully mechanical![] +unit.meld2-inator.details = The first mechanical unit truely added into the mod. There was an attempt with a flying unit before this, but it never made it past testing. -unit.meld-stoner.name = Stoner -unit.meld-stoner.description = [#ea9ad6]Bulky incindary artillery fulgurian[]\n\nConstruct needs to steady itself in place before unsheathing its weapon. I can't tell if it's impressive that it works or if it's concerning that it has a giant chunk of Dissonitre embedded into it.\n\n[orange]Fully mechanical![] -unit.meld-stoner.details = Constantly stoned. +unit.meld2-stoner.name = Stoner +unit.meld2-stoner.description = [#ea9ad6]Bulky incindary artillery fulgurian[]\n\nConstruct needs to steady itself in place before unsheathing its weapon. I can't tell if it's impressive that it works or if it's concerning that it has a giant chunk of Dissonitre embedded into it.\n\n[orange]Fully mechanical![] +unit.meld2-stoner.details = Constantly stoned. -unit.meld-bulwark.name = Bulwark -unit.meld-bulwark.description = [#ea9ad6]First form shielding fulgurian[]\nConstruct has a small capsule construct encased in a layer of metal. I wonder how it's fueled...\n\n[red]Lightly armored[] & [orange] Mechanical! -unit.meld-bulwark.details = An absolute mance to fight. Be prepared... +unit.meld2-bulwark.name = Bulwark +unit.meld2-bulwark.description = [#ea9ad6]First form shielding fulgurian[]\nConstruct has a small capsule construct encased in a layer of metal. I wonder how it's fueled...\n\n[red]Lightly armored[] & [orange] Mechanical! +unit.meld2-bulwark.details = An absolute mance to fight. Be prepared... -unit.meld-soontm.name = Coming Soon! +unit.meld2-soontm.name = Coming Soon! //research categories //Status effects -status.meld-aspect-burn.name = Aspect Burn -status.meld-aspect-burn.description = Doubles damage taken, does a tiny bit of DoT. Applied by [#cbdbfc]Aspect[]-based weaponary in conjunction with burning. \nOnly affects mechanical and armored targets. -status.meld-aspect-burn +status.meld2-aspect-burn.name = Aspect Burn +status.meld2-aspect-burn.description = Doubles damage taken, does a tiny bit of DoT. Applied by [#cbdbfc]Aspect[]-based weaponary in conjunction with burning. \nOnly affects mechanical and armored targets. +status.meld2-aspect-burn -status.meld-blackout.name = Blackout -status.meld-blackout.description = Fade to nothing. Applied by the [gray]Backdrop[] -status.meld-blackout.details = Being reshapen by the lucid one, much to the slumbering one's dismay. +status.meld2-blackout.name = Blackout +status.meld2-blackout.description = Fade to nothing. Applied by the [gray]Backdrop[] +status.meld2-blackout.details = Being reshapen by the lucid one, much to the slumbering one's dismay. -status.meld-dissolving.name = Dissolving -status.meld-dissolving.description = Small bit of DoT and doubles damage taken. Applied by [#ea9ad6]Meld Beacons[]. -status.meld-dissolving.details = Being peeled appart by [#ea9ad6]Meld[], bit by bit. +status.meld2-dissolving.name = Dissolving +status.meld2-dissolving.description = Small bit of DoT and doubles damage taken. Applied by [#ea9ad6]Meld Beacons[]. +status.meld2-dissolving.details = Being peeled appart by [#ea9ad6]Meld[], bit by bit. -status.meld-strata.name = Strata -status.meld-strata.description = Utilises Ikaru's basic resources to great effect.\n[accent]This is you![] -status.meld-strata.details = Our last resort. If the Dreamer were to ever be lost, an instance of you would be awoken. Go forth and return what is ours. +status.meld2-strata.name = Strata +status.meld2-strata.description = Utilises Ikaru's basic resources to great effect.\n[accent]This is you![] +status.meld2-strata.details = Our last resort. If the Dreamer were to ever be lost, an instance of you would be awoken. Go forth and return what is ours. -status.meld-fringe.name = Fringe -status.meld-fringe.description = Enlightens materials into a useable form. -status.meld-fringe.details = Hello Strata! +status.meld2-fringe.name = Fringe +status.meld2-fringe.description = Enlightens materials into a useable form. +status.meld2-fringe.details = Hello Strata! -status.meld-mangrove-a0-refreshed.name = Refreshed -status.meld-mangrove-a0-refreshed.description = Doubles reload speed and slightly reduces damage taken. Invokes slight regeneration. +status.meld2-mangrove-a0-refreshed.name = Refreshed +status.meld2-mangrove-a0-refreshed.description = Doubles reload speed and slightly reduces damage taken. Invokes slight regeneration. -status.meld-mangrove-a1-infested.name = Infested -status.meld-mangrove-a1-infested.description = Hefty amount of DoT an' damage taken and dealt is magnified. Doubles... reload speed?\n\n[gray]What applies this again?\nI don't know, but we've got to ru-[]\n[red][] +status.meld2-mangrove-a1-infested.name = Infested +status.meld2-mangrove-a1-infested.description = Hefty amount of DoT an' damage taken and dealt is magnified. Doubles... reload speed?\n\n[gray]What applies this again?\nI don't know, but we've got to ru-[]\n[red][] -status.meld-mangrove-b0-shattered-flame.name = Shattered Flame -status.meld-mangrove-b0-shattered-flame.description = Sacrifice is power. +status.meld2-mangrove-b0-shattered-flame.name = Shattered Flame +status.meld2-mangrove-b0-shattered-flame.description = Sacrifice is power. -status.meld-mangrove-d0-mercury-poisoning.name = Mercury Poisoning -status.meld-mangrove-d0-mercury-poisoning.description = Extremely deadly to critters of [#ea9ad6]Meld[] origin. Effects unknown.\n[gray]TODO: Update this for Strata +status.meld2-mangrove-d0-mercury-poisoning.name = Mercury Poisoning +status.meld2-mangrove-d0-mercury-poisoning.description = Extremely deadly to critters of [#ea9ad6]Meld[] origin. Effects unknown.\n[gray]TODO: Update this for Strata -status.meld-mangrove-d1-slippery.name = Mercury Coating -status.meld-mangrove-d1-slippery.description = Coating of [#89828c]Mercury[].\n[gray]Fun!\nHey don't eat that-[] +status.meld2-mangrove-d1-slippery.name = Mercury Coating +status.meld2-mangrove-d1-slippery.description = Coating of [#89828c]Mercury[].\n[gray]Fun!\nHey don't eat that-[] -status.meld-strata-a0-rally.name = Rally -status.meld-strata-a0-rally.description = Increased mobility and reload. Applied by [accent]Commanders[] and [accent]Sonars[]. +status.meld2-strata-a0-rally.name = Rally +status.meld2-strata-a0-rally.description = Increased mobility and reload. Applied by [accent]Commanders[] and [accent]Sonars[]. -status.meld-strata-a1-primed.name = Primed -status.meld-strata-a1-primed.description = Increased mobility, damage, reload. Heavly increased health. This unit's ready to go off! +status.meld2-strata-a1-primed.name = Primed +status.meld2-strata-a1-primed.description = Increased mobility, damage, reload. Heavly increased health. This unit's ready to go off! -status.meld-strata-b0-anchored.name = Anchored -status.meld-strata-b0-anchored.description = Heavly increased drag and health. Heavly decreased speed. Applied by [accent]Movement Anchors[] +status.meld2-strata-b0-anchored.name = Anchored +status.meld2-strata-b0-anchored.description = Heavly increased drag and health. Heavly decreased speed. Applied by [accent]Movement Anchors[] -status.meld-strata-b1-rebound.name = Rebound -status.meld-strata-b1-rebound.description = Heavly increased speed, slightly increased reload speed. Decreased drag. Applied by [accent]Movement Anchors[] +status.meld2-strata-b1-rebound.name = Rebound +status.meld2-strata-b1-rebound.description = Heavly increased speed, slightly increased reload speed. Decreased drag. Applied by [accent]Movement Anchors[] -status.meld-wildlife-a0-amplified.name = Amplified -status.meld-wildlife-a0-amplified.description = Amplifies mobility, durability and reload. Applied by [#ea9ad6]Meld Amplifiers[]. +status.meld2-wildlife-a0-amplified.name = Amplified +status.meld2-wildlife-a0-amplified.description = Amplifies mobility, durability and reload. Applied by [#ea9ad6]Meld Amplifiers[]. -status.meld-wildlife-a1-reconstitution.name = Reconstitution -status.meld-wildlife-a1-reconstitution.description = Increases durability and drag. Slightly decreases speed. Light regeneration. Applied by [#ea9ad6]Meld Beacons[]. Certain constructs spawn with this.\nOnly affects biological targets. +status.meld2-wildlife-a1-reconstitution.name = Reconstitution +status.meld2-wildlife-a1-reconstitution.description = Increases durability and drag. Slightly decreases speed. Light regeneration. Applied by [#ea9ad6]Meld Beacons[]. Certain constructs spawn with this.\nOnly affects biological targets. -status.meld-wildlife-b0-sentry.name = Sentry -status.meld-wildlife-b0-sentry.description = Heavily reduced mobility, but double fireate. Does constant DoT.\nCertain constructs apply this upon shooting. +status.meld2-wildlife-b0-sentry.name = Sentry +status.meld2-wildlife-b0-sentry.description = Heavily reduced mobility, but double fireate. Does constant DoT.\nCertain constructs apply this upon shooting. -status.meld-wildlife-c0-surge.name = Surge -status.meld-wildlife-c0-surge.description = Massive boost in reload speed, but heavly decreased damage.\nCertain constructs can intiate a surge with a long cooldown. +status.meld2-wildlife-c0-surge.name = Surge +status.meld2-wildlife-c0-surge.description = Massive boost in reload speed, but heavly decreased damage.\nCertain constructs can intiate a surge with a long cooldown. -status.meld-lacerated.name = Lacerated -status.meld-lacerated.description = Heavly reduced mobility and fireate. Increases durability slightly and encourages light regeneration.\n\nApplied by [#4bb66b]Resonarum[] related sources. No effect on armored meld or inorganic targets. -status.meld-lacerated.details = Applied recreationally by constructs which don't guard the nests. Maybe they have a different name for it? +status.meld2-lacerated.name = Lacerated +status.meld2-lacerated.description = Heavly reduced mobility and fireate. Increases durability slightly and encourages light regeneration.\n\nApplied by [#4bb66b]Resonarum[] related sources. No effect on armored meld or inorganic targets. +status.meld2-lacerated.details = Applied recreationally by constructs which don't guard the nests. Maybe they have a different name for it? -status.meld-shattered.name = Shattered -status.meld-shattered.description = Doubles damage taken and reload speed. Increases damage and mobility.\n\nApplied by [#e89964]Dissonitre[] related sources. No effect on unarmored meld. -status.meld-shattered.details = Applied frequently by certain constructs on the battlefield. Maybe they have a different name for it? +status.meld2-shattered.name = Shattered +status.meld2-shattered.description = Doubles damage taken and reload speed. Increases damage and mobility.\n\nApplied by [#e89964]Dissonitre[] related sources. No effect on unarmored meld. +status.meld2-shattered.details = Applied frequently by certain constructs on the battlefield. Maybe they have a different name for it? -status.meld-storm-a0-disabled.name = Shellshocked -status.meld-storm-a0-disabled.description = Heavly reduced mobility and fireate. Applied by most sources of [#e45940]EMP[]. +status.meld2-storm-a0-disabled.name = Shellshocked +status.meld2-storm-a0-disabled.description = Heavly reduced mobility and fireate. Applied by most sources of [#e45940]EMP[]. -status.meld-storm-a1-enabled.name = Storm Surge -status.meld-storm-a1-enabled.description = Increased mobility, damage and reload. Applied by most sources of [#e45940]EMP[]. +status.meld2-storm-a1-enabled.name = Storm Surge +status.meld2-storm-a1-enabled.description = Increased mobility, damage and reload. Applied by most sources of [#e45940]EMP[]. //Sectors -planet.meld-ikaru.name = Ikaru -planet.meld-ikaru.description = A wartorn planet with scraps of usable unrefined resources. Inhabited by the [#ea9ad6]Meld[].\n\nHeavy fog lingers everywhere. -planet.meld-ikaru.details = The [#ea9ad6]Meld[] was always here. There was no beginning or end to life on Ikaru. from the planet's inception to its destruction, there will be always [#ea9ad6]Meld[]. +planet.meld2-ikaru.name = Ikaru +planet.meld2-ikaru.description = A wartorn planet with scraps of usable unrefined resources. Inhabited by the [#ea9ad6]Meld[].\n\nHeavy fog lingers everywhere. +planet.meld2-ikaru.details = The [#ea9ad6]Meld[] was always here. There was no beginning or end to life on Ikaru. from the planet's inception to its destruction, there will be always [#ea9ad6]Meld[]. //Texts resurgence.text.dormant1 = This is a [accent]Dormant Core[].\n\nZoom out or pan over to the Trench core, hold [accent][CTRL][] and [accent]left click[] to respawn. @@ -1278,10 +1336,27 @@ database-tag.aspect-omnipotence = Progress database-tag.aspect-vita = Vita database-tag.heavy-industry = Heavy Industry +database-tag.arsenal = Arsenal +database-tag.meldy = Meldy +database-tag.environment = Environment + +settings.meld-title = Meld Settings +settings.meld-experimental = Experimental Settings + +setting.meld-lighting = Coloured Lighting!\n(Restart game to take effect) +setting.meld-invert-ambient = Invert ambient colour\n(Will impact game experience in meld sectors!) +setting.meld-connected-sonar = Connected Sonar\n(Breaks with Arikoth, and potentially other mods) +setting.meld-unit-light-scale = Unit light radius multiplier +setting.meld-highvis-overlay = High-vis block overlay\n(Turret ranges and etc... over Fow/Lighting) +setting.meld-bulbhead-omnimove = Bulbhead Omnimovement\n(Move like a non-naval) +setting.meld-port-saves = Port Saves\n[red]HIGHLY EXPERIMENTAL\nallows you to load a meld hjson map in meld java[] + + unit.ticks = ticks bar.spool = Spool stat.aspect-efficiency = Efficiency -stat.aspect-density = Density \ No newline at end of file +stat.aspect-density = Density +stat.aspect-stats = Aspect Stats \ No newline at end of file diff --git a/assets/bundles/bundle.shitpost b/assets/bundles/bundle.shitpost index a674a1b..b28ca18 100644 --- a/assets/bundles/bundle.shitpost +++ b/assets/bundles/bundle.shitpost @@ -1,11 +1,29 @@ -item.meld-glass-mallow.name = Pan-fried Plates +item.meld2-glass-mallow.name = Pan-fried Plates -item.meld-crucible-plating.name = Boiled Plates +item.meld2-crucible-plating.name = Boiled Plates -block.meld-sonar-spire.name = Slay the Sonar Spire +item.meld2-dissonitre.name = Crystal Crack -block.meld-manual-valve.name = Gabe Nuel's Wife -block.meld-pressure-vent.name = Amogus Escape route +item.meld2-gunpowder.name = Crack on crack (going through rehab) + +block.meld2-sonar-spire.name = Slay the Sonar Spire + +block.meld2-manual-valve.name = Gabe Nuel's Wife +block.meld2-pressure-vent.name = Amogus Escape route + +block.meld2-crystal-cracker.name = Tasty Wafer +block.meld2-crystal-cracker.description = ...you know you wana\n\njust a lil nibble + +block.meld2-overflow-chute.name = Smart Router +block.meld2-overflow-chute.description = Smart Router + +block.meld2-depot.name = frankouloadertainer's frankouloadertainer-er + +liquid.meld2-aspect.name = Outdated Ass Destroyer +liquid.meld2-storming-aspect.name = Bombspect +liquid.meld2-bound-aspect.name = Leanspect unit.meld-bulbhead.name = Bulbster -unit.meld-bulbhead.description = Meldieps the allied blocks as it Meldarras.io the enemies \ No newline at end of file +unit.meld-bulbhead.description = Meldieps the allied blocks as it Meldarras.io the enemies + +liquid.meld2-meld = Meld 2: Electric meldaloo \ No newline at end of file diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000..c414abd Binary files /dev/null and b/assets/icon.png differ diff --git a/assets/maps/badlands-testmap-1.msav b/assets/maps/badlands-testmap-1.msav new file mode 100644 index 0000000..2ee2abf Binary files /dev/null and b/assets/maps/badlands-testmap-1.msav differ diff --git a/assets/maps/badlands-testmap-2.msav b/assets/maps/badlands-testmap-2.msav new file mode 100644 index 0000000..9be32eb Binary files /dev/null and b/assets/maps/badlands-testmap-2.msav differ diff --git a/assets/maps/gameplay-testmap-1.msav b/assets/maps/gameplay-testmap-1.msav index a18e713..051e89e 100644 Binary files a/assets/maps/gameplay-testmap-1.msav and b/assets/maps/gameplay-testmap-1.msav differ diff --git a/assets/maps/gameplay-testmap-2.msav b/assets/maps/gameplay-testmap-2.msav index 21ce5bc..9cf7e6f 100644 Binary files a/assets/maps/gameplay-testmap-2.msav and b/assets/maps/gameplay-testmap-2.msav differ diff --git a/assets/maps/heavy-industry-test-1.msav b/assets/maps/heavy-industry-test-1.msav index 7ab6586..2df59d3 100644 Binary files a/assets/maps/heavy-industry-test-1.msav and b/assets/maps/heavy-industry-test-1.msav differ diff --git a/assets/maps/info.msav b/assets/maps/info.msav index 4a07132..300a216 100644 Binary files a/assets/maps/info.msav and b/assets/maps/info.msav differ diff --git a/assets/shaders/light.frag b/assets/shaders/light.frag new file mode 100644 index 0000000..c117372 --- /dev/null +++ b/assets/shaders/light.frag @@ -0,0 +1,41 @@ +uniform sampler2D u_texture; +uniform sampler2D u_lights; +uniform sampler2D u_exclusion; + +uniform vec2 u_resolution; +uniform vec2 u_campos; + +uniform vec4 u_ambient; + +varying vec2 v_texCoords; + +void main(){ + + float banding = 8.0; + + //Exclusion + vec4 exclusion = texture2D(u_exclusion, v_texCoords); + + vec4 positionAmbient = clamp(vec4(u_ambient.rgb - exclusion.rgb * exclusion.a, u_ambient.a), 0.0, 1.0); + + //Light color + vec4 color = texture2D(u_lights, v_texCoords); + + float alpha = color.a; + + //Get the scaling right here... + alpha = clamp(floor((alpha) * 8.0)/8.0, 0.0, 1.0) * 0.3 + clamp(floor(alpha * 3.0)/3.0, 0.0, 1.0) * 0.3 + alpha * 0.4; + + vec4 totalColor = clamp(vec4(color.rgb * alpha, 1) + vec4(positionAmbient.rgb * positionAmbient.a, 1), 0.0, 1.0); + + vec4 background = clamp(texture2D(u_texture, v_texCoords), 0.0, 1.0); + + gl_FragColor = clamp(background * totalColor, 0.0, 1.0); + + /* + float max = max(gl_FragColor.r, gl_FragColor.g, gl_FragColor.b); + float min = min(gl_FragColor.r, gl_FragColor.g, gl_FragColor.b); + float chrom = max - min; + float L = (max + min)/2; + */ +} \ No newline at end of file diff --git a/assets/shaders/sonar.frag b/assets/shaders/sonar.frag new file mode 100644 index 0000000..dec4079 --- /dev/null +++ b/assets/shaders/sonar.frag @@ -0,0 +1,24 @@ +uniform sampler2D u_texture; + +uniform vec2 u_resolution; +uniform vec2 u_campos; + +uniform vec4 u_color; + +uniform float u_time; + +varying vec2 v_texCoords; + +void main() { + + vec4 color = texture2D(u_texture, v_texCoords); + gl_FragColor = color; + + if(color.r == 1 && color.g + color.b > 0){ + + color.a *= 0.5 * abs(sin((v_texCoords.x + v_texCoords.y) * 20.0 + u_time/20.0)); + + gl_FragColor = color; + } + else gl_FragColor = vec4(color.rgb, 0); +} \ No newline at end of file diff --git a/assets/sprites/liquids/aether.png b/assets/sprites/aspects/aether.png similarity index 100% rename from assets/sprites/liquids/aether.png rename to assets/sprites/aspects/aether.png diff --git a/assets/sprites/liquids/aspect.png b/assets/sprites/aspects/aspect.png similarity index 100% rename from assets/sprites/liquids/aspect.png rename to assets/sprites/aspects/aspect.png diff --git a/assets/sprites/liquids/bound-aspect.png b/assets/sprites/aspects/bound-aspect.png similarity index 100% rename from assets/sprites/liquids/bound-aspect.png rename to assets/sprites/aspects/bound-aspect.png diff --git a/assets/sprites/liquids/fumes.png b/assets/sprites/aspects/fumes.png similarity index 100% rename from assets/sprites/liquids/fumes.png rename to assets/sprites/aspects/fumes.png diff --git a/assets/sprites/aspects/meld.png b/assets/sprites/aspects/meld.png new file mode 100644 index 0000000..97b83d6 Binary files /dev/null and b/assets/sprites/aspects/meld.png differ diff --git a/assets/sprites/liquids/pollutant-mixture.png b/assets/sprites/aspects/pollutant-mixture.png similarity index 100% rename from assets/sprites/liquids/pollutant-mixture.png rename to assets/sprites/aspects/pollutant-mixture.png diff --git a/assets/sprites/liquids/storming-aspect.png b/assets/sprites/aspects/storming-aspect.png similarity index 100% rename from assets/sprites/liquids/storming-aspect.png rename to assets/sprites/aspects/storming-aspect.png diff --git a/assets/sprites/liquids/thundering-aether.png b/assets/sprites/aspects/thundering-aether.png similarity index 100% rename from assets/sprites/liquids/thundering-aether.png rename to assets/sprites/aspects/thundering-aether.png diff --git a/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-bottom.png b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-bottom.png new file mode 100644 index 0000000..2de0a8d Binary files /dev/null and b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-bottom.png differ diff --git a/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-glow.png b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-glow.png new file mode 100644 index 0000000..a1bc64e Binary files /dev/null and b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier-glow.png differ diff --git a/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier.png b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier.png new file mode 100644 index 0000000..7abddbe Binary files /dev/null and b/assets/sprites/blocks/crafting/aether vitrifier/aether-vitrifier.png differ diff --git a/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-bottom.png b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-bottom.png new file mode 100644 index 0000000..8c4337a Binary files /dev/null and b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-bottom.png differ diff --git a/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-glow.png b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-glow.png new file mode 100644 index 0000000..3cdf531 Binary files /dev/null and b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer-glow.png differ diff --git a/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer.png b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer.png new file mode 100644 index 0000000..58174fa Binary files /dev/null and b/assets/sprites/blocks/crafting/amalgam decomposer/amalgam-decomposer.png differ diff --git a/assets/sprites/blocks/crafting/crush weaver/crush-weaver-bottom.png b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-bottom.png new file mode 100644 index 0000000..5a53553 Binary files /dev/null and b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-bottom.png differ diff --git a/assets/sprites/blocks/crafting/crush weaver/crush-weaver-glow.png b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-glow.png new file mode 100644 index 0000000..b054b9d Binary files /dev/null and b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-glow.png differ diff --git a/assets/sprites/blocks/crafting/crush weaver/crush-weaver-grinder.png b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-grinder.png new file mode 100644 index 0000000..ecbd019 Binary files /dev/null and b/assets/sprites/blocks/crafting/crush weaver/crush-weaver-grinder.png differ diff --git a/assets/sprites/blocks/crafting/crush weaver/crush-weaver.png b/assets/sprites/blocks/crafting/crush weaver/crush-weaver.png new file mode 100644 index 0000000..39bb40f Binary files /dev/null and b/assets/sprites/blocks/crafting/crush weaver/crush-weaver.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-bottom-0.png b/assets/sprites/blocks/distrib/plated-chute-bottom-0.png new file mode 100644 index 0000000..f4d712b Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-bottom-0.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-bottom-1.png b/assets/sprites/blocks/distrib/plated-chute-bottom-1.png new file mode 100644 index 0000000..54bb301 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-bottom-1.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-bottom-2.png b/assets/sprites/blocks/distrib/plated-chute-bottom-2.png new file mode 100644 index 0000000..c30c6ca Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-bottom-2.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-bottom-3.png b/assets/sprites/blocks/distrib/plated-chute-bottom-3.png new file mode 100644 index 0000000..6fb4a77 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-bottom-3.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-bottom-4.png b/assets/sprites/blocks/distrib/plated-chute-bottom-4.png new file mode 100644 index 0000000..93557a1 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-bottom-4.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-top-0.png b/assets/sprites/blocks/distrib/plated-chute-top-0.png new file mode 100644 index 0000000..f997381 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-top-0.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-top-1.png b/assets/sprites/blocks/distrib/plated-chute-top-1.png new file mode 100644 index 0000000..0e0c464 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-top-1.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-top-2.png b/assets/sprites/blocks/distrib/plated-chute-top-2.png new file mode 100644 index 0000000..a3b3b69 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-top-2.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-top-3.png b/assets/sprites/blocks/distrib/plated-chute-top-3.png new file mode 100644 index 0000000..72ff792 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-top-3.png differ diff --git a/assets/sprites/blocks/distrib/plated-chute-top-4.png b/assets/sprites/blocks/distrib/plated-chute-top-4.png new file mode 100644 index 0000000..055bef7 Binary files /dev/null and b/assets/sprites/blocks/distrib/plated-chute-top-4.png differ diff --git a/assets/sprites/blocks/environment/badlands/soft-dune1.png b/assets/sprites/blocks/environment/badlands/soft-dune1.png new file mode 100644 index 0000000..127e6d1 Binary files /dev/null and b/assets/sprites/blocks/environment/badlands/soft-dune1.png differ diff --git a/assets/sprites/blocks/environment/badlands/soft-dune2.png b/assets/sprites/blocks/environment/badlands/soft-dune2.png new file mode 100644 index 0000000..ae5f8dd Binary files /dev/null and b/assets/sprites/blocks/environment/badlands/soft-dune2.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-fragments-edge.png b/assets/sprites/blocks/environment/storm planes/dissonant-fragments-edge.png new file mode 100644 index 0000000..d99e6d3 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-fragments-edge.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-fragments.png b/assets/sprites/blocks/environment/storm planes/dissonant-fragments.png new file mode 100644 index 0000000..399c5f3 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-fragments.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-edge.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-edge.png new file mode 100644 index 0000000..9adabdb Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-edge.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched1.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched1.png new file mode 100644 index 0000000..a858a48 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched1.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched2.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched2.png new file mode 100644 index 0000000..73f7d8b Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched2.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched3.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched3.png new file mode 100644 index 0000000..e0e40c5 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-scorched3.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck1.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck1.png new file mode 100644 index 0000000..e4171b7 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck1.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck2.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck2.png new file mode 100644 index 0000000..ff80ea2 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck2.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck3.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck3.png new file mode 100644 index 0000000..cc90637 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-struck3.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall1.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall1.png new file mode 100644 index 0000000..242c31c Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall1.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall2.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall2.png new file mode 100644 index 0000000..3242882 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale-wall2.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale1.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale1.png new file mode 100644 index 0000000..69de91d Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale1.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale2.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale2.png new file mode 100644 index 0000000..5b201d7 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale2.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-shale3.png b/assets/sprites/blocks/environment/storm planes/dissonant-shale3.png new file mode 100644 index 0000000..ff99650 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-shale3.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall1.png b/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall1.png new file mode 100644 index 0000000..b8b5340 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall1.png differ diff --git a/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall2.png b/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall2.png new file mode 100644 index 0000000..1e3cd51 Binary files /dev/null and b/assets/sprites/blocks/environment/storm planes/dissonant-vitric-wall2.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-0.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-0.png new file mode 100644 index 0000000..4373257 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-0.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-1.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-1.png new file mode 100644 index 0000000..69eee07 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-1.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-2.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-2.png new file mode 100644 index 0000000..31bbd61 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-2.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-3.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-3.png new file mode 100644 index 0000000..a7c3ceb Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-3.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-4.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-4.png new file mode 100644 index 0000000..dfedbdf Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-bottom-4.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-0.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-0.png new file mode 100644 index 0000000..e2a8aa6 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-0.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-1.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-1.png new file mode 100644 index 0000000..0ffc33b Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-1.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-2.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-2.png new file mode 100644 index 0000000..6a8a839 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-2.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-3.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-3.png new file mode 100644 index 0000000..de93783 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-3.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-4.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-4.png new file mode 100644 index 0000000..790e010 Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-top-4.png differ diff --git a/assets/sprites/blocks/fluid/conduit/aspect-bomb-ui.png b/assets/sprites/blocks/fluid/conduit/aspect-bomb-ui.png new file mode 100644 index 0000000..9e940fd Binary files /dev/null and b/assets/sprites/blocks/fluid/conduit/aspect-bomb-ui.png differ diff --git a/assets/sprites/blocks/light/lamp-psi-top.png b/assets/sprites/blocks/light/lamp-psi-top.png new file mode 100644 index 0000000..118b45c Binary files /dev/null and b/assets/sprites/blocks/light/lamp-psi-top.png differ diff --git a/assets/sprites/blocks/light/lamp-psi.png b/assets/sprites/blocks/light/lamp-psi.png new file mode 100644 index 0000000..8371ba0 Binary files /dev/null and b/assets/sprites/blocks/light/lamp-psi.png differ diff --git a/assets/sprites/blocks/meld/cultivator/meld-cultivator-base.png b/assets/sprites/blocks/meld/cultivator/meld-cultivator-base.png new file mode 100644 index 0000000..2b7da2c Binary files /dev/null and b/assets/sprites/blocks/meld/cultivator/meld-cultivator-base.png differ diff --git a/assets/sprites/blocks/meld/cultivator/meld-cultivator-gum.png b/assets/sprites/blocks/meld/cultivator/meld-cultivator-gum.png new file mode 100644 index 0000000..613289f Binary files /dev/null and b/assets/sprites/blocks/meld/cultivator/meld-cultivator-gum.png differ diff --git a/assets/sprites/blocks/meld/cultivator/meld-cultivator-middle.png b/assets/sprites/blocks/meld/cultivator/meld-cultivator-middle.png new file mode 100644 index 0000000..d5d71dd Binary files /dev/null and b/assets/sprites/blocks/meld/cultivator/meld-cultivator-middle.png differ diff --git a/assets/sprites/blocks/meld/cultivator/meld-cultivator-top.png b/assets/sprites/blocks/meld/cultivator/meld-cultivator-top.png new file mode 100644 index 0000000..9023888 Binary files /dev/null and b/assets/sprites/blocks/meld/cultivator/meld-cultivator-top.png differ diff --git a/assets/sprites/blocks/meld/cultivator/meld-cultivator.png b/assets/sprites/blocks/meld/cultivator/meld-cultivator.png new file mode 100644 index 0000000..6a4529c Binary files /dev/null and b/assets/sprites/blocks/meld/cultivator/meld-cultivator.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-full.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-full.png new file mode 100644 index 0000000..16e213f Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-full.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting-glow.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting-glow.png new file mode 100644 index 0000000..8a6039c Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting-glow.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting.png new file mode 100644 index 0000000..5fe8d10 Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-matting.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils-glow.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils-glow.png new file mode 100644 index 0000000..0aaad60 Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils-glow.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils.png new file mode 100644 index 0000000..1690a42 Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid-coils.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid.png new file mode 100644 index 0000000..6347c19 Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-mid.png differ diff --git a/assets/sprites/blocks/power/aspect discharger/aspect-discharger-top.png b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-top.png new file mode 100644 index 0000000..be2ac2a Binary files /dev/null and b/assets/sprites/blocks/power/aspect discharger/aspect-discharger-top.png differ diff --git a/assets/sprites/blocks/power/conductive-pile-glow.png b/assets/sprites/blocks/power/conductive-pile-glow.png new file mode 100644 index 0000000..e72b6a4 Binary files /dev/null and b/assets/sprites/blocks/power/conductive-pile-glow.png differ diff --git a/assets/sprites/blocks/power/conductive-pile.png b/assets/sprites/blocks/power/conductive-pile.png new file mode 100644 index 0000000..837241d Binary files /dev/null and b/assets/sprites/blocks/power/conductive-pile.png differ diff --git a/assets/sprites/blocks/power/substation-laser-end.png b/assets/sprites/blocks/power/substation-laser-end.png new file mode 100644 index 0000000..940ed63 Binary files /dev/null and b/assets/sprites/blocks/power/substation-laser-end.png differ diff --git a/assets/sprites/blocks/power/substation-laser.png b/assets/sprites/blocks/power/substation-laser.png new file mode 100644 index 0000000..26522e3 Binary files /dev/null and b/assets/sprites/blocks/power/substation-laser.png differ diff --git a/assets/sprites/blocks/power/substation.png b/assets/sprites/blocks/power/substation.png new file mode 100644 index 0000000..a68b349 Binary files /dev/null and b/assets/sprites/blocks/power/substation.png differ diff --git a/assets/sprites/blocks/production/cracker/crystal-cracker-bottom.png b/assets/sprites/blocks/production/cracker/crystal-cracker-bottom.png new file mode 100644 index 0000000..7c0f54b Binary files /dev/null and b/assets/sprites/blocks/production/cracker/crystal-cracker-bottom.png differ diff --git a/assets/sprites/blocks/production/cracker/crystal-cracker-glow.png b/assets/sprites/blocks/production/cracker/crystal-cracker-glow.png new file mode 100644 index 0000000..f331259 Binary files /dev/null and b/assets/sprites/blocks/production/cracker/crystal-cracker-glow.png differ diff --git a/assets/sprites/blocks/production/cracker/crystal-cracker.png b/assets/sprites/blocks/production/cracker/crystal-cracker.png new file mode 100644 index 0000000..266a7d6 Binary files /dev/null and b/assets/sprites/blocks/production/cracker/crystal-cracker.png differ diff --git a/assets/sprites/blocks/production/feeder/filtrative-feeder-tanks-liquid.png b/assets/sprites/blocks/production/feeder/filtrative-feeder-tanks-liquid.png new file mode 100644 index 0000000..1631867 Binary files /dev/null and b/assets/sprites/blocks/production/feeder/filtrative-feeder-tanks-liquid.png differ diff --git a/assets/sprites/blocks/production/feeder/filtrative-feeder.png b/assets/sprites/blocks/production/feeder/filtrative-feeder.png new file mode 100644 index 0000000..6d06234 Binary files /dev/null and b/assets/sprites/blocks/production/feeder/filtrative-feeder.png differ diff --git a/assets/sprites/blocks/props/dissonitre-cluster-glow-heat.png b/assets/sprites/blocks/props/dissonitre-cluster-glow-heat.png new file mode 100644 index 0000000..fbc1504 Binary files /dev/null and b/assets/sprites/blocks/props/dissonitre-cluster-glow-heat.png differ diff --git a/assets/sprites/blocks/props/dissonitre-cluster-glow.png b/assets/sprites/blocks/props/dissonitre-cluster-glow.png new file mode 100644 index 0000000..30c3a97 Binary files /dev/null and b/assets/sprites/blocks/props/dissonitre-cluster-glow.png differ diff --git a/assets/sprites/blocks/props/dissonitre-cluster-shadow.png b/assets/sprites/blocks/props/dissonitre-cluster-shadow.png new file mode 100644 index 0000000..9f79448 Binary files /dev/null and b/assets/sprites/blocks/props/dissonitre-cluster-shadow.png differ diff --git a/assets/sprites/blocks/props/dissonitre-cluster.png b/assets/sprites/blocks/props/dissonitre-cluster.png new file mode 100644 index 0000000..be5313f Binary files /dev/null and b/assets/sprites/blocks/props/dissonitre-cluster.png differ diff --git a/assets/sprites/blocks/props/earthen-resonarum-cluster1.png b/assets/sprites/blocks/props/earthen-resonarum-cluster1.png new file mode 100644 index 0000000..86107d8 Binary files /dev/null and b/assets/sprites/blocks/props/earthen-resonarum-cluster1.png differ diff --git a/assets/sprites/blocks/props/earthen-resonarum-cluster2.png b/assets/sprites/blocks/props/earthen-resonarum-cluster2.png new file mode 100644 index 0000000..bf04e4d Binary files /dev/null and b/assets/sprites/blocks/props/earthen-resonarum-cluster2.png differ diff --git a/assets/sprites/blocks/props/mallow-cluster-large.png b/assets/sprites/blocks/props/mallow-cluster-large.png new file mode 100644 index 0000000..9b04483 Binary files /dev/null and b/assets/sprites/blocks/props/mallow-cluster-large.png differ diff --git a/assets/sprites/blocks/props/mixed-carbonic-boulder1.png b/assets/sprites/blocks/props/mixed-carbonic-boulder1.png new file mode 100644 index 0000000..77853fe Binary files /dev/null and b/assets/sprites/blocks/props/mixed-carbonic-boulder1.png differ diff --git a/assets/sprites/blocks/props/mixed-carbonic-boulder2.png b/assets/sprites/blocks/props/mixed-carbonic-boulder2.png new file mode 100644 index 0000000..f2320e5 Binary files /dev/null and b/assets/sprites/blocks/props/mixed-carbonic-boulder2.png differ diff --git a/assets/sprites/blocks/props/mixed-carbonic-boulder3.png b/assets/sprites/blocks/props/mixed-carbonic-boulder3.png new file mode 100644 index 0000000..4a2eda1 Binary files /dev/null and b/assets/sprites/blocks/props/mixed-carbonic-boulder3.png differ diff --git a/assets/sprites/blocks/props/pillow-glint-cluster1.png b/assets/sprites/blocks/props/pillow-glint-cluster1.png new file mode 100644 index 0000000..7fd7bc8 Binary files /dev/null and b/assets/sprites/blocks/props/pillow-glint-cluster1.png differ diff --git a/assets/sprites/blocks/props/pillow-glint-cluster2.png b/assets/sprites/blocks/props/pillow-glint-cluster2.png new file mode 100644 index 0000000..a59d664 Binary files /dev/null and b/assets/sprites/blocks/props/pillow-glint-cluster2.png differ diff --git a/assets/sprites/blocks/props/sandstone-pillar.png b/assets/sprites/blocks/props/sandstone-pillar.png new file mode 100644 index 0000000..104e6c9 Binary files /dev/null and b/assets/sprites/blocks/props/sandstone-pillar.png differ diff --git a/assets/sprites/blocks/environment/badlands/vitric-weave1.png b/assets/sprites/blocks/props/vitric-weave1.png similarity index 100% rename from assets/sprites/blocks/environment/badlands/vitric-weave1.png rename to assets/sprites/blocks/props/vitric-weave1.png diff --git a/assets/sprites/blocks/environment/badlands/vitric-weave2.png b/assets/sprites/blocks/props/vitric-weave2.png similarity index 100% rename from assets/sprites/blocks/environment/badlands/vitric-weave2.png rename to assets/sprites/blocks/props/vitric-weave2.png diff --git a/assets/sprites/blocks/storage/buffer.png b/assets/sprites/blocks/storage/buffer.png new file mode 100644 index 0000000..f258eca Binary files /dev/null and b/assets/sprites/blocks/storage/buffer.png differ diff --git a/assets/sprites/blocks/storage/depot-center.png b/assets/sprites/blocks/storage/depot-center.png new file mode 100644 index 0000000..04dbafd Binary files /dev/null and b/assets/sprites/blocks/storage/depot-center.png differ diff --git a/assets/sprites/blocks/storage/depot.png b/assets/sprites/blocks/storage/depot.png new file mode 100644 index 0000000..4e5d313 Binary files /dev/null and b/assets/sprites/blocks/storage/depot.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo-accelerator.png b/assets/sprites/blocks/turrets/vivalo/vivalo-accelerator.png new file mode 100644 index 0000000..f0b0b28 Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo-accelerator.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo-barrel.png b/assets/sprites/blocks/turrets/vivalo/vivalo-barrel.png new file mode 100644 index 0000000..6f266b0 Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo-barrel.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo-base.png b/assets/sprites/blocks/turrets/vivalo/vivalo-base.png new file mode 100644 index 0000000..c229aff Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo-base.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo-drum.png b/assets/sprites/blocks/turrets/vivalo/vivalo-drum.png new file mode 100644 index 0000000..013030e Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo-drum.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo-preview.png b/assets/sprites/blocks/turrets/vivalo/vivalo-preview.png new file mode 100644 index 0000000..24c2f1a Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo-preview.png differ diff --git a/assets/sprites/blocks/turrets/vivalo/vivalo.png b/assets/sprites/blocks/turrets/vivalo/vivalo.png new file mode 100644 index 0000000..086f709 Binary files /dev/null and b/assets/sprites/blocks/turrets/vivalo/vivalo.png differ diff --git a/assets/sprites/blocks/units/launch-station-base-range.png b/assets/sprites/blocks/units/launch-station-base-range.png new file mode 100644 index 0000000..84c83d6 Binary files /dev/null and b/assets/sprites/blocks/units/launch-station-base-range.png differ diff --git a/assets/sprites/blocks/units/launch-station-base.png b/assets/sprites/blocks/units/launch-station-base.png new file mode 100644 index 0000000..f98e6ca Binary files /dev/null and b/assets/sprites/blocks/units/launch-station-base.png differ diff --git a/assets/sprites/blocks/units/launch-station-flipped.png b/assets/sprites/blocks/units/launch-station-flipped.png new file mode 100644 index 0000000..fee9548 Binary files /dev/null and b/assets/sprites/blocks/units/launch-station-flipped.png differ diff --git a/assets/sprites/blocks/units/launch-station-glow.png b/assets/sprites/blocks/units/launch-station-glow.png new file mode 100644 index 0000000..48ba299 Binary files /dev/null and b/assets/sprites/blocks/units/launch-station-glow.png differ diff --git a/assets/sprites/blocks/units/launch-station-launcher-shadow.png b/assets/sprites/blocks/units/launch-station-launcher-shadow.png new file mode 100644 index 0000000..4bab32c Binary files /dev/null and b/assets/sprites/blocks/units/launch-station-launcher-shadow.png differ diff --git a/assets/sprites/blocks/units/launch-station.png b/assets/sprites/blocks/units/launch-station.png new file mode 100644 index 0000000..7bd3509 Binary files /dev/null and b/assets/sprites/blocks/units/launch-station.png differ diff --git a/assets/sprites/blocks/walls/friction-pad.png b/assets/sprites/blocks/walls/friction-pad.png new file mode 100644 index 0000000..ad40b40 Binary files /dev/null and b/assets/sprites/blocks/walls/friction-pad.png differ diff --git a/assets/sprites/blocks/walls/gate-spike-open.png b/assets/sprites/blocks/walls/gate-spike-open.png new file mode 100644 index 0000000..23ec45b Binary files /dev/null and b/assets/sprites/blocks/walls/gate-spike-open.png differ diff --git a/assets/sprites/blocks/walls/gate-spike.png b/assets/sprites/blocks/walls/gate-spike.png new file mode 100644 index 0000000..4877709 Binary files /dev/null and b/assets/sprites/blocks/walls/gate-spike.png differ diff --git a/assets/sprites/blocks/walls/lake-rim-open.png b/assets/sprites/blocks/walls/lake-rim-open.png new file mode 100644 index 0000000..6a511e4 Binary files /dev/null and b/assets/sprites/blocks/walls/lake-rim-open.png differ diff --git a/assets/sprites/blocks/walls/lake-rim.png b/assets/sprites/blocks/walls/lake-rim.png new file mode 100644 index 0000000..6d15246 Binary files /dev/null and b/assets/sprites/blocks/walls/lake-rim.png differ diff --git a/assets/sprites/icon.png b/assets/sprites/icon.png new file mode 100644 index 0000000..c414abd Binary files /dev/null and b/assets/sprites/icon.png differ diff --git a/assets/sprites/items/electrum-sheet.png b/assets/sprites/items/electrum-sheet.png index bbc0b34..9485b5e 100644 Binary files a/assets/sprites/items/electrum-sheet.png and b/assets/sprites/items/electrum-sheet.png differ diff --git a/assets/sprites/items/heavy ind/aspect-bomb.png b/assets/sprites/items/heavy ind/aspect-bomb.png new file mode 100644 index 0000000..8ceffb0 Binary files /dev/null and b/assets/sprites/items/heavy ind/aspect-bomb.png differ diff --git a/assets/sprites/items/larval-plating.png b/assets/sprites/items/larval-plating.png new file mode 100644 index 0000000..133f01c Binary files /dev/null and b/assets/sprites/items/larval-plating.png differ diff --git a/assets/sprites/items/meld-shard.png b/assets/sprites/items/meld-shard.png new file mode 100644 index 0000000..ead26e6 Binary files /dev/null and b/assets/sprites/items/meld-shard.png differ diff --git a/assets/sprites/liquids/blood.png b/assets/sprites/liquids/blood.png new file mode 100644 index 0000000..db035b7 Binary files /dev/null and b/assets/sprites/liquids/blood.png differ diff --git a/assets/sprites/liquids/ichor.png b/assets/sprites/liquids/ichor.png new file mode 100644 index 0000000..f67019a Binary files /dev/null and b/assets/sprites/liquids/ichor.png differ diff --git a/assets/sprites/liquids/meld.png b/assets/sprites/liquids/meld.png index 97b83d6..333ba11 100644 Binary files a/assets/sprites/liquids/meld.png and b/assets/sprites/liquids/meld.png differ diff --git a/assets/sprites/liquids/mercury.png b/assets/sprites/liquids/mercury.png new file mode 100644 index 0000000..dfd43bf Binary files /dev/null and b/assets/sprites/liquids/mercury.png differ diff --git a/assets/sprites/liquids/nectar.png b/assets/sprites/liquids/nectar.png new file mode 100644 index 0000000..f184814 Binary files /dev/null and b/assets/sprites/liquids/nectar.png differ diff --git a/assets/sprites/liquids/ooze.png b/assets/sprites/liquids/ooze.png new file mode 100644 index 0000000..49d8fb8 Binary files /dev/null and b/assets/sprites/liquids/ooze.png differ diff --git a/assets/sprites/ui/fabricator-battery.aseprite b/assets/sprites/ui/fabricator-battery.aseprite new file mode 100644 index 0000000..8ac932d Binary files /dev/null and b/assets/sprites/ui/fabricator-battery.aseprite differ diff --git a/assets/sprites/ui/fabricator-battery1.png b/assets/sprites/ui/fabricator-battery1.png new file mode 100644 index 0000000..53ac876 Binary files /dev/null and b/assets/sprites/ui/fabricator-battery1.png differ diff --git a/assets/sprites/ui/fabricator-battery2.png b/assets/sprites/ui/fabricator-battery2.png new file mode 100644 index 0000000..91dbad8 Binary files /dev/null and b/assets/sprites/ui/fabricator-battery2.png differ diff --git a/assets/sprites/ui/fabricator-battery3.png b/assets/sprites/ui/fabricator-battery3.png new file mode 100644 index 0000000..287f659 Binary files /dev/null and b/assets/sprites/ui/fabricator-battery3.png differ diff --git a/assets/sprites/ui/fabricator-battery4.png b/assets/sprites/ui/fabricator-battery4.png new file mode 100644 index 0000000..e5b6fb6 Binary files /dev/null and b/assets/sprites/ui/fabricator-battery4.png differ diff --git a/assets/sprites/ui/fabricator-battery5.png b/assets/sprites/ui/fabricator-battery5.png new file mode 100644 index 0000000..89b997a Binary files /dev/null and b/assets/sprites/ui/fabricator-battery5.png differ diff --git a/mod.hjson b/mod.hjson index 3e069cd..d51d277 100644 --- a/mod.hjson +++ b/mod.hjson @@ -1,8 +1,8 @@ #the mod name as displayed in-game -displayName: "Meld (Java)" +displayName: "[[]#ea9ad6]Meld: Sand and Sunder[[]]" #the internal name of your mod -name: "meld" +name: "meld2" #your name author: "Sh1p" @@ -11,13 +11,15 @@ author: "Sh1p" main: "meld.Meld" #the mod description as seen in the mod dialog -description: "Meld Java.\n\n[[]accent]Only has custom game content! (play the info map to understand)[[]]\n\nIncompatable with hjson meld" +description: "[[]gray]Under scattered gloomy sunlight in the shimmering seas, within the shifting sanctuary, Strata awoke.\n\nNo mouth to scream with, no skin to feel with, yet one sense remained.\n\nA great longing of meaning.\n\n[[]accent]Only has custom game content! (play the info map to understand)[[]]" + +subtitle: "[[]accent]What choice do I have...[[]]" #the mod version -version: gameplay test v3 +version: gameplay test 5 #the minimum game build required to run this mod -minGameVersion: 157 +minGameVersion: 154 #this is a java mod java: true diff --git a/src/meld/Meld.java b/src/meld/Meld.java index 7affe5f..db7b790 100644 --- a/src/meld/Meld.java +++ b/src/meld/Meld.java @@ -1,40 +1,35 @@ package meld; import arc.*; +import arc.graphics.Blending; import arc.graphics.Color; import arc.graphics.Colors; -import arc.math.geom.Geometry; -import arc.math.geom.Point2; -import arc.struct.IntSeq; +import arc.graphics.g2d.Draw; import arc.struct.Seq; -import arc.util.Log; -import arc.util.Time; +import arc.util.Reflect; import arc.util.Tmp; import meld.content.*; import meld.core.*; -import meld.entities.unit.abilities.BezerkAbility; +import meld.graphics.*; import meld.fluid.AspectGroup; -import meld.graphics.MeldRegions; import meld.meta.MeldStatUnit; +import meld.meta.MeldStats; +import meld.ui.MeldSettings; +import meld.world.CustomExplosions; import mindustry.Vars; -import mindustry.content.Blocks; -import mindustry.content.Bullets; -import mindustry.content.Fx; -import mindustry.content.UnitTypes; import mindustry.ctype.UnlockableContent; import mindustry.game.EventType; -import mindustry.game.EventType.*; +import mindustry.game.Team; +import mindustry.graphics.Layer; import mindustry.mod.*; -import mindustry.world.Tile; -import mindustry.world.blocks.environment.Floor; +import mindustry.type.UnitType; import mindustry.world.meta.Stat; -import mindustry.world.meta.StatUnit; import rhino.ImporterTopLevel; import rhino.NativeJavaPackage; public class Meld extends Mod{ - public static final String name = "meld"; + public static final String name = "meld2"; public static NativeJavaPackage p = null; @@ -43,7 +38,22 @@ public class Meld extends Mod{ public Meld(){ Events.on(EventType.ClientLoadEvent.class, e -> { MeldRegions.load(); + MeldMappings.loadAfter(); }); + + Events.run(EventType.Trigger.draw, () -> { + if(!MeldSettings.overlayOverFog) return; + Draw.draw(Layer.fogOfWar + 2, AboveOverlayRenderer::draw); + + //Just additive blending the fuck out of this layer in particular cause like fuck yes + Draw.drawRange(MeldLayers.smokeHigh, 1, () -> Draw.blend(Blending.additive), () -> Draw.blend(Blending.normal)); + }); + + Events.on(EventType.FileTreeInitEvent.class, e -> { + Core.app.post(MeldShaders::load); + }); + + CustomExplosions.load(); } public static String prefix(String in){ @@ -76,9 +86,14 @@ public static String gradient(String in, Color... colors){ @Override public void init() { super.init(); - + melting = new Melting(); - + + Core.settings.put(SettingKeys.lighting, true); + + MeldSettings.loadSettings(); + if(MeldSettings.replaceLighting) Reflect.set(Vars.renderer, "lights", new MeldLightRenderer()); + Vars.mods.getScripts().runConsole( "function buildWorldP(){return Vars.world.buildWorld(Vars.player.x, Vars.player.y)}"); ImporterTopLevel scope = (ImporterTopLevel) Vars.mods.getScripts().scope; @@ -87,7 +102,8 @@ public void init() { "meld", "meld.content", "meld.world", - "meld.fluid" + "meld.fluid", + "meld.graphics" ); packages.each(name -> { @@ -103,22 +119,23 @@ public void init() { @Override public void loadContent(){ MeldStatusEffects.load(); - MeldBullets.load(); - MeldUnits.load(); MeldItems.load(); MeldLiquids.load(); + MeldBullets.load(); + MeldUnits.load(); MeldBlocks.load(); MeldEnvironment.load(); + MeldPlanets.load(); //Just loads localised names AspectGroup.loadAll(); - Vars.content.items().each(c -> { - c.stats.add(Stat.buildCost, c.cost, MeldStatUnit.ticks); - }); - + //Loaded after all the content + MeldMappings.load(); + MeldStats.loadModifications(); + Vars.content.blocks().each(b -> { - if(b.minfo.mod != null && b.minfo.mod.name.equals("meld")){ + if(b.minfo.mod != null && b.minfo.mod.name.equals("meld2")){ b.deconstructDropAllLiquid = true; } }); @@ -126,5 +143,16 @@ public void loadContent(){ Vars.content.liquids().each(l -> { Colors.put(l.name, l.color); }); + Vars.content.items().each(l -> { + Colors.put(l.name, l.color); + }); + + Vars.content.each(c -> { + if(!(c instanceof UnlockableContent content)) return; + if(content.minfo.mod != null && content.minfo.mod.name.equals("meld2")) { + content.shownPlanets.clear(); + content.shownPlanets.addAll(MeldPlanets.ikaru); + } + }); } } diff --git a/src/meld/SettingKeys.java b/src/meld/SettingKeys.java new file mode 100644 index 0000000..69eff57 --- /dev/null +++ b/src/meld/SettingKeys.java @@ -0,0 +1,17 @@ +package meld; + +public class SettingKeys { + public static String pref(String in){ + return "setting.meld-" + in; + } + + public static String lighting = pref("lighting"), + invertAmbient = pref("invert-ambient"), + connectedSonar = pref("connected-sonar"), + unitLightScale = pref("unit-light-scale"), + overlayOverFog = pref("highvis-overlay"), + + //Expirimental- doesn't sync in multiplayer and off by default + bulbheadOmnimove = pref("bulbhead-omnimove"), + portSaves = pref("port-saves"); +} diff --git a/src/meld/content/MeldAttributes.java b/src/meld/content/MeldAttributes.java index 907e039..2f967c3 100644 --- a/src/meld/content/MeldAttributes.java +++ b/src/meld/content/MeldAttributes.java @@ -4,6 +4,8 @@ public class MeldAttributes { - public static final Attribute aetherAttr = Attribute.add("aether"); + public static final Attribute aetherAttr = Attribute.add("aether"), + soilAttr = Attribute.add("aether-soil"), + meld = Attribute.add("meld-floor"); } diff --git a/src/meld/content/MeldBlocks.java b/src/meld/content/MeldBlocks.java index 5921046..883b321 100644 --- a/src/meld/content/MeldBlocks.java +++ b/src/meld/content/MeldBlocks.java @@ -2,10 +2,14 @@ import arc.graphics.Blending; import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.g2d.Lines; import arc.math.Angles; import arc.math.Interp; import arc.math.Mathf; import arc.math.geom.Vec2; +import arc.struct.Seq; import arc.util.Tmp; import meld.*; import meld.entities.bullet.OutflowBulletType; @@ -13,6 +17,10 @@ import meld.fluid.AspectGroup; import meld.graphics.*; import meld.world.blocks.*; +import meld.world.blocks.consumers.ConsumeItemsBoost; +import meld.world.blocks.production.Depot; +import meld.world.blocks.turrets.MeldItemTurret; +import meld.world.blocks.consumers.ConsumePowerRecipe; import meld.world.blocks.consumers.StupidConsumeAspects; import meld.world.blocks.crafting.ModularCrafter; import meld.world.blocks.crafting.RecipeCrafter; @@ -21,16 +29,24 @@ import meld.world.blocks.crafting.recipe.SpoolRecipe; import meld.world.blocks.crafting.modules.*; import meld.world.blocks.crafting.recipe.TimedRecipe; +import meld.world.blocks.defense.FrictionPad; +import meld.world.blocks.defense.LakeRim; import meld.world.blocks.fluid.*; import meld.world.blocks.items.PriorityInputSplitter; +import meld.world.blocks.power.ConsumeThermal; import meld.world.blocks.producer.ProduceItem; import meld.world.blocks.producer.ProduceLiquid; +import meld.world.blocks.production.GrindingQuary; import meld.world.blocks.production.SingleBeamDrill; +import meld.world.blocks.units.LaunchStation; +import meld.world.blocks.units.UnitLogisticsPad; import meld.world.meta.*; import mindustry.Vars; import mindustry.content.Fx; import mindustry.content.StatusEffects; +import mindustry.entities.Effect; import mindustry.entities.bullet.*; +import mindustry.entities.effect.MultiEffect; import mindustry.entities.effect.ParticleEffect; import mindustry.entities.part.DrawPart; import mindustry.entities.part.HaloPart; @@ -42,33 +58,42 @@ import mindustry.gen.Bullet; import mindustry.gen.Sounds; import mindustry.gen.Statusc; +import mindustry.graphics.Drawf; import mindustry.graphics.Layer; import mindustry.graphics.Pal; import mindustry.type.*; import mindustry.world.Block; +import mindustry.world.blocks.defense.Door; import mindustry.world.blocks.defense.ForceProjector; import mindustry.world.blocks.defense.RegenProjector; import mindustry.world.blocks.defense.Wall; -import mindustry.world.blocks.defense.turrets.ItemTurret; import mindustry.world.blocks.defense.turrets.LiquidTurret; import mindustry.world.blocks.distribution.*; import mindustry.world.blocks.liquid.Conduit; import mindustry.world.blocks.liquid.LiquidJunction; import mindustry.world.blocks.liquid.LiquidRouter; +import mindustry.world.blocks.power.Battery; +import mindustry.world.blocks.power.LightBlock; +import mindustry.world.blocks.power.PowerNode; +import mindustry.world.blocks.power.ThermalGenerator; import mindustry.world.blocks.production.*; +import mindustry.world.blocks.storage.StorageBlock; import mindustry.world.blocks.storage.Unloader; import mindustry.world.blocks.units.UnitFactory; +import mindustry.world.consumers.ConsumeItemList; import mindustry.world.consumers.ConsumeItems; import mindustry.world.consumers.ConsumeLiquid; +import mindustry.world.consumers.ConsumePower; import mindustry.world.draw.*; import mindustry.world.meta.Attribute; +import mindustry.world.meta.BuildVisibility; import static mindustry.type.ItemStack.with; public class MeldBlocks { //Strata blocks first - public static Block chute, chuteRouter, chuteBridge, chuteJunction, chuteOverflow, unloadingHub; + public static Block chute, chuteRouter, chuteBridge, chuteJunction, chuteOverflow, platedChute, unloadingHub; public static Block sonarSpire, movementAnchor, nullifier, //Bruisekit: Targets largest, highest hp blocks, functional blocks first, continuously heals @@ -76,25 +101,37 @@ public class MeldBlocks { //Gauze chainheals smallest, lowest hp blocks, low target prio blocks first. //Suture shoots healing needles in a cone at the closest damaged block. Impales enemies, causing them to take constant chip damage and be sedated. - bruisekit, gauze, suture; + bruisekit, gauze, suture, + lampPsi; //Core Blocks - public static Block coreRaft; + public static Block coreRaft, buffer, depot; //Core Incinerator does what core incinerator does... it core incinerator public static ItemIncinerator aspectIncinerator; - public static Block aetherAccumulator, elementalBlaster, pneumaticPulsear, + public static Block aetherAccumulator, crystalCracker, elementalBlaster, filtrativeFeeder, grinderQuarry, pneumaticPulsear, earthboundInfuser, fumehood, sharkFactory; - public static Block gasKiln, metalworks, rotaryKiln, pneumaticExtruder; + public static LaunchStation launchStation; - public static Block channelNode, channelHub, channelFace, aspectOutlet, aspectChannel, channelDirector, channelVent, manualValve, intakeValve, valveController, pipebox; + public static UnitLogisticsPad logiPad; - public static Block sunder, shredstorm, molotov, vivisection; + //Crafters + public static RecipeCrafter gasKiln, metalworks, rotaryKiln, pneumaticExtruder; - public static Block silverHusk, shadesteelShingles; + public static AttributeCrafter crushWeaver, amalgamDecomposer; + public static RecipeCrafter stormIris; + + //power blocks + public static Block conductivePile, substation, aspectDischarger; + + public static Block channelNode, channelHub, channelFace, aspectOutlet, aspectChannel, aspectBomb, channelDirector, channelVent, manualValve, intakeValve, valveController, pipebox; + + public static Block sunder, shredstorm, molotov, vivisection, vinca, vivalo; + + public static Block silverHusk, shadesteelShingles, gateSpike, lakeRim, frictionPad; //Meld blocks public static Block pipeline, pipelineRouter, pipelineCrossing, pipelineBridge, @@ -191,27 +228,28 @@ public static void load(){ new TimedRecipe(){{ float multi = AspectGroup.aether.getEfficiency(MeldLiquids.aether); float density = AspectGroup.aether.getDensity(MeldLiquids.aether); - consumers.add(new ConsumeLiquid(MeldLiquids.aether, outletRate/density/10)); - producers.add(new ProduceLiquid(MeldLiquids.aspect, outletRate * multi * density)); + consumers.add(new ConsumeLiquid(MeldLiquids.aether, outletRate/density/10 * multi)); + producers.add(new ProduceLiquid(MeldLiquids.aspect, outletRate * multi)); }}, new TimedRecipe(){{ float multi = AspectGroup.aether.getEfficiency(MeldLiquids.pollutantMixture); float density = AspectGroup.aether.getDensity(MeldLiquids.pollutantMixture); - consumers.add(new ConsumeLiquid(MeldLiquids.pollutantMixture, outletRate/density/10)); - producers.add(new ProduceLiquid(MeldLiquids.boundAspect, outletRate * multi * density)); + consumers.add(new ConsumeLiquid(MeldLiquids.pollutantMixture, outletRate/density/10 * multi)); + producers.add(new ProduceLiquid(MeldLiquids.boundAspect, outletRate * multi)); }}, new TimedRecipe(){{ float multi = AspectGroup.aether.getEfficiency(MeldLiquids.thunderingAether); float density = AspectGroup.aether.getDensity(MeldLiquids.thunderingAether); - consumers.add(new ConsumeLiquid(MeldLiquids.thunderingAether, outletRate/density/10)); - producers.add(new ProduceLiquid(MeldLiquids.stormingAspect, outletRate * multi * density)); + consumers.add(new ConsumeLiquid(MeldLiquids.thunderingAether, outletRate/density/10 * multi)); + producers.add(new ProduceLiquid(MeldLiquids.stormingAspect, outletRate * multi)); }} ); }}; aspectChannel = new VisualAspectPipe("aspect-channel"){{ requirements(Category.liquid, with( - MeldItems.aspectPipe, 4 + MeldItems.annealedSilver, 4, + MeldItems.glassMallows, 4 )); underBullets = false; leaks = false; @@ -227,6 +265,24 @@ public static void load(){ junctionReplacement = channelFace; }}; + aspectBomb = new AspectBomb("aspect-bomb"){{ + requirements(Category.liquid, with( + MeldItems.aspectBomb, 50 + )); + underBullets = false; + leaks = false; + health = (int)(channelHealth * 2.5f); + armor = 2; + insulated = true; + + placeableLiquid = true; + + liquidCapacity = 20; + size = 1; + botColor = Color.white; + junctionReplacement = channelFace; + }}; + channelHub = new LiquidRouter("channel-hub"){{ requirements(Category.liquid, with(MeldItems.debris, 80, MeldItems.shadesteel, 120)); size = 4; @@ -317,7 +373,7 @@ public static void load(){ placeableLiquid = true; }}; - sunder = new ItemTurret("sunder"){{ + sunder = new MeldItemTurret("sunder"){{ requirements(Category.turret, with( MeldItems.debris, 45, MeldItems.carbolith, 60 @@ -381,7 +437,7 @@ public static void load(){ ); }}; - shredstorm = new ItemTurret("shredstorm"){{ + shredstorm = new MeldItemTurret("shredstorm"){{ requirements(Category.turret, with( MeldItems.debris, 35, MeldItems.silver, 50 @@ -469,7 +525,7 @@ public static void load(){ ); }}; - molotov = new ItemTurret("molotov"){{ + molotov = new MeldItemTurret("molotov"){{ requirements(Category.turret, with( MeldItems.carbolith, 40, MeldItems.silver, 70 @@ -644,7 +700,87 @@ public static void load(){ ); }}; - vivisection = new ItemTurret("vivisection"){{ + vinca = new MeldItemTurret("vinca"){{ + requirements(Category.turret, with(MeldItems.debris, 25, MeldItems.silver, 25, MeldItems.quartzStrata, 30)); + size = 2; + health = 850; + range = 120; + + liquidCapacity = outletRate * 60 * 4; + fogRadiusMultiplier = 0.25f; + reload = 30; + + shootEffect = Fx.shootBig; + shootWarmupSpeed = 0.09f; + minWarmup = 0.7f; + + velocityRnd = 0.2f; + recoil = 1.5f; + inaccuracy = 2; + shootCone = 5; + + ammoPerShot = 2; + shootY = 8; + + rotate = quickRotate = false; + + consume(new StupidConsumeAspects(outletRate * 1, AspectGroup.aspect)); + + ammo( + MeldItems.quartzStrata, MeldBullets.vincaQuartz + ); + }}; + + //TODO: Finish vivalo's... everything + /* + vivalo = new MeldItemTurret("vivalo"){{ + requirements(Category.turret, with(MeldItems.debris, 20, MeldItems.electrumSheet, 45, MeldItems.vitricMesh, 12)); + size = 3; + health = 520; + range = 160; + fogRadiusMultiplier = 0.25f; + reload = 240; + + shootWarmupSpeed = 0.12f; + minWarmup = 0.7f; + + recoil = 0; + shootCone = 5; + + rotateSpeed = 12; + + shootSound = Sounds.loopSpray; + moveWhileCharging = true; + + rotate = quickRotate = false; + shoot = new ShootSpread(){{ + spread = 0; + shots = 6; + shotDelay = 8; + firstShotDelay = 30; + }}; + + inaccuracy = 0; + shootY = 9; + + ammoPerShot = 10; + drawer = new DrawTurret(){{ + parts.addAll(); + }}; + + ammo( + MeldItems.resonarum, 1, + MeldItems.dissonitre, 1, + MeldItems.vitricMesh, 1, + MeldItems.quartzStrata, 1, + MeldItems.iampsi, 1, + MeldItems.glassMallows, 1 + ); + + }}; + */ + + vivisection = new MeldItemTurret("vivisection"){{ requirements(Category.turret, with(MeldItems.debris, 200, MeldItems.silver, 320, MeldItems.resonarum, 60)); size = 4; health = 2640; @@ -981,13 +1117,6 @@ public void update(Bullet b){ ); }}; - shadesteelShingles = new Wall("shadesteel-shingles"){{ - requirements(Category.defense, with(MeldItems.shadesteel, 64)); - size = 2; - health = 2000; - buildCostMultiplier = 2f; - }}; - silverHusk = new RegenProjector("silver-husk"){{ requirements(Category.defense, with(MeldItems.debris, 15, MeldItems.annealedSilver, 16)); health = 450; @@ -1006,12 +1135,39 @@ public void update(Bullet b){ }}, new DrawLiquidTile(MeldLiquids.aspect), new DrawLiquidTile(MeldLiquids.boundAspect), + new DrawLiquidTile(MeldLiquids.stormingAspect), new DrawDefault() ); consume(new StupidConsumeAspects(outletRate/2, AspectGroup.aspect)); }}; + shadesteelShingles = new Wall("shadesteel-shingles"){{ + requirements(Category.defense, with(MeldItems.shadesteel, 64)); + size = 2; + health = 2000; + buildCostMultiplier = 2f; + }}; + + gateSpike = new Door("gate-spike"){{ + requirements(Category.defense, with(MeldItems.debris, 4)); + size = 1; + health = 120; + }}; + + lakeRim = new LakeRim("lake-rim"){{ + requirements(Category.defense, with(MeldItems.debris, 4)); + size = 1; + health = 120; + }}; + + frictionPad = new FrictionPad("friction-pad"){{ + requirements(Category.units, with(MeldItems.quartzStrata, 1)); + size = 1; + health = 40; + }}; + + coreRaft = new CoreRaft("core-raft"){{ requirements(Category.effect, with( MeldItems.debris, 900 @@ -1019,6 +1175,9 @@ public void update(Bullet b){ size = 3; health = 4000; + lightRadius = 360; + fogRadius = 40; + itemCapacity = 900; unitCapModifier = 6; @@ -1027,6 +1186,25 @@ public void update(Bullet b){ solid = false; }}; + buffer = new StorageBlock("buffer"){{ + requirements(Category.effect, with(MeldItems.debris, 120, MeldItems.cruciblePlating, 200)); + size = 2; + health = 600; + armor = 15; + + itemCapacity = 100; + }}; + + depot = new Depot("depot"){{ + requirements(Category.effect, with(MeldItems.debris, 60)); + buildTime = 240; + + size = 2; + health = 800; + + itemCapacity = 20; + }}; + aspectIncinerator = new StorageIncinerator("aspect-incinerator"){{ requirements(Category.effect, with(MeldItems.debris, 40)); health = 120; @@ -1044,6 +1222,8 @@ public void update(Bullet b){ health = 300; + buildTime = 180; + attribute = MeldAttributes.aetherAttr; baseEfficiency = 0; minEfficiency = 8.9f; @@ -1054,44 +1234,31 @@ public void update(Bullet b){ outputLiquid = new LiquidStack(MeldLiquids.aether, 1); }}; - fumehood = new ModularCrafter("fumehood"){{ + crystalCracker = new AttributeCrafter("crystal-cracker"){{ requirements(Category.production, with( - MeldItems.debris, 80, MeldItems.shadesteel, 40 + MeldItems.debris, 40, + MeldItems.dissonitre, 40 )); - size = 3; - health = 500; - armor = 2; - hasLiquids = true; - replaceBars = false; - - squareSprite = false; + size = 2; - dumpedLiquids.addAll(MeldLiquids.pollutantMixture, MeldLiquids.fumes); + health = 600; - //Should make all the modules trigger in order - hookAll(BlockEvent.Defaults.proximityUpdate, - new AttributeModule(){{ - attribute = MeldAttributes.aetherAttr; - baseEfficiency = 0; - minEfficiency = 1; - boostScale = 1f/9f; - - efficiencyPin = 0; - }}, - new AttributeModule(){{ - attribute = Attribute.steam; - baseEfficiency = 0; - minEfficiency = 1; - boostScale = 1f/9f; + attribute = MeldAttributes.soilAttr; + baseEfficiency = 0; - efficiencyPin = 1; - }} + drawer = new DrawMulti( + new DrawRegion("-bottom"), + new DrawLiquidTile(MeldLiquids.thunderingAether), + new DrawGlowRegion(), + new DrawRegion() ); - modules.addAll( - new ProduceLiquidModule(new LiquidStack(MeldLiquids.pollutantMixture, 1), 0), - new ProduceLiquidModule(new LiquidStack(MeldLiquids.fumes, 1), 1) - ); + craftTime = 60; + consumeItem(MeldItems.dissonitre, 1); + consume(new ConsumeLiquid(MeldLiquids.thunderingAether, 0){{ + optional = true; + }}); + outputLiquid = new LiquidStack(MeldLiquids.thunderingAether, 4/6f); }}; elementalBlaster = new BeamDrill("elemental-blaster"){{ @@ -1105,6 +1272,8 @@ public void update(Bullet b){ drillTime = 90; tier = 2; + buildTime = 90; + liquidCapacity = outletRate * 60 * 4; optionalBoostIntensity = 2; @@ -1123,7 +1292,7 @@ public void update(Bullet b){ MeldItems.resonarum, 0.5f ); drillMultipliers.put( - MeldItems.electrumSheets, 2 + MeldItems.electrumSheet, 2 ); drillMultipliers.put( MeldItems.likestoneSediments, 0.5f @@ -1144,6 +1313,117 @@ public void update(Bullet b){ }}); }}; + filtrativeFeeder = new AttributeCrafter("filtrative-feeder"){{ + requirements( + Category.production, with( + MeldItems.debris, 80, + MeldItems.annealedSilver, 60, + MeldItems.vitricMesh, 240 + ) + ); + size = 5; + + liquidCapacity = 300; + itemCapacity = 1; + + hasLiquids = true; + + health = 350; + + baseEfficiency = 0; + boostScale = 2.49f/2.5f; + minEfficiency = 0.99f; + maxBoost = 10; + + craftTime = 30; + + attribute = MeldAttributes.meld; + + drawer = new DrawMulti( + new DrawLiquidTile(MeldLiquids.meld, 2), + new DrawRegion(), + new DrawLiquidRegion(MeldLiquids.ichor){{ + suffix = "-tanks-liquid"; + }} + ); + + consume(new ConsumeLiquid(MeldLiquids.ichor, 1)); + outputItems = with(MeldItems.debris, 1); + outputLiquids = LiquidStack.with(MeldLiquids.meld, 2); + + placeableLiquid = floating = true; + }}; + + fumehood = new ModularCrafter("fumehood"){{ + requirements(Category.production, with( + MeldItems.debris, 80, MeldItems.shadesteel, 40 + )); + size = 3; + health = 500; + armor = 2; + hasLiquids = true; + replaceBars = false; + + squareSprite = false; + + dumpedLiquids.addAll(MeldLiquids.pollutantMixture, MeldLiquids.fumes); + + //Should make all the modules trigger in order + hookAll(BlockEvent.Defaults.proximityUpdate, + new AttributeModule(){{ + attribute = MeldAttributes.aetherAttr; + baseEfficiency = 0; + minEfficiency = 1; + boostScale = 1f/9f; + + efficiencyPin = 0; + }}, + new AttributeModule(){{ + attribute = Attribute.steam; + baseEfficiency = 0; + minEfficiency = 1; + boostScale = 1f/9f; + + efficiencyPin = 1; + }} + ); + + modules.addAll( + new ProduceLiquidModule(new LiquidStack(MeldLiquids.pollutantMixture, 1), 0), + new ProduceLiquidModule(new LiquidStack(MeldLiquids.fumes, 1), 1) + ); + }}; + + grinderQuarry = new GrindingQuary("grinder-quarry"){{ + requirements(Category.production, with(MeldItems.debris, 250, MeldItems.quartzStrata, 120)); + size = 5; + + drillMultipliers.put(MeldItems.clayMallows, 0); + + consume(new StupidConsumeAspects(outletRate * 4, AspectGroup.aspect)); + consume(new ConsumeItemList(){{ + optional = booster = true; + setMultipliers( + MeldItems.quartzStrata, 1.5f, + MeldItems.iampsi, 3f + ); + }} + ); + consume(new ConsumeItemList(){{ + optional = booster = true; + setMultipliers( + MeldItems.gunpowder, 3f, + MeldItems.aspectBomb, 2f + ); + }} + ); + consume( + new StupidConsumeAspects(outletRate, AspectGroup.aqua, 5){{ + optional = booster = true; + }} + ); + }}; + pneumaticPulsear = new SingleBeamDrill("pneumatic-pulsar"){{ requirements(Category.production, with(MeldItems.debris, 500, MeldItems.carbolith, 250, MeldItems.shadesteel, 350, MeldItems.aspectPipe, 300)); health = 2400; @@ -1228,7 +1508,7 @@ public void update(Bullet b){ itemCapacity = 10; inputLiquids.addAll(MeldLiquids.aspect, MeldLiquids.boundAspect, MeldLiquids.stormingAspect); - inputItems.addAll(MeldItems.tenbris, MeldItems.clayMallows, MeldItems.carbolith, MeldItems.debris, MeldItems.shadesteel, MeldItems.glassMallows, MeldItems.silver, MeldItems.likestoneSediments, MeldItems.quartzStrata); + inputItems.addAll(MeldItems.tenbris, MeldItems.clayMallows, MeldItems.carbolith, MeldItems.debris, MeldItems.shadesteel, MeldItems.silver, MeldItems.likestoneSediments, MeldItems.quartzStrata); outputItems.addAll(MeldItems.cruciblePlating, MeldItems.shadesteel, MeldItems.glassMallows, MeldItems.annealedSilver); outputLiquids.addAll(MeldLiquids.fumes); @@ -1273,8 +1553,8 @@ public void update(Bullet b){ itemCapacity = 10; inputLiquids.addAll(MeldLiquids.aspect, MeldLiquids.boundAspect, MeldLiquids.stormingAspect); - inputItems.addAll(MeldItems.shadesteel, MeldItems.elnarDust, MeldItems.debris, MeldItems.silver, MeldItems.annealedSilver); - outputItems.addAll(MeldItems.aspectPipe); + inputItems.addAll(MeldItems.shadesteel, MeldItems.elnarDust, MeldItems.debris, MeldItems.silver, MeldItems.annealedSilver, MeldItems.glassMallows); + outputItems.addAll(MeldItems.aspectPipe, MeldItems.aspectBomb); inputLiquidSlots = 1; @@ -1305,10 +1585,242 @@ public void update(Bullet b){ producers.addAll( new ProduceItem(new ItemStack(MeldItems.aspectPipe, 2)) ); + }}, + + new TimedRecipe(30){{ + consumers.addAll( + new ConsumeItems(with(MeldItems.glassMallows, 4, MeldItems.silver, 2)), + new ConsumeLiquid(MeldLiquids.stormingAspect, outletRate * 4) + ); + producers.addAll( + new ProduceItem(new ItemStack(MeldItems.aspectBomb, 10)) + ); + }}, + new TimedRecipe(15){{ + consumers.addAll( + new ConsumeItems(with(MeldItems.glassMallows, 4, MeldItems.annealedSilver, 2)), + new ConsumeLiquid(MeldLiquids.stormingAspect, outletRate * 4) + ); + producers.addAll( + new ProduceItem(new ItemStack(MeldItems.aspectBomb, 10)) + ); }} ); }}; + crushWeaver = new AttributeCrafter("crush-weaver"){{ + requirements(Category.crafting, with( + MeldItems.debris, 40, + MeldItems.annealedSilver, 40, + MeldItems.dissonitre, 40 + )); + size = 2; + + health = 600; + + attribute = MeldAttributes.soilAttr; + baseEfficiency = 0; + minEfficiency = 1; + + drawer = new DrawMulti( + new DrawRegion("-bottom"), + new DrawRegion("-grinder"){{ + x = 2; + y = -3; + spinSprite = true; + rotateSpeed = 30; + }}, + new DrawRegion("-grinder"){{ + x = 2; + y = 3; + spinSprite = true; + rotateSpeed = -30; + }}, + new DrawRegion("-grinder"){{ + x = -2; + y = 3; + spinSprite = true; + rotateSpeed = 30; + }}, + new DrawRegion("-grinder"){{ + x = -2; + y = -3; + spinSprite = true; + rotateSpeed = -30; + }}, + new DrawGlowRegion(), + new DrawRegion() + ); + + craftTime = 30; + consumeItem(MeldItems.dissonitre, 1); + consume(new StupidConsumeAspects(outletRate, AspectGroup.aspect)); + outputItems = with(MeldItems.vitricMesh, 1); + }}; + + crushWeaver = new AttributeCrafter("aether-vitrifier"){{ + requirements(Category.crafting, with( + MeldItems.debris, 40, + MeldItems.electrumSheet, 80, + MeldItems.dissonitre, 40 + )); + size = 2; + + health = 600; + + attribute = MeldAttributes.soilAttr; + baseEfficiency = 0; + minEfficiency = 1; + + drawer = new DrawMulti( + new DrawRegion("-bottom"), + new DrawGlowRegion(), + new DrawRegion() + ); + + craftTime = 60; + consume(new StupidConsumeAspects(outletRate/10f, AspectGroup.aether)); + consumePower(2); + outputItems = with(MeldItems.dissonitre, 1); + }}; + + amalgamDecomposer = new AttributeCrafter("amalgam-decomposer"){{ + requirements(Category.production, with( + MeldItems.debris, 45, + MeldItems.annealedSilver, 80, + MeldItems.dissonitre, 80 + )); + size = 3; + health = 800; + + itemCapacity = 40; + + attribute = MeldAttributes.soilAttr; + baseEfficiency = 0; + minEfficiency = 1; + + craftTime = 60; + consumeItem(MeldItems.electrumSheet, 20); + consume(new StupidConsumeAspects(outletRate * 2, AspectGroup.aspect)); + + outputItems = with(MeldItems.debris, 5); + outputLiquids = LiquidStack.with(MeldLiquids.ichor, 2); + + + drawer = new DrawMulti( + new DrawRegion("-bottom"), + new DrawLiquidTile(){{ + drawLiquid = MeldLiquids.aspect; + padTop = 14.25f; + }}, + new DrawLiquidTile(){{ + drawLiquid = MeldLiquids.ichor; + padBottom = 8.25f; + }}, + new DrawRegion(), + new DrawGlowRegion() + ); + }}; + + stormIris = new RecipeCrafter("storm-iris"){{ + requirements(Category.crafting, with(MeldItems.annealedSilver, 450, MeldItems.electrumSheet, 300, MeldItems.quartzStrata, 250)); + size = 5; + hasItems = hasLiquids = hasPower = true; + liquidCapacity = 120; + + inputLiquidSlots = 1; + outputLiquidSlots = 1; + + inputLiquids.addAll(MeldLiquids.aether); + outputLiquids.addAll(MeldLiquids.thunderingAether); + + consPower = new ConsumePowerRecipe(); + + recipes.addAll( + new TimedRecipe(){{ + consumers.addAll( + new ConsumePower(10, 500, false), + new ConsumeLiquid(MeldLiquids.aether, 1) + ); + producers.addAll( + new ProduceLiquid(MeldLiquids.thunderingAether, 2) + ); + }} + ); + }}; + + + //#Region Power + + conductivePile = new Battery("conductive-pile"){{ + requirements(Category.power, with(MeldItems.electrumSheet, 12)); + size = 1; + health = 800; + armor = -80; + solid = false; + + fogRadius = 0; + consumePowerBuffered(1); + + drawer = new DrawMulti( + new DrawDefault(), + new DrawGlowRegion() + ); + }}; + + substation = new PowerNode("substation"){{ + requirements(Category.power, with(MeldItems.annealedSilver, 450, MeldItems.electrumSheet, 600, MeldItems.dissonitre, 150, MeldItems.vitricMesh, 300)); + size = 5; + health = 2100; + armor = 15; + + laserRange = 50; + maxNodes = 3; + fogRadius = 0; + laserColor1 = Color.white; + laserColor2 = Color.valueOf("646461"); + + consumesPower = outputsPower = true; + consumePowerBuffered(300); + }}; + + aspectDischarger = new ConsumeThermal("aspect-discharger"){{ + requirements(Category.power, with(MeldItems.debris, 35, MeldItems.electrumSheet, 120)); + size = 2; + health = 650; + solid = false; + underBullets = true; + + minEfficiency = 1 - 0.00001f; + liquidCapacity = 100; + + powerProduction = 1; + + consumePowerBuffered(1); + consume(new StupidConsumeAspects(outletRate, AspectGroup.aspect)); + + attribute = MeldAttributes.soilAttr; + + drawer = new DrawMulti( + new DrawRegion("-matting"){{ + layer = Layer.blockUnder; + }}, + new DrawGlowRegion("-matting-glow"){{ + layer = Layer.blockUnder; + }}, + new DrawRegion("-mid"){{ + layer = Layer.block; + }}, + new DrawRegion("-mid-coils"){{ + layer = Layer.block; + }}, + new DrawGlowRegion("-mid-coils-glow"), + new DrawRegion("-top"){{ + layer = Layer.block + 1; + }} + ); + }}; + sharkFactory = new UnitFactory("shark-factory"){{ requirements(Category.units, with(MeldItems.debris, 500, MeldItems.carbolith, 350, MeldItems.silver, 450)); size = 5; @@ -1320,6 +1832,25 @@ public void update(Bullet b){ ); }}; + launchStation = new LaunchStation("launch-station"){{ + requirements(Category.units, with(MeldItems.debris, 45, MeldItems.quartzStrata, 60)); + size = 3; + health = 750; + + chargeRate = 1/60f/1.5f; + + consume( + new StupidConsumeAspects(outletRate * 2, AspectGroup.aspect) + ); + }}; + + logiPad = new UnitLogisticsPad("logistic-docks"){{ + requirements(Category.units, with(MeldItems.debris, 80)); + size = 5; + range = (size + 3) * Vars.tilesize * 2; + health = 600; + }}; + sonarSpire = new SonarSpire("sonar-spire"){{ requirements(Category.effect, with( MeldItems.debris, 60, @@ -1335,6 +1866,7 @@ public void update(Bullet b){ shrinkSpeed = 16/60f; range = 220; + clipSize = 220; liquidCapacity = 1 * outletRate * 60; hasLiquids = true; @@ -1397,6 +1929,14 @@ public void update(Bullet b){ consumeItem(MeldItems.resonarum, 2); }}; + lampPsi = new LightBlock("lamp-psi"){{ + requirements(Category.effect, with(MeldItems.iampsi, 30)); + configurable = false; + radius = 32; + + consume(new StupidConsumeAspects(outletRate/5, AspectGroup.aspect)); + }}; + chute = new Duct("chute"){{ requirements(Category.distribution, with(MeldItems.debris, 1)); health = 90; @@ -1415,7 +1955,6 @@ public void update(Bullet b){ health = 90; speed = 4f; solid = false; - ((Duct) chute).bridgeReplacement = this; }}; chuteOverflow = new PriorityInputSplitter("chute-overflow"){{ @@ -1425,6 +1964,14 @@ public void update(Bullet b){ solid = false; }}; + platedChute = new Duct("plated-chute"){{ + requirements(Category.distribution, with(MeldItems.cruciblePlating, 2)); + armored = true; + health = 45; + armor = 10; + speed = 4f; + }}; + unloadingHub = new Unloader("unloading-hub"){{ requirements(Category.distribution, with(MeldItems.debris, 450)); size = 3; @@ -1441,8 +1988,11 @@ public void update(Bullet b){ health = 90; speed = 4f; solid = false; - ((Duct) chute).junctionReplacement = this; }}; + ((Duct) chute).bridgeReplacement = chuteBridge; + ((Duct) platedChute).bridgeReplacement = chuteBridge; + ((Duct) chute).junctionReplacement = chuteJunction; + ((Duct) platedChute).junctionReplacement = chuteJunction; //Meld blocks meldNode = new MeldNode("meld-node"){{ @@ -1568,6 +2118,22 @@ public void update(Bullet b){ boostScale = 1f/9f; displayEfficiencyScale = 9; + drawer = new DrawMulti( + new DrawRegion("-base"){{ + layer = Layer.blockUnder; + }}, + new DrawLiquidTile(MeldLiquids.meld), + new DrawCells(){{ + range = 10; + color = Color.valueOf("9e2e7b"); + particleColorFrom = Color.valueOf("892a6b"); + particleColorTo = Color.valueOf("e5aed7"); + particles = 15; + }}, + new DrawRegion("-gum"), + new DrawRegion("-top") + ); + outputLiquid = new LiquidStack(MeldLiquids.meld, 3); }}; @@ -1858,48 +2424,59 @@ public void update(Bullet b){ }}; ammoTypes.put( - MeldLiquids.meld, - new BasicBulletType(){{ - sprite = Meld.prefix("clump"); - speed = 4; - lifetime = 55; - width = 5; - height = 14; + MeldLiquids.meld, + new BasicBulletType(){{ + sprite = Meld.prefix("clump"); + speed = 4; + lifetime = 55; + width = 5; + height = 14; - pierce = true; - pierceBuilding = true; - pierceCap = 2; + pierce = true; + pierceBuilding = true; + pierceCap = 2; - splashDamage = 25; - splashDamageRadius = 25; + splashDamage = 25; + splashDamageRadius = 25; - knockback = 4f; + knockback = 4f; - hitEffect = despawnEffect = Fx.explosion; + hitEffect = despawnEffect = Fx.explosion; - impact = true; + impact = true; - fragBullets = 3; - fragRandomSpread = 45; + fragBullets = 3; + fragRandomSpread = 45; - fragBullet = new BasicBulletType(4, 15, Meld.prefix("clump")){{ - speed = 4; - lifetime = 10; - width = 3; - height = 8; + fragBullet = new BasicBulletType(4, 15, Meld.prefix("clump")){{ + speed = 4; + lifetime = 10; + width = 3; + height = 8; - pierce = true; - pierceBuilding = true; - pierceCap = 2; + pierce = true; + pierceBuilding = true; + pierceCap = 2; - knockback = 4f; + knockback = 4f; - impact = true; + impact = true; - hitEffect = despawnEffect = Fx.none; - }}; - }} + hitEffect = despawnEffect = Fx.none; + }}; + }} ); }}; + + Seq meldBlocks = Seq.with( + meldCannon, meldMortar, + craigCoffer, jillaCoffer, braigCoffer, billaCoffer, + meldCultivator, + pipebox, pipelineBridge, pipelineCrossing, pipelineRouter, + carbonicBarrier, carbonicBarrierLarge, crystalBarrier, crystalBarrierLarge, + meldAmplifier, meldCapsule, meldNode, meldSuppressor + ); + + meldBlocks.each(b -> b.buildVisibility = BuildVisibility.sandboxOnly); } } diff --git a/src/meld/content/MeldBullets.java b/src/meld/content/MeldBullets.java index 09f2887..c5930fc 100644 --- a/src/meld/content/MeldBullets.java +++ b/src/meld/content/MeldBullets.java @@ -1,24 +1,40 @@ package meld.content; import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.g2d.Lines; import arc.math.Interp; +import arc.util.Tmp; import meld.Meld; import meld.entities.bullet.RicochetBulletType; import meld.entities.bullet.TransitionBulletType; import meld.graphics.MeldPal; +import meld.world.blocks.fluid.AspectBomb; import mindustry.content.Blocks; import mindustry.content.Fx; +import mindustry.entities.Effect; import mindustry.entities.bullet.*; import mindustry.entities.effect.MultiEffect; import mindustry.entities.effect.ParticleEffect; +import mindustry.graphics.Drawf; public class MeldBullets { + //Bullets from non weapon/turret sources public static BulletType pulsarBlast, pulsarShrapnel, + bombShrapnel, bombShrapnelAspect, aspectBombExplosion; + + //Weapon bullets + public static BulletType + sunderDebris, sunderGlass, - shredDebris, shredSilver; + shredDebris, shredSilver, + vincaQuartz; + + public static void load(){ @@ -34,7 +50,7 @@ public static void load(){ drag = 0.02f; lifetime = 30; - damage = 10; + damage = 5; pierce = true; pierceBuilding = true; pierceDamageFactor = 0.5f; @@ -52,7 +68,7 @@ public static void load(){ }}; pulsarBlast = new ExplosionBulletType(){{ - lightningDamage = 5; + lightningDamage = 2; lightning = 12; lightningLength = 48; @@ -304,5 +320,148 @@ public static void load(){ setDefaults = false; }}; }}; + + vincaQuartz = new RailBulletType(){{ + hitShake = 0.5f; + length = 120; + + lifetime = 10; + damage = 12; + pierceArmor = true; + pierceDamageFactor = 1; + + setDefaults = false; + despawnHit = false; + hittable = absorbable = false; + pointEffectSpace = 8; + hitEffect = Fx.none; + pierceEffect = Fx.none; + + status = MeldStatusEffects.impaled; + statusDuration = 5; + + fragBullets = 2; + fragRandomSpread = 35; + fragVelocityMin = 0.9f; + + fragBullet = new BasicBulletType(){{ + speed = 8; + + shrinkX = shrinkY = 1; + lightRadius = 0; + damage = 5; + splashDamage = 8; + splashDamageRadius = 8; + + sprite = Meld.prefix("diamond"); + sticky = true; + + knockback = 2; + impact = true; + hitEffect = despawnEffect = Fx.none; + + fragBullets = 3; + fragBullet = new BasicBulletType(){{ + pierce = true; + pierceCap = 2; + speed = 8; + lifetime = 10; + + shrinkX = shrinkY = 1; + lightRadius = 0; + damage = 5; + + sprite = Meld.prefix("diamond"); + + knockback = 2; + impact = true; + hitEffect = despawnEffect = Fx.none; + + }}; + }}; + }}; + + bombShrapnel = new BasicBulletType(8, 3, Meld.prefix("clump")){{ + lifetime = 12; + + width = 4; + height = 18; + + hitEffect = despawnEffect = Fx.none; + + lightRadius = 0; + fragBullets = 2; + fragBullet = new BasicBulletType(8, 7, Meld.prefix("clump")){{ + lifetime = 12; + + width = 2; + height = 12; + + shrinkX = 1; + shrinkY = 0.2f; + + hitEffect = despawnEffect = Fx.none; + + + sticky = true; + + stickyExtraLifetime = 600; + + lightRadius = 0; + }}; + }}; + + bombShrapnelAspect = new BasicBulletType(3, 3, Meld.prefix("clump")){{ + lifetime = 30; + + width = 8; + height = 10; + shrinkX = 1; + shrinkY = 0.2f; + + hitEffect = despawnEffect = Fx.none; + + lightRadius = 0; + fragBullets = 2; + + fragBullet = new LiquidBulletType(MeldLiquids.stormingAspect); + }}; + + aspectBombExplosion = new TransitionBulletType(){{ + lifetime = 30; + spawnBullets.addAll( + new TransitionBulletType(){{ + fragBullets = 12; + fragLifeMin = 0.5f; + fragBullet = bombShrapnelAspect; + }}, + new TransitionBulletType(){{ + fragBullets = 24; + fragBullet = bombShrapnel; + }} + ); + splashDamage = 500; + splashDamageRadius = 32; + incendAmount = 50; + + hitEffect = new Effect(24, e -> { + Draw.color(MeldLiquids.stormingAspect.color); + Draw.alpha(e.foutpowdown() * 0.3f); + Fill.light(e.x, e.y, 100, e.finpow() * 32, Tmp.c1.set(Tmp.c2.set(MeldLiquids.stormingAspect.color)).a(e.fout()), Tmp.c2.a(0)); + //Fill.circle(e.x, e.y, e.finpow() * 85); + + Drawf.light(e.x, e.y, e.finpow() * 14, MeldLiquids.stormingAspect.color, e.fout()); + + e.scaled(8, e1 -> { + Draw.color(Color.white); + Draw.alpha(e1.foutpowdown() * 0.35f); + Lines.stroke(e1.fin() * 12 + 2); + Lines.circle(e1.x, e1.y, e1.fin() * 18 + 8); + }); + }); + + fragBullets = 4; + fragBullet = new LiquidBulletType(MeldLiquids.stormingAspect); + }}; } } diff --git a/src/meld/content/MeldEnvironment.java b/src/meld/content/MeldEnvironment.java index 57612d4..18245c7 100644 --- a/src/meld/content/MeldEnvironment.java +++ b/src/meld/content/MeldEnvironment.java @@ -1,9 +1,15 @@ package meld.content; import arc.graphics.Color; +import arc.struct.Seq; +import meld.graphics.MeldPal; +import meld.graphics.ParticleFloor; import meld.world.blocks.AetherCluster; -import mindustry.content.Blocks; +import meld.world.blocks.defense.TreeWall; +import meld.world.blocks.env.ModdedOreBlock; +import meld.world.blocks.env.SupportPillar; import mindustry.content.Fx; +import mindustry.content.Liquids; import mindustry.graphics.CacheLayer; import mindustry.type.Category; import mindustry.type.ItemStack; @@ -12,6 +18,8 @@ import mindustry.world.meta.Attribute; import mindustry.world.meta.BuildVisibility; +import static meld.graphics.MeldPal.*; + public class MeldEnvironment { //Ore deposits & overlays @@ -32,6 +40,7 @@ public class MeldEnvironment { metalMeshWall, metalMeshWallMeld, metalAetherWall, //Badlands pillowWall, sandstoneWall, + softDune, sandstonePillar, mallowWall, crackstoneWall, likesandWall, likestoneWall, likesaltWall, @@ -58,15 +67,17 @@ public class MeldEnvironment { runicSlate, runicSlateMeld, literallyCarbonStoneFromMindustryButSlightlyDifferent, carbonicPlates, carbonicVent, earthenStone, mixtureStone, + //Storm Planes + dissonantShale, dissonantShaleStruck, dissonantShaleScorched, dissonantFragments, resonantStone, //Marsh meldPlates, meldHadaland, meldTrenchland, meldSwampland, meldCrystalScattered, meldCrystalFloor, meldCrystalHardFloor; public static SteamVent aetherGrowth, metalWeaveAether; - public static Prop meldCluster, meldPools, meldProtrusion, meldMetalStick, meldCrystal, iampsiGemstone, quartzSpikes; + public static Prop meldCluster, meldPools, meldProtrusion, meldMetalStick, meldCrystal, mixedCarbonicBoulder, iampsiGemstone, quartzSpikes, vitricWeave, mallowCluster, pillowGlintCluster, earthenResonarumCluster; public static TallBlock meldCrystalLarge, meldSupportFrame; - public static AetherCluster meldClusterLarge; + public static AetherCluster meldClusterLarge, dissonitreCluster; public static void load(){ @@ -83,9 +94,9 @@ public static void load(){ needsSurface = false; }}; - debrisNodule = new OreBlock("debris-nodule"){{ + debrisNodule = new ModdedOreBlock("debris-nodule", MeldItems.debris){{ variants = 3; - itemDrop = MeldItems.debris; + mapColor = Color.valueOf("f4a462"); needsSurface = false; }}; @@ -119,9 +130,10 @@ public static void load(){ itemDrop = MeldItems.elnarDust; }}; - elnarSilt = new OreBlock("elnar-silt"){{ + elnarSilt = new ModdedOreBlock("elnar-silt", MeldItems.elnarDust){{ variants = 4; - itemDrop = MeldItems.elnarDust; + mapColor = Color.valueOf("96ed45"); + setDefaults = false; needsSurface = false; }}; @@ -145,7 +157,7 @@ public static void load(){ electrumDeposit = new StaticWall("electrum-deposit"){{ variants = 3; - itemDrop = MeldItems.electrumSheets; + itemDrop = MeldItems.electrumSheet; }}; resonarumDeposit = new SeaBush("resonarum-deposit"){{ @@ -207,13 +219,16 @@ public static void load(){ metalWeave = new Floor("metal-weave", 3); metalWeaveHole= new Floor("metal-weave-hole", 0); metalWeaveGlow = new Floor("metal-weave-glow", 0){{ + emitLight = true; lightRadius = 16; lightColor = Color.orange.cpy().a(0.35f); }}; metalWeaveHole.blendGroup = metalWeaveGlow.blendGroup = metalWeave; - meldHadaland = new Floor("meld-hadaland", 3){{ + meldHadaland = new ParticleFloor("meld-hadaland", 3){{ + effect = MeldFx.meldSmoke; + chance = 0.00036f; isLiquid = true; cacheLayer = CacheLayer.water; drownTime = 90; @@ -222,9 +237,16 @@ public static void load(){ statusDuration = 40; dragMultiplier = 2f; + + emitLight = true; + lightColor = meldFloorGlowHadal; + lightRadius = 15; + attributes.set(MeldAttributes.meld, 0.3f); }}; - meldTrenchland = new Floor("meld-trenchland", 3){{ + meldTrenchland = new ParticleFloor("meld-trenchland", 3){{ + effect = MeldFx.meldSmoke; + chance = 0.00036f; isLiquid = true; drownTime = 120; @@ -233,41 +255,64 @@ public static void load(){ dragMultiplier = 1.5f; cacheLayer = CacheLayer.water; + + emitLight = true; + lightColor = meldFloorGlowDeep; + lightRadius = 15; + attributes.set(MeldAttributes.meld, 0.2f); }}; - meldSwampland = new Floor("meld-swampland", 3){{ + meldSwampland = new ParticleFloor("meld-swampland", 3){{ + effect = MeldFx.meldSmoke; + chance = 0.00036f; isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + + emitLight = true; + lightColor = meldFloorGlow; + lightRadius = 20; + attributes.set(MeldAttributes.meld, 0.1f); }}; - meldPlates = new Floor("meld-plates", 2){{ + meldPlates = new ParticleFloor("meld-plates", 2){{ + effect = MeldFx.meldSmoke; + chance = 0.00036f; + isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.08f); }}; - meldCrystalScattered = new Floor("meld-crystal-scattered", 3){{ + meldCrystalScattered = new ParticleFloor("meld-crystal-scattered", 3){{ + effect = MeldFx.meldSmoke; + chance = 0.00036f; + isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.06f); }}; sandMeld = new Floor("sand-meld", 3){{ isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.05f); }}; redsandMeld = new Floor("red-sand-meld", 3){{ isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.08f); }}; slateMeld = new Floor("slate-meld", 3){{ isLiquid = true; cacheLayer = CacheLayer.water; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.02f); }}; bedrockMeld = new Floor("bedrock-meld", 3){{ @@ -277,6 +322,7 @@ public static void load(){ status = MeldStatusEffects.drenched; statusDuration = 25; supportsOverlay = true; + attributes.set(MeldAttributes.meld, 0.05f); }}; @@ -316,20 +362,30 @@ public static void load(){ variants = 2; }}; + //Start storm stuff before badlands since badlands should blend onto storm + resonantStone = new Floor("resonant-stone", 3); + dissonantShale = new Floor("dissonant-shale", 3); + dissonantShaleStruck = new Floor("dissonant-shale-struck", 3); + dissonantShaleScorched = new Floor("dissonant-shale-scorched", 3); + dissonantFragments = new Floor("dissonant-fragments", 0); + polishedSandstoneTile = new Floor("polished-sandstone-tile", 3); + //Storm stuff likesand = new Floor("likesand", 3); likestone = new Floor("likestone", 3); likesalt = new Floor("likesalt", 3); - likesand.itemDrop = likestone.itemDrop = MeldItems.likestoneSediments; - likesand.playerUnmineable = likestone.playerUnmineable = true; - redSilt = new Floor("red-silt", 3); - aspectSoil = new Floor("aspect-soil", 3); + aspectSoil = new Floor("aspect-soil", 3){{ + attributes.set(MeldAttributes.soilAttr, 0.25f); + }}; softSand = new Floor("soft-sand", 3); sandstone = new Floor("hard-sand", 3); - redSand = new Floor("red-sand", 3); + redSand = new Floor("red-sand", 3){{ + itemDrop = MeldItems.clayMallows; + playerUnmineable = true; + }}; redSandWeave = new Floor("red-sand-weave", 3); crackstone = new Floor("cracked-sand", 4); @@ -337,6 +393,8 @@ public static void load(){ isLiquid = true; cacheLayer = CacheLayer.water; + liquidDrop = MeldLiquids.ichor; + status = MeldStatusEffects.drenched; statusDuration = 25; supportsOverlay = true; @@ -345,20 +403,22 @@ public static void load(){ isLiquid = true; cacheLayer = CacheLayer.water; + liquidDrop = MeldLiquids.ichor; + status = MeldStatusEffects.drenched; statusDuration = 45; supportsOverlay = true; }}; - iampsiSpecks = new OreBlock("iampsi-specks"){{ + iampsiSpecks = new ModdedOreBlock("iampsi-specks", MeldItems.iampsi){{ variants = 4; - itemDrop = MeldItems.iampsi; + mapColor = Color.valueOf("a582f7"); needsSurface = false; }}; - quartzFlakes = new OreBlock("quartz-flakes"){{ + quartzFlakes = new ModdedOreBlock("quartz-flakes", MeldItems.quartzStrata){{ variants = 4; - itemDrop = MeldItems.quartzStrata; + mapColor = Color.valueOf("ef84fb"); needsSurface = false; }}; @@ -380,6 +440,10 @@ public static void load(){ metalAetherWall = new StaticWall("metal-aether-wall"){{ variants = 3; + + emitLight = true; + lightRadius = 48; + lightColor = Color.valueOf("e5932e").a(0.45f); }}; @@ -395,6 +459,20 @@ public static void load(){ variants = 2; }}; + softDune = new TreeWall("soft-dune"){{ + variants = 2; + solid = false; + hasShadow = false; + mapColor = Color.valueOf("f3e1af"); + }}; + + sandstonePillar = new SupportPillar("sandstone-pillar"){{ + requirements(Category.effect, ItemStack.with(MeldItems.debris, 500)); + buildVisibility = BuildVisibility.sandboxOnly; + + mapColor = Color.black; + }}; + mallowWall = new StaticWall("mallow-wall"){{ variants = 2; itemDrop = MeldItems.clayMallows; @@ -418,8 +496,6 @@ public static void load(){ variants = 2; }}; - resonantStone = new Floor("resonant-stone", 3); - aetherGrowth = new SteamVent("aether-growth"){{ variants = 0; attributes.set(MeldAttributes.aetherAttr, 1); @@ -461,7 +537,7 @@ public static void load(){ variants = 2; }}; meldPools = new Prop("meld-pools"){{ - requirements(Category.effect, ItemStack.with(MeldItems.debris, 25)); + requirements(Category.effect, ItemStack.with(MeldItems.debris, 65)); buildVisibility = BuildVisibility.sandboxOnly; @@ -481,6 +557,15 @@ public static void load(){ buildTime = 120; }}; + dissonitreCluster = new AetherCluster("dissonitre-cluster"){{ + requirements(Category.effect, ItemStack.with(MeldItems.dissonitre, 300)); + size = 1; + + buildVisibility = BuildVisibility.sandboxOnly; + instantDeconstruct = false; + buildTime = 10; + }}; + meldCrystal = new WobbleProp("meld-crystal"){{ requirements(Category.effect, ItemStack.with(MeldItems.meldShard, 25)); @@ -490,7 +575,29 @@ public static void load(){ buildTime = 10; variants = 3; }}; + mixedCarbonicBoulder = new Prop("mixed-carbonic-boulder"){{ + requirements(Category.effect, ItemStack.with(MeldItems.carbolith, 35, MeldItems.stonyParticulate, 45)); + solid = true; + alwaysReplace = false; + + buildVisibility = BuildVisibility.sandboxOnly; + + instantDeconstruct = false; + buildTime = 60; + variants = 3; + }}; + pillowGlintCluster = new Prop("pillow-glint-cluster"){{ + requirements(Category.effect, ItemStack.with(MeldItems.silver, 25, MeldItems.annealedSilver, 40)); + solid = true; + alwaysReplace = false; + + buildVisibility = BuildVisibility.sandboxOnly; + + instantDeconstruct = false; + buildTime = 45; + variants = 2; + }}; iampsiGemstone = new Prop("iampsi-gemstone"){{ requirements(Category.effect, ItemStack.with(MeldItems.silver, 25, MeldItems.iampsi, 45, MeldItems.quartzStrata, 25)); @@ -500,14 +607,14 @@ public static void load(){ buildVisibility = BuildVisibility.sandboxOnly; instantDeconstruct = false; - buildTime = 35; + buildTime = 40; variants = 4; }}; quartzSpikes = new Prop("quartz-spikes"){{ requirements(Category.effect, ItemStack.with(MeldItems.quartzStrata, 15)); solid = false; - alwaysReplace = true; + alwaysReplace = false; buildVisibility = BuildVisibility.sandboxOnly; @@ -517,6 +624,35 @@ public static void load(){ variants = 5; }}; + vitricWeave = new Prop("vitric-weave"){{ + requirements(Category.effect, ItemStack.with(MeldItems.dissonitre, 5, MeldItems.vitricMesh, 24)); + buildVisibility = BuildVisibility.sandboxOnly; + + solid = false; + alwaysReplace = false; + + variants = 2; + buildTime = 5; + instantDeconstruct = false; + }}; + + mallowCluster = new Prop("mallow-cluster"){{ + + }}; + + earthenResonarumCluster = new Prop("earthen-resonarum-cluster"){{ + requirements(Category.effect, ItemStack.with(MeldItems.resonarum, 40)); + solid = true; + alwaysReplace = false; + + buildVisibility = BuildVisibility.sandboxOnly; + + instantDeconstruct = false; + buildTime = 40; + variants = 2; + }}; + + meldCrystalLarge = new TallBlock("meld-crystal-large"){{ variants = 1; customShadow = true; @@ -525,5 +661,19 @@ public static void load(){ variants = 2; customShadow = true; }}; + + Seq meldProps = Seq.with(sandstonePillar, meldCluster, meldClusterLarge, meldMetalStick, meldProtrusion, meldPools, meldCrystal, + dissonitreCluster, vitricWeave, + mixedCarbonicBoulder, + pillowGlintCluster, + earthenResonarumCluster, + iampsiGemstone, quartzSpikes); + meldProps.each(f -> f.databaseTag = "environment"); + Seq meldFloors = Seq.with(meldSwampland, meldTrenchland, meldHadaland, + meldCrystalScattered, + sandMeld, redsandMeld, + slateMeld, bedrockMeld); + + meldFloors.each(m -> m.liquidDrop = MeldLiquids.meld); } } diff --git a/src/meld/content/MeldFx.java b/src/meld/content/MeldFx.java index 6218160..bd840cf 100644 --- a/src/meld/content/MeldFx.java +++ b/src/meld/content/MeldFx.java @@ -15,6 +15,9 @@ import arc.util.Tmp; import meld.graphics.Draww; import meld.Meld; +import meld.graphics.MeldLayers; +import meld.graphics.MeldPal; +import meld.math.MultiInterp; import mindustry.Vars; import mindustry.entities.Effect; import mindustry.gen.Healthc; @@ -25,10 +28,92 @@ public class MeldFx { + public static MultiInterp + smokeFade = new MultiInterp(new float[]{0, 0.8f}, new Interp[]{Interp.pow2, Interp.pow2Out}); private static float percent = 0; + public static Effect + waterShear = new Effect(35, e -> { + Draw.color(Color.white, e.color, e.finpow()); + + e.scaled(15, e1 -> { + + Draw.z(Layer.groundUnit - 1); + Draw.alpha(Mathf.clamp(e1.finpow() * 5)); + + for(int i = 0; i < 2; i++){ + Angles.randLenVectors(e1.id, 3, e1.fin() * Vars.tilesize * 8, e.rotation + 180 + 25 * Mathf.signs[i], 15, 4, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 1.5f * e1.foutpowdown()); + }); + } + }); + + Draw.z(Layer.groundUnit - 1); + + Draw.alpha(Mathf.clamp(e.finpow() * 5)); + for(int i = 0; i < 2; i++){ + Angles.randLenVectors(e.id, 3, e.fin() * Vars.tilesize * 6, e.rotation + 180 + 35 * Mathf.signs[i], 5, 4, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 3 * e.foutpowdown()); + }); + } + }){{ + followParent = false; + }}, + + waterShearFollow = new Effect(35, e -> { + Draw.color(Color.white, e.color, Color.clear, e.finpowdown()); + + e.scaled(25, e1 -> { + + Draw.z(Layer.groundUnit - 1); + Draw.alpha(Draw.getColorAlpha() * e1.finpow() * 5); + + for(int i = 0; i < 2; i++){ + Angles.randLenVectors(e1.id, 6, e1.fin() * Vars.tilesize * 3, e.rotation + 180 + 35 * Mathf.signs[i], 0, 4, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 1.5f * e1.foutpowdown()); + }); + } + }); + + Draw.z(Layer.groundUnit - 1); + + Draw.color(Color.white, e.color, e.finpowdown()); + Draw.alpha(e.finpow() * 5); + + for(int i = 0; i < 2; i++){ + Angles.randLenVectors(e.id, 3, e.fin() * Vars.tilesize * 3, e.rotation + 180 + 25 * Mathf.signs[i], 5, 4, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 3 * e.foutpowdown()); + }); + } + + e.scaled(15, e1 -> {; + Draw.z(Layer.groundUnit + 1); + Draw.alpha(Mathf.clamp(e1.finpow() * 5)/10); + for(int i = 0; i < 2; i++){ + Angles.randLenVectors(e.id, 16, e1.fin() * Vars.tilesize * 3, e.rotation + 180 + 35 * Mathf.signs[i], 2, 3, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 1.5f * e1.foutpowdown()); + }); + } + }); + }){{ + rotWithParent = true; + }}, + + meldSmoke = new Effect(120, 100, e -> { + + Draw.color(MeldPal.blobPink); + Draw.alpha(smokeFade.apply(e.fin())); + float size = Mathf.randomSeed(e.id, 2, 4); + Draw.z(MeldLayers.smokeHigh); + + Angles.randLenVectors(e.id + 1, (int) (Mathf.randomSeed(e.id, 3) + 1), e.fin() * 12, e.rotation, 360, (x, y) -> { + Draww.speckOffset(e.x + x, e.y + y, e.fin(), e.time, Draww.smokeWeight, Tmp.v1); + Fill.circle(Tmp.v1.x, Tmp.v1.y, size * e.fout(Interp.pow4)); + }); + }), + chainLightning = new Effect(15, 500 * 500/2 * Vars.tilesize, e -> { if(!(e.data instanceof VisualLightningHolder)) return; VisualLightningHolder p = (VisualLightningHolder) e.data; @@ -119,9 +204,9 @@ public class MeldFx { }); public interface VisualLightningHolder{ - Vec2 start(); + Position start(); - Vec2 end(); + Position end(); float width(); diff --git a/src/meld/content/MeldItems.java b/src/meld/content/MeldItems.java index 52bf984..23a0f4c 100644 --- a/src/meld/content/MeldItems.java +++ b/src/meld/content/MeldItems.java @@ -1,7 +1,7 @@ package meld.content; +import arc.graphics.Color; import arc.struct.Seq; -import mindustry.content.Items; import mindustry.type.Item; public class MeldItems { @@ -9,101 +9,117 @@ public class MeldItems { debris, carbolith, //The badlands hall of shame - silver, clayMallows, electrumSheets, + silver, clayMallows, electrumSheet, //The storm planes hall of shame... resonarum, dissonitre, vitricMesh, meldShard; - //Items that meld mostly uses + //ItemLogic that meld mostly uses public static Item stonyParticulate, larvalPlating; //Heavy industry content public static Item tenbris, motis, shadesteel, elnarDust, - annealedSilver, glassMallows, iampsi, quartzStrata, likestoneSediments, + annealedSilver, glassMallows, + aspectBomb, + iampsi, quartzStrata, likestoneSediments, + gunpowder, cruciblePlating, aspectPipe; public static void load(){ - debris = new Item("debris"){{ + debris = new Item("debris", Color.valueOf("e0b28d")){{ cost = 1; }}; - carbolith = new Item("carbolith"){{ + carbolith = new Item("carbolith", Color.valueOf("95abd9")){{ cost = 1.2f; }}; - silver = new Item("silver"){{ + silver = new Item("silver", Color.valueOf("f0f5fe")){{ cost = 0.3f; }}; - clayMallows = new Item("clay-mallow"){{ + clayMallows = new Item("clay-mallow", Color.valueOf("d08043")){{ cost = 0.2f; }}; - electrumSheets = new Item("electrum-sheets"){{ + electrumSheet = new Item("electrum-sheet", Color.valueOf("f4ec5d")){{ cost = 0.2f; }}; - resonarum = new Item("resonarum"); + resonarum = new Item("resonarum", Color.valueOf("4bb66b")); - dissonitre = new Item("dissonitre"){{ + dissonitre = new Item("dissonitre", Color.valueOf("e89964")){{ cost = 0.05f; }}; - vitricMesh = new Item("vitric-mesh"){{ + vitricMesh = new Item("vitric-mesh", Color.valueOf("fddfc9")){{ cost = 0.25f; }}; - meldShard = new Item("meld-shard"); + meldShard = new Item("meld-shard", Color.valueOf("e5aed7")); - stonyParticulate = new Item("stony-particulate"){{ + stonyParticulate = new Item("stony-particulate", Color.valueOf("3c4448")){{ }}; - larvalPlating = new Item("larval-plating"){{ + larvalPlating = new Item("larval-plating", Color.valueOf("946657")){{ }}; //Heavy Industry - tenbris = new Item("tenbris"){{ + tenbris = new Item("tenbris", Color.valueOf("604343")){{ }}; - motis = new Item("motis"){{ + motis = new Item("motis", Color.valueOf("c27e7a")){{ }}; - shadesteel = new Item("shadesteel"){{ + shadesteel = new Item("shadesteel", Color.valueOf("f06060")){{ }}; - elnarDust = new Item("elnar-dust"){{ + elnarDust = new Item("elnar-dust", Color.valueOf("6cbcaa")){{ }}; - annealedSilver = new Item("annealed-silver"){{ + annealedSilver = new Item("annealed-silver", Color.valueOf("5a6696")){{ }}; - glassMallows = new Item("glass-mallow"); + glassMallows = new Item("glass-mallow", Color.valueOf("ede0d4")); - iampsi = new Item("iampsi"){{ + aspectBomb = new Item("aspect-bomb"){{ + explosiveness = 3; + flammability = 0; + }}; + + iampsi = new Item("iampsi", Color.valueOf("b39ddd")){{ }}; - quartzStrata = new Item("quartz-strata"){{}}; + quartzStrata = new Item("quartz-strata", Color.valueOf("f2cdfe")){{}}; - likestoneSediments = new Item("likestone-sediments"){{}}; + likestoneSediments = new Item("likestone-sediments", Color.valueOf("5b704c")){{}}; + + gunpowder = new Item("gunpowder"){{ + hidden = true; + }}; - aspectPipe = new Item("aspect-pipe"){{ + aspectPipe = new Item("aspect-pipe", Color.valueOf("716a56")){{ }}; - cruciblePlating = new Item("crucible-plating"){{ + cruciblePlating = new Item("crucible-plating", Color.valueOf("4a322b")){{ }}; Seq heavyIndustry = Seq.with(tenbris, motis, shadesteel, elnarDust, annealedSilver, glassMallows, iampsi, quartzStrata, likestoneSediments, cruciblePlating, aspectPipe); heavyIndustry.each(i -> i.databaseTag = "heavy-industry"); + Seq arsenal = Seq.with(aspectBomb, gunpowder); + arsenal.each(i -> i.databaseTag = "arsenal"); + Seq meldological = Seq.with(meldShard, larvalPlating, stonyParticulate); + meldological.each(i -> i.databaseTag = "meldy"); }; } diff --git a/src/meld/content/MeldLiquids.java b/src/meld/content/MeldLiquids.java index a0d0e04..7802521 100644 --- a/src/meld/content/MeldLiquids.java +++ b/src/meld/content/MeldLiquids.java @@ -6,6 +6,8 @@ import arc.struct.Seq; import meld.fluid.Aspect; import meld.fluid.AspectGroup; +import mindustry.entities.effect.ParticleEffect; +import mindustry.type.CellLiquid; import mindustry.type.Liquid; import static meld.fluid.AspectGroup.*; @@ -16,6 +18,9 @@ public class MeldLiquids { pollutantMixture, boundAspect, thunderingAether, stormingAspect; + public static CellLiquid + nectar, mercury, blood, ooze, ichor; + public static ObjectFloatMap outletEfficiencies = new ObjectFloatMap<>(); public static ObjectFloatMap outletDensities = new ObjectFloatMap<>(); @@ -37,7 +42,7 @@ public static void load(){ thunderingAether = new Aspect("thundering-aether"){{ gas = true; - color = Color.valueOf("f99b76"); + color = Color.valueOf("f35430"); temperature = 0.6f; explosiveness = 0.1f; }}; @@ -64,6 +69,7 @@ public static void load(){ color = Color.valueOf("d7a9ef"); temperature = 0.6f; }}; + meld = new Aspect("meld"){{ gas = true; color = Color.valueOf("e4aad5"); @@ -76,6 +82,113 @@ public static void load(){ temperature = 0.6f; }}; + nectar = new CellLiquid("nectar"){{ + viscosity = 0.95f; + temperature = 0.15f; + heatCapacity = 2; + + spreadTarget = MeldLiquids.mercury; + capPuddles = false; + + maxSpread = 0.5f; + spreadConversion = 0.85f; + spreadDamage = 0; + removeScaling = 0.5f; + + effect = MeldStatusEffects.refreshed; + + color = Color.valueOf("55391b"); + colorFrom = Color.valueOf("7d642c");; + colorTo = Color.valueOf("b89f47"); + + }}; + + mercury = new CellLiquid("mercury"){{ + temperature = 0.2f; + heatCapacity = 1; + + cells = 2; + + spreadTarget = MeldLiquids.ooze; + capPuddles = false; + + maxSpread = 0.00025f; + spreadConversion = 0; + spreadDamage = 0; + removeScaling = 0; + + effect = MeldStatusEffects.slippery; + + color = Color.valueOf("89828c"); + colorFrom = Color.valueOf("454545"); + colorTo = Color.valueOf("89828c"); + + moveThroughBlocks = false; + incinerable = false; + + }}; + + blood = new CellLiquid("blood"){{ + explosiveness = 0.42f; + viscosity = 1.01f; + temperature = 153.885f; + heatCapacity = 5; + + effect = MeldStatusEffects.infested; + + capPuddles = false; + + maxSpread = 0.1f; + spreadConversion = 0.35f; + spreadDamage = 0.45f; + removeScaling = 1; + + spreadTarget = nectar; + + color = Color.valueOf("7d312f"); + colorFrom = Color.valueOf("602d2b"); + colorTo = Color.valueOf("d78b65"); + + moveThroughBlocks = true; + incinerable = false; + }}; + + ooze = new CellLiquid("ooze"){{ + explosiveness = 0.15f; + flammability = 0.7f; + temperature = 0; + + spreadTarget = blood; + + capPuddles = false; + + maxSpread = 0.12f; + spreadConversion = 1; + spreadDamage = 5; + removeScaling = 1; + + effect = MeldStatusEffects.oozed; + + color = Color.valueOf("43201e"); + colorFrom = Color.valueOf("663931"); + colorTo = Color.valueOf("45283c"); + + moveThroughBlocks = true; + incinerable = false; + + }}; + + ichor = new CellLiquid("ichor"){{ + gas = false; + + color = Color.valueOf("948a00"); + viscosity = 0.45f; + temperature = 1.25f; + heatCapacity = 0.85f; + + spreadTarget = null; + }}; + put(aether, AspectGroup.aether, new AspectStats(1, 1)); put(pollutantMixture, AspectGroup.aether, new AspectStats(0.5f, 0.5f)); put(thunderingAether, AspectGroup.aether, new AspectStats(2, 0.5f)); @@ -87,6 +200,8 @@ public static void load(){ put(fumes, AspectGroup.fumes, new AspectStats(1, 1)); put(pollutantMixture, AspectGroup.fumes, new AspectStats(1, 0.5f)); + put(meld, aqua, new AspectStats(1/3f, 0.25f)); + outletMapping.putAll( aether, aspect, pollutantMixture, boundAspect, diff --git a/src/meld/content/MeldMappings.java b/src/meld/content/MeldMappings.java new file mode 100644 index 0000000..5aea3aa --- /dev/null +++ b/src/meld/content/MeldMappings.java @@ -0,0 +1,51 @@ +package meld.content; + +import meld.world.blocks.production.GrindingQuary; +import meld.world.blocks.production.GrindingQuary.GrinderEntry; +import mindustry.content.Planets; +import mindustry.content.UnitTypes; +import mindustry.type.ItemStack; + +import static meld.content.MeldEnvironment.*; +import static meld.content.MeldLiquids.*; + +import static mindustry.type.ItemStack.with; + +//Handles mappings for content which depend on eachother so the main classes are not filled with hjbujgjmhbn bhjg +public class MeldMappings { + public static void load(){ + GrindingQuary.grinderMap.putAll( + redSand, new GrinderEntry(180, redSilt, with(MeldItems.clayMallows, 20)), + dissonantFragments, new GrinderEntry(360, dissonantShale, with(MeldItems.clayMallows, 12, MeldItems.glassMallows, 25, MeldItems.dissonitre, 50)), + dissonantShaleScorched, new GrinderEntry(130, dissonantShale, with(MeldItems.clayMallows, 4, MeldItems.glassMallows, 15, MeldItems.dissonitre, 5)), + dissonantShaleStruck, new GrinderEntry(60, dissonantShale, with(MeldItems.clayMallows, 8, MeldItems.glassMallows, 12, MeldItems.dissonitre, 3)), + dissonantShale, new GrinderEntry(240, redSilt, with(MeldItems.clayMallows, 2, MeldItems.dissonitre, 1)), + + likesand, new GrinderEntry(60, likestone, with(MeldItems.likestoneSediments, 20)), + likestone, new GrinderEntry(120, likesalt, with(MeldItems.likestoneSediments, 10)), + + meldCrystalFloor, new GrinderEntry(720, meldCrystalScattered, with(MeldItems.meldShard, 10)) + ); + + + nectar.canStayOn.addAll(mercury, ichor, ooze); + mercury.canStayOn.addAll(mercury, ichor, ooze, blood); + blood.canStayOn.addAll(nectar, ichor, ooze); + ooze.canStayOn.addAll(meld, nectar, ichor, ooze); + ichor.canStayOn.addAll(nectar, ichor); + + } + + public static void loadAfter(){ + //SCREW YOU SHADOW THE HEDGE HOG + //IS THAT AR EFRENCE TO HEDGE HEHJEYSON MEWLD REAL- help + UnitTypes.alpha.shownPlanets.add(Planets.serpulo); + UnitTypes.alpha.shownPlanets.remove(MeldPlanets.ikaru); + + //I CAST THEEEEEEEEEEEEEEEEEEEEEEEEEEE + //HAHAHAHAHAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + UnitTypes.alpha.databaseTabs.clear(); + UnitTypes.alpha.postInit(); + + } +} diff --git a/src/meld/content/MeldPlanets.java b/src/meld/content/MeldPlanets.java new file mode 100644 index 0000000..691c4f4 --- /dev/null +++ b/src/meld/content/MeldPlanets.java @@ -0,0 +1,48 @@ +package meld.content; + +import arc.graphics.Color; +import mindustry.content.Planets; +import mindustry.game.CampaignRules; +import mindustry.graphics.g3d.MultiMesh; +import mindustry.graphics.g3d.NoiseMesh; +import mindustry.maps.generators.BlankPlanetGenerator; +import mindustry.type.Planet; + +public class MeldPlanets { + public static Planet ikaru; + + public static void load(){ + ikaru = new Planet("ikaru", Planets.sun, 1.2f, 2){{ + generator = new BlankPlanetGenerator(); + orbitRadius = 72.31f; + + clearSectorOnLose = true; + allowLaunchSchematics = false; + allowLaunchToNumbered = false; + allowLaunchLoadout = false; + allowSectorInvasion = false; + hasAtmosphere = true; + visible = true; + updateLighting = false; + defaultCore = MeldBlocks.coreRaft; + bloom = false; + + startSector = 2; + iconColor = Color.valueOf("f3c3e7"); + + accessible = true; + alwaysUnlocked = false; + + campaignRuleDefaults = new CampaignRules(){{ + fog = true; + showSpawns = true; + }}; + + int seed = 0; + + mesh = new MultiMesh( + new NoiseMesh(this, seed, 5, 0.9f, 3, 1.4f, 1, 1, Color.valueOf("cba380"), Color.valueOf("a06a3b"), 1, 1, 1, 0.5f) + ); + }}; + } +} diff --git a/src/meld/content/MeldRecipes.java b/src/meld/content/MeldRecipes.java index d48017c..3ca3b4f 100644 --- a/src/meld/content/MeldRecipes.java +++ b/src/meld/content/MeldRecipes.java @@ -52,6 +52,15 @@ public static Seq kilnRecipies(float outlets, float speedMultiplier producers.addAll( new ProduceItem(new ItemStack(MeldItems.cruciblePlating, 4)) ); + }}, + new TimedRecipe(240/speedMultiplier){{ + consumers.addAll( + new ConsumeItems(with(MeldItems.debris, 4, MeldItems.shadesteel, 2)), + new StupidConsumeAspects(outletRate * outlets, AspectGroup.aspect) + ); + producers.addAll( + new ProduceItem(new ItemStack(MeldItems.cruciblePlating, 4)) + ); }} ); } diff --git a/src/meld/content/MeldStatusEffects.java b/src/meld/content/MeldStatusEffects.java index 971148a..1433c11 100644 --- a/src/meld/content/MeldStatusEffects.java +++ b/src/meld/content/MeldStatusEffects.java @@ -2,14 +2,25 @@ import arc.math.Interp; import arc.math.Mathf; +import mindustry.content.Fx; import mindustry.entities.units.StatusEntry; import mindustry.gen.Unit; import mindustry.type.StatusEffect; public class MeldStatusEffects { - public static StatusEffect amplified, rally, anchored, aspectBurn, sentry, spurting, newborn, interference, drenched, stunned; + public static StatusEffect interference, drenched, stuck, stunned; public static StatusEffect lacerated, impaled; - public static StatusEffect rush; + + //Player effects + public static StatusEffect rally, anchored, aspectBurn, omnimoveCompensate; + + //Meld effects + public static StatusEffect amplified, sentry, spurting, newborn, rush; + + //Swamp effects + public static StatusEffect refreshed, slippery, infested, oozed; + + public static StatusEffect boosting, boostingIframes; public static void load(){ @@ -79,6 +90,29 @@ public void update(Unit unit, StatusEntry entry) { disarm = true; }}; + boosting = new StatusEffect("boosting"){ + + @Override + public void onRemoved(Unit unit) { + super.onRemoved(unit); + unit.apply(rush, 15); + } + + @Override + public void update(Unit unit, StatusEntry entry) { + unit.vel.trns(unit.rotation, 7); + Fx.explosion.at(unit.x, unit.y); + } + + { + disarm = true; + speedMultiplier = 0; + dragMultiplier = 0; + } + }; + + boostingIframes = new StatusEffect("boosting-iframes"); + anchored = new StatusEffect("anchored"){ @Override @@ -178,6 +212,18 @@ public void update(Unit unit, StatusEntry entry) { }}; + stuck = new StatusEffect("stuck"){ + @Override + public void update(Unit unit, StatusEntry entry) { + super.update(unit, entry); + unit.dragMultiplier /= dragMultiplier; + + //Speed multiplier based on duration. 10 ticks -> 0.1 less multi + unit.dragMultiplier *= Mathf.clamp(3 - entry.time/300, 1f, 3); + }{ + dragMultiplier = 3; + }}; + //Only affects unarmored lacerated = new StatusEffect("lacerated"){{ damage = -0.2f; @@ -205,5 +251,33 @@ public void update(Unit unit, StatusEntry entry) { speedMultiplier = 0.45f; buildSpeedMultiplier = 0.5f; }}; + + //For bulbhead when omni movement is turned on + omnimoveCompensate = new StatusEffect("omnimove-compensate"){{ + dragMultiplier = 0.5f; + }}; + + //Swamp effects + + refreshed = new StatusEffect("refreshed"){{ + damage = -1; + reloadMultiplier = 2; + }}; + + slippery = new StatusEffect("slippery"){{ + speedMultiplier = 1.25f; + dragMultiplier = 0.15f; + }}; + + infested = new StatusEffect("infested"){{ + damage = 0.5f; + healthMultiplier = 0.5f; + reloadMultiplier = 2; + }}; + + oozed = new StatusEffect("oozed"){{ + speedMultiplier = 0.75f; + dragMultiplier = 3; + }}; } } diff --git a/src/meld/content/MeldUnits.java b/src/meld/content/MeldUnits.java index 6b3bf94..9a8dd86 100644 --- a/src/meld/content/MeldUnits.java +++ b/src/meld/content/MeldUnits.java @@ -23,12 +23,10 @@ import meld.graphics.*; import meld.entities.unit.weapons.DeathWeapon; import meld.entities.unit.weapons.ShadowVisualWeapon; +import meld.ui.MeldSettings; import mindustry.Vars; import mindustry.ai.types.HugAI; -import mindustry.content.Blocks; -import mindustry.content.Fx; -import mindustry.content.Items; -import mindustry.content.StatusEffects; +import mindustry.content.*; import mindustry.entities.Effect; import mindustry.entities.abilities.RegenAbility; import mindustry.entities.abilities.StatusFieldAbility; @@ -93,6 +91,26 @@ public static int classID(Class type){ return idMap.get(type, -1); } + public static void bulbheadOmnimove(boolean omniMovement){ + bulbhead.omniMovement = omniMovement; + + //TODO: stat tweaks? + if(omniMovement){ + return; + } + } + + + public static void lightRadiusMultiplier(float newRad){ + + float prevScale = MeldSettings.lightScale; + + float multi = newRad/prevScale; + Vars.content.units().each(u -> { + u.lightRadius *= multi; + }); + } + //player units public static UnitType bulbhead, shark, @@ -145,6 +163,7 @@ public static void load(){ shadowElevation = 0; drawCell = drawBody = false; drawSoftShadow = false; + fullOverride = "clear"; weapons.addAll( new RepairBeamWeapon(){{ @@ -209,19 +228,6 @@ public static void load(){ progress = PartProgress.life.delay(0.8f).curve(Interp.pow5In); }}, //Sonar - new ShapePart(){{ - x = y = 0; - progress = PartProgress.life; - circle = true; - hollow = true; - radius = 0; - radiusTo = IR; - stroke = 6; - strokeTo = 0; - layer = Layer.buildBeam; - color = Pal.accent; - }}, - new ShapePart(){{ x = y = 0; progress = PartProgress.life.curve(Interp.pow10Out); @@ -235,17 +241,19 @@ public static void load(){ color = Pal.accent; }}, - new ShapePart(){{ - x = y = 0; - progress = PartProgress.life.curve(Interp.pow10In); - circle = true; - hollow = true; + new SonarPart(){{ radius = IR; + }}, + + new SonarPart(){{ + x = y = 0; + progress = PartProgress.life; + radius = 0; radiusTo = IR; - stroke = 4; + stroke = 6; strokeTo = 0; - layer = Layer.buildBeam; color = Pal.accent; + layer = MeldLayers.sonarInside; }} ); @@ -260,7 +268,7 @@ public static void load(){ constructor = TimedKillUnit::create; }}; - bulbhead = new UnitType("bulbhead"){{ + bulbhead = new BulbheadUnitType("bulbhead"){{ float IR = 120; outlineColor = Color.clear; @@ -280,8 +288,8 @@ public static void load(){ range = 100; - lightRadius = IR; - lightOpacity = 1; + lightRadius = IR/2; + lightOpacity = 0.5f; buildSpeed = 1; mineTier = 2; mineSpeed = 8; @@ -343,7 +351,6 @@ public static void load(){ colorTo = Pal.accent; progress = mixedProg.compress(0.1f, 0.9f).curve(Interp.pow2In); }}, - new ShapePart(){{ circle = hollow = true; radius = 45; @@ -414,26 +421,17 @@ public static void load(){ ); parts.addAll( - new HoverPart(){{ - x = y = 0; - phase = 420; - sides = 60; - mirror = false; + new SonarPart(){{ radius = IR; - stroke = 3; - circles = 2; - minStroke = 0.5f; - layer = Layer.buildBeam; - color = Pal.accent; - }}, - new ShapePart(){{ - x = y = 0; - circle = true; - hollow = true; stroke = 4; - radius = IR - 2; - layer = Layer.buildBeam; - color = Pal.accent; + }}, + new SonarPart(){{ + radius = 0; + radiusTo = IR; + stroke = 0.5f; + strokeTo = 2; + layer = MeldLayers.sonarInside; + progress = PartProgress.time.mul(1f/420).mod(1); }} ); constructor = BulbheadEntity::new; @@ -446,7 +444,8 @@ public static void load(){ activeEffect = Fx.none; }}, new SlipstreamHullAbility(), - new BeachedAbility() + new BeachedAbility(), + new FabricatorBatteryAbility() ); //can't rally yourself goober >w< immunities.addAll( @@ -473,8 +472,10 @@ public static void load(){ hitSize = 16; fogRadius = 24; - lightRadius = 85; - lightOpacity = 0.35f; + lightRadius = 35; + lightOpacity = 0.8f; + lightColor = Pal.sap; + range = 145; rotateSpeed = 6; @@ -500,6 +501,7 @@ public static void load(){ shoot.shotDelay = 5; bullet = new MissileBulletType(){{ + sprite = "missile-large"; speed = 4.5f; drag = -0.02f; @@ -518,7 +520,7 @@ public static void load(){ weaveScale = 5; weaveMag = 1.5f; - width = 3; + width = 4.5f; height = 8; shrinkX = 0; shrinkY = 0.2f; @@ -527,6 +529,7 @@ public static void load(){ backColor = trailColor = MeldPal.shark; trailChance = 0.15f; trailLength = 5; + trailWidth = 1.5f; despawnEffect = Fx.none; hitEffect = new Effect(12, e -> { @@ -548,7 +551,7 @@ public static void load(){ fragSpread = 15; fragRandomSpread = 0; fragBullet = new SapBulletType(){{ - damage = 10; + damage = 15; sapStrength = 1; length = 15; pierce = true; @@ -667,6 +670,7 @@ public static void load(){ shadowElevation = 0; drawCell = drawBody = false; drawSoftShadow = false; + fullOverride = "clear"; weapons.addAll( new RepairBeamWeapon(){{ @@ -1680,6 +1684,7 @@ public static void load(){ width = 1.7f; knockback = 1; pierceCap = 2; + pierceBuilding = true; colors = new Color[]{ Color.valueOf("f9e1f343"), diff --git a/src/meld/core/Melting.java b/src/meld/core/Melting.java index 7093239..704bd4d 100644 --- a/src/meld/core/Melting.java +++ b/src/meld/core/Melting.java @@ -39,7 +39,6 @@ public void start(Tile start){ @Override public void run(){ - Log.info("ticking"); toMelt // TODO: this check might not be necessary .select(it -> it.floor() != melted) diff --git a/src/meld/entities/unit/BulbheadEntity.java b/src/meld/entities/unit/BulbheadEntity.java index b10313b..49e6808 100644 --- a/src/meld/entities/unit/BulbheadEntity.java +++ b/src/meld/entities/unit/BulbheadEntity.java @@ -14,9 +14,11 @@ import arc.math.geom.Position; import arc.math.geom.Vec2; import arc.util.*; +import meld.content.MeldStatusEffects; import meld.content.MeldUnits; import meld.graphics.Draww; import meld.graphics.MeldRegions; +import meld.ui.MeldSettings; import meld.world.blocks.CoreRaft; import mindustry.Vars; import mindustry.content.Blocks; @@ -31,6 +33,7 @@ import mindustry.graphics.Drawf; import mindustry.graphics.Layer; import mindustry.graphics.Pal; +import mindustry.type.StatusEffect; import mindustry.world.Build; import mindustry.world.Tile; import mindustry.world.blocks.ConstructBlock; @@ -39,6 +42,8 @@ //Bandaid fix for multiplayer units dying randomly because I legit have no idea how to fix it otherwise public class BulbheadEntity extends UnitWaterMove { + public boolean omniMove; + @Nullable public CoreRaft.CoreRaftBuild nearbyRaft; @@ -47,43 +52,14 @@ public class BulbheadEntity extends UnitWaterMove { //Goes up to 1 and once it's at one, well... stuck... public float beached = 0; + //How beached you can get while boosting + public float boostingBeachedCap = 0.5f; public float standstillDrag = 1; public boolean controllerMoved = false; public Vec2 lastSafe = new Vec2(); - //It's a d8 but I shoved several hamburgors in it - public final static Point2[] d8Expanded = { - new Point2(1, 0), - new Point2(1, 1), - new Point2(0, 1), - new Point2(-1, 1), - new Point2(-1, 0), - new Point2(-1, -1), - new Point2(0, -1), - new Point2(1, -1), - - new Point2(2, 0), - new Point2(2, 1), - new Point2(2, -1), - new Point2(2, 2), - new Point2(2, -2), - - new Point2(-2, 0), - new Point2(-2, 1), - new Point2(-2, -1), - new Point2(-2, 2), - new Point2(-2, -2), - - new Point2(0, 2), - new Point2(1, 2), - new Point2(-1, 2), - - new Point2(0, -2), - new Point2(1, -2), - new Point2(-1, -2), - }; @Override public EntityCollisions.SolidPred solidity() { return (x, y) -> { @@ -92,21 +68,6 @@ public EntityCollisions.SolidPred solidity() { //If the tile is out of bounds or solid, then yeah it's solid if(tile == null || tile.solid()) return true; return false; - - /* - //If the current floor is a liquid then we're good - if(tile.floor().isLiquid) return false; - - for(int i = 0; i < 24; i++){ - Point2 offset = d8Expanded[i]; - Tile other = tile.nearby(offset); - if(other != null && !other.solid() && other.floor().isLiquid) return false; - } - - //If we can't find a nearby liquid tile, return true - return true; - - */ }; } @@ -121,22 +82,39 @@ public boolean canShoot() { return super.canShoot(); } + @Override + public void apply(StatusEffect effect, float duration) { + if(effect == MeldStatusEffects.boosting && !hasEffect(MeldStatusEffects.boosting)) beached = 0; + super.apply(effect, duration); + } + @Override public void update() { + //TODO: Sync in multiplayer??? + omniMove = type.omniMovement; + getNearbyLink(); + unapply(MeldStatusEffects.omnimoveCompensate); + if(omniMove){ + apply(MeldStatusEffects.omnimoveCompensate, 1); + } + Tile tile = this.tileOn(); if(tile != null && !tile.floor().isLiquid){ if(Mathf.chance(vel.len()/speed())) Fx.unitLandSmall.at(x, y, type.hitSize/Vars.tilesize, tile.floor().mapColor); - beached = Mathf.approachDelta(beached, 1, 1/60f); + beached = Mathf.approachDelta(beached, hasEffect(MeldStatusEffects.boosting) ? boostingBeachedCap : 1, 1/60f); if(beached == 1){ float exitAngle = angleTo(lastSafe); set(lastSafe); rotation(exitAngle); + apply(MeldStatusEffects.boostingIframes, 60); + unapply(MeldStatusEffects.rush); + unapply(MeldStatusEffects.boosting); } } else { @@ -164,7 +142,7 @@ public void update() { drag *= Mathf.lerp(1, 5, beached * beached); } - if(!controllerMoved) standstillDrag = Mathf.approachDelta(standstillDrag, 10, 1); + if(!controllerMoved && !omniMove) standstillDrag = Mathf.approachDelta(standstillDrag, 10, 1); else standstillDrag = 1; drag *= standstillDrag; @@ -198,7 +176,7 @@ public boolean activelyBuilding() { } public boolean withinBuildRange(Position p){ - return Vars.state.rules.infiniteResources || within(p, type.buildRange) || nearbyRaft != null && nearbyRaft.within(p, nearbyRaft.fogRadius() * Vars.tilesize); + return Vars.state.rules.infiniteResources || lastSafe.within(p, type.buildRange) || nearbyRaft != null && nearbyRaft.within(p, nearbyRaft.fogRadius() * Vars.tilesize); } public float buildDistance(Position p){ @@ -370,6 +348,14 @@ public void draw(){ } if(beached > 0 && beached != 1){ + + Draw.draw(Layer.buildBeam, () -> { + Lines.stroke(4); + Draw.color(team.color); + Draw.alpha(beached * 5); + Lines.circle(lastSafe.x, lastSafe.y, type.buildRange); + Draw.reset(); + }); float fout = 1 - beached; Draw.alpha(beached * beached); @@ -402,7 +388,7 @@ public void drawBuilding() { Tile tile = plan.tile(); CoreBlock.CoreBuild core = this.team.core(); - Position origin = within(plan, type.buildRange) ? this : nearbyRaft; + Position origin = lastSafe.within(plan, type.buildRange) ? lastSafe : nearbyRaft; if (tile != null && origin != null) { if (core != null && active && !this.isLocal() && !(tile.block() instanceof ConstructBlock)) { Draw.z(84.0F); @@ -415,14 +401,14 @@ public void drawBuilding() { float focusLen = type.buildBeamOffset + Mathf.absin(Time.time, 3.0F, 0.6F); float px = origin.getX(); float py = origin.getY(); - if(origin == this){ + if(origin == lastSafe){ px += Angles.trnsx(rotation, focusLen); py += Angles.trnsy(rotation, focusLen); } drawBuildingBeam(px, py); - if(origin != this){ + if(origin != lastSafe){ Draw.z(122); Drawf.buildBeam(origin.getX(), origin.getY(), x, y, 4); Lines.stroke(2); diff --git a/src/meld/entities/unit/abilities/BeachedAbility.java b/src/meld/entities/unit/abilities/BeachedAbility.java index d62c9af..4239628 100644 --- a/src/meld/entities/unit/abilities/BeachedAbility.java +++ b/src/meld/entities/unit/abilities/BeachedAbility.java @@ -8,7 +8,7 @@ public class BeachedAbility extends Ability { public void update(Unit unit) { super.update(unit); if(unit.tileOn() != null && !unit.tileOn().floor().isLiquid){ - unit.reloadMultiplier = unit.buildSpeedMultiplier = 0; + unit.reloadMultiplier = 0; } } } diff --git a/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java new file mode 100644 index 0000000..4f0a889 --- /dev/null +++ b/src/meld/entities/unit/abilities/FabricatorBatteryAbility.java @@ -0,0 +1,186 @@ +package meld.entities.unit.abilities; + +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.g2d.Lines; +import arc.math.Interp; +import arc.math.Mathf; +import arc.math.geom.Position; +import arc.math.geom.Vec2; +import arc.util.Log; +import arc.util.Time; +import arc.util.Tmp; +import meld.content.MeldFx; +import meld.graphics.MeldRegions; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.entities.abilities.Ability; +import mindustry.gen.Sounds; +import mindustry.gen.Unit; +import mindustry.graphics.Drawf; +import mindustry.graphics.Layer; +import mindustry.graphics.Pal; + +public class FabricatorBatteryAbility extends Ability { + + public float[] lightRadai = new float[]{ + 0, 80, 120, 240, 320 + }; + + public float lightRadius = lightRadai[0]; + + public Interp chargeInterp = Interp.pow2; + public float lingerTime = 0; + public float visualsWarmup = 0; + + public int stage = 0; + public int stageMax = 0; + + protected float charge = 0; + protected float zapTimer = 0; + protected boolean enabled = true; + + float x = 12, y = 0; + + public float chargeCap = 60 * 60; + + public float speedMulti = 5; + public float drainSpeed = 8; + + public float minCharge = 60; + + Color[] colors = new Color[]{Color.red, Color.orange, Color.blue, Pal.accent}; + + @Override + public void update(Unit unit) { + super.update(unit); + boolean active = unit.activelyBuilding(); + boolean visualActive = unit.vel.len() > 1f && !active && lingerTime <= 0; + + lightRadius = Mathf.lerp(lightRadius, lightRadai[Mathf.clamp(stage, 0, lightRadai.length)], 0.02f); + if(!visualActive && visualsWarmup < 0.1f) stageMax = stage; + + visualsWarmup = Mathf.slerpDelta(visualsWarmup, visualActive ? 0 : 1, 0.08f); + lingerTime -= Time.delta; + + //5 stages + int toStage = Mathf.floor(charge/chargeCap * 4); + + if(toStage != stage){ + if(toStage > stageMax){ + Fx.coreExplosion.at(unit.x, unit.y); + lingerTime = 240; + } + stage = toStage; + stageMax = stage; + } + + if(active){ + if(enabled){ + charge -= Time.delta * drainSpeed; + unit.buildSpeedMultiplier *= speedMulti; + zapTimer += Time.delta; + if(zapTimer > 12){ + zapTimer %= 12; + Vec2 targ = new Vec2(); + if(unit.buildPlan().build() != null) { + targ.set(unit.buildPlan().build().x, unit.buildPlan().build().y); + } + else { + Tmp.v1.trns(Mathf.random(360), unit.type.hitSize + Mathf.random(0, 12)).add(unit); + targ.set(Tmp.v1); + } + + MeldFx.chainLightning.at(unit.x, unit.y, 0, Pal.accent, new MeldFx.VisualLightningHolder() { + @Override + public Position start() { + return unit; + } + + @Override + public Position end() { + return targ; + } + + @Override + public float width() { + return 2; + } + + @Override + public float segLength() { + return 7; + } + + @Override + public float arc() { + return 0.2f; + } + + @Override + public int coils() { + return 3; + } + }); + } + Sounds.shootArc.at(unit.x, unit.y, Mathf.range(0.8f, 1.2f)); + } + } + else charge += Time.delta; + + if(charge >= chargeCap){ + unit.healthMultiplier *= 2; + unit.speedMultiplier *= 1.15f; + unit.reloadMultiplier *= 4/3f; + } + + + charge = Mathf.clamp(charge, 0, chargeCap); + if(charge == 0) enabled = false; + if(charge >= minCharge) enabled = true; + } + + @Override + public void draw(Unit unit) { + super.draw(unit); + float dx = x + unit.x, dy = y + unit.y; + + float fin = charge/chargeCap; + + float rad = 4; + float fullRad = 4; + float fract = 0.75f; + + Draw.color(Color.darkGray); + Draw.alpha(visualsWarmup); + Lines.stroke(3.5f); + Lines.arc(dx, dy, fullRad, fract); + Draw.color(Color.gray); + Draw.alpha(visualsWarmup); + Lines.stroke(1.5f); + Lines.arc(dx, dy, fullRad, fract); + + for(int i = 0; i < colors.length; i++){ + Draw.color(colors[i]); + Draw.alpha(visualsWarmup); + + float finp = Mathf.clamp(fin * colors.length - i, 0, 1); + finp = chargeInterp.apply(finp); + + if(finp < 0.02f) continue; + + Lines.stroke(1.5f); + Lines.arc(dx, dy, rad, Mathf.lerp(0.01f, fract, finp)); + } + + Draw.color(); + Draw.alpha(visualsWarmup); + Draw.rect(MeldRegions.chargeRegions[stage], dx - x * 2, dy); + + Vars.renderer.lights.add(() -> { + Fill.light(unit.x, unit.y, 4 + (int) lightRadius/4, lightRadius, Tmp.c1.set(unit.type.lightColor).a(1), Tmp.c2.set(unit.type.lightColor).a(0)); + }); + } +} diff --git a/src/meld/entities/unit/abilities/ReloadStackingAbility.java b/src/meld/entities/unit/abilities/ReloadStackingAbility.java new file mode 100644 index 0000000..65cebcf --- /dev/null +++ b/src/meld/entities/unit/abilities/ReloadStackingAbility.java @@ -0,0 +1,101 @@ +package meld.entities.unit.abilities; + +import arc.graphics.g2d.Lines; +import arc.math.Mathf; +import arc.math.geom.Position; +import arc.math.geom.Vec2; +import arc.util.Time; +import arc.util.Tmp; +import meld.content.MeldFx; +import mindustry.Vars; +import mindustry.entities.abilities.Ability; +import mindustry.gen.Sounds; +import mindustry.gen.Unit; +import mindustry.graphics.Pal; + +public class ReloadStackingAbility extends Ability { + protected float charge = 0; + protected float zapTimer = 0; + protected boolean enabled = true; + + public float chargeCap = 60 * 60; + + public float speedMulti = 5; + public float drainSpeed = 8; + + public float minCharge = 60; + + @Override + public void update(Unit unit) { + super.update(unit); + + if(unit.activelyBuilding()){ + if(enabled){ + charge -= Time.delta * drainSpeed; + unit.buildSpeedMultiplier *= speedMulti; + zapTimer += Time.delta; + if(zapTimer > 12){ + zapTimer %= 12; + Vec2 targ = new Vec2(); + if(unit.buildPlan().build() != null) { + targ.set(unit.buildPlan().build().x, unit.buildPlan().build().y); + } + else { + Tmp.v1.trns(Mathf.random(360), unit.type.hitSize + Mathf.random(0, 12)).add(unit); + targ.set(Tmp.v1); + } + + MeldFx.chainLightning.at(unit.x, unit.y, 0, Pal.accent, new MeldFx.VisualLightningHolder() { + @Override + public Position start() { + return unit; + } + + @Override + public Position end() { + return targ; + } + + @Override + public float width() { + return 2; + } + + @Override + public float segLength() { + return 7; + } + + @Override + public float arc() { + return 0.2f; + } + + @Override + public int coils() { + return 3; + } + }); + } + Sounds.shootArc.at(unit.x, unit.y, Mathf.range(0.8f, 1.2f)); + } + } + else charge += Time.delta; + + if(charge >= chargeCap){ + unit.healthMultiplier *= 2; + unit.speedMultiplier *= 1.5f; + } + + + charge = Mathf.clamp(charge, 0, chargeCap); + if(charge == 0) enabled = false; + if(charge >= minCharge) enabled = true; + } + + @Override + public void draw(Unit unit) { + super.draw(unit); + Lines.arc(unit.x, unit.y, Vars.tilesize * 3, charge/chargeCap); + } +} diff --git a/src/meld/entities/unit/abilities/SlipstreamHullAbility.java b/src/meld/entities/unit/abilities/SlipstreamHullAbility.java index fc22e4a..994a2fc 100644 --- a/src/meld/entities/unit/abilities/SlipstreamHullAbility.java +++ b/src/meld/entities/unit/abilities/SlipstreamHullAbility.java @@ -1,14 +1,29 @@ package meld.entities.unit.abilities; +import arc.math.Mathf; +import arc.util.Tmp; +import meld.content.MeldFx; import mindustry.entities.abilities.Ability; import mindustry.gen.Unit; +import mindustry.world.Tile; public class SlipstreamHullAbility extends Ability { @Override public void update(Unit unit) { super.update(unit); if(unit.tileOn() != null) { + Tile tile = unit.tileOn(); unit.dragMultiplier /= Math.max(unit.tileOn().floor().dragMultiplier, 1); + + //TODO: Better wakes for naval units + /* + if(tile.floor().isLiquid && unit.vel.len() > 4 && Mathf.chance(unit.vel.len()/5f)){ + Tmp.v1.trns(unit.rotation, unit.hitSize).add(unit.x, unit.y); + MeldFx.waterShear.at(Tmp.v1.x, Tmp.v1.y, unit.rotation, tile.floor().mapColor, unit); + MeldFx.waterShearFollow.at(Tmp.v1.x, Tmp.v1.y, unit.rotation, tile.floor().mapColor, unit); + } + + */ } } } diff --git a/src/meld/entities/unit/type/BulbheadUnitType.java b/src/meld/entities/unit/type/BulbheadUnitType.java new file mode 100644 index 0000000..e09d9df --- /dev/null +++ b/src/meld/entities/unit/type/BulbheadUnitType.java @@ -0,0 +1,23 @@ +package meld.entities.unit.type; + +import arc.util.Log; +import meld.content.MeldUnits; +import meld.ui.MeldSettings; +import mindustry.graphics.Pal; + +public class BulbheadUnitType extends MeldUnitType{ + + public BulbheadUnitType(String name) { + super(name); + healColor = Pal.accent; + } + + @Override + public void init() { + super.init(); + + Log.info("UNIT"); + Log.info(MeldSettings.bulbheadOmnimove); + MeldUnits.bulbheadOmnimove(MeldSettings.bulbheadOmnimove); + } +} diff --git a/src/meld/entities/unit/type/MeldUnitType.java b/src/meld/entities/unit/type/MeldUnitType.java index 54f21ce..d091683 100644 --- a/src/meld/entities/unit/type/MeldUnitType.java +++ b/src/meld/entities/unit/type/MeldUnitType.java @@ -12,6 +12,8 @@ import mindustry.type.UnitType; public class MeldUnitType extends UnitType { + + public MeldUnitType(String name) { super(name); outlineColor = Color.clear; diff --git a/src/meld/fluid/Aspect.java b/src/meld/fluid/Aspect.java index 5204f70..70c6674 100644 --- a/src/meld/fluid/Aspect.java +++ b/src/meld/fluid/Aspect.java @@ -10,11 +10,21 @@ import mindustry.type.Liquid; public class Aspect extends Liquid { + + public boolean setDefaults = true; + public float lightOpacity = 0.5f; + public Aspect(String name) { super(name, Color.white); databaseCategory = "aspect"; } + @Override + public void init() { + super.init(); + if(lightColor.equals(Color.clear) && setDefaults) lightColor = new Color(color).a(lightOpacity); + } + @Override public void setStats() { super.setStats(); diff --git a/src/meld/fluid/AspectGroup.java b/src/meld/fluid/AspectGroup.java index bc33b80..3946393 100644 --- a/src/meld/fluid/AspectGroup.java +++ b/src/meld/fluid/AspectGroup.java @@ -24,7 +24,7 @@ public static void loadAll(){ groups.each(AspectGroup::load); } - //Kept separate since I want to test some things ingame and be able to reset a single group's name over calling a load function on everything + //Kept separate since I want to test some things ingame and be able to reset a single group's name over calling a init function on everything public void load(){ localizedName = Core.bundle.get("aspect-group." + name, name); } @@ -44,14 +44,17 @@ public AspectGroup hide(){ aether = new AspectGroup("aether"), aspect = new AspectGroup("aspect"), outlet = new AspectGroup("outlet"), - fumes = new AspectGroup("fumes"); + fumes = new AspectGroup("fumes"), + aqua = new AspectGroup("aqua"); public float getDensity(Liquid liquid){ + if(liquid == null) return 0; AspectStats stat = stats.get(liquid); return stat == null ? 1 : stat.density; } public float getEfficiency(Liquid liquid){ + if(liquid == null) return 0; AspectStats stat = stats.get(liquid); return stat == null ? 1 : stat.efficiency; } diff --git a/src/meld/graphics/AboveOverlayRenderer.java b/src/meld/graphics/AboveOverlayRenderer.java new file mode 100644 index 0000000..79cb999 --- /dev/null +++ b/src/meld/graphics/AboveOverlayRenderer.java @@ -0,0 +1,44 @@ +package meld.graphics; + +import arc.Core; +import arc.graphics.g2d.Draw; +import arc.math.geom.Vec2; +import mindustry.Vars; +import mindustry.core.World; + +import static mindustry.Vars.player; + +public class AboveOverlayRenderer { + public static void draw(){ + + int cursorX = tileX(Core.input.mouseX()); + int cursorY = tileY(Core.input.mouseY()); + + if(player.isBuilder() && Vars.control.input.isPlacing()){ + int rot = Vars.control.input.block == null ? Vars.control.input.rotation : Vars.control.input.block.planRotation(Vars.control.input.rotation); + + if(Vars.control.input.block.rotate && Vars.control.input.block.drawArrow){ + Vars.control.input.drawArrow(Vars.control.input.block, cursorX, cursorY, rot); + } + Draw.color(); + boolean valid = Vars.control.input.validPlace(cursorX, cursorY, Vars.control.input.block, rot); + Vars.control.input.block.drawPlace(cursorX, cursorY, rot, valid); + } + } + + static int tileX(float cursorX){ + Vec2 vec = Core.input.mouseWorld(cursorX, 0); + if(Vars.control.input.selectedBlock()){ + vec.sub(Vars.control.input.block.offset, Vars.control.input.block.offset); + } + return World.toTile(vec.x); + } + + static int tileY(float cursorY){ + Vec2 vec = Core.input.mouseWorld(0, cursorY); + if(Vars.control.input.selectedBlock()){ + vec.sub(Vars.control.input.block.offset, Vars.control.input.block.offset); + } + return World.toTile(vec.y); + } +} diff --git a/src/meld/graphics/Draww.java b/src/meld/graphics/Draww.java index 8957d7d..baa1881 100644 --- a/src/meld/graphics/Draww.java +++ b/src/meld/graphics/Draww.java @@ -1,24 +1,140 @@ package meld.graphics; +import arc.Core; import arc.graphics.Color; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.Lines; -import arc.graphics.g2d.TextureRegion; +import arc.graphics.Gl; +import arc.graphics.g2d.*; import arc.math.Interp; import arc.math.Mathf; import arc.math.geom.Vec2; +import arc.scene.ui.layout.Scl; +import arc.util.Align; import arc.util.Tmp; +import arc.util.pooling.Pools; +import meld.SettingKeys; +import meld.math.Math3D; +import meld.world.WeatherMath; import mindustry.Vars; import mindustry.content.Blocks; +import mindustry.graphics.Layer; import mindustry.graphics.Pal; +import mindustry.type.Item; +import mindustry.ui.Fonts; import mindustry.world.Block; +import static meld.ui.MeldSettings.connectedSonar; +import static mindustry.Vars.*; + public class Draww { + + public static Vec2 tv; + /*This conssiders + -X and Y of position + -Wind + -Parallax + */ + + //Weights for different materials + public static float + sparkWeight = 0.1f, + smokeWeight = 0.005f, + heavySmokeWeight = 0.015f; + + //Height gain/second for different materials + public static float + smokeDrift = 0.75f/60; + + public static void speckOffset(float x, float y, float height, float magnitude, float weight, Vec2 out){ + Vec2 w = new Vec2(); + windOffset(magnitude, weight, w); + w.add(x,y); + parallaxOffset(w.x, w.y, height, out); + } + + public static void windOffset(float magnitude, float weight, Vec2 out){ + out.set(WeatherMath.wind); + out.scl(Core.settings.getInt("frostscape-wind-visual-force")); + float length = Math.max(out.len() - weight, 0) * magnitude; + out.setLength(length); + } + + public static void parallaxOffset(float x, float y, float height, Vec2 out){ + float px = Math3D.xCamOffset2D(x, height), py = Math3D.yCamOffset2D(y, height); + out.set(x + px, y + py); + } + + public static void drawSonar(float x, float y, float radius, float thickness){ + drawSonar(x, y, radius, thickness, MeldLayers.sonar, Pal.accent); + } + + public static void drawSonar(float x, float y, float radius, float thickness, float layer, Color color){ + if(connectedSonar){ + float z = Draw.z(); + Draw.z(layer); + + Draw.color(color); + Fill.light(x, y, (int) (radius/4) + 12, radius + thickness/2, Tmp.c1.set(color).a(0), Tmp.c1.a(1)); + + Draw.z(layer + 0.01f); + Fill.light(x, y, (int) (radius/4) + 12, radius - thickness/2, Tmp.c1.set(Color.red), Tmp.c1); + Draw.z(z); + } + else { + Draw.color(color); + Draw.z(layer); + Lines.stroke(thickness); + Lines.circle(x, y, radius); + } + } + + //Draw place text from blocks but well... yeah + //Uses the draw colour instead of an input one + + public static void itemText(String text, float x, float y, Item item){ + float offset = drawTextUnderlined(text, x, y, item.color)/2; + Draw.mixcol(Color.darkGray, 1f); + float s = iconSmall / 4f; + Draw.rect(item.fullIcon, x + offset + s/2, y - 1, s, s); + Draw.mixcol(); + Draw.rect(item.fullIcon, x + offset + s/2, y, s, s); + } + + public static float drawTextUnderlined(String text, float x, float y, Color col){ + if(renderer.pixelate) return 0; + + Font font = Fonts.outline; + GlyphLayout layout = Pools.obtain(GlyphLayout.class, GlyphLayout::new); + boolean ints = font.usesIntegerPositions(); + font.setUseIntegerPositions(false); + font.getData().setScale(1f / 4f / Scl.scl(1f)); + layout.setText(font, text); + + float width = layout.width; + + font.setColor(col); + + font.draw(text, x, y + layout.height + 1, Align.center); + y -= 1f; + Lines.stroke(2f, Color.darkGray); + Lines.line(x - layout.width / 2f - 2f, y, x + layout.width / 2f + 1.5f, y); + Lines.stroke(1f, col); + Lines.line(x - layout.width / 2f - 2f, y, x + layout.width / 2f + 1.5f, y); + + font.setUseIntegerPositions(ints); + font.setColor(Color.white); + font.getData().setScale(1f); + Draw.reset(); + Pools.free(layout); + + return width; + } + public static Vec2 tv1 = new Vec2(), tv2 = new Vec2(), tv3 = new Vec2(); //draws a chain of sprites public static void drawChain(TextureRegion region, float x, float y, float endx, float endy, float drawRotation){ drawChain(region, x, y, endx, endy, 1, 1, drawRotation); } + public static void drawChain(TextureRegion region, float x, float y, float endx, float endy, float wScale, float hScale, float drawRotation){ float angleToEnd = Mathf.angle(endx - x, endy - y); float distance = Mathf.dst(x, y, endx, endy); diff --git a/src/meld/graphics/MeldLayers.java b/src/meld/graphics/MeldLayers.java new file mode 100644 index 0000000..8525355 --- /dev/null +++ b/src/meld/graphics/MeldLayers.java @@ -0,0 +1,13 @@ +package meld.graphics; + +import mindustry.graphics.Layer; + +public class MeldLayers { + public static float + //Used to prevent layer collisions + funnyNumber = 0.691337f, + smokeLow = 50 + funnyNumber, + smokeHigh = 105 + funnyNumber, + sonar = Layer.fogOfWar + 1 + funnyNumber, + sonarInside = Layer.fogOfWar + 3 + funnyNumber; +} diff --git a/src/meld/graphics/MeldLightRenderer.java b/src/meld/graphics/MeldLightRenderer.java new file mode 100644 index 0000000..9d8667e --- /dev/null +++ b/src/meld/graphics/MeldLightRenderer.java @@ -0,0 +1,294 @@ +package meld.graphics; + +import arc.Core; +import arc.graphics.*; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.graphics.gl.FrameBuffer; +import arc.math.Mathf; +import arc.math.geom.Vec2; +import arc.struct.Seq; +import arc.util.Log; +import arc.util.Tmp; +import meld.ui.MeldSettings; +import mindustry.Vars; +import mindustry.content.Blocks; +import mindustry.graphics.LightRenderer; +import mindustry.graphics.Shaders; + +import static meld.graphics.MeldShaders.lightBuffer; +import static mindustry.Vars.renderer; +import static mindustry.Vars.state; + +public class MeldLightRenderer extends LightRenderer { + + public MeldLightRenderer(){ + super(); + thingo = this; + } + + public static MeldLightRenderer thingo; + + private static final int scaling = 4; + + private float[] vertices = new float[24]; + public static FrameBuffer buffer = new FrameBuffer(), shadowBuffer = new FrameBuffer(); + private Seq lights = new Seq<>(), shadows = new Seq<>(); + + private Seq circles = new Seq<>(CircleLight.class); + + private Seq shadowCircles = new Seq<>(CircleLight.class); + + private int circleIndex = 0, shadowCircleIndex = 0; + private TextureRegion circleRegion; + + public void shadow(Runnable run){ + if(!enabled()) return; + + shadows.add(run); + } + + public void add(Runnable run){ + if(!enabled()) return; + + lights.add(run); + } + + public void add(float x, float y, float radius, Color color, float opacity){ + if(!enabled() || radius <= 0f) return; + + float res = Color.toFloatBits(color.r, color.g, color.b, opacity); + + if(circles.size <= circleIndex) circles.add(new CircleLight()); + + //pool circles to prevent runaway GC usage from lambda capturing + var light = circles.items[circleIndex]; + light.set(x, y, res, radius); + + circleIndex ++; + } + + public void add(float x, float y, TextureRegion region, Color color, float opacity){ + add(x, y, region, 0f, color, opacity); + } + + public void add(float x, float y, TextureRegion region, float rotation, Color color, float opacity){ + if(!enabled()) return; + + float res = color.toFloatBits(); + float xscl = Draw.xscl, yscl = Draw.yscl; + add(() -> { + Draw.color(res); + Draw.alpha(opacity); + Draw.scl(xscl, yscl); + Draw.rect(region, x, y, rotation); + Draw.scl(); + }); + } + + public void line(float x, float y, float x2, float y2, float stroke, Color tint, float alpha){ + if(!enabled()) return; + + add(() -> { + Draw.color(tint, alpha); + + float rot = Mathf.angleExact(x2 - x, y2 - y); + TextureRegion ledge = Core.atlas.find("circle-end"), lmid = Core.atlas.find("circle-mid"); + + float color = Draw.getColorPacked(); + float u = lmid.u; + float v = lmid.v2; + float u2 = lmid.u2; + float v2 = lmid.v; + + Vec2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); + float lx1 = x - v1.x, ly1 = y - v1.y, + lx2 = x + v1.x, ly2 = y + v1.y, + lx3 = x2 + v1.x, ly3 = y2 + v1.y, + lx4 = x2 - v1.x, ly4 = y2 - v1.y; + + vertices[0] = lx1; + vertices[1] = ly1; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx2; + vertices[7] = ly2; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx3; + vertices[13] = ly3; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx4; + vertices[19] = ly4; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.texture, vertices, 0, vertices.length); + + Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); + + u = ledge.u; + v = ledge.v2; + u2 = ledge.u2; + v2 = ledge.v; + + vertices[0] = lx4; + vertices[1] = ly4; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx3; + vertices[7] = ly3; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx3 + v3.x; + vertices[13] = ly3 + v3.y; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx4 + v3.x; + vertices[19] = ly4 + v3.y; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.texture, vertices, 0, vertices.length); + + vertices[0] = lx2; + vertices[1] = ly2; + vertices[2] = color; + vertices[3] = u; + vertices[4] = v; + vertices[5] = 0; + + vertices[6] = lx1; + vertices[7] = ly1; + vertices[8] = color; + vertices[9] = u; + vertices[10] = v2; + vertices[11] = 0; + + vertices[12] = lx1 - v3.x; + vertices[13] = ly1 - v3.y; + vertices[14] = color; + vertices[15] = u2; + vertices[16] = v2; + vertices[17] = 0; + + vertices[18] = lx2 - v3.x; + vertices[19] = ly2 - v3.y; + vertices[20] = color; + vertices[21] = u2; + vertices[22] = v; + vertices[23] = 0; + + Draw.vert(ledge.texture, vertices, 0, vertices.length); + }); + } + + public boolean enabled(){ + return state.rules.lighting && renderer.drawLight; + } + + public void draw(){ + } + + public void draw2(){ + lightBuffer.end(); + + if(!Vars.enableLight){ + lights.clear(); + circleIndex = 0; + return; + } + + if(circleRegion == null) circleRegion = Core.atlas.find("circle-shadow"); + + buffer.resize(Core.graphics.getWidth()/scaling, Core.graphics.getHeight()/scaling); + + Draw.color(); + buffer.begin(Color.clear); + Draw.sort(false); + Gl.blendEquationSeparate(Gl.funcAdd, Gl.max); + Blending.additive.apply(); + for(Runnable run : lights){ + run.run(); + } + for(int i = 0; i < circleIndex; i++){ + var cir = circles.items[i]; + Draw.color(cir.color); + Draw.rect(circleRegion, cir.x, cir.y, cir.radius * 2, cir.radius * 2); + } + Draw.reset(); + Blending.normal.apply(); + Draw.sort(true); + Texture lightTex = buffer.getTexture(); + buffer.end(); + Draw.color(); + + //TODO: potential memory leak + Draw.color(); + shadowBuffer.begin(Color.clear); + Draw.sort(false); + Blending.additive.apply(); + Gl.blendEquationSeparate(Gl.funcAdd, Gl.funcAdd); + shadowBuffer.resize(Core.graphics.getWidth()/scaling, Core.graphics.getHeight()/scaling); + + for(Runnable run : shadows){ + run.run(); + } + + Draw.reset(); + Blending.normal.apply(); + Draw.sort(true); + Texture exclusionTex = shadowBuffer.getTexture(); + shadowBuffer.end(); + Draw.color(); + + + + if(MeldSettings.invertAmbient) + MeldShaders.light.ambient.set(Tmp.c1.set(Color.white)).sub(Tmp.c2.set(state.rules.ambientLight).mul(state.rules.ambientLight.a)); + else MeldShaders.light.ambient.set(state.rules.ambientLight); + + MeldShaders.light.lights = lightTex; + MeldShaders.light.exclusion = exclusionTex; + + lightBuffer.blit(MeldShaders.light); + + lights.clear(); + shadows.clear(); + circleIndex = shadowCircleIndex = 0; + } + + static class CircleLight{ + float x, y, color, radius; + + public void set(float x, float y, float color, float radius){ + this.x = x; + this.y = y; + this.color = color; + this.radius = radius; + } + } +} diff --git a/src/meld/graphics/MeldPal.java b/src/meld/graphics/MeldPal.java index 3c1cb9d..2eb0d02 100644 --- a/src/meld/graphics/MeldPal.java +++ b/src/meld/graphics/MeldPal.java @@ -5,14 +5,23 @@ public class MeldPal { public static Color + + meldFloorGlow = Color.valueOf("d26ab12b"), + meldFloorGlowDeep = Color.valueOf("ca3fba21"), + meldFloorGlowHadal = Color.valueOf("ca3fba1b"), + aspect = Color.valueOf("f0f5fe"), + shark = Color.valueOf("a393feff"), darkShark = Color.valueOf("665c9f"), accentClear = Pal.accent.cpy().a(0), + accentTranslucent = Pal.accent.cpy().a(0.01f), + blobPink = Color.valueOf("e5aed7"), blobPinkClear = blobPink.cpy().a(0), flamePink = Color.valueOf("feafea"), flamePinkDark = Color.valueOf("d26ab1"), + shockwaveGray = Color.valueOf("7f7f7f"), sparkOrange = Color.valueOf("f6e096"), resoShardFront = Color.valueOf("a3efba"), diff --git a/src/meld/graphics/MeldRegions.java b/src/meld/graphics/MeldRegions.java index 2f56de7..cbbe53c 100644 --- a/src/meld/graphics/MeldRegions.java +++ b/src/meld/graphics/MeldRegions.java @@ -6,9 +6,17 @@ public class MeldRegions { - public static TextureRegion chain; + public static TextureRegion chain, particle; + + public static TextureRegion[] chargeRegions; public static void load(){ chain = Core.atlas.find(Meld.prefix("chain")); + particle = Core.atlas.find("particle"); + + chargeRegions = new TextureRegion[5]; + for(int i = 0; i < 5; i++){ + chargeRegions[i] = Core.atlas.find(Meld.prefix("fabricator-battery" + (i + 1))); + } } } diff --git a/src/meld/graphics/MeldShaders.java b/src/meld/graphics/MeldShaders.java new file mode 100644 index 0000000..976c189 --- /dev/null +++ b/src/meld/graphics/MeldShaders.java @@ -0,0 +1,149 @@ +package meld.graphics; + +import arc.Core; +import arc.Events; +import arc.graphics.Blending; +import arc.graphics.Color; +import arc.graphics.GL20; +import arc.graphics.Texture; +import arc.graphics.g2d.Draw; +import arc.graphics.gl.FrameBuffer; +import arc.graphics.gl.Shader; +import arc.scene.ui.layout.Scl; +import arc.util.Log; +import arc.util.Time; +import meld.Meld; +import meld.SettingKeys; +import meld.ui.MeldSettings; +import mindustry.Vars; +import mindustry.game.EventType; +import mindustry.graphics.Layer; +import mindustry.graphics.LightRenderer; +import mindustry.graphics.Pal; +import mindustry.graphics.Shaders; + +import static mindustry.Vars.renderer; + + +public class MeldShaders { + + public static NamedShader sonar; + public static LightShaderMeld light; + + public static FrameBuffer lightBuffer = new FrameBuffer(), sonarBuffer = new FrameBuffer(); + + public static boolean loaded = false; + + public static void load(){ + if(loaded) return; + loaded = true; + + sonar = new SonarShader("sonar"); + light = new LightShaderMeld("light"); + + + + Events.run(EventType.Trigger.draw, () -> { + sonarBuffer.resize(Core.graphics.getWidth(), Core.graphics.getHeight()); + + if(Vars.state.rules.lighting && MeldSettings.replaceLighting){ + lightBuffer.resize(Core.graphics.getWidth(), Core.graphics.getHeight()); + Draw.draw(Layer.background, () -> { + lightBuffer.begin(); + }); + Draw.draw(Layer.light, () -> { + lightBuffer.end(); + MeldLightRenderer.thingo.draw2(); + }); + } + + Draw.drawRange(MeldLayers.sonar, 0.1f, () -> { + sonarBuffer.begin(Color.clear); + }, () -> { + sonarBuffer.end(); + sonarBuffer.blit(MeldShaders.sonar); + }); + + Draw.drawRange(MeldLayers.sonarInside, 0.1f, () -> { + renderer.effectBuffer.begin(Color.clear); + }, () -> { + renderer.effectBuffer.end(); + renderer.effectBuffer.blit(MeldShaders.sonar); + }); + }); + } + + /** Shaders that the the*/ + public static class NamedShader extends Shader { + public NamedShader(String frag) { + super(Core.files.internal("shaders/screenspace.vert"), Vars.tree.get("shaders/" + frag + ".frag")); + } + + @Override + public void apply() { + setUniformf("u_time", Time.time / Scl.scl(1f)); + setUniformf("u_campos", + Core.camera.position.x, + Core.camera.position.y + ); + setUniformf("u_resolution", + Core.graphics.getWidth(), + Core.graphics.getHeight() + ); + setUniformf("u_drawCol", Draw.getColor().r, Draw.getColor().g, Draw.getColor().b, Draw.getColor().a); + } + } + + public static class SonarShader extends NamedShader{ + public Color sonarColor = Pal.accent; + + public SonarShader(String frag) { + super(frag); + } + + + @Override + public void apply() { + super.apply(); + setUniformf("u_color", + sonarColor.r, + sonarColor.g, + sonarColor.b, + sonarColor.a + ); + } + } + + public static class LightShaderMeld extends NamedShader{ + public float thickness = 0; + public Color ambient = new Color(0.01f, 0.01f, 0.04f, 0.99f); + public Texture lights = null; + public Texture exclusion = null; + + public LightShaderMeld(String frag) { + super(frag); + } + + @Override + public void apply(){ + /* + setUniformf("u_campos", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); + setUniformf("u_resolution", Core.camera.width, Core.camera.height); + setUniformf("u_time", Time.time); + + */ + + setUniformf("u_ambient", ambient); + setUniformf("u_thickness", thickness); + + if(exclusion != null) exclusion.bind(2); + if(lights != null) lights.bind(1); + + setUniformi("u_exclusion", 2); + setUniformi("u_lights", 1); + + lightBuffer.getTexture().bind(0); + + } + } +} diff --git a/src/meld/graphics/ParticleFloor.java b/src/meld/graphics/ParticleFloor.java new file mode 100644 index 0000000..8204dc6 --- /dev/null +++ b/src/meld/graphics/ParticleFloor.java @@ -0,0 +1,45 @@ +package meld.graphics; +import arc.graphics.Color; +import arc.math.Mathf; +import mindustry.content.Blocks; +import mindustry.content.Fx; +import mindustry.entities.Effect; +import mindustry.world.Tile; +import mindustry.world.blocks.environment.Floor; + +public class ParticleFloor extends Floor { + + public Effect effect; + + public Color effectColor; + + public float chance; + + public boolean emitBlocked; + + + public ParticleFloor(String name) { + super(name, 3); + } + + public ParticleFloor(String name, int variants) { + super(name, variants); + effect = Fx.smoke; + effectColor = Color.white; + chance = 1; + emitBlocked = false; + } + + @Override + public boolean updateRender(Tile tile) { + return true; + } + + @Override + public void renderUpdate(UpdateRenderState tile) { + //gota check twice cause stuff can block the floor + if(Mathf.chanceDelta(chance) && (emitBlocked || tile.tile.block() == Blocks.air)) { + effect.at(tile.tile.worldx(), tile.tile.worldy(), effectColor); + } + } +} \ No newline at end of file diff --git a/src/meld/graphics/part/ShadowPart.java b/src/meld/graphics/part/ShadowPart.java new file mode 100644 index 0000000..96d4819 --- /dev/null +++ b/src/meld/graphics/part/ShadowPart.java @@ -0,0 +1,18 @@ +package meld.graphics.part; + +import arc.graphics.Color; +import arc.graphics.g2d.Fill; +import arc.util.Tmp; +import meld.graphics.MeldLightRenderer; +import mindustry.entities.part.DrawPart; + +public class ShadowPart extends DrawPart { + @Override + public void draw(PartParams params) { + float x = params.x, y = params.y; + + MeldLightRenderer.thingo.shadow(() -> { + Fill.light(x, y, 100, 100, Color.white, Tmp.c1.set(Color.white).a(0)); + }); + } +} diff --git a/src/meld/graphics/part/SonarPart.java b/src/meld/graphics/part/SonarPart.java new file mode 100644 index 0000000..43b0c3f --- /dev/null +++ b/src/meld/graphics/part/SonarPart.java @@ -0,0 +1,54 @@ +package meld.graphics.part; + +import arc.graphics.Blending; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.math.Mathf; +import arc.math.geom.Vec2; +import arc.util.Tmp; +import meld.graphics.Draww; +import meld.graphics.MeldLayers; +import meld.graphics.MeldPal; +import meld.graphics.MeldRegions; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.entities.part.DrawPart; +import mindustry.graphics.Drawf; +import mindustry.graphics.Pal; + +public class SonarPart extends DrawPart { + public float x = 0, y = 0, layer = MeldLayers.sonar; + public Color color = Pal.accent; + + public float radius, + stroke = 2; + + public float radiusTo = -1, strokeTo = -1; + + public boolean setDefaults = true; + + public PartProgress progress = PartProgress.life; + + @Override + public void load(String name) { + super.load(name); + if(setDefaults){ + if(radiusTo == -1) radiusTo = radius; + if(strokeTo == -1) strokeTo = stroke; + } + } + + @Override + public void draw(PartParams params) { + Tmp.v1.set(x, y).rotate(params.rotation).add(params.x, params.y); + Draww.drawSonar(Tmp.v1.x, Tmp.v1.y, Mathf.lerp(radius, radiusTo, progress.get(params)), Mathf.lerp(stroke, strokeTo, progress.get(params)), layer, color); + + Vec2 pos = new Vec2(Tmp.v1); + Vars.renderer.lights.add(() -> { + Draw.blend(Blending.additive); + Fill.light(pos.x, pos.y, 100, radius, Pal.accent, MeldPal.accentClear); + Draw.blend(Blending.normal); + }); + } +} diff --git a/src/meld/math/Math3D.java b/src/meld/math/Math3D.java new file mode 100644 index 0000000..c05e7e1 --- /dev/null +++ b/src/meld/math/Math3D.java @@ -0,0 +1,41 @@ +package meld.math; + +import arc.Core; + +public class Math3D { + + public static float parallax; + /** + * Originally by + * @author MEEP + * Modified by + * @author Sh1penfire + * */ + + //Ty meep, didn't realize how simple it was + + public static float xCamOffset2D(float x, float height){ + return xCamOffset2D(x, height, 1 + (1 - Math.max(0, parallax))); + } + + public static float yCamOffset2D(float y, float height){ + return yCamOffset2D(y, height, 1 + 7 * (1 - Math.max(0, parallax))); + } + public static float xCamOffset2D(float x, float height, float spacing){ + return (x - Core.camera.position.x) * height/spacing; + } + + public static float yCamOffset2D(float y, float height, float spacing){ + return (y - Core.camera.position.y) * height/spacing; + } + + public static class HeightHolder{ + public float height; + public float lift; + + public HeightHolder(float height, float lift){ + this.height = height; + this.lift = lift; + } + } +} \ No newline at end of file diff --git a/src/meld/math/MultiInterp.java b/src/meld/math/MultiInterp.java new file mode 100644 index 0000000..612325a --- /dev/null +++ b/src/meld/math/MultiInterp.java @@ -0,0 +1,28 @@ +package meld.math; + +import arc.math.Interp; + +public class MultiInterp implements Interp { + final float[] timings; + final Interp[] interps; + private Interp tinterp; + private float tmp; + + public MultiInterp(float[] timings, Interp[] interps){ + this.timings = timings; + this.interps = interps; + } + + @Override + public float apply(float a) { + for (int i = 0; i < timings.length; i++) { + if(i == timings.length - 1 || a < timings[i + 1]) { + if(i == timings.length-1) tmp = 1; + else tmp = timings[i + 1]; + + return interps[i].apply((a-timings[i])/(tmp - timings[i])); + } + } + return interps[timings.length - 1].apply(a); + } +} \ No newline at end of file diff --git a/src/meld/meta/MeldStats.java b/src/meld/meta/MeldStats.java index 19b754c..6e3905f 100644 --- a/src/meld/meta/MeldStats.java +++ b/src/meld/meta/MeldStats.java @@ -3,6 +3,7 @@ import arc.Core; import arc.util.Strings; import meld.fluid.AspectGroup; +import mindustry.Vars; import mindustry.gen.Tex; import mindustry.type.Liquid; import mindustry.ui.Styles; @@ -11,6 +12,12 @@ public class MeldStats { + public static void loadModifications(){ + Vars.content.items().each(c -> { + c.stats.add(Stat.buildCost, c.cost, MeldStatUnit.ticks); + }); + } + public static Stat aspectStats = new Stat("aspect-stats"); diff --git a/src/meld/ui/MeldSettings.java b/src/meld/ui/MeldSettings.java new file mode 100644 index 0000000..61aed77 --- /dev/null +++ b/src/meld/ui/MeldSettings.java @@ -0,0 +1,108 @@ +package meld.ui; + +import arc.Core; +import arc.func.Boolc; +import arc.func.Cons; +import arc.util.Log; +import meld.Meld; +import meld.SettingKeys; +import meld.content.MeldUnits; +import mindustry.Vars; +import mindustry.content.Blocks; +import mindustry.ctype.UnlockableContent; +import mindustry.io.SaveFileReader; +import mindustry.ui.dialogs.SettingsMenuDialog; + +public class MeldSettings { + public static boolean replaceLighting, invertAmbient, connectedSonar, overlayOverFog, + + //The expirimental settings + bulbheadOmnimove, portSaves; + public static float lightScale = 100; + + public static void check(SettingsMenuDialog.SettingsTable table, String settingName, boolean def, Boolc changed){ + table.checkPref(Core.bundle.get(settingName), def, b -> { + Core.settings.put(settingName, b); + changed.get(b); + }); + } + + public static void loadSettings(){ + + replaceLighting = Core.settings.getBool(SettingKeys.lighting, true); + invertAmbient = Core.settings.getBool(SettingKeys.invertAmbient, false); + connectedSonar = Core.settings.getBool(SettingKeys.connectedSonar, true); + overlayOverFog = Core.settings.getBool(SettingKeys.overlayOverFog, true); + + float newLightScale = Core.settings.getInt(SettingKeys.unitLightScale, 100); + MeldUnits.lightRadiusMultiplier(newLightScale); + lightScale = newLightScale; + + bulbheadOmnimove = Core.settings.getBool(SettingKeys.bulbheadOmnimove, false); + + portSaves = Core.settings.getBool(SettingKeys.portSaves, false); + + //TODO: Move save io related things to their own class? + if(portSaves){ + Vars.content.each(c -> { + if(!(c instanceof UnlockableContent content) || content.minfo.mod == null) return; + String modified = content.name; + String[] bits = modified.split("meld2"); + + if(bits.length > 1){ + String oldName = "meld" + bits[1]; + + SaveFileReader.fallback.put(oldName, modified); + } + }); + } + + Vars.ui.settings.addCategory(Core.bundle.get("settings.meld-title"), Meld.prefix("icon"), t -> { + check(t, SettingKeys.lighting, true, b -> replaceLighting = b); + check(t, SettingKeys.invertAmbient, true, b -> invertAmbient = b); + check(t, SettingKeys.connectedSonar, true, b -> connectedSonar = b); + check(t, SettingKeys.overlayOverFog, true, b -> overlayOverFog = b); + + t.sliderPref(Core.bundle.get(SettingKeys.unitLightScale), 100, 1, 200, f -> { + MeldUnits.lightRadiusMultiplier(f); + lightScale = f; + Core.settings.put(SettingKeys.unitLightScale, f); + return f + "%"; + }); + }); + + Vars.ui.settings.addCategory(Core.bundle.get("settings.meld-experimental"), Meld.prefix("icon"), t -> { + check(t, SettingKeys.bulbheadOmnimove, false, MeldUnits::bulbheadOmnimove); + check(t, SettingKeys.portSaves, false, b -> portSaves = b); + }); + + /* + photosensitiveMode = Core.settings.getBool("settings.frostscape-flashing-lights-safety", false); + heatOverlay.enabled = Core.settings.getBool("settings.frostscape-heat-overlay", false); + simplifiedLightning = Core.settings.getBool("settings.frostscape-simple-lightning"); + parallax = Core.settings.getInt("settings.frostscape-parallax"); + + heatOverlay.enabled = Core.settings.getBool("settings.frostscape-heat-overlay", false); + ui.settings.addCategory(Core.bundle.get("settings.frostscape-title"), NAME + "-hunter", t -> { + t.sliderPref(Core.bundle.get("settings.frostscape-parallax"), 100, 1, 100, 1, s -> { + parallax = s/100; + return s + "%"; + }); + t.sliderPref(Core.bundle.get("settings.frostscape-wind-visual-force"), 1, 0, 8, 1, s -> s * 100 + "%"); + t.checkPref(Core.bundle.get("settings.frostscape-flashing-lights-safety"), false, b -> { + photosensitiveMode = b; + }); + t.checkPref(Core.bundle.get("settings.frostscape-heat-overlay"), false, b -> { + heatOverlay.enabled = b; + }); + t.checkPref(Core.bundle.get("settings.frostscape-simple-lightning"), false, b -> { + simplifiedLightning = b; + }); + t.row(); + t.add(Core.bundle.get("settings.frostscape.flashingwarning")).wrap().left().growX().padTop(3); + }); + + */ + } + +} diff --git a/src/meld/world/CustomExplosions.java b/src/meld/world/CustomExplosions.java new file mode 100644 index 0000000..3d01a23 --- /dev/null +++ b/src/meld/world/CustomExplosions.java @@ -0,0 +1,44 @@ +package meld.world; + +import arc.Core; +import arc.Events; +import arc.math.Mathf; +import meld.content.MeldBullets; +import meld.content.MeldItems; +import mindustry.Vars; +import mindustry.game.EventType; +import mindustry.game.Team; +import mindustry.gen.Building; +import mindustry.gen.Teamc; + +public class CustomExplosions { + public static void load(){ + + Events.on(EventType.UnitDestroyEvent.class, e -> { + //We do a lil aspect bombing + if(e.unit.item() == MeldItems.aspectBomb){ + aspectBomb(e.unit.x, e.unit.y, e.unit.stack.amount, e.unit); + } + }); + + Events.on(EventType.BlockDestroyEvent.class, e -> { + //We do a lil aspect bombing + Building b = e.tile.build; + if(b.items != null && b.items.has(MeldItems.aspectBomb)){ + aspectBomb(b.x, b.y, b.items.get(MeldItems.aspectBomb), b); + } + }); + } + + public static void aspectBomb(float x, float y, float amount, Teamc owner){ + for(int i = 0; i < Mathf.floor(amount/50); i++){ + MeldBullets.aspectBombExplosion.create(owner, Team.derelict, x, y, 0); + } + for(int i = 0; i < Math.min(amount * 3, 24); i++){ + MeldBullets.bombShrapnel.create(owner, Team.derelict, x, y, Mathf.random(360)); + } + for(int i = 0; i < Math.min(amount * 2, 32); i++){ + MeldBullets.bombShrapnelAspect.create(owner, Team.derelict, x, y, Mathf.random(360)); + } + } +} diff --git a/src/meld/world/WeatherMath.java b/src/meld/world/WeatherMath.java new file mode 100644 index 0000000..f730336 --- /dev/null +++ b/src/meld/world/WeatherMath.java @@ -0,0 +1,26 @@ +package meld.world; + +import arc.math.geom.Vec2; +import arc.util.Tmp; +import mindustry.gen.Groups; +import mindustry.type.weather.ParticleWeather; + +public class WeatherMath { + public static Vec2 wind = new Vec2(); + + public static Vec2 windDirection(){ + return wind; + }; + + public static void updateWind(){ + Tmp.v1.set(0, 0); + Groups.weather.each(w -> { + if(!(w.weather instanceof ParticleWeather)) return; + ParticleWeather weather = (ParticleWeather) w.weather; + float speed = weather.force * w.intensity; + float windx = w.windVector.x * speed, windy = w.windVector.y * speed; + Tmp.v1.add(windx, windy); + }); + wind.lerpDelta(Tmp.v1, 0.1f); + } +} diff --git a/src/meld/world/WorldUtil.java b/src/meld/world/WorldUtil.java index e4f2daf..4a42173 100644 --- a/src/meld/world/WorldUtil.java +++ b/src/meld/world/WorldUtil.java @@ -3,19 +3,92 @@ import arc.func.Cons; import arc.math.Mathf; import arc.math.geom.Point2; +import arc.struct.ObjectFloatMap; +import arc.struct.ObjectMap; import arc.struct.Seq; +import arc.util.Log; import arc.util.Nullable; import arc.util.Tmp; +import meld.world.blocks.LiquidUtil; +import meld.world.blocks.production.GrindingQuary; +import mindustry.Vars; +import mindustry.content.Fx; +import mindustry.type.Item; +import mindustry.type.ItemStack; import mindustry.world.Block; import mindustry.world.Tile; import mindustry.world.meta.Attribute; +import mindustry.world.modules.ItemModule; import static mindustry.Vars.world; public class WorldUtil { + //Really useful for totalQuarry + static ItemModule module = new ItemModule(); + + static ObjectFloatMap speeds = new ObjectFloatMap<>(); + static Seq tempTiles = new Seq<>(); + public static ItemModule totalQuarry(int x1, int y1, int x2, int y2){ + module.clear(); + + for(int y = y1; y < y2; y++){ + for(int x = x1; x < x2; x++){ + Tile tile = world.tile(x, y); + if(tile == null) continue; + + GrindingQuary.GrinderEntry entry = GrindingQuary.grinderMap.get(tile.floor()); + + while (entry != null){ + for (ItemStack itemStack : entry.output) { + module.add(itemStack.item, itemStack.amount); + } + entry = GrindingQuary.grinderMap.get(entry.floor); + } + } + } + return module; + } + + public static ItemModule totalQuarry(float x, float y, Block block, boolean blockable){ + module.clear(); + + Tile startTile = world.tileWorld(x, y); + if(startTile == null) return module; + startTile.getLinkedTilesAs(block, (tile) -> { + if(tile == null || tile.solid() && blockable && tile.block() != block) return; + + GrindingQuary.GrinderEntry entry = GrindingQuary.grinderMap.get(tile.floor()); + + while (entry != null){ + for (ItemStack itemStack : entry.output) { + module.add(itemStack.item, itemStack.amount); + } + entry = GrindingQuary.grinderMap.get(entry.floor); + } + }); + + return module; + } + public static ObjectFloatMap quarrySpeed(float x, float y, GrindingQuary block){ + speeds.clear(); + + Tile startTile = world.tileWorld(x, y); + if(startTile == null) return speeds; + startTile.getLinkedTilesAs(block, (tile) -> { + if(tile == null) return; + Item item = tile.overlay().itemDrop; + if(item != null) speeds.put(item, speeds.get(item, 0) + block.drillSpeedOverlay(tile)); + + item = tile.floor().itemDrop; + if(item != null) speeds.put(item, speeds.get(item, 0) + block.drillSpeedFloor(tile)); + }); + + return speeds; + } + //Coppied from Block public static float sumAttribute(@Nullable Attribute attr, int x, int y){ if(attr == null) return 0; diff --git a/src/meld/world/blocks/CoreRaft.java b/src/meld/world/blocks/CoreRaft.java index 1903f71..bb1dcfb 100644 --- a/src/meld/world/blocks/CoreRaft.java +++ b/src/meld/world/blocks/CoreRaft.java @@ -8,6 +8,9 @@ import arc.util.Nullable; import arc.util.Time; import meld.content.MeldStatusEffects; +import meld.graphics.Draww; +import meld.graphics.MeldLayers; +import meld.graphics.MeldShaders; import meld.world.blocks.crafting.StorageIncinerator; import mindustry.Vars; import mindustry.content.Fx; @@ -49,22 +52,27 @@ public class CoreRaft extends CoreBlock { public CoreRaft(String name) { super(name); fogRadius = 40; + lightRadius = 720; + clipSize = 720; Events.on(EventType.WorldLoadEvent.class, e -> { rafts.clear(); Team.sharded.cores().each(c -> { if(c instanceof CoreRaftBuild raft) rafts.add(raft); }); }); + emitLight = true; } @Override public void init() { //Yknow I wish we had like a set defaults for this but nvm int f = fogRadius; + float l = lightRadius; super.init(); fogRadius = f; + lightRadius = l; } //Allow spawning at an offset @@ -117,7 +125,7 @@ public class CoreRaftBuild extends CoreBuild { @Override public void onProximityUpdate() { super.onProximityUpdate(); - incinerator= null; + incinerator = null; proximity.each(b -> { if(b instanceof Incinerator.IncineratorBuild || b instanceof ItemIncinerator.ItemIncineratorBuild || @@ -156,13 +164,12 @@ public void handleStack(Item item, int amount, Teamc source){ super.handleStack(item, realAmount, source); if(team == state.rules.defaultTeam && state.isCampaign()){ - if(!incinerate){ - state.rules.sector.info.handleCoreItem(item, amount); - } - - if(realAmount == 0 && wasVisible && canIncinerate){ + if(realAmount == 0 && incinerate){ incinerator.handleStack(item, amount, source); } + + state.rules.sector.info.handleCoreItem(item, amount); + } } @@ -214,6 +221,9 @@ public void draw() { Draw.color(Pal.accent); float layer = Draw.z(); Draw.z(Layer.buildBeam); + + Draww.drawSonar(x, y, fogRadius * tilesize - 2, 4, MeldLayers.sonar, Pal.accent); + Lines.circle(x, y, fogRadius * Vars.tilesize - 2); for (int i = 0; i < 1; i++) { float prog = ((Time.time + 200 * i) % 600) / 600; diff --git a/src/meld/world/blocks/SonarSpire.java b/src/meld/world/blocks/SonarSpire.java index 43e9cee..1f26f61 100644 --- a/src/meld/world/blocks/SonarSpire.java +++ b/src/meld/world/blocks/SonarSpire.java @@ -3,10 +3,14 @@ import arc.graphics.g2d.Draw; import arc.graphics.g2d.Lines; import arc.math.Interp; +import meld.graphics.Draww; +import meld.graphics.MeldLayers; import mindustry.Vars; import mindustry.content.StatusEffects; import mindustry.entities.Units; +import mindustry.graphics.Drawf; import mindustry.graphics.Layer; +import mindustry.graphics.Pal; import mindustry.type.StatusEffect; import static mindustry.Vars.tilesize; @@ -48,7 +52,17 @@ public float fogRadius() { @Override public void draw() { - super.draw(); + Draw.rect(region, x, y); + //I literally slapped this in + //Draww.drawChain(chain, x, y, Core.input.mouseWorldX(), Core.input.mouseWorldY(), 0); + + Draww.drawSonar(x, y, smoothRadius, 2, MeldLayers.sonar, ringColor); + Drawf.light(x, y, smoothRadius, Pal.accent, 1); + + //Charge visuals, not sure if im keeping them or not + Lines.arc(x, y, range, uptime/pulseDuration); + + Draw.color(Pal.accent); float charge = duration/pulseDuration; float chargeInv = 1 - charge; diff --git a/src/meld/world/blocks/consumers/ConsumeItemsBoost.java b/src/meld/world/blocks/consumers/ConsumeItemsBoost.java new file mode 100644 index 0000000..d9e300a --- /dev/null +++ b/src/meld/world/blocks/consumers/ConsumeItemsBoost.java @@ -0,0 +1,21 @@ +package meld.world.blocks.consumers; + +import mindustry.gen.Building; +import mindustry.type.ItemStack; +import mindustry.world.consumers.ConsumeItems; + +public class ConsumeItemsBoost extends ConsumeItems { + + public float boostAmount; + + public ConsumeItemsBoost(ItemStack[] items, float boostAmount){ + super(items); + this.boostAmount = boostAmount; + }; + + + @Override + public float efficiencyMultiplier(Building build) { + return boostAmount; + } +} diff --git a/src/meld/world/blocks/consumers/ConsumePowerRecipe.java b/src/meld/world/blocks/consumers/ConsumePowerRecipe.java new file mode 100644 index 0000000..792d023 --- /dev/null +++ b/src/meld/world/blocks/consumers/ConsumePowerRecipe.java @@ -0,0 +1,18 @@ +package meld.world.blocks.consumers; + +import arc.func.Floatf; +import meld.world.blocks.crafting.RecipeCrafter; +import mindustry.gen.Building; +import mindustry.world.consumers.ConsumePowerDynamic; + +public class ConsumePowerRecipe extends ConsumePowerDynamic { + public ConsumePowerRecipe() { + + super(b -> { + if(b instanceof RecipeCrafter.RecipeCrafterBuild r){ + return r.consPower != null ? r.consPower.requestedPower(b) : 0; + } + return 0; + }); + } +} diff --git a/src/meld/world/blocks/consumers/StupidConsumeAspects.java b/src/meld/world/blocks/consumers/StupidConsumeAspects.java index 0e63f1a..cd346a5 100644 --- a/src/meld/world/blocks/consumers/StupidConsumeAspects.java +++ b/src/meld/world/blocks/consumers/StupidConsumeAspects.java @@ -23,6 +23,8 @@ public class StupidConsumeAspects extends ConsumeLiquidFilter implements MeldGen //grab it from the group public AspectGroup group; + public float boostMultiplier = 1; + public StupidConsumeAspects(float amount, AspectGroup group){ super(); @@ -31,6 +33,10 @@ public StupidConsumeAspects(float amount, AspectGroup group){ filter = group.stats::containsKey; } + public StupidConsumeAspects(float amount, AspectGroup group, float boostMultiplier){ + this(amount, group); + this.boostMultiplier = boostMultiplier; + } private static Liquid currentBest; @@ -46,6 +52,7 @@ public void apply(Block block) { @Override public void update(Building build) { Liquid consumed = getConsumed(build); + if(consumed == null) return; build.liquids.remove(consumed, this.amount * build.edelta()/group.getDensity(consumed)); } @@ -79,7 +86,7 @@ public float efficiency(Building build) { @Override public float efficiencyMultiplier(Building build) { Liquid liq = this.getConsumed(build); - return liq == null ? 1 : group.getEfficiency(liq); + return liq == null ? 1 : group.getEfficiency(liq) * boostMultiplier; } @Override diff --git a/src/meld/world/blocks/crafting/RecipeCrafter.java b/src/meld/world/blocks/crafting/RecipeCrafter.java index 418cc10..e23f211 100644 --- a/src/meld/world/blocks/crafting/RecipeCrafter.java +++ b/src/meld/world/blocks/crafting/RecipeCrafter.java @@ -16,6 +16,7 @@ import mindustry.Vars; import mindustry.entities.units.BuildPlan; import mindustry.gen.Building; +import mindustry.graphics.Drawf; import mindustry.type.Item; import mindustry.type.ItemStack; import mindustry.type.Liquid; @@ -23,6 +24,7 @@ import mindustry.ui.Bar; import mindustry.world.Block; import mindustry.world.blocks.production.GenericCrafter; +import mindustry.world.consumers.ConsumePower; import mindustry.world.draw.DrawBlock; import mindustry.world.draw.DrawDefault; @@ -134,6 +136,8 @@ public void load(){ public class RecipeCrafterBuild extends Building{ + public ConsumePower consPower; + RecipeCrafter crafter; public TimedRecipe recipe = null; @@ -227,8 +231,13 @@ public void updateTile() { } public void findRecipe(){ + consPower = null; + recipe = recipes.find(r -> r.valid(crafter, this)); - if(recipe != null) last = recipes.indexOf(recipe); + if(recipe != null) { + last = recipes.indexOf(recipe); + consPower = (ConsumePower) recipe.consumers.find(r -> r instanceof ConsumePower); + } } diff --git a/src/meld/world/blocks/defense/FrictionPad.java b/src/meld/world/blocks/defense/FrictionPad.java new file mode 100644 index 0000000..43cf855 --- /dev/null +++ b/src/meld/world/blocks/defense/FrictionPad.java @@ -0,0 +1,51 @@ +package meld.world.blocks.defense; + +import arc.graphics.g2d.Draw; +import meld.content.MeldStatusEffects; +import meld.world.meta.BuildingPriority; +import mindustry.game.Team; +import mindustry.gen.Building; +import mindustry.gen.Unit; +import mindustry.gen.UnitEntity; +import mindustry.world.Block; +import mindustry.world.Tile; + +public class FrictionPad extends Block { + + public float wearDamage = 0.1f; + + public FrictionPad(String name) { + super(name); + update = true; + targetable = false; + underBullets = true; + hasShadow = false; + alwaysReplace = true; + priority = BuildingPriority.landmine; + } + + @Override + public boolean canPlaceOn(Tile tile, Team team, int rotation) { + return tile != null && tile.floor().isLiquid && !tile.floor().isDeep(); + } + + public class FrictionPadBuild extends Building { + + @Override + public void unitOn(Unit unit) { + super.unitOn(unit); + + if(unit.team != team) damageContinuous(wearDamage); + + unit.apply(MeldStatusEffects.stuck, 5); + unit.unapply(MeldStatusEffects.boosting); + } + + + @Override + public void draw() { + Draw.alpha(0.35f); + super.draw(); + } + } +} diff --git a/src/meld/world/blocks/defense/LakeRim.java b/src/meld/world/blocks/defense/LakeRim.java new file mode 100644 index 0000000..4be9ae6 --- /dev/null +++ b/src/meld/world/blocks/defense/LakeRim.java @@ -0,0 +1,25 @@ +package meld.world.blocks.defense; + +import arc.math.geom.Geometry; +import arc.math.geom.Point2; +import mindustry.game.Team; +import mindustry.world.Tile; +import mindustry.world.blocks.defense.Door; + +public class LakeRim extends Door { + public LakeRim(String name) { + super(name); + } + + //Placeable on tiles which are nearby liquids, but aren't liquids themselves + @Override + public boolean canPlaceOn(Tile tile, Team team, int rotation) { + if(tile == null || tile.floor().isLiquid) return false; + + for (Point2 offset : Geometry.d8) { + Tile nearby = tile.nearby(offset.x, offset.y); + if(nearby.floor().isLiquid) return true; + } + return false; + } +} diff --git a/src/meld/world/blocks/defense/TreeWall.java b/src/meld/world/blocks/defense/TreeWall.java new file mode 100644 index 0000000..c4e5f97 --- /dev/null +++ b/src/meld/world/blocks/defense/TreeWall.java @@ -0,0 +1,65 @@ +package meld.world.blocks.defense; + +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import arc.util.Tmp; +import meld.content.MeldStatusEffects; +import mindustry.gen.Unit; +import mindustry.world.Tile; +import mindustry.world.blocks.defense.Wall; +import mindustry.world.blocks.environment.StaticWall; + +import static mindustry.Vars.tilesize; + +public class TreeWall extends Wall { + + public TreeWall(String name) { + super(name); + drawTeamOverlay = false; + } + + @Override + public int minimapColor(Tile tile) { + return mapColor.rgba(); + } + + public class TreeBuild extends WallBuild{ + + @Override + public void unitOn(Unit unit) { + super.unitOn(unit); + unit.apply(MeldStatusEffects.stuck, 30); + } + + public void draw(){ + TextureRegion reg = variants > 0 ? variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))] : region; + + TextureRegion r = Tmp.tr1; + r.set(reg); + int crop = (r.width - tilesize*4) / 2; + float ox = 0; + float oy = 0; + + for(int i = 0; i < 4; i++){ + if(tile.nearby(i) != null && tile.nearby(i).block().solid){ + + if(i == 0){ + r.setWidth(r.width - crop); + ox -= crop /2f; + }else if(i == 1){ + r.setY(r.getY() + crop); + oy -= crop /2f; + }else if(i == 2){ + r.setX(r.getX() + crop); + ox += crop /2f; + }else{ + r.setHeight(r.height - crop); + oy += crop /2f; + } + } + } + Draw.rect(r, tile.drawx() + ox * Draw.scl, tile.drawy() + oy * Draw.scl); + } + } +} diff --git a/src/meld/world/blocks/env/ModdedOreBlock.java b/src/meld/world/blocks/env/ModdedOreBlock.java new file mode 100644 index 0000000..cddba1a --- /dev/null +++ b/src/meld/world/blocks/env/ModdedOreBlock.java @@ -0,0 +1,27 @@ +package meld.world.blocks.env; + +import arc.graphics.Color; +import mindustry.type.Item; +import mindustry.world.blocks.environment.OreBlock; + +public class ModdedOreBlock extends OreBlock { + + public boolean setDefaults = true; + + public ModdedOreBlock(String name, Item ore) { + super(name, ore); + setDefaults = false; + } + + @Override + public void setup(Item ore) { + if(!setDefaults){ + Color mapCol = new Color(mapColor); + super.setup(ore); + mapColor = mapCol; + + return; + } + super.setup(ore); + } +} diff --git a/src/meld/world/blocks/env/SupportPillar.java b/src/meld/world/blocks/env/SupportPillar.java new file mode 100644 index 0000000..7efce0e --- /dev/null +++ b/src/meld/world/blocks/env/SupportPillar.java @@ -0,0 +1,82 @@ +package meld.world.blocks.env; + +import arc.graphics.Color; +import arc.graphics.g2d.Fill; +import arc.util.Tmp; +import arc.util.io.Reads; +import arc.util.io.Writes; +import meld.graphics.MeldLightRenderer; +import mindustry.Vars; +import mindustry.gen.Building; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.power.LightBlock; + +public class SupportPillar extends Block { + + public SupportPillar(String name) { + super(name); + solid = true; + hasShadow = false; + update = true; + drawTeamOverlay = false; + clipSize = 5000; + forceDark = true; + } + + + @Override + public int minimapColor(Tile tile) { + return mapColor.rgba(); + } + + @Override + public boolean canBreak(Tile tile) { + return Vars.state.isEditor(); + } + + public class SupportPillarBuild extends Building{ + public float radius = 0; + public float outerShade = 0.1f; + public int color, outerColor; + + @Override + public void damage(float damage) { + + } + + @Override + public void draw() { + super.draw(); + MeldLightRenderer.thingo.shadow(() -> { + Fill.light(x, y, 20, radius, Tmp.c1.set(color), Tmp.c2.set(outerColor)); + }); + } + + public void setColor(Color col){ + color = col.rgba(); + } + + public void setColorOuter(Color col){ + outerColor = col.rgba(); + } + + @Override + public void write(Writes write) { + super.write(write); + write.f(radius); + + write.i(color); + write.i(outerColor); + } + + @Override + public void read(Reads read, byte revision) { + super.read(read, revision); + radius = read.f(); + + color = read.i(); + outerColor = read.i(); + } + } +} diff --git a/src/meld/world/blocks/fluid/AspectBomb.java b/src/meld/world/blocks/fluid/AspectBomb.java new file mode 100644 index 0000000..ba73d34 --- /dev/null +++ b/src/meld/world/blocks/fluid/AspectBomb.java @@ -0,0 +1,39 @@ +package meld.world.blocks.fluid; + +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.g2d.Lines; +import arc.math.Mathf; +import arc.util.Tmp; +import meld.Meld; +import meld.content.MeldBullets; +import meld.content.MeldLiquids; +import meld.entities.bullet.TransitionBulletType; +import mindustry.content.Fx; +import mindustry.entities.Effect; +import mindustry.entities.bullet.BasicBulletType; +import mindustry.entities.bullet.LiquidBulletType; +import mindustry.graphics.Drawf; + +public class AspectBomb extends VisualAspectPipe{ + public AspectBomb(String name) { + super(name); + buildTime = 0; + rebuildable = true; + + destroyBullet = MeldBullets.aspectBombExplosion; + destroyBulletSameTeam = false; + } + + public float pressureDamage = 5f; + public float explosionPressure = 0.5f; + + public class AspectBombBuild extends VisualPipeBuild{ + @Override + public void updateTile() { + super.updateTile(); + if(liquids.currentAmount()/liquidCapacity > explosionPressure) damageContinuousPierce(pressureDamage); + } + } +} diff --git a/src/meld/world/blocks/fluid/AspectPipe.java b/src/meld/world/blocks/fluid/AspectPipe.java index 8b0e747..5a810e8 100644 --- a/src/meld/world/blocks/fluid/AspectPipe.java +++ b/src/meld/world/blocks/fluid/AspectPipe.java @@ -1,5 +1,7 @@ package meld.world.blocks.fluid; +import arc.Core; +import arc.graphics.g2d.TextureRegion; import arc.math.Mathf; import arc.math.geom.Geometry; import arc.struct.Seq; @@ -9,6 +11,7 @@ import meld.world.blocks.crafting.ModularCrafter; import meld.world.blocks.crafting.RecipeCrafter; import mindustry.Vars; +import mindustry.content.Fx; import mindustry.game.Team; import mindustry.gen.Building; import mindustry.type.Liquid; @@ -31,6 +34,11 @@ public AspectPipe(String name) { super(name); } + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{botRegions[0], topRegions[0]}; + } + @Override public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock) { return super.blends(tile, rotation, otherx, othery, otherrot, otherblock) || (otherblock.hasLiquids && !(otherblock instanceof Conduit || otherblock instanceof LiquidRouter) && outletMapping.values().toSeq().find(l -> otherblock.consumesLiquid(l)) != null); @@ -47,11 +55,10 @@ public void updateTile() { lastMoved = moveLiquidForward(leaks, this.liquids.current()); this.noSleep(); - //Attempt to push liquids to the sides - for(int i = 0; i < 2; i++){ - //get the tile above and below the current pipe, accounting for rotation - Tile t = Vars.world.tile(tile.x + Geometry.d4(1 + i * 2 + rotation).x, tile.y + Geometry.d4(1 + i * 2 + rotation).y); - + //Attempt to push liquids to the sides & back + for(int i = 0; i < 3; i++){ + //get the tile above, below and behind the current pipe, accounting for rotation + Tile t = Vars.world.tile(tile.x + Geometry.d4(1 + i + rotation).x, tile.y + Geometry.d4(1 + i + rotation).y); if(t == null || t.build == null || !t.build.block.hasLiquids || t.build.liquids == null || (!(t.build.block instanceof RecipeCrafter || t.build.block instanceof ModularCrafter) && t.build.block.consumers.length == 0)) continue; moveLiquid(t.build, liquids.current()); } @@ -106,7 +113,7 @@ public float moveLiquid(Building other, Liquid liquid) { float flow = Math.min(other.block.liquidCapacity - other.liquids.get(liquid), amount) * 10; if (other.acceptLiquid(this, liquid)) { other.handleLiquid(this, liquid, flow); - this.liquids.remove(original, flow/AspectGroup.aether.getDensity(liquid)/10/AspectGroup.aether.getEfficiency(liquid)); + this.liquids.remove(original, flow/AspectGroup.aether.getDensity(liquid)/10); total += amount; } diff --git a/src/meld/world/blocks/io/BlockIO.java b/src/meld/world/blocks/io/BlockIO.java new file mode 100644 index 0000000..00511da --- /dev/null +++ b/src/meld/world/blocks/io/BlockIO.java @@ -0,0 +1,29 @@ +package meld.world.blocks.io; + +import arc.struct.ObjectFloatMap; +import arc.util.io.Reads; +import arc.util.io.Writes; +import mindustry.Vars; +import mindustry.type.Item; + +public class BlockIO { + + public static void writeItemMap(ObjectFloatMap itemValues, Writes write){ + write.i(itemValues.size); + for (ObjectFloatMap.Entry itemValue : itemValues) { + write.str(itemValue.key.name); + write.f(itemValue.value); + } + } + + public static ObjectFloatMap readItemMap(Reads reads){ + int size = reads.i(); + ObjectFloatMap output = new ObjectFloatMap<>(); + for(int i = 0; i < size; i++){ + Item item = Vars.content.item(reads.str()); + float value = reads.f(); + if(item != null) output.put(item, value); + } + return output; + } +} diff --git a/src/meld/world/blocks/power/ConsumeThermal.java b/src/meld/world/blocks/power/ConsumeThermal.java new file mode 100644 index 0000000..1ec1914 --- /dev/null +++ b/src/meld/world/blocks/power/ConsumeThermal.java @@ -0,0 +1,29 @@ +package meld.world.blocks.power; + +import mindustry.world.blocks.power.ThermalGenerator; +import mindustry.world.consumers.Consume; + +public class ConsumeThermal extends ThermalGenerator { + public ConsumeThermal(String name) { + super(name); + } + + public class ConsumeThermalBuild extends ThermalGeneratorBuild{ + + float consBoost = 1; + + @Override + public void updateTile() { + super.updateTile(); + consBoost = 1; + for (Consume consumer : consumers) { + consBoost *= consumer.efficiencyMultiplier(this); + } + } + + @Override + public float getPowerProduction() { + return enabled ? powerProduction * productionEfficiency * efficiency * consBoost : 0f; + } + } +} diff --git a/src/meld/world/blocks/production/Depot.java b/src/meld/world/blocks/production/Depot.java new file mode 100644 index 0000000..c0b39f2 --- /dev/null +++ b/src/meld/world/blocks/production/Depot.java @@ -0,0 +1,137 @@ +package meld.world.blocks.production; + +import arc.Core; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import arc.scene.ui.layout.Table; +import arc.struct.EnumSet; +import arc.util.io.Reads; +import arc.util.io.Writes; +import mindustry.content.Blocks; +import mindustry.gen.Building; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.ItemSelection; +import mindustry.world.blocks.distribution.Router; +import mindustry.world.blocks.storage.StorageBlock; +import mindustry.world.blocks.storage.Unloader; +import mindustry.world.meta.BlockFlag; +import mindustry.world.meta.BlockGroup; +import mindustry.world.meta.Env; + +import static mindustry.Vars.content; + +//A container which outputs only to distribution blocks, helping to filter outputs +public class Depot extends StorageBlock { + public TextureRegion centerRegion; + + public float speed = 1f; + + public Depot(String name) { + super(name); + update = true; + hasItems = true; + configurable = true; + saveConfig = true; + itemCapacity = 0; + noUpdateDisabled = true; + clearOnDoubleTap = true; + unloadable = false; + + config(Item.class, (DepotBuild tile, Item item) -> tile.sortItem = item); + configClear((DepotBuild tile) -> tile.sortItem = null); + } + + @Override + public boolean outputsItems(){ + return true; + } + + @Override + public void load() { + super.load(); + centerRegion = Core.atlas.find(name + "-center"); + } + + public class DepotBuild extends StorageBuild{ + public float time; + public Item sortItem = null; + public Item lastItem; + public Tile lastInput; + + @Override + public void buildConfiguration(Table table){ + ItemSelection.buildTable(block, table, content.items(), () -> sortItem, this::configure, selectionRows, selectionColumns); + } + + @Override + public Item config(){ + return sortItem; + } + + + @Override + public void updateTile(){ + if(lastItem == null && items.any()){ + //branching just for the sake of my sanity here + if(sortItem == null || sortItem == items.first()) lastItem = items.first(); + } + + if(lastItem != null){ + time += 1f / speed * delta(); + Building target = getTileTarget(lastItem, lastInput, false); + + if(target != null && (time >= 1f || !(target.block instanceof Router || target.block.instantTransfer))){ + getTileTarget(lastItem, lastInput, true); + target.handleItem(this, lastItem); + items.remove(lastItem, 1); + lastItem = null; + } + } + } + + public Building getTileTarget(Item item, Tile from, boolean set){ + int counter = rotation; + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get((i + counter) % proximity.size); + if(set) rotation = ((byte)((rotation + 1) % proximity.size)); + if(other.tile == from && from.block() == Blocks.overflowGate) continue; + if(other.acceptItem(this, item)){ + return other; + } + } + return null; + } + + @Override + public void draw(){ + super.draw(); + + Draw.color(sortItem == null ? Color.clear : sortItem.color); + Draw.rect(centerRegion, x, y); + Draw.color(); + } + + @Override + public void drawSelect(){ + super.drawSelect(); + drawItemSelection(sortItem); + } + + @Override + public void write(Writes write){ + super.write(write); + write.s(sortItem == null ? -1 : sortItem.id); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + int id = read.s(); + sortItem = id == -1 ? null : content.item(id); + } + } +} diff --git a/src/meld/world/blocks/production/GrindingQuary.java b/src/meld/world/blocks/production/GrindingQuary.java new file mode 100644 index 0000000..58e6dce --- /dev/null +++ b/src/meld/world/blocks/production/GrindingQuary.java @@ -0,0 +1,316 @@ +package meld.world.blocks.production; + +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Fill; +import arc.graphics.g2d.Lines; +import arc.math.Mathf; +import arc.struct.ObjectFloatMap; +import arc.struct.ObjectMap; +import arc.struct.Seq; +import arc.util.Log; +import arc.util.Time; +import arc.util.io.Reads; +import arc.util.io.Writes; +import meld.graphics.Draww; +import meld.world.WorldUtil; +import meld.world.blocks.io.BlockIO; +import meld.world.util.ItemLogic; +import mindustry.Vars; +import mindustry.gen.Building; +import mindustry.graphics.Drawf; +import mindustry.graphics.Pal; +import mindustry.type.Item; +import mindustry.type.ItemStack; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.environment.Floor; +import mindustry.world.blocks.storage.StorageBlock; +import mindustry.world.consumers.Consume; +import mindustry.world.modules.ItemModule; + +public class GrindingQuary extends Block { + + public static ObjectMap grinderMap = new ObjectMap<>(); + + public static ObjectFloatMap drillMultipliers = new ObjectFloatMap<>(); + + public float drillSpeed = 0.25f; + + public int targetTimer = timers++; + + public float itemDuration = 60; + + public GrindingQuary(String name) { + super(name); + update = true; + solid = true; + hasItems = true; + itemCapacity = 50; + } + + public Seq valid = new Seq<>(), overlay = new Seq<>(); + + @Override + public void drawOverlay(float x, float y, int rotation) { + super.drawOverlay(x, y, rotation); + + float drawx = x, drawy = y - (size * Vars.tilesize)/2f - 2; + + Tile start = Vars.world.tileWorld(x, y); + + if(start != null){ + valid.clear(); + overlay.clear(); + start.getLinkedTilesAs(this, tile -> { + if(tile != null){ + if(tile.solid() && tile.block() != this){ + Draw.color(Pal.health); + Draw.alpha(0.5f); + Fill.square(tile.worldx(), tile.worldy(), Vars.tilesize/2f); + return; + } + if(grinderMap.containsKey(tile.floor())){ + valid.add(tile); + } + if(tile.overlay().itemDrop != null){ + overlay.add(tile); + } + } + }); + //Draw this in stages + valid.each(tile -> { + Draw.color(Pal.accent); + Draw.alpha(0.5f); + Fill.square(tile.worldx(), tile.worldy(), Vars.tilesize/2f); + + }); + + Lines.stroke(3.75f, Pal.gray); + Lines.square(x, y, size * Vars.tilesize/2f + 1.25f); + Lines.stroke(1.25f, Pal.accent); + Lines.square(x, y, size * Vars.tilesize/2f); + + valid.each(tile -> { + Draw.color(Color.white); + float prog = Mathf.absin(Time.time/30 + (tile.x + tile.y) * Mathf.pi/3, 1, 1); + float prog2 = Time.time/240 + (tile.x + tile.y) * Mathf.pi % 1; + Draw.alpha(0.5f + 0.5f * prog); + Draw.rect(tile.floor().region, tile.worldx(), tile.worldy() -2 + prog * 4, 4 + 4 * prog, 4 + 4 * Mathf.sin(prog), -15 + 30 * prog + 360 * prog2); + }); + overlay.each(tile -> { + if(tile.overlay().itemDrop != null){ + Draw.color(Color.white); + Draw.rect(tile.overlay().itemDrop.fullIcon, tile.worldx(), tile.worldy()); + } + }); + } + + Drawf.text(); + ItemModule depositItems = WorldUtil.totalQuarry(x, y, this, true); + for (Item item : Vars.content.items()) { + float amount = depositItems.get(item); + if(amount == 0) continue; + Draww.itemText(item.localizedName + ": " + amount, drawx, drawy, item); + + drawy -= 10; + } + + drawy = y + (size * Vars.tilesize)/2f + 2; + ObjectFloatMap drillSpeeds = WorldUtil.quarrySpeed(x, y, this); + for (Item item : Vars.content.items()) { + float amount = drillSpeeds.get(item, 0); + if(amount == 0) continue; + Draww.itemText(item.localizedName + ": " + amount + "/s", drawx, drawy, item); + + drawy += 10; + } + } + + public static class GrinderEntry{ + + public GrinderEntry(float time, Block tile){ + this(time, tile.asFloor()); + } + + public GrinderEntry(float time, Floor floor){ + this.time = time; + this.floor = floor; + } + + public GrinderEntry(float time, Floor floor, ItemStack[] output){ + this.time = time; + this.floor = floor; + this.output = output; + } + + public float time; + public Floor floor; + public ItemStack[] output; + } + + //Returned in items/seccond + public float drillSpeedFloor(Tile tile){ + if(tile == null || tile.floor().itemDrop == null) return 0; + return drillMultipliers.get(tile.floor().itemDrop, 1) * drillSpeed; + } + public float drillSpeedOverlay(Tile tile){ + if(tile == null || tile.overlay().itemDrop == null) return 0; + return drillMultipliers.get(tile.overlay().itemDrop, 1) * drillSpeed; + } + + public class GrindingQuaryBuild extends Building{ + public float time = 0; + public Tile target = null; + public GrinderEntry entry; + public float boostAmount = 1; + + public Seq nearbyDepots = new Seq<>(); + + @Override + public void onProximityAdded() { + super.onProximityAdded(); + } + + //Timer used to determine when the current batch of items expires + public float progress = 0; + + public ObjectFloatMap drillTimers = new ObjectFloatMap<>(), itemRates = new ObjectFloatMap<>(); + + @Override + public boolean shouldConsume() { + for (Item key : itemRates.keys()) { + if(itemRates.get(key, 0) * drillMultipliers.get(key, 1) > 0 && acceptItem(this, key)) return true; + } + return target != null; + } + + @Override + public void update(){ + super.update(); + updateDrilling(); + dump(); + + progress += Time.delta/itemDuration; + if(progress >= 1){ + progress %= 1; + boostAmount = 1; + for (Consume consumer : consumers) { + if(consumer.booster && consumer.optional && consumer.efficiency(this) > 0) boostAmount *= consumer.efficiencyMultiplier(this); + consumer.trigger(this); + } + } + } + + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + + nearbyDepots.clear(); + proximity.each(b -> { + if(b instanceof Depot.DepotBuild) nearbyDepots.add(b); + }); + + itemRates.clear(); + + tile.getLinkedTiles(t -> { + //We check both the floor and the overlay here + float productivity = drillSpeedFloor(t); + if(productivity > 0) { + Item output = t.floor().itemDrop; + float value = itemRates.get(output, 0); + itemRates.put(output, value + productivity); + } + + productivity = drillSpeedOverlay(t); + if(productivity > 0) { + Item output = t.overlay().itemDrop; + + float value = itemRates.get(output, 0); + itemRates.put(output, value + productivity); + } + }); + } + + @Override + public boolean acceptItem(Building source, Item item) { + if((source instanceof Depot.DepotBuild)) return false; + if(source == this){ + return nearbyDepots.size > 0 ? nearbyDepots.find(b -> b.acceptItem(source, item)) != null : this.items.get(item) < this.getMaximumAccepted(item); + } + return this.block.consumesItem(item) && this.items.get(item) < this.getMaximumAccepted(item); + } + + @Override + public void handleItem(Building source, Item item) { + if(source == this && nearbyDepots.size > 0){ + nearbyDepots.find(b -> b.acceptItem(source, item)).handleItem(source, item); + return; + } + super.handleItem(source, item); + } + + public void updateDrilling(){ + + for(Item item: itemRates.keys().toArray()){ + float current = drillTimers.get(item, 0); + //Note that productionRates is in items/SECCOND, not tick, so we divide by 60 + current = Mathf.clamp(current + itemRates.get(item, 0)/60f * drillMultipliers.get(item, 1) * edelta() * boostAmount, 0, 1); + + if(current >= 1 && acceptItem(this, item)){ + current = 0; + handleItem(this, item); + } + + drillTimers.put(item, current); + } + + if(target == null && findTarget() == null) { + time = 0; + return; + } + + if(entry.output == null || ItemLogic.capacity(entry.output, this)){ + time += edelta(); + + //Reset the target tile after we're done + if(time >= entry.time) { + if(entry.output != null) ItemLogic.addStacks(entry.output, this); + target.setFloor(entry.floor); + time = 0; + target = null; + } + } + } + + public Tile findTarget(){ + entry = null; + target = null; + + if(timer.get(targetTimer, 5)) tile.getLinkedTiles(t -> { + GrinderEntry tileEntry = grinderMap.get(t.floor()); + if(tileEntry == null) return; + + target = t; + entry = tileEntry; + }); + return target; + } + + @Override + public void write(Writes write) { + super.write(write); + write.f(progress); + write.f(time); + BlockIO.writeItemMap(drillTimers, write); + } + + @Override + public void read(Reads read, byte revision) { + super.read(read, revision); + progress = read.f(); + time = read.f(); + drillTimers = BlockIO.readItemMap(read); + } + } +} diff --git a/src/meld/world/blocks/production/SingleBeamDrill.java b/src/meld/world/blocks/production/SingleBeamDrill.java index faadb00..1864ebf 100644 --- a/src/meld/world/blocks/production/SingleBeamDrill.java +++ b/src/meld/world/blocks/production/SingleBeamDrill.java @@ -1,6 +1,8 @@ package meld.world.blocks.production; import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Lines; import arc.math.Mathf; import arc.math.geom.Geometry; import arc.math.geom.Point2; @@ -13,6 +15,7 @@ import arc.util.io.Reads; import arc.util.io.Writes; import meld.content.MeldBullets; +import meld.graphics.Draww; import mindustry.Vars; import mindustry.content.Fx; import mindustry.entities.Damage; @@ -20,13 +23,19 @@ import mindustry.entities.bullet.BulletType; import mindustry.game.Team; import mindustry.gen.Building; +import mindustry.gen.Icon; import mindustry.gen.Sounds; +import mindustry.graphics.Drawf; +import mindustry.graphics.Pal; import mindustry.type.Item; import mindustry.world.Block; import mindustry.world.Tile; import mindustry.world.blocks.production.BeamDrill; +import mindustry.world.blocks.production.Drill; import mindustry.world.meta.BlockFlag; +import static mindustry.Vars.iconSmall; + //HAS TO be an odd number in size. public class SingleBeamDrill extends Block { @@ -65,6 +74,55 @@ public SingleBeamDrill(String name) { selfDamage = 400; } + @Override + public void drawOverlay(float x, float y, int rotation) { + Item found = null; + int unusedTiles = range + 1; + + int offset = (size + 1)/2; + Point2 dir = Geometry.d4(rotation); + + int tx = (int) x/Vars.tilesize, ty = (int) y/Vars.tilesize; + Tile other = null; + + for(int i = 0; i < range; i++) { + unusedTiles--; + int j = i + offset; + other = Vars.world.tile(tx + dir.x * j, ty + dir.y * j); + if(other.solid()){ + found = other.block().itemDrop; + int mined = (int)((baseProductivity + distanceProductivity * unusedTiles) * itemMultipliers.get(found, 1)); + + if(found != null){ + Item current = transformItems.get(found, found); + Draww.itemText(mined/drillTime * 60 + " " + current.localizedName + "/s", x, y + Vars.tilesize * size/2f, current); + if(found != current){ + float drawy = y - Vars.tilesize * size/2f; + float s = iconSmall / 4f; + float textWidth = Draww.drawTextUnderlined("->", x, drawy, Pal.accent); + Draw.mixcol(Color.darkGray, 1f); + Draw.rect(found.fullIcon, x - textWidth, drawy - 1, s, s); + Draw.rect(current.fullIcon, x + textWidth, drawy - 1, s, s); + Draw.mixcol(); + Draw.rect(found.fullIcon, x - textWidth, drawy, s, s); + Draw.rect(current.fullIcon, x + textWidth, drawy, s, s); + } + } + + Lines.stroke(3); + Draw.color(Pal.gray); + Lines.square(other.worldx(), other.worldy(), Vars.tilesize/2f + 2 + 1); + Lines.stroke(1); + Draw.color(Pal.accent); + Lines.square(other.worldx(), other.worldy(), Vars.tilesize/2f + 2); + + Drawf.dashLine(Pal.accent, x, y, other.worldx(), other.worldy()); + return; + } + } + Drawf.dashLine(Pal.accent, x, y, x + dir.x * range * Vars.tilesize, y + dir.y * range * Vars.tilesize); + } + public class SingleBeamBuild extends Building{ public float time; diff --git a/src/meld/world/blocks/turrets/MeldItemTurret.java b/src/meld/world/blocks/turrets/MeldItemTurret.java new file mode 100644 index 0000000..9c361e7 --- /dev/null +++ b/src/meld/world/blocks/turrets/MeldItemTurret.java @@ -0,0 +1,20 @@ +package meld.world.blocks.turrets; + +import arc.graphics.g2d.Draw; +import arc.util.Log; +import mindustry.graphics.Drawf; +import mindustry.graphics.Layer; +import mindustry.graphics.Pal; +import mindustry.world.blocks.defense.turrets.ItemTurret; + +import static mindustry.Vars.state; +import static mindustry.Vars.tilesize; + +public class MeldItemTurret extends ItemTurret { + + public float layer = 0; + + public MeldItemTurret(String name) { + super(name); + } +} diff --git a/src/meld/world/blocks/units/LaunchStation.java b/src/meld/world/blocks/units/LaunchStation.java new file mode 100644 index 0000000..cd7c7d2 --- /dev/null +++ b/src/meld/world/blocks/units/LaunchStation.java @@ -0,0 +1,184 @@ +package meld.world.blocks.units; + +import arc.Core; +import arc.graphics.Blending; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Lines; +import arc.graphics.g2d.TextureRegion; +import arc.math.Mathf; +import arc.util.Eachable; +import arc.util.Log; +import arc.util.Tmp; +import arc.util.io.Reads; +import arc.util.io.Writes; +import meld.content.MeldStatusEffects; +import meld.world.blocks.SonarSpire; +import mindustry.Vars; +import mindustry.entities.Units; +import mindustry.entities.units.BuildPlan; +import mindustry.gen.Building; +import mindustry.gen.Groups; +import mindustry.gen.Unit; +import mindustry.graphics.Drawf; +import mindustry.graphics.Layer; +import mindustry.graphics.Pal; +import mindustry.world.Block; +import mindustry.world.blocks.production.BeamDrill; + +import static mindustry.Vars.player; + +public class LaunchStation extends Block { + + public float range = 48; + public float launchRange = -1; + + public float dragForce = 160; + + public TextureRegion flippedRegion, rangeRegion, glowRegion, baseRegion, launcherShadow; + + public float chargeRate = 1/60f/3f, chargeCost = 1; + + public float maxSize = 24; + + public float statusDuration = 30; + + public LaunchStation(String name) { + super(name); + update = true; + solid = false; + rotate = true; + quickRotate = true; + + liquidCapacity = 500; + } + + @Override + public void load() { + super.load(); + flippedRegion = Core.atlas.find(name + "-flipped"); + rangeRegion = Core.atlas.find(name + "-base-range"); + glowRegion = Core.atlas.find(name + "-glow"); + baseRegion = Core.atlas.find(name + "-base"); + launcherShadow = Core.atlas.find(name + "-launcher-shadow"); + } + + @Override + protected TextureRegion[] icons() { + return new TextureRegion[]{baseRegion, launcherShadow, region}; + } + + @Override + public void drawPlanRegion(BuildPlan plan, Eachable list){ + float x = plan.drawx(), y = plan.drawy(); + float rot = plan.rotation * 90; + + Draw.z(Layer.blockUnder); + Draw.rect(rangeRegion, x, y); + Draw.z(Layer.blockUnder + 0.1f); + Draw.rect(baseRegion, x, y); + Draw.rect(launcherShadow, x, y, rot); + + Draw.z(Layer.block); + Draw.rect((plan.rotation + 1) % 4 > 1 ? flippedRegion : region, x, y, rot); + + Drawf.dashLine(Pal.accent, Tmp.v1.set(x, y).x, y, Tmp.v1.add(Tmp.v2.trns(rot, statusDuration * 7)).x, Tmp.v1.y, (int) Tmp.v2.len()/Vars.tilesize); + } + + @Override + public void drawOverlay(float x, float y, int rotation) { + super.drawOverlay(x, y, rotation); + + Drawf.dashLine(Pal.accent, Tmp.v1.set(x, y).x, y, Tmp.v1.add(Tmp.v2.trns(rotation * 90, statusDuration * 7)).x, Tmp.v1.y, (int) Tmp.v2.len()/Vars.tilesize); + } + + @Override + public void init() { + super.init(); + if(launchRange == -1) launchRange = size/2f * Vars.tilesize + 4; + } + + public class LaunchStationBuild extends Building{ + + public float charge = 0; + public float warmup = 0; + + @Override + public boolean shouldConsume() { + return super.shouldConsume() && charge < 1; + } + + @Override + public void update() { + super.update(); + + warmup = Mathf.lerpDelta(warmup, charge >= chargeCost ? 1 : 0, charge >= chargeCost ? 0.01f : 0.05f); + + charge = Mathf.clamp(charge + edelta() * chargeRate, 0, 1); + + if(charge >= chargeCost && warmup > 0.5f) Groups.unit.intersect(x - range, y - range, range * 2, range * 2, target -> { + + if(charge < chargeCost || !target.isValid() || !within(target, range) || target.hasEffect(MeldStatusEffects.boostingIframes) || target.hitSize() > maxSize) return; + + float prog = dst(target)/range; + if(!target.hasEffect(MeldStatusEffects.stuck))target.impulse(Tmp.v1.trns(target.angleTo(this), Mathf.lerp(dragForce * 0.5f, dragForce, prog * prog))); + + if(within(target, launchRange)){ + charge -= chargeCost; + if(!target.hasEffect(MeldStatusEffects.boosting)) target.set(this.x, this.y); + target.rotation = rotation * 90; + target.apply(MeldStatusEffects.boosting, statusDuration); + target.apply(MeldStatusEffects.boostingIframes, 5); + target.vel.trns(target.rotation, target.vel.len()); + } + + }); + } + + @Override + public void drawSelect() { + super.drawSelect(); + Draw.z(Layer.overlayUI); + Drawf.dashLine(Pal.accent, Tmp.v1.set(x, y).x, y, Tmp.v1.add(Tmp.v2.trns(drawrot(), statusDuration * 7)).x, Tmp.v1.y, (int) Tmp.v2.len()/Vars.tilesize); + } + + @Override + public void draw() { + Draw.z(Layer.blockUnder); + Draw.rect(rangeRegion, x, y); + Draw.z(Layer.blockUnder + 0.1f); + Draw.rect(baseRegion, x, y); + Draw.rect(launcherShadow, x, y, drawrot()); + + Draw.z(Layer.block); + Draw.rect((rotation + 1) % 4 > 1 ? flippedRegion : block.region, x, y, drawrot()); + + Draw.blend(Blending.additive); + Draw.color(Pal.accent); + + float a = (Mathf.absin(10, 0.5f) + 0.5f) * warmup; + + Draw.alpha(a); + Draw.rect(glowRegion, x, y, drawrot()); + + Draw.z(Layer.effect); + Draw.alpha(a/2); + Draw.rect(glowRegion, x, y, drawrot()); + + Draw.blend(); + } + + @Override + public void write(Writes write) { + super.write(write); + write.f(charge); + write.f(warmup); + } + + @Override + public void read(Reads read, byte revision) { + super.read(read, revision); + charge = read.f(); + warmup = read.f(); + } + } +} diff --git a/src/meld/world/blocks/units/UnitLogisticsPad.java b/src/meld/world/blocks/units/UnitLogisticsPad.java new file mode 100644 index 0000000..c898d42 --- /dev/null +++ b/src/meld/world/blocks/units/UnitLogisticsPad.java @@ -0,0 +1,235 @@ +package meld.world.blocks.units; + +import arc.Core; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.Mathf; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import arc.util.pooling.Pool.*; +import mindustry.Vars; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.graphics.Drawf; +import mindustry.graphics.Pal; +import mindustry.input.DesktopInput; +import mindustry.input.InputHandler; +import mindustry.type.*; +import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.storage.CoreBlock; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; + +//Attempts to load balance a specific item on a unit to a specific amount, managing the items from a nearby storage +public class UnitLogisticsPad extends Block { + + public TextureRegion centerRegion; + + @Override + public void load() { + super.load(); + centerRegion = Core.atlas.find(name + "-center", Core.atlas.find("unloader-center")); + } + + public float speed = 1f; + public float range = -1; + + /** Cached result of content.items() */ + static Item[] allItems; + + public UnitLogisticsPad(String name){ + super(name); + update = true; + solid = true; + health = 70; + hasItems = true; + configurable = true; + saveConfig = true; + itemCapacity = 0; + noUpdateDisabled = true; + clearOnDoubleTap = true; + unloadable = false; + + config(Item.class, (UnloadingPadBuild tile, Item item) -> tile.sortItem = item); + config(Float.class, (UnloadingPadBuild tile, Float value) -> tile.targetPercent = value); + configClear((UnloadingPadBuild tile) -> tile.sortItem = null); + } + + @Override + public void init(){ + super.init(); + + allItems = content.items().toArray(Item.class); + if(range == -1) range = size * tilesize; + } + + @Override + public void setStats(){ + super.setStats(); + stats.add(Stat.speed, 60f / speed, StatUnit.itemsSecond); + } + + @Override + public void drawPlanConfig(BuildPlan plan, Eachable list){ + drawPlanConfigCenter(plan, plan.config, "unloader-center"); + } + + @Override + public void drawOverlay(float x, float y, int rotation) { + x += offset; + y += offset; + + Drawf.dashSquare(Pal.accent, x, y, range); + } + + @Override + public void setBars(){ + super.setBars(); + removeBar("items"); + } + + public class UnloadingPadBuild extends Building{ + + public float targetPercent; + + public Item sortItem; + public float unloadTimer; + public Seq candidates; + public Seq loadTargets = Seq.with(); + + @Override + public void onProximityUpdate() { + super.onProximityUpdate(); + rebuildTargets(); + } + + public void rebuildTargets(){ + loadTargets.clear(); + proximity.each(b -> { + if(b.interactable(team) && b.items != null){ + loadTargets.add(b); + } + }); + + loadTargets.sort(b -> b.block instanceof CoreBlock ? 0 : 1); + } + + @Override + public void updateTile() { + super.updateTile(); + unload(); + } + + public void unload(){ + unloadTimer += Time.delta; + if (unloadTimer >= 60) { + candidates = Groups.unit.intersect(x - range/2, y - range/2, range, range); + if(candidates.size == 0) return; + unloadTimer %= 60; + + //Loop through each unit over the pad + candidates.each(unit -> { + //Pls don't load units with items already, thanks + if(unit.hasItem() && sortItem != null && unit.item() != sortItem) return; + + Item item = unit.stack.amount == 0 ? sortItem : unit.item(); + if(item == null) return; + + //How many items to remove from the unit. If it's negative, how many items to load into the unit instead. + int transferAmount = unit.stack.amount - (int) (unit.type.itemCapacity * targetPercent); + + if(transferAmount == 0) return; + + //If we have items to unload, loop through nearby buildings and try to push into them + if(transferAmount > 0){ + //How many items should be left in the unit + float target = unit.stack.amount - transferAmount; + + loadTargets.each(build -> { + + //Get the minimum between the items we can push, and the amount to deposit + int transfering = Math.min(build.getMaximumAccepted(item) - build.items.get(item), (int) Mathf.maxZero(unit.stack.amount - target)); + + //No more items left to transport :D + if(transfering == 0) return; + + Call.transferItemTo(unit, item, transfering, unit.x, unit.y, build); + }); + + return; + } + + //Treat transfer amount as the amount of items we want the unit to gain from its initial amount + transferAmount *= -1; + + //The max amount of items the unit will hold + float target = unit.stack.amount + transferAmount; + + loadTargets.each(build -> { + + //Get the minimum between the items we can push, and the amount to deposit + int transfering = Math.min(build.items.get(item), (int) Mathf.maxZero(target - unit.stack.amount)); + + //No more items left to transport :D + if(transfering == 0) return; + InputHandler.takeItems(build, item,transfering, unit); + }); + + }); + } + } + + @Override + public void draw(){ + super.draw(); + + Draw.color(sortItem == null ? Color.clear : sortItem.color); + Draw.rect(centerRegion, x, y); + Draw.color(); + } + + @Override + public void drawSelect(){ + super.drawSelect(); + drawItemSelection(sortItem); + } + + @Override + public void buildConfiguration(Table table){ + ItemSelection.buildTable(block, table, content.items(), () -> sortItem, this::configure, selectionRows, selectionColumns); + table.row(); + table.slider(0, 1, 0.1f, targetPercent, Vars.net.active(), this::configure).size(240, 40f); + } + + @Override + public Item config(){ + return sortItem; + } + + @Override + public byte version(){ + return 1; + } + + @Override + public void write(Writes write){ + super.write(write); + write.i(sortItem == null ? -1 : sortItem.id); + write.f(targetPercent); + write.f(unloadTimer); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + id = read.i(); + sortItem = id == -1 ? null : content.item(id); + targetPercent = read.f(); + unloadTimer = read.f(); + } + } +} \ No newline at end of file diff --git a/src/meld/world/meta/BuildingPriority.java b/src/meld/world/meta/BuildingPriority.java index 6f577ab..ab3ce22 100644 --- a/src/meld/world/meta/BuildingPriority.java +++ b/src/meld/world/meta/BuildingPriority.java @@ -3,6 +3,7 @@ public class BuildingPriority { public static final float none = 0, + landmine = -3, under = -2, radar = 1.5f, synapse = 3; diff --git a/src/meld/world/util/ItemLogic.java b/src/meld/world/util/ItemLogic.java new file mode 100644 index 0000000..a7a93dd --- /dev/null +++ b/src/meld/world/util/ItemLogic.java @@ -0,0 +1,23 @@ +package meld.world.util; + +import mindustry.gen.Building; +import mindustry.type.ItemStack; + +public class ItemLogic { + + public static boolean capacity(ItemStack[] stacks, Building build){ + for(var stack: stacks){ + if(build.getMaximumAccepted(stack.item) - build.items.get(stack.item) < stack.amount) return false; + } + return true; + } + + public static void addStacks(ItemStack[] stacks, Building source, Building dest){ + for(var stack: stacks){ + dest.handleStack(stack.item, stack.amount, source); + } + } + public static void addStacks(ItemStack[] stacks, Building source){ + addStacks(stacks, source, source); + } +}