diff --git a/UNITCLASSES.md b/UNITCLASSES.md index 5dd9fb38..be57d0df 100644 --- a/UNITCLASSES.md +++ b/UNITCLASSES.md @@ -4,7 +4,7 @@ Mechanical Warfare introduces a tier system for units, which divides all units into 4 tiers (classes): - Orange - Cyan -- Purple (upcoming) +- Purple - Red (upcoming) Units in each class have a certain average DPS, ranging from low (Orange) to extreme (Red). Unit factories also have a color indicator on their tops to determine their respective unit classes. diff --git a/bundles/bundle.properties b/bundles/bundle.properties index b5551ed1..67576b08 100644 --- a/bundles/bundle.properties +++ b/bundles/bundle.properties @@ -11,6 +11,8 @@ item.mechanical-warfare-ap-shell.name = AP Shell item.mechanical-warfare-ap-shell.description = Armor-piercing artillery shells to counter heavy armors. item.mechanical-warfare-he-shell.name = HE Shell item.mechanical-warfare-he-shell.description = High-explosive artillery shells made for long range strikes. +item.mechanical-warfare-mk2-module.name = MK2 Module +item.mechanical-warfare-mk2-module.description = A standard production module used in high-tech structures. /// End Region Items /// Liquids @@ -29,7 +31,7 @@ block.mechanical-warfare-aegis.description = A durable short-ranged turret. Make block.mechanical-warfare-incandescence.name = Incandescence block.mechanical-warfare-incandescence.description = A small, powered turret that fires a focused beam of heat at enemies within its range. block.mechanical-warfare-blow.name = Blow -block.mechanical-warfare-blow.description = A medium-ranged machinegun turret. Shoots piercing, high-velocity rounds. +block.mechanical-warfare-blow.description = A medium-ranged burst turret. Shoots armor-piercing, high-velocity rounds. block.mechanical-warfare-nighthawk.name = Nighthawk block.mechanical-warfare-nighthawk.description = A long-ranged sniper turret designated to fire high-velocity bullets with exceptional accuracy. Accepts raw items as ammo, but works better with assembled rounds. block.mechanical-warfare-quake.name = Quake @@ -38,6 +40,8 @@ block.mechanical-warfare-voltmeter.name = Voltmeter block.mechanical-warfare-voltmeter.description = A Tesla tower-type turret. Fires electric arcs in rapid succession. block.mechanical-warfare-ghost.name = Ghost block.mechanical-warfare-ghost.description = An advanced anti-air turret. Shoots high-velocity flak bullets. +block.mechanical-warfare-seism.name = Seism +block.mechanical-warfare-seism.description = A more powerful version of Quake, with better firepower, range, and fire rate. // End Region Turret // Region Production @@ -56,6 +60,11 @@ block.mechanical-warfare-reinforced-wall-large.description = Essentially an armo / Region Ground Units block.mechanical-warfare-sabre-factory.name = Sabre Mech Factory block.mechanical-warfare-sabre-factory.description = Assembles armored ground units equipped with acid-frag rockets. +block.mechanical-warfare-m-tron-factory.name = M-Tron Mech Factory +block.mechanical-warfare-m-tron-factory.description = Assembles M-Tron, a heavily armored ground unit equipped with energy rifle. + +block.mechanical-warfare-chaos-array-factory.name = Chaos Array Factory +block.mechanical-warfare-chaos-array-factory.description = Assembles a powerful ground unit known as Chaos Array. / End Region Ground Units / Region Aerial Units @@ -65,6 +74,10 @@ block.mechanical-warfare-shadow-factory.name = Shadow Destroyer Factory block.mechanical-warfare-shadow-factory.description = Assembles heavy destroyer ships known as Shadow. block.mechanical-warfare-scythe-factory.name = Scythe Destroyer Factory block.mechanical-warfare-scythe-factory.description = Assembles Scythe, a massive destroyer ship, rising off the floor eradicating everything it encounters. +block.mechanical-warfare-serpent-factory.name = Serpent Assembling Pad +block.mechanical-warfare-serpent-factory.description = Assembles Serpent, a light helicopter mounted with light gun and missile launcher. +block.mechanical-warfare-battleaxe-factory.name = Battleaxe Fighter Factory +block.mechanical-warfare-battleaxe-factory.description = Assembles Battleaxe, an armored fighter ship equipped with rocket launcher. / End Region Aerial Units // End Region Units @@ -90,11 +103,15 @@ block.mechanical-warfare-stone-melter.name = Stone Melter block.mechanical-warfare-stone-melter.description = Melts stone into searing lava. block.mechanical-warfare-stone-centrifuge.name = Stone Centrifuge block.mechanical-warfare-stone-centrifuge.description = Hardens lava into raw cobblestone by rapid spinning. +block.mechanical-warfare-mk2-assembler.name = MK2 Module Assembler +block.mechanical-warfare-mk2-assembler.description = Assembles MK2 Module used in high-tech and upgraded structures. // End Region Crafting // Region Upgrade block.mechanical-warfare-halberd-ship-pad.name = Halberd Ship Pad block.mechanical-warfare-halberd-ship-pad.description = Provides transformation into a scorpion-type fighter ship equipped with gatling gun. \nUse by tapping while standing on it. +block.mechanical-warfare-vortex-ship-pad.name = Vortex Ship Pad +block.mechanical-warfare-vortex-ship-pad.description = Provides transformation into a heavy ship armed with energy cannon. \nUse by tapping while standing on it. block.mechanical-warfare-upsylon-mech-pad.name = Upsylon Mech Pad block.mechanical-warfare-upsylon-mech-pad.description = Provides transformation into a moderately-armored powerful ground mech. \nUse by tapping while standing on it. // End Region Upgrade @@ -104,7 +121,7 @@ block.mechanical-warfare-core-origin.name = Core: Origin block.mechanical-warfare-core-origin.description = The fourth newer version of the core capsule. Extremely durable and capable of withstanding extreme amount of damage. block.mechanical-warfare-fire-aura.name = Fire Aura -block.mechanical-warfare-fire-aura.description = Applies fire damage to all units within it's range. +block.mechanical-warfare-fire-aura.description = Applies fire damage to all units within its range. // End Region Effect // Region Environtments @@ -130,6 +147,8 @@ zone.mechanical-warfare-volcano.name = Volcano zone.mechanical-warfare-volcano.description = One of several enormous active craters throughout the mountains. Stores extreme thermal potential energy. Expect high enemy activity. zone.mechanical-warfare-front-gate.name = Front Gate zone.mechanical-warfare-front-gate.description = A main gate to the enemy's capital. Heavily guarded, knowing that the main factory is inside. Uranium is present, but is already taken and fortified. Take out the two cores and move on. +zone.mechanical-warfare-back-door.name = Back Door +zone.mechanical-warfare-back-door.description = Past the rift is the Back Door. Narrow space and slight contamination. The enemy has fortified this area. Leave nothing behind. /// End Region Zones /// Region Mech @@ -137,12 +156,19 @@ zone.mechanical-warfare-front-gate.description = A main gate to the enemy's capi mech.mechanical-warfare-upsylon-mech.name = Upsylon mech.mechanical-warfare-upsylon-mech.description = A moderately-armored ground mech equipped with heavy shotgun. mech.mechanical-warfare-upsylon-mech.weapon = Shotgun +mech.mechanical-warfare-upsylon-mech.ability = Plasma Flank Cannon // End Region Ground // Region Ship mech.mechanical-warfare-halberd-ship.name = Halberd -mech.mechanical-warfare-halberd-ship.description = A durable ship equipped with gatling gun. +mech.mechanical-warfare-halberd-ship.description = A hit-and-run ship equipped with gatling gun. Releases orbs of concentrated energy while at peak velocity. mech.mechanical-warfare-halberd-ship.weapon = Gatling Gun +mech.mechanical-warfare-halberd-ship.ability = Kugelblitz + +mech.mechanical-warfare-vortex-ship.name = Vortex +mech.mechanical-warfare-vortex-ship.description = A heavy ship armed with energy cannon. Generates shield while shooting. +mech.mechanical-warfare-vortex-ship.weapon = Energy Cannon +mech.mechanical-warfare-vortex-ship.ability = Energy Shield // End Region Ship /// End Region Mech @@ -150,17 +176,28 @@ mech.mechanical-warfare-halberd-ship.weapon = Gatling Gun // Region Ground Unit unit.mechanical-warfare-sabre.name = Sabre unit.mechanical-warfare-sabre.description = A well-armored unit that fires acid frag-rockets. +unit.mechanical-warfare-m-tron.name = M-Tron +unit.mechanical-warfare-m-tron.description = A heavily armored ground unit equipped with energy rifle. +unit.mechanical-warfare-anarchy.name = Anarchy +unit.mechanical-warfare-anarchy.description = A powerful ground unit equipped with upgraded Quake-type cannons. unit.mechanical-warfare-nullifier.name = Nullifier unit.mechanical-warfare-nullifier.description = Extremely durable and dangerous. Use AP ammo whenever encountered. // End Region Ground Unit // Region Hover Unit unit.mechanical-warfare-phantasm.name = Phantasm -unit.mechanical-warfare-phantasm.description = An armored aerial unit equipped with flak gun. +unit.mechanical-warfare-phantasm.description = A light fighter equipped with flak gun. unit.mechanical-warfare-shadow.name = Shadow unit.mechanical-warfare-shadow.description = A heavy destroyer ship that fires quick bursts of bullets. unit.mechanical-warfare-scythe.name = Scythe -unit.mechanical-warfare-scythe.description = A massive destroyer ship equiped with heavy shell launcher that rises off the floor destroying everything it comes across. +unit.mechanical-warfare-scythe.description = A massive destroyer ship equipped with heavy shell launcher that rises off the floor destroying everything it comes across. +unit.mechanical-warfare-battleaxe.name = Battleaxe +unit.mechanical-warfare-battleaxe.description = An armored fighter ship equipped with lava-frag rocket launcher. // End Region Hover Unit + +// Region Copter Unit +unit.mechanical-warfare-serpent.name = Serpent +unit.mechanical-warfare-serpent.description = A light helicopter mounted with light gun and missile launcher. +// End Region Copter Unit /// End Region Unit diff --git a/bundles/bundle_fr.properties b/bundles/bundle_fr.properties index 770ae855..351c4611 100644 --- a/bundles/bundle_fr.properties +++ b/bundles/bundle_fr.properties @@ -1,9 +1,10 @@ /// Region Items + item.mechanical-warfare-iron.name = Fer item.mechanical-warfare-iron.description = Un métal lourd utilisé essentiellement dans les plaques de blindage et dans la fabrication d'acier. item.mechanical-warfare-steel.name = Acier item.mechanical-warfare-steel.description = Un matériau durable avec de nombreux usages. -item.mechanical-warfare-cobblestone.name = Pavé +item.mechanical-warfare-cobblestone.name = Roche item.mechanical-warfare-cobblestone.description = Une pierre ordinaire. item.mechanical-warfare-uranium.name = Uranium item.mechanical-warfare-uranium.description = Une substance dense et radioactive possédant un rendement élevé en énergie potentielle. @@ -11,64 +12,107 @@ item.mechanical-warfare-ap-shell.name = Obus PA item.mechanical-warfare-ap-shell.description = Des obus d'artillerie perce-armure pour faire face aux armures lourdes. item.mechanical-warfare-he-shell.name = Obus HE item.mechanical-warfare-he-shell.description = Des obus d'artillerie hautement explosifs faits pour les frappes de longue portée. +item.mechanical-warfare-mk2-module.name = Module MK2 +item.mechanical-warfare-he-shell.description = Un module de production standard utilisé dans les structures de haute technologie. + /// End Region Items + /// Liquids + liquid.mechanical-warfare-liquid-gas.name = Essence liquid.mechanical-warfare-liquid-gas.description = Un produit venant du pétrole dangereusement explosif. A manipuler avec précaution. liquid.mechanical-warfare-liquid-acid.name = Acide liquid.mechanical-warfare-liquid-acid.description = Un liquide hautement corrosif. A déverser sur les ennemis ou à utiliser pour alimenter les foreuses chimiques. liquid.mechanical-warfare-liquid-lava.name = Lave liquid.mechanical-warfare-liquid-lava.description = De la roche volcanique fondue. Ne pas toucher. + /// End Region Liquids + + /// Blocks + // Region Turret + block.mechanical-warfare-aegis.name = Aegis block.mechanical-warfare-aegis.description = Une tourelle durable avec une faible portée. Fait un relativement bon mur grace à son armure épaisse. +block.mechanical-warfare-incandescence.name = Incandescence +block.mechanical-warfare-incandescence.description = Une petite tourelle électrique qui tire un faisceau concentré de chaleur sur les ennemis à portée. block.mechanical-warfare-blow.name = Revers block.mechanical-warfare-blow.description = Une tourelle maitrailleuse avec une portée moyenne. Tire des cartouches perforantes avec une vitesse importante. block.mechanical-warfare-nighthawk.name = Faucon block.mechanical-warfare-nighthawk.description = Une tourelle d'élite avec une longue portée faite pour tirer des balles très rapides avec une précision exceptionnelle. Accepte les ressources brutes comme munitions, mais fonctionne mieux avec des cartouches assemblées. -block.mechanical-warfare-incandescence.name = Incandescence -block.mechanical-warfare-incandescence.description = Une petite tourelle électrique qui tire un faisceau de chaleur concentré sur les ennemis à portée. - - block.mechanical-warfare-quake.name = Secousse -block.mechanical-warfare-quake.description = Une puissante tourelle d'artillerie, avec une longue portée. Tire soit des obus explosifs soit des obus perce-armure. +block.mechanical-warfare-quake.description = Une puissante tourelle d'artillerie, avec une longue porté. Tire soit des obus explosifs soit des obus perce-armure. +block.mechanical-warfare-seism.name = Séisme +block.mechanical-warfare-seism.description = Une version plus puissante de la secousse, avec une meilleure puissance de feu, une meilleure portée et une vitesse de tir améliorée. block.mechanical-warfare-voltmeter.name = Voltmètre block.mechanical-warfare-voltmeter.description = Une tourelle de type Tesla. Tire des arcs électriques qui se succèdent rapidement. block.mechanical-warfare-ghost.name = Fantôme block.mechanical-warfare-ghost.description = Une tourelle anti-aérienne avancée. Tire des éclats très rapides. + // End Region Turret + + // Region Production + block.mechanical-warfare-chemical-drill.name = Foreuse chimique block.mechanical-warfare-chemical-drill.description = Une foreuse qui utilise de l'acide corrosif. Capable de miner de l'uranium. + // End Region Production + + // Region Defense block.mechanical-warfare-reinforced-wall.name = Mur renforcé block.mechanical-warfare-reinforced-wall.description = Essentiellement un mur superchargé cuirassé capable d'absorber des dégâts extrêmes. block.mechanical-warfare-reinforced-wall-large.name = Grand mur renforcé block.mechanical-warfare-reinforced-wall-large.description = Essentiellement un mur superchargé cuirassé capable d'absorber des dégâts extrêmes. Peut s'auto-régénerer lentement. \nCouvre plusieurs cases. + // End Region Defense + + // Region Units + / Region Ground Units + block.mechanical-warfare-sabre-factory.name = Usine de méchas Sabre block.mechanical-warfare-sabre-factory.description = Assemble des unités terrestres blindées équipées de missile létaux à l'acide. +block.mechanical-warfare-m-tron-factory.name = Usine de méchas M-Tron +block.mechanical-warfare-m-tron-factory.description = Assemble le M-Tron, une unité terrestre lourdement blindée équipée d'un canon à énergie. + +block.mechanical-warfare-chaos-array-factory.name = Usine de Soldat du chaos +block.mechanical-warfare-chaos-array-factory.description = Assemble une puissante unité terrestre connue sous le nom de Soldat du chaos. + / End Region Ground Units + / Region Aerial Units + block.mechanical-warfare-phantasm-factory.name = Usine de torpilleurs Fantasme block.mechanical-warfare-phantasm-factory.description = Assemble un fantasme, un vaisseau torpilleur blindé équipé de canons mortels. block.mechanical-warfare-shadow-factory.name = Usine de destructeurs Ombre block.mechanical-warfare-shadow-factory.description = Assemble un vaisseau destructeur lourd connu sous le nom d'Ombre. block.mechanical-warfare-scythe-factory.name = Usine de dévastateurs Faux block.mechanical-warfare-scythe-factory.description = Assemble la Faux, un lanceur de missiles massif et cuirassé, rasant le sol en éliminant tout ce qu'il croise. +block.mechanical-warfare-serpent-factory.name = Unité d'assemblage de Serpents +block.mechanical-warfare-serpent-factory.description = Assemble le Serpent, un hélicoptère léger monté avec des canons lumineux et des lance-missiles. +block.mechanical-warfare-battleaxe-factory.name = Usine de combattants Hache de guerre +block.mechanical-warfare-battleaxe-factory.description = Assemble la Hache de guerre, un vaisseau de combat cuirassé équipé de lance-missiles. + / End Region Aerial Units + // End Region Units + + // Region Power + block.mechanical-warfare-uranium-reactor.name = Réacteur à uranium block.mechanical-warfare-uranium-reactor.description = Génére des quantités d'électricité significatives en utilisant l'énergie potentielle contenue dans l'uranium, radioactif. Explosera violemment en cas de carence de liquide refroidissant. + // End Region Power + + // Region Crafting + block.mechanical-warfare-steel-crucible.name = Creuset à acier block.mechanical-warfare-steel-crucible.description = Fond des lingots de fer pour fabriquer de l'acier. block.mechanical-warfare-oil-refinery.name = Raffinerie de pétrole @@ -84,33 +128,59 @@ block.mechanical-warfare-stone-grinder.description = Broie la pierre pour en fai block.mechanical-warfare-stone-melter.name = Fondeur de pierre block.mechanical-warfare-stone-melter.description = Fond la pierre pour en faire de la lave brûlante block.mechanical-warfare-stone-centrifuge.name = Centrifugeuse de pierre -block.mechanical-warfare-stone-centrifuge.description = Solidifie la lave en pavésde pierre en tournant rapidement. +block.mechanical-warfare-stone-centrifuge.description = Solidifie la lave en pierre brute en tournant rapidement. +block.mechanical-warfare-mk2-assembler.name = Assembleur de modules MK2 +block.mechanical-warfare-mk2-assembler.description = Assemble le module MK2 dans les strctures améliorées ou hautement technologiques. + // End Region Crafting + + // Region Upgrade + block.mechanical-warfare-halberd-ship-pad.name = Reconstructeur de vaisseau Hallebarde block.mechanical-warfare-halberd-ship-pad.description = Fournit la transformation en un vaisseau de combat de type scorpion équipé de canons à mitraille. \nUtilisez-le en appuyant dessus quand vous vous trouvez au-dessus. +block.mechanical-warfare-vortex-ship-pad.name = Reconstructeur de vaisseau Vortex +block.mechanical-warfare-vortex-ship-pad.description = Fournit la transformation en un vaisseau lourd armé de canons à énergie. \nUtilisez-le en appuyant dessus quand vous vous trouvez au-dessus. block.mechanical-warfare-upsylon-mech-pad.name = Reconstructeur de mécha Upsilon block.mechanical-warfare-upsylon-mech-pad.description = Fournit la transformation en un puisant mécha terrestre modérément blindé. \nUtilisez-le en appuyant dessus quand vous vous trouvez au-dessus. + // End Region Upgrade + + // Region Effect + block.mechanical-warfare-core-origin.name = Noyau Origine block.mechanical-warfare-core-origin.description = La quatrième version du noyau, la plus récente. Extrêmement durable et capable d'endurer une quantité colossale de dégâts. -block.mechanical-warfare-fire-aura.name = aura enflammée -block.mechanical-warfare-fire-aura.description = Applique des dégâts de brûlure à toutes les unités à portée. + +block.mechanical-warfare-fire-aura.name = Aura enflammée +block.mechanical-warfare-fire-aura.description = Applique des dégâts de brûlures à toutes les unités à portée. + // End Region Effect + + // Region Environtments + block.mechanical-warfare-soil.name = Terre block.mechanical-warfare-hills.name = Colline block.mechanical-warfare-obsidian.name = Obsidienne block.mechanical-warfare-obsidian-rocks.name = Roc d'obsidienne block.mechanical-warfare-lava.name = Lave + // End Region Environtments + + // Region Ores + block.mechanical-warfare-ore-iron.name = Fer block.mechanical-warfare-ore-uranium.name = Uranium + // End Region Ores + /// End Region Blocks + + /// Region Zones + zone.mechanical-warfare-frozen-valley.name = Vallée glacée zone.mechanical-warfare-frozen-valley.description = On peut voir ici des veines de fer. Explorez les abords couverts d'herbe. Traversez avec précaution le terrain humide. Minez du fer et apprenez à l'utiliser. zone.mechanical-warfare-hill-path.name = Passe des collines @@ -118,38 +188,80 @@ zone.mechanical-warfare-hill-path.description = Un chemin étroit dans les colli zone.mechanical-warfare-volcano.name = Volcan zone.mechanical-warfare-volcano.description = Un des nombreux énormes cratères actifs dans les montagnes. Contient des quantités extrêmes d'énergie thermique potentielle. Attendez-vous à une activité ennemie importante. zone.mechanical-warfare-front-gate.name = Rempart -zone.mechanical-warfare-front-gate.description = Une des entrées prinicipales vers la capitale ennemie. Hautement gardé, car l'usine principale est dedans. L'uranium est présent, mais déjà pris et fortifié. Prenez les deux noyaux et déplacez-vous. +zone.mechanical-warfare-front-gate.description = Une des entrées prinicipales vers la capitale ennemie. Hautement gardé car l'usine principale est derrière. L'uranium est présent, mais déjà pris et fortifié. Prenez les deux noyaux et déplacez-vous. +zone.mechanical-warfare-back-door.name = Porte arrière +zone.mechanical-warfare-back-door.description = Apès le ravin se trouve l'entrée arrière. Un espace étroit et une contamination légère. L'ennemi a fortifié cette zone. Ne laissez rien derrière vous. + /// End Region Zones + /// Region Mech + // Region Ground + mech.mechanical-warfare-upsylon-mech.name = Upsilon mech.mechanical-warfare-upsylon-mech.description = Un mécha terrestre modérément armé équipé de fusils lourds. mech.mechanical-warfare-upsylon-mech.weapon = Fusil +mech.mechanical-warfare-upsylon-mech.ability = Canon à plasma latéral + // End Region Ground + // Region Ship + mech.mechanical-warfare-halberd-ship.name = Hallebarde -mech.mechanical-warfare-halberd-ship.description = Un vaisseau durable équipé de canons à mitraille. +mech.mechanical-warfare-halberd-ship.description = Un vaisseau pour l'attaque rapide équipé de canons à mitraille.Libére des orbes d'énergie concentrée quand il va à sa vitesse de pointe. mech.mechanical-warfare-halberd-ship.weapon = Canon à mitraille +mech.mechanical-warfare-halberd-ship.ability = Attaque éclair + +mech.mechanical-warfare-vortex-ship.name = Vortex +mech.mechanical-warfare-vortex-ship.description = Un vaisseau lourd armé de canons à énergie. Génére un bouclier quand il tire. +mech.mechanical-warfare-vortex-ship.weapon = Canon énergétique +mech.mechanical-warfare-vortex-ship.ability = Bouclier énergétique + + // End Region Ship + /// End Region Mech + /// Region Unit + // Region Ground Unit + unit.mechanical-warfare-sabre.name = Sabre unit.mechanical-warfare-sabre.description = Une unité bien cuirassée qui tire des missiles létaux à l'acide. +unit.mechanical-warfare-sabre.name = M-Tron +unit.mechanical-warfare-sabre.description = Une unité blindée équipée avec des canons à énergie. +unit.mechanical-warfare-anarchy.name = Anarchie +unit.mechanical-warfare-anarchy.description = Une unité terrestre puissante équipée de canons secousse améliorés. unit.mechanical-warfare-nullifier.name = Annihilateur unit.mechanical-warfare-nullifier.description = Extrêmement résistant et dangereux. Utilisez des munitions PA à chaque fois que vous le rencontrez. + // End Region Ground Unit + // Region Hover Unit + unit.mechanical-warfare-phantasm.name = Fantasme -unit.mechanical-warfare-phantasm.description = Une unité aérienne blindée équipée de canons à éclats. +unit.mechanical-warfare-phantasm.description = Un combattant léger équipé de canons à éclats. unit.mechanical-warfare-shadow.name = Ombre -unit.mechanical-warfare-shadow.description = Un vaisseau torpilleur lourd qui tire rapidement des rafales de balles. +unit.mechanical-warfare-shadow.description = Un vaisseau torpilleur lourd qui tire rapidement des rafales de balles A heavy destroyer ship that fires quick bursts of bullets. unit.mechanical-warfare-scythe.name = Faux unit.mechanical-warfare-scythe.description = Un vaisseau de destruction massif équipé de lanceurs d'obus lourds, qui plane au dessus du sol, anéantissant tout ce qu'il croise. +unit.mechanical-warfare-scythe.name = Hache de guerre +unit.mechanical-warfare-scythe.description = Un vaisseau de combat blindé équipé avec des lanceurs de missiles à fragment de lave. + // End Region Hover Unit + + +//Region Copter Unit + +unit.mechanical-warfare-serpent.name = Serpent +unit.mechanical-warfare-serpent.description = Un hélicoptère léger monté avec des canons lumineux et un lance-missile. + +//End Region Copter Unit + + /// End Region Unit diff --git a/content/blocks/defense/fire-aura.json.txt b/content/blocks/defense/fire-aura.json similarity index 76% rename from content/blocks/defense/fire-aura.json.txt rename to content/blocks/defense/fire-aura.json index b3ef8c5a..956ccbff 100644 --- a/content/blocks/defense/fire-aura.json.txt +++ b/content/blocks/defense/fire-aura.json @@ -1,6 +1,7 @@ -// NOT IMPLEMENTED YET! size: 2 health: 320 +powerUse: 1.5 +activeSound: fireAuraActive requirements: [ lead/125 iron/75 diff --git a/content/blocks/mechs/mechs/upsylon-mech-pad.json b/content/blocks/mechs/mechs/upsylon-mech-pad.json index 82b9995c..467c22d6 100644 --- a/content/blocks/mechs/mechs/upsylon-mech-pad.json +++ b/content/blocks/mechs/mechs/upsylon-mech-pad.json @@ -1,5 +1,3 @@ -type: MechPad -mech: upsylon-mech size: 3 consumes: { power: 1.4 diff --git a/content/blocks/mechs/ships/halberd-ship-pad.json b/content/blocks/mechs/ships/halberd-ship-pad.json index 841e56bd..c05ede61 100644 --- a/content/blocks/mechs/ships/halberd-ship-pad.json +++ b/content/blocks/mechs/ships/halberd-ship-pad.json @@ -1,5 +1,3 @@ -type: MechPad -mech: halberd-ship size: 3 consumes: { power: 1.4 diff --git a/content/blocks/mechs/ships/vortex-ship-pad.json b/content/blocks/mechs/ships/vortex-ship-pad.json new file mode 100644 index 00000000..c0917b8c --- /dev/null +++ b/content/blocks/mechs/ships/vortex-ship-pad.json @@ -0,0 +1,13 @@ +size: 4 +consumes: { + power: 2 +} +requirements: [ + mk2-module/10 + lead/400 + silicon/325 + iron/300 + thorium/325 +] +category: upgrade +research: halberd-ship-pad diff --git a/content/blocks/production/chemical-station.json b/content/blocks/production/chemical-station.json index 10610a65..fac52e53 100644 --- a/content/blocks/production/chemical-station.json +++ b/content/blocks/production/chemical-station.json @@ -20,7 +20,6 @@ consumes: { } outputLiquid: { liquid: liquid-acid - amount: 24 } requirements: [ iron/80 @@ -30,5 +29,3 @@ requirements: [ ] category: crafting research: oil-refinery -idleSound: respawning -idleSoundVolume: 0.5 diff --git a/content/blocks/production/mk2-assembler.json b/content/blocks/production/mk2-assembler.json new file mode 100644 index 00000000..8fa37df9 --- /dev/null +++ b/content/blocks/production/mk2-assembler.json @@ -0,0 +1,36 @@ +size: 3 +hasPower: true +hasItems: true +hasLiquids: true +craftTime: 300 +craftEffect: formsmoke +consumes: { + power: 3.5 + items: { + items: [ + steel/7 + silicon/8 + uranium/5 + plastanium/6 + surge-alloy/5 + phase-fabric/4 + ] + } + liquid: { + liquid: liquid-acid + amount: 0.1 + } +} +itemCapacity: 20 +liquidCapacity: 60 +outputItem: mk2-module/1 +requirements: [ + copper/150 + lead/125 + metaglass/45 + silicon/125 + iron/150 + uranium/75 +] +category: crafting +research: phase-weaver diff --git a/content/blocks/production/oil-refinery.json b/content/blocks/production/oil-refinery.json index 2b44d913..e8d73330 100644 --- a/content/blocks/production/oil-refinery.json +++ b/content/blocks/production/oil-refinery.json @@ -22,5 +22,3 @@ requirements: [ ] category: crafting research: coal-centrifuge -idleSound: respawning -idleSoundVolume: 0.5 diff --git a/content/blocks/production/steel-crucible.json b/content/blocks/production/steel-crucible.json index 234532f1..0a925d47 100644 --- a/content/blocks/production/steel-crucible.json +++ b/content/blocks/production/steel-crucible.json @@ -21,5 +21,3 @@ requirements: [ ] category: crafting research: silicon-smelter -idleSound: respawning -idleSoundVolume: 0.5 diff --git a/content/blocks/production/stone-centrifuge.json b/content/blocks/production/stone-centrifuge.json index 815f1de5..b4ef654d 100644 --- a/content/blocks/production/stone-centrifuge.json +++ b/content/blocks/production/stone-centrifuge.json @@ -19,5 +19,3 @@ requirements: [ ] category: crafting research: stone-melter -idleSound: respawning -idleSoundVolume: 0.5 diff --git a/content/blocks/production/stone-grinder.json b/content/blocks/production/stone-grinder.json index 169f25a8..31c7a085 100644 --- a/content/blocks/production/stone-grinder.json +++ b/content/blocks/production/stone-grinder.json @@ -20,3 +20,5 @@ requirements: [ ] category: crafting research: pulverizer +idleSound: drill +idleSoundVolume: 0.003 diff --git a/content/blocks/production/stone-melter.json b/content/blocks/production/stone-melter.json index 7471af15..8574e789 100644 --- a/content/blocks/production/stone-melter.json +++ b/content/blocks/production/stone-melter.json @@ -22,5 +22,3 @@ requirements: [ ] research: melter category: crafting -idleSound: respawning -idleSoundVolume: 0.5 diff --git a/content/blocks/turrets/blow.json b/content/blocks/turrets/blow.json index 76e0eda3..e9926389 100644 --- a/content/blocks/turrets/blow.json +++ b/content/blocks/turrets/blow.json @@ -1,30 +1,16 @@ health: 1440 size: 3 -reload: 10 +reload: 40 ammoUseEffect: shellEjectBig inaccuracy: 5 -rotatespeed: 1.25 +rotatespeed: 3.5 shotWidth: 3 -range: 180 -recoil: 4 -ammo: { - ap-shell: { - damage: 30 - speed: 12 - lifetime: 20 - pierce: true - hitEffect: hitLancer - bulletWidth: 9 - bulletHeight: 21 - backColor: 1fa7a5 - frontColor: 92fffd - ammoMultiplier: 8 - } -} +range: 200 +recoil: 3.5 requirements: [ titanium/125 surge-alloy/100 - uranium/150 + uranium/90 ] category: turret research: fuse diff --git a/content/blocks/turrets/ghost.json b/content/blocks/turrets/ghost.json index ef8e7522..95fb49fc 100644 --- a/content/blocks/turrets/ghost.json +++ b/content/blocks/turrets/ghost.json @@ -1,147 +1,15 @@ -type: DoubleTurret health: 1350 size: 3 reload: 15 ammoUseEffect: shellEjectBig +shootEffect: shootBig +smokeEffect: shootBigSmoke inaccuracy: 0 rotatespeed: 4 shotWidth: 2 range: 240 recoil: 3.5 targetGround: false -ammo: { - metaglass: { - type: FlakBulletType - damage: 12 - splashDamage: 48 - splashDamageRadius: 18 - speed: 18 - lifetime: 14 - bulletWidth: 3 - bulletHeight: 15 - frontColor: ffe0bb - backColor: d3b189 - ammoMultiplier: 2 - hitEffect: flakExplosion - fragBullets: 12 - fragBullet: { - type: BasicBulletType - damage: 9 - bulletWidth: 5 - bulletHeight: 12 - bulletShrink: 1 - lifetime: 20 - frontColor: ee8d18 - backColor: d66410 - despawnEffect: none - } - } - pyratite: { - type: FlakBulletType - damage: 12 - splashDamage: 48 - splashDamageRadius: 18 - speed: 16 - lifetime: 16 - bulletWidth: 4 - bulletHeight: 18 - frontColor: ee8d18 - backColor: d66410 - ammoMultiplier: 2 - hitEffect: flakExplosion - status: burning - fragBullets: 12 - fragBullet: { - type: BasicBulletType - damage: 9 - bulletWidth: 5 - bulletHeight: 12 - bulletShrink: 1 - lifetime: 20 - frontColor: ee8d18 - backColor: d66410 - despawnEffect: none - } - } - blast-compound: { - type: FlakBulletType - damage: 20 - splashDamage: 68 - splashDamageRadius: 42 - speed: 17 - lifetime: 14 - bulletWidth: 3 - bulletHeight: 15 - frontColor: e5b9a8 - backColor: c68686 - ammoMultiplier: 2 - hitEffect: blastExplosion - fragBullets: 12 - fragBullet: { - type: BasicBulletType - damage: 14 - bulletWidth: 5 - bulletHeight: 12 - bulletShrink: 1 - lifetime: 20 - frontColor: e5b9a8 - backColor: c68686 - despawnEffect: none - } - } - plastanium: { - type: FlakBulletType - damage: 18 - splashDamage: 64 - splashDamageRadius: 24 - speed: 18 - lifetime: 14 - bulletWidth: 4 - bulletHeight: 18 - frontColor: e1ffbb - backColor: 9ad284 - ammoMultiplier: 3 - hitEffect: plasticExplosion - fragBullets: 12 - fragBullet: { - type: BasicBulletType - damage: 12 - bulletWidth: 5 - bulletHeight: 12 - bulletShrink: 1 - lifetime: 20 - frontColor: e1ffbb - backColor: 9ad284 - despawnEffect: none - } - } - he-shell: { - type: FlakBulletType - damage: 23 - splashDamage: 72 - splashDamageRadius: 42 - speed: 20 - lifetime: 13 - bulletWidth: 5 - bulletHeight: 21 - frontColor: e5b9a8 - backColor: c68686 - ammoMultiplier: 5 - hitEffect: blastExplosion - fragBullets: 12 - fragBullet: { - type: BasicBulletType - damage: 17 - bulletWidth: 5 - bulletHeight: 12 - bulletShrink: 1 - lifetime: 20 - frontColor: e5b9a8 - backColor: c68686 - despawnEffect: none - } - } -} requirements: [ plastanium/75 steel/100 diff --git a/content/blocks/turrets/nighthawk.json b/content/blocks/turrets/nighthawk.json index 87c88bf4..72446c68 100644 --- a/content/blocks/turrets/nighthawk.json +++ b/content/blocks/turrets/nighthawk.json @@ -6,46 +6,8 @@ spread: 0 inaccuracy: 0.33 rotatespeed: 6 shootCone: 3 -range: 420 //lmfao +range: 420 recoil: 4 -ammo: { - graphite: { - damage: 75 - speed: 10 - lifetime: 50 - hitEffect: hitBulletBig - bulletSprite: mechanical-warfare-hvbullet - bulletWidth: 8 - bulletHeight: 16 - frontColor: d0e4e8 - backColor: f3eeba - ammoMultiplier: 2 - } - titanium: { - damage: 98 - speed: 12 - lifetime: 42 - hitEffect: hitBulletBig - bulletSprite: mechanical-warfare-hvbullet - bulletWidth: 8 - bulletHeight: 20 - frontColor: fdf3e2 - backColor: f3eeba - ammoMultiplier: 2 - } - ap-shell: { - damage: 140 - speed: 14 - lifetime: 36 - hitEffect: hitLancer - bulletSprite: mechanical-warfare-hvbullet - bulletWidth: 8 - bulletHeight: 25 - frontColor: fdf3e2 - backColor: f3eeba - ammoMultiplier: 3 - } -} requirements: [ copper/180 graphite/100 diff --git a/content/blocks/turrets/quake.json b/content/blocks/turrets/quake.json index 9cc13b23..27883cee 100644 --- a/content/blocks/turrets/quake.json +++ b/content/blocks/turrets/quake.json @@ -1,47 +1,14 @@ health: 2400 size: 4 -reload: 700 +reload: 420 ammoUseEffect: shellEjectBig inaccuracy: 2 -rotatespeed: 0.25 +rotatespeed: 0.5 shootCone: 5 range: 360 recoil: 6 -restitution: 0.005 +restitution: 0.008 cooldown: 0.02 -ammo: { - he-shell: { - damage: 180 - speed: 10 - splashDamage: 390 - splashDamageRadius: 80 - hitEffect: blastExplosion - knockback: 3 - lifetime: 90 - bulletWidth: 17 - bulletHeight: 22 - backColor: b6573a - frontColor: ffd385 - ammoMultiplier: 4 - hitSound: boom - } - ap-shell: { - damage: 1700 - speed: 10 - splashDamage: 90 - splashDamageRadius: 16 - hitEffect: blastExplosion - reloadMultiplier: 1.4 - knockback: 6 - lifetime: 90 - bulletWidth: 17 - bulletHeight: 22 - backColor: b68f3a - frontColor: fbff85 - ammoMultiplier: 4 - hitSound: boom - } -} requirements: [ iron/200 graphite/450 diff --git a/content/blocks/turrets/seism.json b/content/blocks/turrets/seism.json new file mode 100644 index 00000000..0a998f2a --- /dev/null +++ b/content/blocks/turrets/seism.json @@ -0,0 +1,21 @@ +health: 4500 +size: 5 +reload: 300 +ammoUseEffect: shellEjectBig +inaccuracy: 2 +rotatespeed: 0.5 +shootCone: 5 +range: 420 //lmfao +recoil: 6.5 +restitution: 0.02 +cooldown: 0.02 +shootSound: quakemk2shot +requirements: [ + mk2-module/10 + steel/350 + plastanium/425 + surge-alloy/375 + uranium/325 +] +category: turret +research: quake diff --git a/content/blocks/units/battleaxe-factory.json b/content/blocks/units/battleaxe-factory.json new file mode 100644 index 00000000..da351ef0 --- /dev/null +++ b/content/blocks/units/battleaxe-factory.json @@ -0,0 +1,26 @@ +size: 5 +produceTime: 3500 +maxSpawn: 4 +consumes: { + power: 2.4 + items: { + items: [ + silicon/80 + titanium/50 + steel/65 + ] + } + liquid: { + liquid: liquid-lava + amount: 0.05 + } +} +hasLiquids: true +category: units +research: shadow-factory +requirements: [ + uranium/200 + titanium/325 + lead/350 + silicon/300 +] diff --git a/content/blocks/units/chaos-array-factory.json b/content/blocks/units/chaos-array-factory.json new file mode 100644 index 00000000..89d1deff --- /dev/null +++ b/content/blocks/units/chaos-array-factory.json @@ -0,0 +1,24 @@ +type: UnitFactory +unitType: chaos-array +size: 5 +produceTime: 4000 +maxSpawn: 1 +consumes: { + power: 2.5 + items: { + items: [ + silicon/90 + surge-alloy/75 + iron/80 + ] + } +} +category: units +research: fortress-factory +requirements: [ + mk2-module/10 + thorium/450 + lead/350 + silicon/375 + steel/300 +] diff --git a/content/blocks/units/m-tron-factory.json b/content/blocks/units/m-tron-factory.json new file mode 100644 index 00000000..6a4a3df2 --- /dev/null +++ b/content/blocks/units/m-tron-factory.json @@ -0,0 +1,22 @@ +type: UnitFactory +unitType: m-tron +size: 4 +produceTime: 3000 +maxSpawn: 3 +consumes: { + power: 1.8 + items: { + items: [ + silicon/50 + graphite/35 + iron/20 + ] + } +} +category: units +research: sabre-factory +requirements: [ + uranium/50 + lead/175 + silicon/150 +] diff --git a/content/blocks/units/sabre-factory.json b/content/blocks/units/sabre-factory.json index 1d948ad5..4595ef05 100644 --- a/content/blocks/units/sabre-factory.json +++ b/content/blocks/units/sabre-factory.json @@ -4,7 +4,7 @@ description: Assembles armored ground units equipped with acid-frag rockets. unitType: sabre size: 3 produceTime: 2000 -maxSpawn: 3 +maxSpawn: 4 consumes: { power: 1.5 items: { @@ -13,7 +13,12 @@ consumes: { graphite/15 ] } + liquid: { + liquid: liquid-acid + amount: 0.05 + } } +hasLiquids: true category: units research: titan-factory requirements: [ diff --git a/content/blocks/units/scythe-factory.json b/content/blocks/units/scythe-factory.json index d8c31605..50b74e5d 100644 --- a/content/blocks/units/scythe-factory.json +++ b/content/blocks/units/scythe-factory.json @@ -1,7 +1,3 @@ -type: UnitFactory -name: Scythe Destroyer Factory -description: Assembles Scythe, a massive hovering destroyer ship. -unitType: scythe size: 6 produceTime: 4000 maxSpawn: 3 diff --git a/content/blocks/units/serpent-factory.json b/content/blocks/units/serpent-factory.json new file mode 100644 index 00000000..2f2854bf --- /dev/null +++ b/content/blocks/units/serpent-factory.json @@ -0,0 +1,20 @@ +size: 4 +produceTime: 2000 +maxSpawn: 4 +consumes: { + power: 2 + items: { + items: [ + silicon/35 + titanium/20 + ] + } +} +requirements: [ + steel/50 + titanium/100 + lead/50 + silicon/75 +] +category: units +research: revenant-factory diff --git a/content/items/mk2-module.json b/content/items/mk2-module.json new file mode 100644 index 00000000..fce8b991 --- /dev/null +++ b/content/items/mk2-module.json @@ -0,0 +1,3 @@ +type: material +cost: 5 +color: 6cd9b5 diff --git a/content/mechs/mechs/upsylon-mech.json b/content/mechs/mechs/upsylon-mech.json deleted file mode 100644 index 3d0f423b..00000000 --- a/content/mechs/mechs/upsylon-mech.json +++ /dev/null @@ -1,38 +0,0 @@ -speed: 0.5 -boostSpeed: 0.8 -mass: 3.5 -drillPower: 6 -mineSpeed: 0.9 -itemCapacity: 70 -shake: 2 -engineColor: 7efdfd -engineOffset: 5.6 -health: 250 -buildPower: 1.8 -weaponOffsetX: 2 -// Raw DPS: 960 -weapon: { - name: shotgun - width: 5 - length: 5.5 - recoil: 3 - reload: 30 - shots: 20 - spacing: 0 - inaccuracy: 12 - alternate: true - ejectEffect: shellEjectBig - shake: 2 - velocityRnd: 0.5 - shootSound: shootBig - bullet: { - damage: 12 - bulletWidth: 5 - bulletHeight: 12 - speed: 5 - lifetime: 17 - hitEffect: hitBulletSmall - shootEffect: shootBig - smokeEffect: shootBigSmoke - } -} diff --git a/content/mechs/ships/halberd-ship.json b/content/mechs/ships/halberd-ship.json deleted file mode 100644 index 127ef893..00000000 --- a/content/mechs/ships/halberd-ship.json +++ /dev/null @@ -1,31 +0,0 @@ -flying: true -drillPower: 4 -mineSpeed: 1.4 -speed: 0.2 -drag: 0.05 -mass: 4 -health: 420 //lmfao -itemCapacity: 80 -engineColor: 7efdfd -cellTrnsY: 1 -buildPower: 1.2 -// Raw DPS: 340 -weapon: { - name: gatling - length: 1.2 - reload: 6 - alternate: true - inaccuracy: 1 - ejectEffect: shellEjectSmall - shootSound: shootBig - bullet: { - damage: 17 - bulletWidth: 7 - bulletHeight: 14 - lifetime: 18 - speed: 9 - hitEffect: hitBulletSmall - shootEffect: shootSmall - smokeEffect: shootSmallSmoke - } -} diff --git a/content/units/anarchy.json b/content/units/anarchy.json new file mode 100644 index 00000000..d3e2580d --- /dev/null +++ b/content/units/anarchy.json @@ -0,0 +1,8 @@ +health: 7000 +speed: 0.16 +maxVelocity: 0.9 +mass: 5 +drag: 0.6 +hitsize: 18 +rotatespeed: 0.08 +targetAir: false diff --git a/content/units/battleaxe.json b/content/units/battleaxe.json new file mode 100644 index 00000000..ba206660 --- /dev/null +++ b/content/units/battleaxe.json @@ -0,0 +1,15 @@ +flying: true +speed: 0.16 +maxVelocity: 1.2 +mass: 5.5 +health: 1350 +hitsize: 20 +drag: 0.01 +range: 150 +attackLength: 135 +shootCone: 60 +rotateWeapon: false +engineOffset: 15 +engineSize: 3 +rotatespeed: 0.02 +baseRotateSpeed: 0.07 \ No newline at end of file diff --git a/content/units/m-tron.json b/content/units/m-tron.json new file mode 100644 index 00000000..6afbeac9 --- /dev/null +++ b/content/units/m-tron.json @@ -0,0 +1,33 @@ +type: GroundUnit +health: 1280 +speed: 0.08 +drag: 0.3 +mass: 5 +hitsize: 16 +rotatespeed: 0.07 +// Raw DPS: 230.4 +weapon: { + name: m-rifle + length: 1 + reload: 50 + width: 14 + alternate: true + recoil: 4 + shake: 2 + shots: 3 + spacing: 0 + shotDelay: 2 + ejectEffect: shellEjectBig + shootSound: missile + bullet: { + type: BasicBulletType + bulletSprite: mechanical-warfare-energybullet1 + bulletWidth: 7 + bulletHeight: 16 + speed: 3.5 + lifetime: 60 + damage: 32 + frontColor: ddeeff + backColor: aabbcc + } +} diff --git a/content/units/nullifier.json b/content/units/nullifier.json index 413afd52..5905a301 100644 --- a/content/units/nullifier.json +++ b/content/units/nullifier.json @@ -1,4 +1,3 @@ -type: GroundUnit health: 18000 speed: 0.1 maxVelocity: 0.6 @@ -6,28 +5,3 @@ mass: 6 drag: 0.4 hitsize: 25 rotatespeed: 0.05 -// Raw DPS: 1400 -weapon: { - name: null-pointer - length: 18 - width: 30 - reload: 60 - alternate: true - recoil: 6 - shake: 2.2 - inaccuracy: 2 - ejectEffect: shellEjectBig - shootSound: artillery - bullet: { - hitEffect: blastExplosion - damage: 700 - speed: 4 - knockback: 3 - lifetime: 75 - bulletWidth: 20 - bulletHeight: 23 - bulletSprite: shell - backColor: ffffff - frontColor: 000000 - } -} diff --git a/content/units/phantasm.json b/content/units/phantasm.json index a3197566..a26fc8a3 100644 --- a/content/units/phantasm.json +++ b/content/units/phantasm.json @@ -6,13 +6,14 @@ mass: 4 health: 900 hitsize: 15 drag: 0.02 -range: 120 -shootCone: 40 +range: 140 +attackLength: 125 +shootCone: 5 rotateWeapon: true engineOffset: 9 engineSize: 2.5 rotatespeed: 0.1 -baseRotateSpeed: 0.08 +baseRotateSpeed: 0.2 // Raw DPS: 30 weapon: { name: phantasmal-gun diff --git a/content/units/scythe.json b/content/units/scythe.json index f0e16a0b..983182ab 100644 --- a/content/units/scythe.json +++ b/content/units/scythe.json @@ -1,4 +1,3 @@ -type: HoverUnit flying: true speed: 0.07 maxVelocity: 0.6 @@ -7,40 +6,10 @@ health: 1760 hitsize: 25 drag: 0.02 range: 160 +attackLength: 145 shootCone: 150 rotateWeapon: true engineOffset: 20 engineSize: 4.5 rotatespeed: 0.01 baseRotateSpeed: 0.05 -// Raw DPS: 1080 -weapon: { - name: scythe-launcher - width: 9 - recoil: 3 - reload: 50 - alternate: true - inaccuracy: 2 - shots: 15 - spacing: 0.5 - shotDelay: 0 - shootSound: artillery - velocityRnd: 0.3 - bullet: { - type: ArtilleryBulletType - collides: true - collidesTiles: true - collidesAir: true - inaccuracy: 3 - bulletWidth: 10 - bulletHeight: 16 - speed: 7 - lifetime: 25 - damage: 15 - splashDamage: 15 - splashDamageRadius: 2 - shootEffect: shootBig - frontColor: ccddee - backColor: aabbcc - } -} diff --git a/content/units/serpent.json b/content/units/serpent.json new file mode 100644 index 00000000..d456bdb3 --- /dev/null +++ b/content/units/serpent.json @@ -0,0 +1,11 @@ +flying: true +health: 700 +mass: 4 +hitsize: 15 +speed: 0.8 +drag: 0.005 +maxVelocity: 1.42 +range: 100 +attackLength: 85 +rotatespeed: 0.04 +baseRotateSpeed: 0.1 diff --git a/content/units/shadow.json b/content/units/shadow.json index c09349f7..97cfa15a 100644 --- a/content/units/shadow.json +++ b/content/units/shadow.json @@ -7,32 +7,33 @@ health: 1200 hitsize: 20 drag: 0.02 range: 140 +attackLength: 125 shootCone: 90 rotateWeapon: true engineOffset: 11 engineSize: 4 rotatespeed: 0.01 baseRotateSpeed: 0.06 -// Raw DPS: 168 +// Raw DPS: 216 weapon: { name: shadow-caster width: 7 recoil: 2 reload: 30 alternate: true - inaccuracy: 0 - shots: 6 + inaccuracy: 2 + shots: 3 spacing: 0 - shotDelay: 1 + shotDelay: 3 shootSound: artillery bullet: { type: BasicBulletType - inaccuracy: 0 + inaccuracy: 0.5 bulletWidth: 8 bulletHeight: 12 speed: 10 lifetime: 20 - damage: 7 + damage: 18 shootEffect: shootBig } } diff --git a/content/zones/back-door.json b/content/zones/back-door.json new file mode 100644 index 00000000..fdf5d583 --- /dev/null +++ b/content/zones/back-door.json @@ -0,0 +1,39 @@ +loadout: basicNucleus +startingItems: [ + copper/500 + lead/750 + graphite/500 + silicon/500 + iron/500 +] +conditionWave: 20 +configureObjective: { + type: Launched + zone: front-gate +} +launchPeriod: 10 +requirements: [ + { + type: Launched + zone: overgrowth + } + { + type: ZoneWave + zone: desolateRift + wave: 30 + } + { + type: Unlock + block: nighthawk + } +] +resources: [ + copper + lead + coal + titanium + iron + thorium + sand + cobblestone +] diff --git a/maps/back-door.msav b/maps/back-door.msav new file mode 100644 index 00000000..936b5898 Binary files /dev/null and b/maps/back-door.msav differ diff --git a/maps/front-gate.msav b/maps/front-gate.msav index f1b9ed7c..5792aeae 100644 Binary files a/maps/front-gate.msav and b/maps/front-gate.msav differ diff --git a/mod.json b/mod.json index 18edd294..00c5abc4 100644 --- a/mod.json +++ b/mod.json @@ -1,7 +1,7 @@ name: "mechanical-warfare" displayName: "[gold]Mechanical [accent]Warfare[]" author: "GlennFolker + JerichoFletcher" -description: "Adds brand new [yellow]units[], [cyan]mechs[], and [red]turrets[]. \n\n[scarlet]Not for the faintest of engines.[]" -version: "1.4" +description: "Adds brand new [yellow]units[], [cyan]mechs[], [red]turrets[], and [accent]resources[] along with their respective crafters. \n\n[scarlet]Not for the faintest of engines.[]" +version: "1.5" minGameVersion: "104" dependencies: [] diff --git a/scripts/blocks/effect/element-aura.js b/scripts/blocks/effect/element-aura.js new file mode 100644 index 00000000..46935053 --- /dev/null +++ b/scripts/blocks/effect/element-aura.js @@ -0,0 +1,165 @@ +const plib = require("plib"); + +const fireAuraRange = 15 * Vars.tilesize; + +/* Fire Aura effect */ +const fireAuraEffect = newEffect(40, e => { + Draw.color(plib.fireAuraFlame, Pal.darkFlame, e.fin()); + Angles.randLenVectors(e.id, 3, 2 + e.fin() * 9, new Floatc2(){get: (x, y) => { + Fill.circle(e.x + x, e.y + y, 0.2 + e.fout() * 1.5); + }}); +}); + +/* Aura bullet */ +const fireAuraBullet = extend(BasicBulletType, { + draw(b){} +}); +fireAuraBullet.speed = 0.001; +fireAuraBullet.lifetime = 1; +fireAuraBullet.damage = 1; +fireAuraBullet.status = StatusEffects.melting; +fireAuraBullet.hitEffect = Fx.none; +fireAuraBullet.despawnEffect = Fx.none; + +/* Fire Aura */ +const fireAura = extendContent(PowerTurret, "fire-aura", { + load(){ + this.super$load(); + this.region = Core.atlas.find(this.name + "-block"); + this.liquidRegion = Core.atlas.find(this.name + "-liquid"); + this.topRegion = Core.atlas.find(this.name + "-top"); + }, + update(tile){ + var entity = tile.ent(); + if(!this.validateTarget(tile)){ + entity.target = null; + } + entity.recoil = 0; + entity.rotation = 90; + var isShooting = this.hasAmmo(tile) && this.validateTarget(tile); + entity.heat = Mathf.lerpDelta(entity.heat, + isShooting ? 1 : 0, + isShooting ? this.warmup : this.cooldown + ); + if(this.hasAmmo(tile)){ + if(entity.timer.get(this.timerTarget, this.targetInterval)){ + this.findTarget(tile); + } + if(this.validateTarget(tile)){ + this.updateShooting(tile); + } + } + }, + drawLayer(tile){ + this.super$drawLayer(tile); + var entity = tile.ent(); + Draw.color(entity.liquids.current().color); + Draw.alpha(entity.liquids.total() / this.liquidCapacity); + Draw.rect(this.liquidRegion, tile.drawx(), tile.drawy()); + Draw.color(); + Draw.rect(this.topRegion, tile.drawx(), tile.drawy()); + }, + updateShooting(tile){ + var entity = tile.ent(); + if(entity.reload >= this.reload){ + var type = this.peekAmmo(tile); + this.shoot(tile, type); + entity.reload = 0; + }else{ + entity.reload += tile.entity.delta() * (this.peekAmmo(tile)).reloadMultiplier * this.baseReloadSpeed(tile); + } + }, + shoot(tile, type){ + var entity = tile.ent(); + var radius = this.range; + var hasShot = false; + Units.nearbyEnemies(tile.getTeam(), tile.drawx() - radius, tile.drawy() - radius, radius * 2, radius * 2, cons(unit => { + if(unit.withinDst(tile.drawx(), tile.drawy(), radius)){ + if(!unit.isDead() && unit instanceof HealthTrait){ + Calls.createBullet(type, tile.getTeam(), unit.x, unit.y, 0, 1, 1); + if(!hasShot){ + hasShot = true; + this.effects(tile); + this.effectsArea(tile, this.areaEffectCount); + this.useAmmo(tile); + } + } + } + })); + }, + effects(tile){ + var shootEffect = this.shootEffect == Fx.none ? (this.peekAmmo(tile)).shootEffect : this.shootEffect; + var smokeEffect = this.smokeEffect == Fx.none ? (this.peekAmmo(tile)).smokeEffect : this.smokeEffect; + var entity = tile.ent(); + Effects.effect(shootEffect, tile.drawx(), tile.drawy(), entity.rotation); + Effects.effect(smokeEffect, tile.drawx(), tile.drawy(), entity.rotation); + //this.shootSound.at(tile, Mathf.random(0.9, 1.1)); + }, + effectsArea(tile, count){ + var shootEffect = this.shootEffect == Fx.none ? (this.peekAmmo(tile)).shootEffect : this.shootEffect; + var smokeEffect = this.smokeEffect == Fx.none ? (this.peekAmmo(tile)).smokeEffect : this.smokeEffect; + var entity = tile.ent(); + for (var i = 0; i < count; i++){ + Effects.effect(shootEffect, + tile.drawx() + Angles.trnsx(Mathf.random(360), Mathf.random(this.range)), + tile.drawy() + Angles.trnsy(Mathf.random(360), Mathf.random(this.range)), + entity.rotation + ); + Effects.effect(smokeEffect, + tile.drawx() + Angles.trnsx(Mathf.random(360), Mathf.random(this.range)), + tile.drawy() + Angles.trnsy(Mathf.random(360), Mathf.random(this.range)), + entity.rotation + ); + } + }, + findTarget(tile){ + var entity = tile.ent(); + entity.target = Units.closestEnemy(tile.getTeam(), tile.drawx(), tile.drawy(), this.range, boolf(e => !e.isDead())); + }, + setStats(){ + this.super$setStats(); + this.stats.add(BlockStat.input, new LiquidValue(this.liquidAsAmmo(), this.shootType.ammoMultiplier * 60 / this.reload, true)); + }, + useAmmo: function(tile){ + var entity = tile.ent(); + if(tile.isEnemyCheat()){ + return this.shootType; + } + var type = this.shootType; + entity.liquids.remove(entity.liquids.current(), type.ammoMultiplier); + return type; + }, + acceptItem: function(item, tile, source){ + return false; + }, + acceptLiquid: function(tile, source, liquid, amount){ + return this.liquidAsAmmo() == liquid || tile.entity.liquids.current() == liquid && tile.entity.liquids.get(tile.entity.liquids.current()) <= this.shootType.ammoMultiplier + 0.001; + }, + hasAmmo: function(tile){ + var entity = tile.ent(); + return entity.cons.valid() && this.liquidAsAmmo() == entity.liquids.current() && entity.liquids.total() >= this.shootType.ammoMultiplier; + }, + shouldActiveSound: function(tile){ + var entity = tile.ent(); + return tile != null && this.hasAmmo(tile) && this.validateTarget(tile); + }, + shouldTurn: function(tile){ + return false; + }, + liquidAsAmmo: function(){ + return Vars.content.getByName(ContentType.liquid, this.liquidAmmoName); + }, +}); +fireAura.reload = 5; +fireAura.shootType = fireAuraBullet; +fireAura.range = fireAuraRange; +fireAura.areaEffectCount = 3; +fireAura.hasItems = false; +fireAura.hasLiquids = true; +fireAura.liquidAmmoName = modName + "-liquid-lava" +fireAura.liquidCapacity = 60; +fireAura.shootEffect = fireAuraEffect; +fireAura.smokeEffect = Fx.fireSmoke; +fireAura.ammoUseEffect = Fx.none; +fireAura.targetInterval = 5; +fireAura.warmup = 0.08; diff --git a/scripts/blocks/effect/elementAura.js b/scripts/blocks/effect/elementAura.js deleted file mode 100644 index fc355e83..00000000 --- a/scripts/blocks/effect/elementAura.js +++ /dev/null @@ -1,32 +0,0 @@ -// Fire Aura effect -const fireAuraColor = "ffaa44"; -const fireAuraEffect = newEffect(40, e => { - Draw.color(Color.valueOf(fireAuraColor)); - Lines.stroke(e.fout() * 3); - Lines.circle(e.x, e.y, e.fin() * 50); -}); - -// Aura bullet -const auraBullet = extend(BulletType, {}); -auraBullet.bulletSprite = Core.atlas.find("clear"); -auraBullet.speed = 0.001; -auraBullet.damage = 0; -auraBullet.instantDisappear = true; - -// Fire Aura -const fireAura = extendContent(LiquidTurret, "fire-aura", { - load(){ - this.region = Core.atlas.find(this.name); - this.liquidRegion = Core.atlas.find(this.name + "-liquid"); - this.topRegion = Core.atlas.find(this.name + "-top"); - }, - drawLayer(tile){ - this.super$drawLayer(tile); - var entity = tile.ent(); - Draw.color(entity.liquids.current().color); - Draw.alpha(entity.liquids.total() / this.liquidCapacity); - Draw.rect(this.liquidRegion, tile.drawx(), tile.drawy()); - Draw.color(); - Draw.rect(this.topRegion, tile.drawx(), tile.drawy()); - }, -}); diff --git a/scripts/blocks/production.js b/scripts/blocks/production.js index 4aa13b95..b3522010 100644 --- a/scripts/blocks/production.js +++ b/scripts/blocks/production.js @@ -1,5 +1,5 @@ // Chemical Station -const chemicalStation = extendContent(GenericCrafter, "chemical-station", { +const chemicalStation = extendContent(LiquidConverter, "chemical-station", { load(){ this.region = Core.atlas.find(this.name); this.liquidRegion = Core.atlas.find(this.name + "-liquid"); @@ -12,9 +12,10 @@ const chemicalStation = extendContent(GenericCrafter, "chemical-station", { ]; }, draw(tile){ + const entity = tile.ent(); Draw.rect(this.region, tile.drawx(), tile.drawy()); Draw.color(this.outputLiquid.liquid.color); - Draw.alpha(tile.entity.liquids.get(this.outputLiquid.liquid) / this.liquidCapacity); + Draw.alpha(entity.liquids.get(this.outputLiquid.liquid) / this.liquidCapacity); Draw.rect(this.liquidRegion, tile.drawx(), tile.drawy()); Draw.color(); Draw.rect(this.topRegion, tile.drawx(), tile.drawy()); @@ -66,3 +67,36 @@ const stoneGrinder = extendContent(GenericCrafter, "stone-grinder", { Draw.rect(this.topRegion, tile.drawx(), tile.drawy()); }, }); + +// MK2 Module Assembler +const mk2Assembler = extendContent(GenericCrafter, "mk2-assembler", { + load(){ + this.region = Core.atlas.find(this.name); + this.bottomRegion = Core.atlas.find(this.name + "-bottom"); + this.liquidRegion = Core.atlas.find(this.name + "-liquid"); + }, + generateIcons: function(){ + return [ + Core.atlas.find(this.name + "-bottom"), + Core.atlas.find(this.name) + ]; + }, + draw(tile){ + const entity = tile.ent(); + Draw.rect(this.bottomRegion, tile.drawx(), tile.drawy()); + Draw.color(Pal.accent); + Draw.alpha(entity.warmup); + Lines.lineAngleCenter( + tile.drawx(), + tile.drawy() + Mathf.sin(entity.totalProgress, 8, (Vars.tilesize - 1) * this.size / 2), + 0, + (Vars.tilesize - 1) * this.size + ); + Draw.reset(); + Draw.rect(this.region, tile.drawx(), tile.drawy()); + Draw.color(entity.liquids.current().color); + Draw.alpha(entity.liquids.total() / this.liquidCapacity); + Draw.rect(this.liquidRegion, tile.drawx(), tile.drawy()); + Draw.reset(); + } +}); diff --git a/scripts/blocks/turret/blow.js b/scripts/blocks/turret/blow.js new file mode 100644 index 00000000..c96937ec --- /dev/null +++ b/scripts/blocks/turret/blow.js @@ -0,0 +1,77 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const blowShell = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(Time.delta() > 0 && Mathf.chance(0.3)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + } +}); +blowShell.pierce = false; +blowShell.damage = 84; +blowShell.speed = 12; +blowShell.lifetime = 20; +blowShell.bulletWidth = 6; +blowShell.bulletHeight = 14; +blowShell.frontColor = plib.frontColorAP; +blowShell.backColor = plib.backColorAP; +blowShell.ammoMultiplier = 3; +blowShell.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, blowShell.frontColor, 1, Mathf.lerp(1.5, 0.2, e.fin())); +}); +blowShell.hitEffect = newEffect(18, e => { + e.scaled(6, cons(i => { + var cThickness = i.fout() * 2; + var cRadius = i.fin() * 8; + elib.outlineCircle(e.x, e.y, blowShell.frontColor, cThickness, cRadius); + })); + + var lThickness = e.fout() * 1.2; + var lDistance = Mathf.lerp(0, 20, e.finpow()); + var lLength = Mathf.lerp(2, 0.2, e.fin()); + elib.splashLines(e.x, e.y, blowShell.frontColor, lThickness, lDistance, lLength, 6, e.id); +}); +blowShell.despawnEffect = blowShell.hitEffect; + +const blow = extendContent(DoubleTurret, "blow", { + load(){ + this.super$load(); + }, + init(){ + this.ammo( + Vars.content.getByName(ContentType.item, modName + "-ap-shell"), blowShell // Raw DPS: 756 + ); + this.super$init(); + }, + hasAmmo(tile){ + var entity = tile.ent(); + return entity.ammo.size > 0 && entity.ammo.peek().amount >= this.ammoPerShot * this.shots; + }, + shoot(tile, ammo){ + var entity = tile.ent(); + + if(this.hasAmmo(tile)){ + for(var i = 0; i < this.shots; i++){ + Time.run(this.burstSpacing * i, run(() => { + if(tile.entity instanceof Turret.TurretEntity){ + if(this.hasAmmo(tile)){ + entity.recoil = this.recoil; + entity.heat = 1; + for(var a = 0; a < 2; a++){ + var i = Mathf.signs[a]; + this.tr.trns(entity.rotation - 90, this.shotWidth * i, (this.size * Vars.tilesize / 2) - entity.recoil); + this.bullet(tile, ammo, entity.rotation + Mathf.range(this.inaccuracy)); + this.effects(tile); + this.useAmmo(tile); + } + } + } + })); + } + } + }, +}); +blow.shots = 3; +blow.burstSpacing = 3; diff --git a/scripts/blocks/turret/ghost.js b/scripts/blocks/turret/ghost.js new file mode 100644 index 00000000..300b77f3 --- /dev/null +++ b/scripts/blocks/turret/ghost.js @@ -0,0 +1,120 @@ +const ghostGlassFrag = extend(BasicBulletType, {}); +ghostGlassFrag.damage = 9; +ghostGlassFrag.bulletWidth = 5; +ghostGlassFrag.bulletHeight = 12; +ghostGlassFrag.bulletShrink = 1; +ghostGlassFrag.lifetime = 20; +ghostGlassFrag.despawnEffect = Fx.none; + +const ghostGlass = extend(FlakBulletType, {}); +ghostGlass.damage = 12; +ghostGlass.splashDamage = 48; +ghostGlass.splashDamageRadius = 18; +ghostGlass.speed = 18; +ghostGlass.lifetime = 14; +ghostGlass.bulletWidth = 3; +ghostGlass.bulletHeight = 15; +ghostGlass.ammoMultiplier = 2; +ghostGlass.hitEffect = Fx.flakExplosion; +ghostGlass.fragBullets = 12; +ghostGlass.fragBullet = ghostGlassFrag; + +const ghostPyratite = extend(FlakBulletType, {}); +ghostPyratite.damage = 66; +ghostPyratite.splashDamage = 102; +ghostPyratite.splashDamageRadius = 18; +ghostPyratite.speed = 16; +ghostPyratite.lifetime = 16; +ghostPyratite.bulletWidth = 4; +ghostPyratite.bulletHeight = 18; +ghostPyratite.ammoMultiplier = 2; +ghostPyratite.hitEffect = Fx.flakExplosion; +ghostPyratite.status = StatusEffects.burning; + +const ghostBlastCompound = extend(FlakBulletType, {}); +ghostBlastCompound.damage = 104; +ghostBlastCompound.splashDamage = 152; +ghostBlastCompound.splashDamageRadius = 42; +ghostBlastCompound.speed = 15; +ghostBlastCompound.lifetime = 16; +ghostBlastCompound.bulletWidth = 3; +ghostBlastCompound.bulletHeight = 15; +ghostBlastCompound.ammoMultiplier = 2; +ghostBlastCompound.hitEffect = Fx.blastExplosion; +ghostBlastCompound.reloadMultiplier = 0.6; + +const ghostPlastaniumFrag = extend(BasicBulletType, {}); +ghostPlastaniumFrag.damage = 12; +ghostPlastaniumFrag.bulletWidth = 5; +ghostPlastaniumFrag.bulletHeight = 12; +ghostPlastaniumFrag.bulletShrink = 1; +ghostPlastaniumFrag.lifetime = 20; +ghostPlastaniumFrag.despawnEffect = Fx.none; + +const ghostPlastanium = extend(FlakBulletType, {}); +ghostPlastanium.damage = 18; +ghostPlastanium.splashDamage = 56; +ghostPlastanium.splashDamageRadius = 24; +ghostPlastanium.speed = 18; +ghostPlastanium.lifetime = 14; +ghostPlastanium.bulletWidth = 4; +ghostPlastanium.bulletHeight = 18; +ghostPlastanium.ammoMultiplier = 3; +ghostPlastanium.hitEffect = Fx.plasticExplosion; +ghostPlastanium.fragBullets = 12; +ghostPlastanium.fragBullet = ghostPlastaniumFrag; + +const ghostSurge = extend(FlakBulletType, { + update(b){ + if(Mathf.chance(0.5)){ + var cone = this.lightningCone; + var rot = b.velocity().angle() + Mathf.random(-cone, cone); + Calls.createLighting(b.id + Mathf.random(50), b.getTeam(), Pal.surge, this.lightningDamage, b.x, b.y, rot, 10); + } + }, + hit(b, x, y){ + this.super$hit(b, b.x, b.y); + for(var i = 0; i < this.lightningHitCount; i++){ + Calls.createLighting(b.id + Mathf.random(50), b.getTeam(), Pal.surge, this.lightningDamage, b.x, b.y, Mathf.random(360), 15); + } + } +}); +ghostSurge.damage = 20; +ghostSurge.lightningDamage = 12; +ghostSurge.lightningHitCount = 5; +ghostSurge.splashDamage = 48; +ghostSurge.splashDamageRadius = 20; +ghostSurge.speed = 18; +ghostSurge.lifetime = 14; +ghostSurge.bulletWidth = 4; +ghostSurge.bulletHeight = 18; +ghostSurge.ammoMultiplier = 3; +ghostSurge.hitEffect = Fx.flakExplosion; +ghostSurge.reloadMultiplier = 1.2; +ghostSurge.lightningCone = 45; +ghostSurge.status = StatusEffects.shocked; + +const ghostShell = extend(FlakBulletType, {}); +ghostShell.damage = 125; +ghostShell.splashDamage = 174; +ghostShell.splashDamageRadius = 42; +ghostShell.speed = 20; +ghostShell.lifetime = 13; +ghostShell.bulletWidth = 5; +ghostShell.bulletHeight = 21; +ghostShell.ammoMultiplier = 5; +ghostShell.hitEffect = Fx.blastExplosion; + +const ghost = extendContent(DoubleTurret, "ghost", { + init(){ + ghost.ammo( + Items.metaglass, ghostGlass, // Raw DPS: 672 + Items.pyratite, ghostPyratite, // Raw DPS: 672 + Items.blastCompound, ghostBlastCompound, // Raw DPS: 731 + Items.plastanium, ghostPlastanium, // Raw DPS: 872 + Items.surgealloy, ghostSurge, // Raw DPS: 640 + Vars.content.getByName(ContentType.item, modName + "-he-shell"), ghostShell // Raw DPS: 1196 + ); + this.super$init(); + }, +}); diff --git a/scripts/blocks/turret/incandescence.js b/scripts/blocks/turret/incandescence.js index 82c3832d..417ccc09 100644 --- a/scripts/blocks/turret/incandescence.js +++ b/scripts/blocks/turret/incandescence.js @@ -4,8 +4,8 @@ const turretLength = 6; const heatRay = extendContent(PowerTurret, "incandescence", { load(){ this.super$load(); - this.beamRegion = Core.atlas.find("mechanical-warfare-heat-ray-beam"); - this.beamEndRegion = Core.atlas.find("mechanical-warfare-heat-ray-beam-end"); + this.beamRegion = Core.atlas.find(modName + "-heat-ray-beam"); + this.beamEndRegion = Core.atlas.find(modName + "-heat-ray-beam-end"); this.layer2 = Layer.power; }, shoot(tile, type){ diff --git a/scripts/blocks/turret/nighthawk.js b/scripts/blocks/turret/nighthawk.js new file mode 100644 index 00000000..48cd31c6 --- /dev/null +++ b/scripts/blocks/turret/nighthawk.js @@ -0,0 +1,47 @@ +const plib = require("plib"); + +const nhGraphite = extend(BasicBulletType, {}); +nhGraphite.damage = 75; +nhGraphite.speed = 10; +nhGraphite.lifetime = 50; +nhGraphite.bulletSprite = modName + "-hvbullet"; +nhGraphite.bulletWidth = 8; +nhGraphite.bulletHeight = 16; +nhGraphite.ammoMultiplier = 2; +nhGraphite.hitEffect = Fx.hitBulletBig; +nhGraphite.despawnEffect = nhGraphite.hitEffect; + +const nhTitanium = extend(BasicBulletType, {}); +nhTitanium.damage = 98; +nhTitanium.speed = 12; +nhTitanium.lifetime = 42; +nhTitanium.bulletSprite = modName + "-hvbullet"; +nhTitanium.bulletWidth = 8; +nhTitanium.bulletHeight = 20; +nhTitanium.ammoMultiplier = 2; +nhTitanium.hitEffect = Fx.hitBulletBig; +nhTitanium.despawnEffect = nhGraphite.hitEffect; + +const nhShell = extend(BasicBulletType, {}); +nhShell.damage = 140; +nhShell.speed = 14; +nhShell.lifetime = 36; +nhShell.bulletSprite = modName + "-hvbullet"; +nhShell.bulletWidth = 8; +nhShell.bulletHeight = 25; +nhShell.ammoMultiplier = 3; +nhShell.frontColor = plib.frontColorAP; +nhShell.backColor = plib.backColorAP; +nhShell.hitEffect = Fx.hitLancer; +nhShell.despawnEffect = nhGraphite.hitEffect; + +const nighthawk = extendContent(ItemTurret, "nighthawk", { + init(){ + this.ammo( + Items.graphite, nhGraphite, + Items.titanium, nhTitanium, + Vars.content.getByName(ContentType.item, modName + "-ap-shell"), nhShell + ); + this.super$init(); + } +}); \ No newline at end of file diff --git a/scripts/blocks/turret/quake.js b/scripts/blocks/turret/quake.js new file mode 100644 index 00000000..f74068da --- /dev/null +++ b/scripts/blocks/turret/quake.js @@ -0,0 +1,104 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const quakeHE = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(Time.delta() > 0 && Mathf.chance(0.75)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + }, +}); +quakeHE.damage = 240; +quakeHE.splashDamage = 500; +quakeHE.splashDamageRadius = 40; +quakeHE.speed = 10; +quakeHE.lifetime = 40; +quakeHE.knockback = 3; +quakeHE.bulletWidth = 17; +quakeHE.bulletHeight = 22; +quakeHE.frontColor = plib.frontColorHE; +quakeHE.backColor = plib.backColorHE; +quakeHE.ammoMultiplier = 2; +quakeHE.hitSound = Sounds.boom; +// Trail effect +quakeHE.trailEffect = newEffect(27, e => { + elib.fillCircle(e.x, e.y, quakeHE.frontColor, 1, Mathf.lerp(1.8, 0.2, e.fin())); +}); +// Hit effect +quakeHE.hitEffect = newEffect(27, e => { + e.scaled(6, cons(i => { + var c1Thickness = 4 * i.fout(); + var c1Radius = Mathf.lerp(3, 40, i.fin()); + elib.outlineCircle(e.x, e.y, Pal.missileYellow, c1Thickness, c1Radius); + })); + + var c2Alpha = 0.3 + e.fin() * 0.7; + var c2Radius = Mathf.lerp(40, 0.5, e.fin()); + elib.fillCircle(e.x, e.y, Pal.missileYellowBack, c2Alpha, c2Radius); + + var sAlpha = 0.3 + e.fout() * 0.7; + var sRadius = Mathf.lerp(4, 1, e.fin()); + Angles.randLenVectors(e.id, 8, Mathf.lerp(5, 27, e.finpow()), new Floatc2(){get: (a, b) => { + elib.fillCircle(e.x + a, e.y + b, Color.gray, sAlpha, sRadius); + }}); + + var lThickness = e.fout() * 2.7; + var lDistance = Mathf.lerp(13, 80, e.finpow()); + var lLength = Mathf.lerp(10, 1, e.fin()); + elib.splashLines(e.x, e.y, Pal.missileYellow, lThickness, lDistance, lLength, 12, e.id); +}); +quakeHE.despawnEffect = quakeHE.hitEffect; + +const quakeAP = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(Time.delta() > 0 && Mathf.chance(0.75)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + }, +}); +quakeAP.damage = 2210; +quakeAP.splashDamage = 120; +quakeAP.splashDamageRadius = 10; +quakeAP.speed = 10; +quakeAP.lifetime = 40; +quakeAP.knockback = 6; +quakeAP.bulletWidth = 17; +quakeAP.bulletHeight = 22; +quakeAP.frontColor = plib.frontColorAP; +quakeAP.backColor = plib.backColorAP; +quakeAP.ammoMultiplier = 2; +quakeAP.reloadMultiplier = 1.2; +quakeAP.hitSound = Sounds.boom; +// Trail effect +quakeAP.trailEffect = newEffect(27, e => { + elib.fillCircle(e.x, e.y, quakeAP.frontColor, 1, Mathf.lerp(1.8, 0.2, e.fin())); +}); +// Hit effect +quakeAP.hitEffect = newEffect(13, e => { + e.scaled(6, cons(i => { + var cThickness = 4 * i.fout(); + var cRadius = Mathf.lerp(1.5, 20, i.fin()); + elib.outlineCircle(e.x, e.y, quakeAP.frontColor, cThickness, cRadius); + })); + + var lThickness = e.fout() * 2.5; + var lDistance = Mathf.lerp(1, 25, e.finpow()); + var lLength = Mathf.lerp(4, 1, e.fin()); + elib.splashLines(e.x, e.y, quakeAP.backColor, lThickness, lDistance, lLength, 10, e.id); +}); +quakeAP.despawnEffect = quakeAP.hitEffect; + +const quake = extendContent(ArtilleryTurret, "quake", { + load(){ + this.super$load(); + }, + init(){ + this.ammo( + Vars.content.getByName(ContentType.item, modName + "-he-shell"), quakeHE, + Vars.content.getByName(ContentType.item, modName + "-ap-shell"), quakeAP + ); + this.super$init(); + } +}); diff --git a/scripts/blocks/turret/seism.js b/scripts/blocks/turret/seism.js new file mode 100644 index 00000000..4434a9c6 --- /dev/null +++ b/scripts/blocks/turret/seism.js @@ -0,0 +1,130 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const seismHE = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(Time.delta() > 0 && Mathf.chance(0.75)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + }, +}); +seismHE.damage = 350; +seismHE.splashDamage = 720; +seismHE.splashDamageRadius = 60; +seismHE.speed = 12; +seismHE.lifetime = 40; +seismHE.knockback = 4; +seismHE.bulletWidth = 20; +seismHE.bulletHeight = 26; +seismHE.frontColor = plib.frontColorHE; +seismHE.backColor = plib.backColorHE; +seismHE.ammoMultiplier = 2; +seismHE.hitSound = Sounds.boom; +// Trail effect +seismHE.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, seismHE.frontColor, 1, Mathf.lerp(2, 0.2, e.fin())); +}); +// Hit effect +seismHE.hitEffect = newEffect(27, e => { + e.scaled(6, cons(i => { + var c1Thickness = 6 * i.fout(); + var c1Radius = Mathf.lerp(3, 60, i.fin()); + elib.outlineCircle(e.x, e.y, Pal.missileYellow, c1Thickness, c1Radius); + })); + + var c2Alpha = 0.3 + e.fin() * 0.7; + var c2Radius = Mathf.lerp(60, 0.5, e.fin()); + elib.fillCircle(e.x, e.y, Pal.missileYellowBack, c2Alpha, c2Radius); + + var sAlpha = 0.3 + e.fout() * 0.7; + var sRadius = Mathf.lerp(6, 1, e.fin()); + Angles.randLenVectors(e.id, 10, Mathf.lerp(5, 40, e.finpow()), new Floatc2(){get: (a, b) => { + elib.fillCircle(e.x + a, e.y + b, Color.gray, sAlpha, sRadius); + }}); + + var lThickness = e.fout() * 3; + var lDistance = Mathf.lerp(20, 120, e.finpow()); + var lLength = Mathf.lerp(14, 1, e.fin()); + elib.splashLines(e.x, e.y, Pal.missileYellow, lThickness, lDistance, lLength, 15, e.id); +}); +seismHE.despawnEffect = seismHE.hitEffect; + +const seismAP = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(Time.delta() > 0 && Mathf.chance(0.75)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + }, +}); +seismAP.damage = 3300; +seismAP.splashDamage = 160; +seismAP.splashDamageRadius = 15; +seismAP.speed = 12; +seismAP.lifetime = 40; +seismAP.knockback = 8; +seismAP.bulletWidth = 20; +seismAP.bulletHeight = 26; +seismAP.frontColor = plib.frontColorAP; +seismAP.backColor = plib.backColorAP; +seismAP.ammoMultiplier = 2; +seismAP.reloadMultiplier = 1.2; +seismAP.hitSound = Sounds.boom; +// Trail effect +seismAP.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, seismAP.frontColor, 1, Mathf.lerp(2, 0.2, e.fin())); +}); +// Hit effect +seismAP.hitEffect = newEffect(13, e => { + e.scaled(6, cons(i => { + var cThickness = 4 * i.fout(); + var cRadius = Mathf.lerp(2, 30, i.fin()); + elib.outlineCircle(e.x, e.y, seismAP.frontColor, cThickness, cRadius); + })); + + var lThickness = e.fout() * 3; + var lDistance = Mathf.lerp(3, 45, e.finpow()); + var lLength = Mathf.lerp(5, 1, e.fin()); + elib.splashLines(e.x, e.y, seismAP.backColor, lThickness, lDistance, lLength, 12, e.id); +}); +seismAP.despawnEffect = seismAP.hitEffect; + +const seism = extendContent(ArtilleryTurret, "seism", { + load(){ + this.region = Core.atlas.find(this.name); + this.baseRegion = Core.atlas.find(modName + "-block-5"); + this.heatRegion = Core.atlas.find(this.name + "-heat"); + }, + draw(tile){ + Draw.rect(this.baseRegion, tile.drawx(), tile.drawy()); + Draw.color(); + }, + generateIcons: function(){ + return [ + Core.atlas.find(modName + "-block-5"), + Core.atlas.find(this.name) + ]; + }, + init(){ + this.ammo( + Vars.content.getByName(ContentType.item, modName + "-he-shell"), seismHE, + Vars.content.getByName(ContentType.item, modName + "-ap-shell"), seismAP + ); + this.super$init(); + }, + drawLayer(tile){ + this.super$drawLayer(tile); + var entity = tile.ent(); + var val = entity.totalAmmo / this.maxAmmo; + for(var i = 0; i <= 2; i++){ + var j = i + 1; + var lo = i / 3; + var hi = j / 3; + Draw.color(Pal.lancerLaser); + Draw.alpha((Mathf.clamp(val, lo, hi) - lo) * 3); + Draw.rect(Core.atlas.find(this.name + "-phase" + i), tile.drawx() + this.tr2.x, tile.drawy() + this.tr2.y, entity.rotation - 90); + Draw.color(); + } + } +}); diff --git a/scripts/blocks/turret/turrets.js b/scripts/blocks/turret/turrets.js index 0bd17a63..a249366f 100644 --- a/scripts/blocks/turret/turrets.js +++ b/scripts/blocks/turret/turrets.js @@ -1,25 +1,23 @@ // Aegis -const aegis = extendContent(ItemTurret, "aegis", { - -}); +const aegis = extendContent(ItemTurret, "aegis", {}); + +// Ghost +require("blocks/turret/ghost") // Incandescence require("blocks/turret/incandescence") // Nighthawk -const nighthawk = extendContent(ItemTurret, "nighthawk", { - -}); +require("blocks/turret/nighthawk") //Voltmeter require("blocks/turret/voltmeter") // Blow -const blow = extendContent(DoubleTurret, "blow", { - -}); +require("blocks/turret/blow") // Quake -const quake = extendContent(ArtilleryTurret, "quake", { - -}); +require("blocks/turret/quake") + +// Seism +require("blocks/turret/seism") diff --git a/scripts/blocks/turret/voltmeter.js b/scripts/blocks/turret/voltmeter.js index 78b315d4..f3873aab 100644 --- a/scripts/blocks/turret/voltmeter.js +++ b/scripts/blocks/turret/voltmeter.js @@ -14,9 +14,7 @@ const voltmeter = extendContent(PowerTurret, "voltmeter", { if (!this.validateTarget(tile)){ entity.target = null; } - entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? baseHeat : 0, - this.cooldown > (boltWarmup * entity.efficiency()) ? (boltWarmup * entity.efficiency()) : this.cooldown - ); + entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? baseHeat : 0, this.cooldown); entity.recoil = 0; if (this.hasAmmo(tile)){ if(entity.timer.get(this.timerTarget, this.targetInterval)){ @@ -73,7 +71,7 @@ const voltmeter = extendContent(PowerTurret, "voltmeter", { // bolts Draw.blend(Blending.additive); for (var i = 1; i <= 6; i++){ - if (!Mathf.randomBoolean(heat)){continue;} + if (Mathf.randomSeed(Mathf.round(Time.time() + entity.id + i)) > heat){continue;} var j = i - 1; var rawrot = Time.time() * boltrotspeed[j] * boltrotdir[j]; var truerot = diff --git a/scripts/effectlib.js b/scripts/effectlib.js new file mode 100644 index 00000000..b389c6af --- /dev/null +++ b/scripts/effectlib.js @@ -0,0 +1,51 @@ +// Shortcuts for common draw methods used in effects. +// Lib by JerichoFletcher +module.exports = { + outlineCircle(x, y, col, thickness, radius){ + Draw.color(col); + Lines.stroke(thickness); + Lines.circle(x, y, radius); + Draw.color(); + Lines.stroke(1); + }, + outlineCircleWCol(x, y, thickness, radius){ + Lines.stroke(thickness); + Lines.circle(x, y, radius); + Lines.stroke(1); + }, + fillCircle(x, y, col, alpha, radius){ + Draw.color(col); + Draw.alpha(alpha); + Fill.circle(x, y, radius); + Draw.color(); + }, + fillCircleWCol(x, y, radius){ + Fill.circle(x, y, radius); + }, + splashLines(x, y, col, thickness, distance, length, count, seed){ + Draw.color(col); + Lines.stroke(thickness); + Angles.randLenVectors(seed, count, distance, new Floatc2(){get: (a, b) => { + Lines.lineAngle(x + a, y + b, Mathf.angle(a, b), length); + }}); + Draw.color(); + Lines.stroke(1); + }, + splashLinesWCol(x, y, thickness, distance, length, count, seed){ + Lines.stroke(thickness); + Angles.randLenVectors(seed, count, distance, new Floatc2(){get: (a, b) => { + Lines.lineAngle(x + a, y + b, Mathf.angle(a, b), length); + }}); + Lines.stroke(1); + }, + splashCircles(x, y, col, alpha, radius, distance, count, seed){ + Angles.randLenVectors(seed, count, distance, new Floatc2(){get: (a, b) => { + this.fillCircle(x + a, y + b, col, alpha, radius); + }}); + }, + splashCirclesWCol(x, y, radius, distance, count, seed){ + Angles.randLenVectors(seed, count, distance, new Floatc2(){get: (a, b) => { + this.fillCircle(x + a, y + b, radius); + }}); + }, +}; diff --git a/scripts/main.js b/scripts/main.js index 0993a835..e7863326 100644 --- a/scripts/main.js +++ b/scripts/main.js @@ -3,4 +3,13 @@ require("blocks/production") require("blocks/drills") require("blocks/turret/turrets") require("blocks/defense") -//require("blocks/effect/elementAura") +require("blocks/effect/element-aura") + +//units +require("units/ground-unit") +require("units/hover-unit") +require("units/copter-unit") + +//mechs +require("mechs/ship") +require("mechs/mech") diff --git a/scripts/mechs/halberd-ship.js b/scripts/mechs/halberd-ship.js new file mode 100644 index 00000000..9b8a375e --- /dev/null +++ b/scripts/mechs/halberd-ship.js @@ -0,0 +1,147 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const halberdBullet = extend(BasicBulletType, {}); +halberdBullet.damage = 12; +halberdBullet.bulletWidth = 6; +halberdBullet.bulletHeight = 12; +halberdBullet.speed = 9; +halberdBullet.lifetime = 18; +halberdBullet.frontColor = plib.frontColorCyan; +halberdBullet.backColor = plib.backColorCyan; +halberdBullet.hitEffect = Fx.hitBulletSmall; +halberdBullet.shootEffect = Fx.shootBig; +halberdBullet.smokeEffect = Fx.shootBigSmoke; + +const halberdBullet2 = extend(BasicBulletType, { + draw(b){ + elib.fillCircle(b.x, b.y, Pal.lancerLaser, 1, this._size); + if(Time.delta() > 0){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + }, + update(b){ + if(Mathf.chance(0.1)){ + var cone = this.lightningCone; + var rot = b.rot() + Mathf.random(-cone, cone); + Calls.createLighting(b.id + Mathf.random(50), b.getTeam(), Pal.lancerLaser, Vars.state.rules.playerDamageMultiplier * this.lightningDamage, b.x, b.y, rot, 10); + } + }, + hit(b, x, y){ + this.super$hit(b, b.x, b.y); + for(var i = 0; i < 3; i++){ + Calls.createLighting(b.id + Mathf.random(50), b.getTeam(), Pal.lancerLaser, Vars.state.rules.playerDamageMultiplier * this.lightningDamage, b.x, b.y, Mathf.random(360), 15); + } + } +}); +halberdBullet2.lightningDamage = 10; +halberdBullet2.lightningCone = 45; +halberdBullet2.hitTiles = false; +halberdBullet2.collidesTile = false; +halberdBullet2.collides = false; +halberdBullet2.damage = 0; +halberdBullet2.speed = 12; +halberdBullet2.drag = 0.05; +halberdBullet2.lifetime = 60; +halberdBullet2.shootEffect = Fx.shootBig; +halberdBullet2.smokeEffect = Fx.shootBigSmoke; +halberdBullet2._size = 6; +halberdBullet2.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, Pal.lancerLaser, 1, Mathf.lerp(halberdBullet2._size, 0.2, e.fin())); +}); +halberdBullet2.despawnEffect = newEffect(20, e => { + elib.outlineCircle(e.x, e.y, Pal.lancerLaser, e.fout() * halberdBullet2._size, 1 + e.fin() * 14); + elib.fillCircle(e.x, e.y, Pal.lancerLaser, 0.2 + e.fout() * 0.8, Mathf.lerp(halberdBullet2._size * 2, 0.2, e.fin())); +}); +halberdBullet2.hitEffect = halberdBullet2.despawnEffect; + +const halberdGun = extendContent(Weapon, "gatling", { + load(){ + this.region = Core.atlas.find(modName + "-gatling-equip"); + } +}); +halberdGun.length = 1.2; +halberdGun.reload = 6; +halberdGun.alternate = true; +halberdGun.inaccuracy = 1; +halberdGun.ejectEffect = Fx.shellEjectSmall; +halberdGun.shootSound = Sounds.shootBig; +halberdGun.bullet = halberdBullet; + +const halberd = extendContent(Mech, "halberd-ship", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + this.heatRegion = Core.atlas.find(this.name + "-heat"); + }, + draw(player){ + this.super$draw(player); + Draw.color(plib.frontColorCyan, plib.backColorCyan, Mathf.absin(4, 1)); + Draw.alpha(player.velocity().len() / this.maxSpeed); + Draw.rect(this.heatRegion, player.x, player.y, player.rotation - 90); + Draw.color(); + if(Time.delta() > 0){ + var scl = player.velocity().len() / this.maxSpeed; + for(var i = 0; i < 2; i++){ + var angle = player.rotation - 90; + var cx = Angles.trnsx(angle, Mathf.signs[i] * -22 / 4, -21 / 4); + var cy = Angles.trnsy(angle, Mathf.signs[i] * -22 / 4, -21 / 4); + if(scl > 0.5){ + Effects.effect(this._trailEffect, + player.x + cx + player.velocity().x * 5 / 6, + player.y + cy + player.velocity().y * 5 / 6, + player.velocity().angle(), scl + ); + }else{ + Effects.effect(this._trailEffect, + player.x + cx + player.velocity().x * 5 / 6, + player.y + cy + player.velocity().y * 5 / 6, + player.velocity().angle(), this._trailMinSize / this._trailSize + ); + } + } + } + }, + updateAlt(player){ + var scl = player.velocity().len() / this.maxSpeed; + if(scl >= 0.75){ + if(Mathf.chance((player.velocity().len() / this.maxSpeed * 0.08))){ + this.pl2.trns(player.rotation - 90, 0, this.weaponOffsetY); + var dir = player.velocity().angle() + Mathf.range(this.plasmaCone); + Calls.createBullet(halberdBullet2, player.getTeam(), + player.x + this.pl2.x, player.y + this.pl2.y, + dir, 1, 1 + ); + this.plasmaShootSound.at(player.x, player.y, Mathf.random(0.9, 1.1)) + } + } + }, +}); +halberd._trailEffect = newEffect(30, e => { + Draw.blend(Blending.additive); + Draw.color(plib.frontColorCyan, plib.backColorCyan, e.fin()); + Fill.circle(e.x, e.y, e.fout() * halberd._trailSize * e.data); + Draw.blend(); + Draw.color(); +}); +halberd._trailMinSize = 1.25; +halberd._trailSize = 4; +halberd.plasmaShootSound = Sounds.missile; +halberd.plasmaCone = 30; +halberd.pl2 = new Vec2(); +halberd.flying = true; +halberd.drillPower = 4; +halberd.mineSpeed = 1.4; +halberd.speed = 0.16; +halberd.maxSpeed = 12; +halberd.drag = 0.008; +halberd.mass = 4; +halberd.health = 320; +halberd.itemCapacity = 80; +halberd.engineColor = plib.engineColorCyan; +halberd.cellTrnsY = 1; +halberd.buildPower = 1.2; +halberd.weapon = halberdGun; + +const halberdPad = extendContent(MechPad, "halberd-ship-pad", {}); +halberdPad.mech = halberd; diff --git a/scripts/mechs/mech.js b/scripts/mechs/mech.js new file mode 100644 index 00000000..284ea497 --- /dev/null +++ b/scripts/mechs/mech.js @@ -0,0 +1,2 @@ +// Upsylon +require("mechs/upsylon-mech") diff --git a/scripts/mechs/ship.js b/scripts/mechs/ship.js new file mode 100644 index 00000000..d422ab3e --- /dev/null +++ b/scripts/mechs/ship.js @@ -0,0 +1,5 @@ +// Halberd +require("mechs/halberd-ship") + +// Vortex +require("mechs/vortex-ship") diff --git a/scripts/mechs/upsylon-mech.js b/scripts/mechs/upsylon-mech.js new file mode 100644 index 00000000..c0285d69 --- /dev/null +++ b/scripts/mechs/upsylon-mech.js @@ -0,0 +1,103 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const shotgunRound = extend(BasicBulletType, {}); +shotgunRound.damage = 9; +shotgunRound.bulletWidth = 6; +shotgunRound.bulletHeight = 9; +shotgunRound.bulletShrink = 0.3; +shotgunRound.frontColor = plib.frontColorCyan; +shotgunRound.backColor = plib.backColorCyan; +shotgunRound.drag = 0.01; +shotgunRound.speed = 6; +shotgunRound.lifetime = 17; +shotgunRound.hitEffect = Fx.hitBulletSmall; +shotgunRound.shootEffect = Fx.shootBig; +shotgunRound.smokeEffect = Fx.shootBigSmoke; + +const shotgun = extendContent(Weapon, "shotgun", { + load(){ + this.region = Core.atlas.find(modName + "-shotgun-equip"); + } +}); +shotgun.width = 5; +shotgun.length = 5.5; +shotgun.recoil = 3; +shotgun.reload = 30; +shotgun.shots = 20; +shotgun.spacing = 0; +shotgun.inaccuracy = 12; +shotgun.alternate = true; +shotgun.ejectEffect = Fx.shellEjectBig; +shotgun.shake = 2; +shotgun.velocityRnd = 0.3; +shotgun.shootSound = Sounds.shootBig; +shotgun.bullet = shotgunRound; + +const upsylonPlasma = extend(BasicBulletType, { + draw(b){ + elib.fillCircle(b.x, b.y, Pal.lancerLaser, 1, 6); + if(Time.delta() > 0){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + } +}); +upsylonPlasma.damage = Vars.state.rules.playerDamageMultiplier * 15; +upsylonPlasma.splashDamage = Vars.state.rules.playerDamageMultiplier * 30; +upsylonPlasma.splashDamageRadius = 20; +upsylonPlasma.speed = 12; +upsylonPlasma.lifetime = 48; +upsylonPlasma.drag = 0.08; +upsylonPlasma.homingRange = upsylonPlasma.range(); +upsylonPlasma.homingPower = 0.001; +upsylonPlasma.shootEffect = Fx.shootBig; +upsylonPlasma.smokeEffect = Fx.shootBigSmoke; +upsylonPlasma._size = 6; +upsylonPlasma.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, Pal.lancerLaser, 1, Mathf.lerp(upsylonPlasma._size, 0.2, e.fin())); +}); +upsylonPlasma.hitEffect = newEffect(16, e => { + elib.outlineCircle(e.x, e.y, Pal.lancerLaser, e.fout() * upsylonPlasma._size, 1 + e.fin() * (upsylonPlasma.splashDamageRadius + 6)); + elib.fillCircle(e.x, e.y, Pal.lancerLaser, 0.2 + e.fout() * 0.8, Mathf.lerp(upsylonPlasma.splashDamageRadius, 0.2, e.fin())); +}); +upsylonPlasma.despawnEffect = upsylonPlasma.hitEffect; +upsylonPlasma.hitSound = Sounds.explosion; + +const upsylon = extendContent(Mech, "upsylon-mech", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + this.baseRegion = Core.atlas.find(this.name + "-base"); + this.legRegion = Core.atlas.find(this.name + "-leg"); + }, + updateAlt(player){ + if(player.isShooting()){ + if(player.timer.get(player.timerAbility, this.secondaryReload)){ + Calls.createBullet(upsylonPlasma, player.getTeam(), player.x, player.y, player.rotation + Mathf.range(this.secondaryAngle / 2), 1, 1); + this.secondaryShootSound.at(player.x, player.y, Mathf.random(0.9, 1.1)); + } + } + } +}); +upsylon.pl1 = new Vec2(); +upsylon._shots = 0; +upsylon.secondaryShootSound = Sounds.artillery; +upsylon.secondaryAngle = 45; +upsylon.secondaryReload = 30; +upsylon.speed = 0.5; +upsylon.maxSpeed = 2; +upsylon.boostSpeed = 1; +upsylon.mass = 3.5; +upsylon.drillPower = 6; +upsylon.mineSpeed = 1.2; +upsylon.itemCapacity = 70; +upsylon.shake = 2; +upsylon.engineColor = plib.engineColorCyan; +upsylon.engineOffset = 5.6; +upsylon.health = 250; +upsylon.buildPower = 1.8; +upsylon.weaponOffsetX = 2; +upsylon.weapon = shotgun; + +const upsylonPad = extendContent(MechPad, "upsylon-mech-pad", {}); +upsylonPad.mech = upsylon; diff --git a/scripts/mechs/vortex-ship.js b/scripts/mechs/vortex-ship.js new file mode 100644 index 00000000..7b5576e7 --- /dev/null +++ b/scripts/mechs/vortex-ship.js @@ -0,0 +1,113 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const vortexBullet = extend(BasicBulletType, { + draw(b){ + elib.fillCircle(b.x, b.y, this.frontColor, 1, this.bulletWidth); + elib.outlineCircle(b.x, b.y, this.backColor, 1, this.bulletWidth); + if(b.timer.get(0, 3)){ + Effects.effect(this.trailEffectA, b.x, b.y, b.rot()); + } + if(Time.delta() > 0){ + Effects.effect(this.trailEffectB, b.x, b.y, b.rot()); + } + } +}); +vortexBullet.damage = 100; +vortexBullet.speed = 6; +vortexBullet.lifetime = 60; +vortexBullet.drag = 0.01; +vortexBullet.bulletWidth = vortexBullet.bulletHeight = 6; +vortexBullet.frontColor = plib.frontColorPurple; +vortexBullet.backColor = plib.backColorPurple; +vortexBullet.shootEffect = Fx.shootBig; +vortexBullet.smokeEffect = Fx.shootBigSmoke; +vortexBullet.trailEffectA = newEffect(30, e => { + elib.fillCircle(e.x, e.y, vortexBullet.backColor, 1, 0.2 + e.fout() * 4.8); +}); +vortexBullet.trailEffectB = newEffect(48, e => { + var angle = (Time.time() + Mathf.randomSeed(e.id, 360)) % 360; + var dist = vortexBullet.bulletWidth + 1 - e.fout() * 1.5; + elib.fillCircle(e.x + Angles.trnsx(angle, dist), e.y + Angles.trnsy(angle, dist), vortexBullet.backColor, 1, e.fout() * 1.1); +}); +vortexBullet.hitEffect = newEffect(18, e => { + elib.fillCircle(e.x, e.y, vortexBullet.frontColor, 0.2 + e.fin() * 0.8, 0.2 + e.fout() * 11.8); + + var thickness = e.fout() * 3; + var radius = e.fin() * 15; + elib.outlineCircle(e.x, e.y, vortexBullet.backColor, thickness, radius); +}); +vortexBullet.despawnEffect = vortexBullet.hitEffect; + +const vortexLance = extendContent(Weapon, "vortex-lance", { + load(){ + this.region = Core.atlas.find("clear"); + } +}); +vortexLance.shots = 1; +vortexLance.shake = 1; +vortexLance.width = 0; +vortexLance.alternate = true; +vortexLance.reload = 50; +vortexLance.recoil = 2; +vortexLance.inaccuracy = 3; +vortexLance.ejectEffect = Fx.shellEjectBig; +vortexLance.shootSound = Sounds.shootBig; +vortexLance.bullet = vortexBullet; + +const vortex = extendContent(Mech, "vortex-ship", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + }, + draw(player){ + this.pl1.trns(player.rotation - 90, 0, -(this.weapon.getRecoil(player, true) + this.weapon.getRecoil(player, false))); + Draw.rect(Core.atlas.find(modName + "-vortex-lance-equip"), player.x + this.pl1.x, player.y + this.pl1.y, player.rotation - 90); + + if(player.shootHeat > 0.01){ + Draw.color(Color.black, this.engineColor, player.shootHeat / 3); + Draw.blend(Blending.additive); + for(var i = 0; i < 3; i++){ + var rot = (Time.time() * this.shieldRotSpeed[i]) % 360; + Draw.rect(Core.atlas.find(this.name + "-shield" + i), player.x, player.y, rot); + } + Draw.blend(); + Draw.color(); + } + if(Time.delta() > 0){ + Draw.blend(Blending.additive); + Effects.effect(this.trailEffect, player.x, player.y, player.rotation); + Draw.blend(); + } + }, + getExtraArmor: function(player){ + return player.shootHeat * 60; + } +}); +vortex.shieldRotSpeed = [20, 50, 100]; +//vortex.shieldWarmup = 0.008; +vortex.pl1 = new Vec2(); +vortex.flying = true; +vortex.drillPower = 6; +vortex.mineSpeed = 1.6; +vortex.speed = 0.3; +vortex.maxSpeed = 4.33; +vortex.drag = 0.01; +vortex.mass = 4.5; +vortex.health = 420; +vortex.itemCapacity = 50; +vortex.engineColor = plib.engineColorPurple; +vortex.cellTrnsY = 2; +vortex.buildPower = 1.2; +vortex.weapon = vortexLance; +vortex.trailEffect = newEffect(20, e => { + var angle = Mathf.randomSeed(e.id, 360); + var offset = 0.3 + e.fin() * 0.4; + Draw.color(vortex.engineColor); + Draw.alpha(e.fout() * 0.67); + Draw.rect(Core.atlas.find(modName + "-vortex-ship-trail"), e.x + Angles.trnsx(angle, offset), e.y + Angles.trnsy(angle, offset), e.rotation - 90); + Draw.color(); +}); + +const vortexPad = extendContent(MechPad, "vortex-ship-pad", {}); +vortexPad.mech = vortex; diff --git a/scripts/plib.js b/scripts/plib.js new file mode 100644 index 00000000..97ab70f9 --- /dev/null +++ b/scripts/plib.js @@ -0,0 +1,19 @@ +// Mechanical Warfare extra pallette lib. +// Lib by JerichoFletcher +module.exports = { + frontColorHE: Color.valueOf("ffd385"), + backColorHE: Color.valueOf("b6573a"), + frontColorAP: Color.valueOf("fbff85"), + backColorAP: Color.valueOf("b68f3a"), + frontColorLava: Color.valueOf("ffddcc"), + backColorLava: Color.valueOf("ccaa99"), + frontColorCyan: Color.valueOf("c4fdfd"), + backColorCyan: Color.valueOf("4be3ca"), + frontColorPurple: Color.valueOf("f8c5fd"), + backColorPurple: Color.valueOf("d699dc"), + + engineColorCyan: Color.valueOf("7efdfd"), + engineColorPurple: Color.valueOf("e487ed"), + + fireAuraFlame: Color.valueOf("ffaa44"), +} diff --git a/scripts/units/copter-base.js b/scripts/units/copter-base.js new file mode 100644 index 00000000..d5284fa1 --- /dev/null +++ b/scripts/units/copter-base.js @@ -0,0 +1,50 @@ +module.exports = { + drawBase(base){ + Draw.mixcol(Color.white, base.hitTime / base.hitDuration); + Draw.rect(base.type.region, base.x, base.y, base.rotation - 90); + base.drawWeapons(); + base.drawRotor(); + Draw.mixcol(); + }, + drawRotor(base){ + var bladeRegion = Core.atlas.isFound(base.type.rotorBladeRegion()) ? + base.type.rotorBladeRegion() : Core.atlas.find(modName + "-rotor-blade"); + var topRegion = Core.atlas.isFound(base.type.rotorTopRegion()) ? + base.type.rotorTopRegion() : Core.atlas.find(modName + "-rotor-top"); + var offx = Angles.trnsx(base.rotation, base.type.rotorOffset(), base.type.rotorWidth()); + var offy = Angles.trnsy(base.rotation, base.type.rotorOffset(), base.type.rotorWidth()); + var w = bladeRegion.getWidth() * base.type.rotorScale() * Draw.scl; + var h = bladeRegion.getHeight() * base.type.rotorScale() * Draw.scl; + var angle = Time.time() * base.type.rotorSpeed() % 360; + var angle2 = base.type.alternateRotor() ? 360 - (angle % 360) : 90 + angle; + if(base.type.isTwinBlade()){ + for(var i = 0; i < 2; i++){ + var sign = Mathf.signs[i]; + var twinOffX = offx * sign; + var twinOffY = offy * sign; + Draw.rect(bladeRegion, base.x + twinOffX, base.y + twinOffY, w, h, angle); + Draw.rect(bladeRegion, base.x + twinOffX, base.y + twinOffY, w, h, angle2); + Draw.rect(topRegion, base.x + twinOffX, base.y + twinOffY); + } + }else{ + Draw.rect(bladeRegion, base.x + offx, base.y + offy, w, h, angle); + Draw.rect(bladeRegion, base.x + offx, base.y + offy, w, h, angle2); + Draw.rect(topRegion, base.x + offx, base.y + offy); + } + }, + drawWeapons(base){ + for(var i = 0; i <= 1; i++){ + var sign = Mathf.signs[i]; + var angle = base.rotation - 90; + var trY = base.type.weaponOffsetY - base.type.weapon.getRecoil(base, (sign > 0)); + var w = -sign * base.type.weapon.region.getWidth() * Draw.scl; + var h = base.type.weapon.region.getHeight() * Draw.scl; + Draw.rect(base.type.weapon.region, + base.x + Angles.trnsx(angle, base.getWeapon().width * sign, trY), + base.y + Angles.trnsy(angle, base.getWeapon().width * sign, trY), + w, h, angle + ); + } + //print(Core.atlas.isFound(Core.atlas.find(base.type.weapon.name + "-equip"))); + }, +}; diff --git a/scripts/units/copter-unit.js b/scripts/units/copter-unit.js new file mode 100644 index 00000000..2646ec42 --- /dev/null +++ b/scripts/units/copter-unit.js @@ -0,0 +1,130 @@ +const copterLib = require("units/copter-base"); + +// Serpent +// Raw DPS: 80 +const serpentBullet = extend(BasicBulletType, {}); +serpentBullet.width = 9; +serpentBullet.height = 12; +serpentBullet.speed = 9; +serpentBullet.lifetime = 21; +serpentBullet.damage = 5; +serpentBullet.shootEffect = Fx.shootSmall; +serpentBullet.smokeEffect = Fx.shootSmallSmoke; + +const serpentMissile = extend(MissileBulletType, {}); +serpentMissile.width = 18; +serpentMissile.height = 24; +serpentMissile.speed = 2.8; +serpentMissile.lifetime = 50; +serpentMissile.damage = 20; +serpentMissile.drag = -0.01; +serpentMissile.homingPower = 0.075; +serpentMissile.homingRange = 120; +serpentMissile.shootEffect = Fx.shootBig; +serpentMissile.smokeEffect = Fx.shootBigSmoke; + +const serpentWeapon = extendContent(Weapon, "serpent-gun", { + load(){ + this.region = Core.atlas.find(modName + "-serpent-gun-equip"); + } +}); +serpentWeapon.width = 8; +serpentWeapon.length = 5; +serpentWeapon.reload = 12; +serpentWeapon.alternate = true; +serpentWeapon.recoil = 1.5; +serpentWeapon.shake = 0; +serpentWeapon.inaccuracy = 3; +serpentWeapon.ejectEffect = Fx.shellEjectSmall; +serpentWeapon.shootSound = Sounds.shootSnap; +serpentWeapon.bullet = serpentBullet; + +const serpentUnit = extendContent(UnitType, "serpent", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + }, + secondaryReload: function(){ + return 40; + }, + /*secondaryRange: function(){ + return 100; + },*/ + secondaryShootCone: function(){ + return 45; + }, + secondaryShootSound: function(){ + return Sounds.missile; + }, + rotorBladeRegion: function(){ + return typeof(this.bladeRegion) !== "undefined" ? this.bladeRegion : Core.atlas.find("error"); + }, + rotorTopRegion: function(){ + return typeof(this.topRegion) !== "undefined" ? this.topRegion : Core.atlas.find("error"); + }, + rotorScale: function(){ + return 1.4; + }, + rotorSpeed: function(){ + return 8; + }, + rotorOffset: function(){ + return 5; + }, + rotorWidth: function(){ + return 0; + }, + alternateRotor: function(){ + return false; + }, + isTwinBlade: function(){ + return false; + }, +}); +serpentUnit.weapon = serpentWeapon; +serpentUnit.create(prov(() => extend(HoverUnit, { + behavior(){ + this.super$behavior(); + if(typeof(this.missileTimer) === "undefined"){ + this.missileTimer = 0; + } + if(typeof(this.currentLauncher) === "undefined"){ + this.currentLauncher = -1; + } + if(this.target != null && this.target.getTeam().isEnemy(this.getTeam()) && Angles.near(this.angleTo(this.target), this.rotation, this.type.secondaryShootCone()) && this.dst(this.target) < serpentMissile.range()){ + if(this.missileTimer++ >= this.type.secondaryReload()){ + var offx = Angles.trnsx(this.rotation - 90, this.getWeapon().width * this.currentLauncher / 2, 1); + var offy = Angles.trnsy(this.rotation - 90, this.getWeapon().width * this.currentLauncher / 2, 1); + Calls.createBullet(serpentMissile, this.getTeam(), this.x + offx, this.y + offy, this.rotation, 1 - Mathf.random(0.1), 1); + this.type.secondaryShootSound().at(this.x, this.y, Mathf.random(0.9, 1.1)); + this.missileTimer = 0; + if(this.currentLauncher < 0){ + this.currentLauncher = 1; + }else{ + this.currentLauncher = -1; + } + } + } + }, + draw(){ + copterLib.drawBase(this); + }, + drawWeapons(){ + copterLib.drawWeapons(this); + }, + drawRotor(){ + copterLib.drawRotor(this); + }, + drawEngine(){}, +}))); + +const serpentFactory = extendContent(UnitFactory, "serpent-factory", { + load(){ + this.region = Core.atlas.find(this.name); + this.topRegion = Core.atlas.find("clear"); + }, + generateIcons: function(){ + return [this.region]; + } +}); +serpentFactory.unitType = serpentUnit; diff --git a/scripts/units/ground-unit.js b/scripts/units/ground-unit.js new file mode 100644 index 00000000..a7a3244f --- /dev/null +++ b/scripts/units/ground-unit.js @@ -0,0 +1,164 @@ +const elib = require("effectlib"); +const plib = require("plib"); +const groundUnit = prov(() => extend(GroundUnit, {})); + +// Nullifier +const nullBullet = extend(BasicBulletType, { + draw(b){ + elib.fillCircle(b.x, b.y, this.frontColor, 1, this.bulletWidth); + elib.outlineCircle(b.x, b.y, this.backColor, 0.5, this.bulletWidth); + if(b.timer.get(0, 4)){ + Effects.effect(this.trailEffectA, b.x, b.y, b.rot()); + } + if(Time.delta() > 0){ + if(Mathf.chance(0.67)){ + Effects.effect(this.trailEffectB, b.x, b.y, b.rot()); + } + Effects.effect(this.trailEffectC, b.x, b.y, b.rot()); + } + } +}); +nullBullet.hitSize = 8; +nullBullet.damage = 700; +nullBullet.speed = 4; +nullBullet.knockback = 3; +nullBullet.lifetime = 75; +nullBullet.backColor = Color.white; +nullBullet.frontColor = Color.black; +nullBullet.bulletWidth = nullBullet.bulletHeight = 7; +nullBullet.trailEffectA = newEffect(30, e => { + var thickness = e.fout() * 3; + var radius = 0.2 + e.fout() * 6; + elib.outlineCircle(e.x, e.y, nullBullet.backColor, thickness, radius); +}); +nullBullet.trailEffectB = newEffect(42, e => { + Angles.randLenVectors(e.id + 2, 1, nullBullet.bulletWidth - 1, new Floatc2(){get: (a, b) => { + elib.fillCircle(e.x + a, e.y + b, nullBullet.frontColor, 1, e.fout() * 3); + }}); +}); +nullBullet.trailEffectC = newEffect(36, e => { + var angle = (Time.time() + Mathf.randomSeed(e.id, 360)) % 360; + var dist = nullBullet.bulletWidth + 1 - e.fout() * 1.5; + elib.fillCircle(e.x + Angles.trnsx(angle, dist), e.y + Angles.trnsy(angle, dist), nullBullet.backColor, 1, e.fout() * 1.1); +}); +nullBullet.hitEffect = newEffect(18, e => { + elib.fillCircle(e.x, e.y, nullBullet.frontColor, 0.2 + e.fin() * 0.8, 0.2 + e.fout() * 19.8); + + var thickness = e.fin() * 4; + var radius = e.fout() * 20; + elib.outlineCircle(e.x, e.y, nullBullet.backColor, thickness, radius); + + var lnThickness = e.fin() * 2; + var lnDistance = e.fout() * 12; + var lnLength = e.fin() * 4; + elib.splashLines(e.x, e.y, nullBullet.backColor, lnThickness, lnDistance, lnLength, 12, e.id); + + var crRadius = e.fout() * 3; + var crDistance = e.fin() * 6; + elib.splashCircles(e.x, e.y, Color.gray, 1, crRadius, crDistance, 4, e.id + 1); +}); +nullBullet.despawnEffect = nullBullet.hitEffect; + +const nullPointer = extendContent(Weapon, "null-pointer", { + load(){ + this.region = Core.atlas.find(modName + "-null-pointer-equip"); + } +}); +nullPointer.length = 18; +nullPointer.width = 30; +nullPointer.reload = 60; +nullPointer.alternate = true; +nullPointer.recoil = 6; +nullPointer.shake = 2.2; +nullPointer.inaccuracy = 2; +nullPointer.ejectEffect = Fx.shellEjectBig; +nullPointer.shootSound = Sounds.artillery; +nullPointer.bullet = nullBullet; + +const nullifier = extendContent(UnitType, "nullifier", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + this.baseRegion = Core.atlas.find(this.name + "-base"); + this.legRegion = Core.atlas.find(this.name + "-leg"); + } +}); +nullifier.weapon = nullPointer; +nullifier.create(groundUnit); + +// Anarchy +const anarchyShell = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(b.timer.get(0, 3)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + } +}); +anarchyShell.bulletWidth = 17; +anarchyShell.bulletHeight = 22; +anarchyShell.bulletShrink = 0.3; +anarchyShell.speed = 8; +anarchyShell.lifetime = 50; +anarchyShell.damage = 150; +anarchyShell.splashDamage = 100; +anarchyShell.splashDamageRadius = 16; +anarchyShell.inaccuracy = 2; +anarchyShell.hitShake = 3; +anarchyShell.frontColor = plib.frontColorCyan; +anarchyShell.backColor = plib.backColorCyan; +anarchyShell.hitSound = Sounds.explosion; +anarchyShell.shootEffect = Fx.shootBig; +anarchyShell.smokeEffect = Fx.shootBigSmoke; +anarchyShell.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, anarchyShell.frontColor, 1, 0.2 + e.fout() * 4.8); +}); +anarchyShell.hitEffect = newEffect(27, e => { + elib.fillCircle(e.x, e.y, anarchyShell.backColor, 0.2 + e.fin() * 0.8, e.fout() * 16); + + e.scaled(4, cons(i => { + var cThickness = i.fout() * 4; + var cRadius = i.fin() * 20; + elib.outlineCircle(e.x, e.y, anarchyShell.frontColor, cThickness, cRadius); + })); + + var lnThickness = e.fout() * 2; + var lnDistance = 4 + e.fin() * 24; + var lnLength = e.fout() * 5; + elib.splashLines(e.x, e.y, anarchyShell.frontColor, lnThickness, lnDistance, lnLength, 10, e.id); + + var crRadius = e.fout() * 4; + var crDistance = e.fin() * 6; + elib.splashCircles(e.x, e.y, Color.gray, 1, crRadius, crDistance, 4, e.id + 1); +}); +anarchyShell.despawnEffect = anarchyShell.hitEffect; + +const anarchyBlaster = extendContent(Weapon, "anarchy-blaster", { + load(){ + this.region = Core.atlas.find(modName + "-anarchy-blaster-equip"); + } +}); +anarchyBlaster.length = 15; +anarchyBlaster.width = 20; +anarchyBlaster.reload = 80; +anarchyBlaster.alternate = true; +anarchyBlaster.recoil = 6; +anarchyBlaster.shake = 3; +anarchyBlaster.inaccuracy = 3; +anarchyBlaster.shots = 2; +anarchyBlaster.shotDelay = 0; +anarchyBlaster.spacing = 0; +anarchyBlaster.ejectEffect = Fx.shellEjectBig; +anarchyBlaster.shootSound = Sounds.artillery; +anarchyBlaster.bullet = anarchyShell; + +const anarchy = extendContent(UnitType, "anarchy", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + this.baseRegion = Core.atlas.find(this.name + "-base"); + this.legRegion = Core.atlas.find(this.name + "-leg"); + } +}); +anarchy.weapon = anarchyBlaster; +anarchy.create(groundUnit); diff --git a/scripts/units/hover-unit.js b/scripts/units/hover-unit.js new file mode 100644 index 00000000..911e10f6 --- /dev/null +++ b/scripts/units/hover-unit.js @@ -0,0 +1,160 @@ +const elib = require("effectlib"); +const plib = require("plib"); + +const hoverUnit = prov(() => extend(HoverUnit, { + drawEngine(){ + Draw.color(this.type.getEngineColor()); + var ox = Angles.trnsx(this.rotation + 180, this.type.engineOffset); + var oy = Angles.trnsy(this.rotation + 180, this.type.engineOffset); + var oSize = Mathf.absin(Time.time(), 2, this.type.engineSize / 4); + Fill.circle(this.x + ox, this.y + oy, this.type.engineSize + oSize); + + Draw.color(Color.white); + var ix = Angles.trnsx(this.rotation + 180, this.type.engineOffset - 1); + var iy = Angles.trnsy(this.rotation + 180, this.type.engineOffset - 1); + var iSize = Mathf.absin(Time.time(), 2, this.type.engineSize / 4); + Fill.circle(this.x + ix, this.y + iy, (this.type.engineSize + oSize) / 2); + Draw.color(); + } +})); + +// Battleaxe +const axeLava = extend(LiquidBulletType, { + init(){ + this.liquid = Vars.content.getByName(ContentType.liquid, modName + "-liquid-lava"); + this.super$init(); + } +}); +axeLava.speed = 1; +axeLava.lifetime = 2; +axeLava.damage = 2; + +const axe = extend(MissileBulletType, { + draw(b){ + this.super$draw(b); + } +}); +axe.bulletWidth = 5; +axe.bulletHeight = 12; +axe.bulletShrink = 0.4; +axe.inaccuracy = 2; +axe.speed = 4; +axe.lifetime = 50; +axe.splashDamage = 24; +axe.splashDamageRadius = 16; +axe.frontColor = plib.frontColorLava; +axe.backColor = plib.backColorLava; +axe.shootEffect = Fx.shootBig; +axe.smokeEffect = Fx.shootBigSmoke; +axe.fragBullets = 3; +axe.fragBullet = axeLava; + +const axeLauncher = extendContent(Weapon, "axe-launcher", { + load(){ + this.region = Core.atlas.find(modName + "-axe-launcher-equip"); + } +}); +axeLauncher.width = 7; +axeLauncher.recoil = 3; +axeLauncher.reload = 30; +axeLauncher.alternate = false; +axeLauncher.inaccuracy = 5; +axeLauncher.shots = 2; +axeLauncher.spacing = 0; +axeLauncher.shotDelay = 1; +axeLauncher.shootSound = Sounds.missile; +axeLauncher.bullet = axe; + +const battleaxe = extendContent(UnitType, "battleaxe", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + }, + getEngineColor: function(){ + return plib.engineColorCyan; + } +}); +battleaxe.weapon = axeLauncher; +battleaxe.create(hoverUnit); + +const battleaxeFactory = extendContent(UnitFactory, "battleaxe-factory", {}); +battleaxeFactory.unitType = battleaxe; + +// Scythe +const scytheShell = extend(BasicBulletType, { + draw(b){ + this.super$draw(b); + if(b.timer.get(0, 3)){ + Effects.effect(this.trailEffect, b.x, b.y, b.rot()); + } + } +}); +scytheShell.collides = true; +scytheShell.collidesTiles = true; +scytheShell.collidesAir = true; +scytheShell.inaccuracy = 3; +scytheShell.bulletWidth = 10; +scytheShell.bulletHeight = 16; +scytheShell.frontColor = plib.frontColorCyan; +scytheShell.backColor = plib.backColorCyan; +scytheShell.speed = 7; +scytheShell.lifetime = 25; +scytheShell.damage = 15; +scytheShell.splashDamage = 15; +scytheShell.splashDamageRadius = 6; +scytheShell.shootEffect = Fx.shootBig; +scytheShell.smokeEffect = Fx.shootBigSmoke; +scytheShell.hitSound = Sounds.explosion; +scytheShell.trailEffect = newEffect(30, e => { + elib.fillCircle(e.x, e.y, scytheShell.frontColor, 1, 0.2 + e.fout() * 2.5); +}); +scytheShell.hitEffect = newEffect(27, e => { + e.scaled(6, cons(i => { + var thickness = i.fout() * 2; + var radius = i.fout() * 8; + elib.outlineCircle(e.x, e.y, scytheShell.frontColor, thickness, radius); + })); + + var lnThickness = e.fout() * 2; + var lnDistance = 4 + e.fin() * 16; + var lnLength = e.fout() * 3; + elib.splashLines(e.x, e.y, scytheShell.frontColor, lnThickness, lnDistance, lnLength, 3, e.id); + + var crRadius = e.fout() * 4; + var crDistance = e.fin() * 6; + elib.splashCircles(e.x, e.y, Color.gray, 1, crRadius, crDistance, 4, e.id + 1); +}); +scytheShell.despawnEffect = scytheShell.hitEffect; + +const scytheLauncher = extendContent(Weapon, "scythe-launcher", { + load(){ + this.region = Core.atlas.find(modName + "-scythe-launcher-equip"); + } +}); +scytheLauncher.width = 9; +scytheLauncher.recoil = 3; +scytheLauncher.reload = 50; +scytheLauncher.alternate = true; +scytheLauncher.inaccuracy = 2; +scytheLauncher.shots = 8; +scytheLauncher.spacing = 0.5; +scytheLauncher.shotDelay = 1; +scytheLauncher.velocityRnd = 0.3; +scytheLauncher.shootSound = Sounds.artillery; +scytheLauncher.ejectEffect = Fx.shellEjectBig; +scytheLauncher.bullet = scytheShell; + +const scythe = extendContent(UnitType, "scythe", { + load(){ + this.weapon.load(); + this.region = Core.atlas.find(this.name); + }, + getEngineColor: function(){ + return plib.engineColorCyan; + } +}); +scythe.weapon = scytheLauncher; +scythe.create(hoverUnit); + +const scytheFactory = extendContent(UnitFactory, "scythe-factory", {}); +scytheFactory.unitType = scythe; \ No newline at end of file diff --git a/sounds/blowshot.mp3 b/sounds/blowshot.mp3 index 9bce4f40..948400ef 100644 Binary files a/sounds/blowshot.mp3 and b/sounds/blowshot.mp3 differ diff --git a/sounds/blowshot.ogg b/sounds/blowshot.ogg index 9056a4dd..3e45afbc 100644 Binary files a/sounds/blowshot.ogg and b/sounds/blowshot.ogg differ diff --git a/sounds/fireAuraActive.mp3 b/sounds/fireAuraActive.mp3 new file mode 100644 index 00000000..cf67762a Binary files /dev/null and b/sounds/fireAuraActive.mp3 differ diff --git a/sounds/fireAuraActive.ogg b/sounds/fireAuraActive.ogg new file mode 100644 index 00000000..ea0c6dd4 Binary files /dev/null and b/sounds/fireAuraActive.ogg differ diff --git a/sounds/quakemk2shot.mp3 b/sounds/quakemk2shot.mp3 new file mode 100644 index 00000000..3e728331 Binary files /dev/null and b/sounds/quakemk2shot.mp3 differ diff --git a/sounds/quakemk2shot.ogg b/sounds/quakemk2shot.ogg new file mode 100644 index 00000000..d07e1637 Binary files /dev/null and b/sounds/quakemk2shot.ogg differ diff --git a/sprites/blocks/defense/fire-aura-block.png b/sprites/blocks/defense/fire-aura-block.png new file mode 100644 index 00000000..1f3cd596 Binary files /dev/null and b/sprites/blocks/defense/fire-aura-block.png differ diff --git a/sprites/blocks/defense/fire-aura-heat.png b/sprites/blocks/defense/fire-aura-heat.png new file mode 100644 index 00000000..f5bdea03 Binary files /dev/null and b/sprites/blocks/defense/fire-aura-heat.png differ diff --git a/sprites/blocks/defense/fire-aura-top.png b/sprites/blocks/defense/fire-aura-top.png index 129e1aa8..4a4b394c 100644 Binary files a/sprites/blocks/defense/fire-aura-top.png and b/sprites/blocks/defense/fire-aura-top.png differ diff --git a/sprites/blocks/defense/fire-aura.png b/sprites/blocks/defense/fire-aura.png index 1f3cd596..a0c6a1bc 100644 Binary files a/sprites/blocks/defense/fire-aura.png and b/sprites/blocks/defense/fire-aura.png differ diff --git a/sprites/blocks/drills/chemical-drill-bottom.png b/sprites/blocks/drills/chemical-drill-bottom.png index a3a17d7e..d199e963 100644 Binary files a/sprites/blocks/drills/chemical-drill-bottom.png and b/sprites/blocks/drills/chemical-drill-bottom.png differ diff --git a/sprites/blocks/drills/chemical-drill-rotator.png b/sprites/blocks/drills/chemical-drill-rotator.png index 0e3c205d..462e12ad 100644 Binary files a/sprites/blocks/drills/chemical-drill-rotator.png and b/sprites/blocks/drills/chemical-drill-rotator.png differ diff --git a/sprites/blocks/mechs/ships/vortex-ship-pad.png b/sprites/blocks/mechs/ships/vortex-ship-pad.png new file mode 100644 index 00000000..79a9802f Binary files /dev/null and b/sprites/blocks/mechs/ships/vortex-ship-pad.png differ diff --git a/sprites/blocks/mw-base-3.png b/sprites/blocks/mw-base-3.png deleted file mode 100644 index ddfc80e2..00000000 Binary files a/sprites/blocks/mw-base-3.png and /dev/null differ diff --git a/sprites/blocks/production/chemical-station-top.png b/sprites/blocks/production/chemical-station-top.png index 10110015..8b06d694 100644 Binary files a/sprites/blocks/production/chemical-station-top.png and b/sprites/blocks/production/chemical-station-top.png differ diff --git a/sprites/blocks/production/mk2-assembler-bottom.png b/sprites/blocks/production/mk2-assembler-bottom.png new file mode 100644 index 00000000..a61117eb Binary files /dev/null and b/sprites/blocks/production/mk2-assembler-bottom.png differ diff --git a/sprites/blocks/production/mk2-assembler-liquid.png b/sprites/blocks/production/mk2-assembler-liquid.png new file mode 100644 index 00000000..2ddfc26c Binary files /dev/null and b/sprites/blocks/production/mk2-assembler-liquid.png differ diff --git a/sprites/blocks/production/mk2-assembler.png b/sprites/blocks/production/mk2-assembler.png new file mode 100644 index 00000000..deccb615 Binary files /dev/null and b/sprites/blocks/production/mk2-assembler.png differ diff --git a/sprites/blocks/production/steel-crucible.png b/sprites/blocks/production/steel-crucible.png index a93ec5fd..d7cbc8b4 100644 Binary files a/sprites/blocks/production/steel-crucible.png and b/sprites/blocks/production/steel-crucible.png differ diff --git a/sprites/blocks/turrets/bases/block-5.png b/sprites/blocks/turrets/bases/block-5.png new file mode 100644 index 00000000..741d713c Binary files /dev/null and b/sprites/blocks/turrets/bases/block-5.png differ diff --git a/sprites/blocks/turrets/seism-heat.png b/sprites/blocks/turrets/seism-heat.png new file mode 100644 index 00000000..00eea7fc Binary files /dev/null and b/sprites/blocks/turrets/seism-heat.png differ diff --git a/sprites/blocks/turrets/seism-phase0.png b/sprites/blocks/turrets/seism-phase0.png new file mode 100644 index 00000000..91c7f001 Binary files /dev/null and b/sprites/blocks/turrets/seism-phase0.png differ diff --git a/sprites/blocks/turrets/seism-phase1.png b/sprites/blocks/turrets/seism-phase1.png new file mode 100644 index 00000000..d8aa7908 Binary files /dev/null and b/sprites/blocks/turrets/seism-phase1.png differ diff --git a/sprites/blocks/turrets/seism-phase2.png b/sprites/blocks/turrets/seism-phase2.png new file mode 100644 index 00000000..87df0e23 Binary files /dev/null and b/sprites/blocks/turrets/seism-phase2.png differ diff --git a/sprites/blocks/turrets/seism.png b/sprites/blocks/turrets/seism.png new file mode 100644 index 00000000..f798af1a Binary files /dev/null and b/sprites/blocks/turrets/seism.png differ diff --git a/sprites/blocks/units/battleaxe-factory-top.png b/sprites/blocks/units/battleaxe-factory-top.png new file mode 100644 index 00000000..2dace23b Binary files /dev/null and b/sprites/blocks/units/battleaxe-factory-top.png differ diff --git a/sprites/blocks/units/battleaxe-factory.png b/sprites/blocks/units/battleaxe-factory.png new file mode 100644 index 00000000..9014093c Binary files /dev/null and b/sprites/blocks/units/battleaxe-factory.png differ diff --git a/sprites/blocks/units/chaos-array-factory-top.png b/sprites/blocks/units/chaos-array-factory-top.png new file mode 100644 index 00000000..78715f1b Binary files /dev/null and b/sprites/blocks/units/chaos-array-factory-top.png differ diff --git a/sprites/blocks/units/chaos-array-factory.png b/sprites/blocks/units/chaos-array-factory.png new file mode 100644 index 00000000..141d9f1c Binary files /dev/null and b/sprites/blocks/units/chaos-array-factory.png differ diff --git a/sprites/blocks/units/m-tron-factory-top.png b/sprites/blocks/units/m-tron-factory-top.png new file mode 100644 index 00000000..35ebd936 Binary files /dev/null and b/sprites/blocks/units/m-tron-factory-top.png differ diff --git a/sprites/blocks/units/m-tron-factory.png b/sprites/blocks/units/m-tron-factory.png new file mode 100644 index 00000000..6786a32c Binary files /dev/null and b/sprites/blocks/units/m-tron-factory.png differ diff --git a/sprites/blocks/units/scythe-factory.png b/sprites/blocks/units/scythe-factory.png index 73a4da5a..3ca68808 100644 Binary files a/sprites/blocks/units/scythe-factory.png and b/sprites/blocks/units/scythe-factory.png differ diff --git a/sprites/blocks/units/serpent-factory.png b/sprites/blocks/units/serpent-factory.png new file mode 100644 index 00000000..c87df425 Binary files /dev/null and b/sprites/blocks/units/serpent-factory.png differ diff --git a/sprites/blocks/units/shadow-factory.png b/sprites/blocks/units/shadow-factory.png index f6152210..f8bcd745 100644 Binary files a/sprites/blocks/units/shadow-factory.png and b/sprites/blocks/units/shadow-factory.png differ diff --git a/sprites/effects/energybullet1-back.png b/sprites/effects/energybullet1-back.png new file mode 100644 index 00000000..546ebc97 Binary files /dev/null and b/sprites/effects/energybullet1-back.png differ diff --git a/sprites/effects/energybullet1.png b/sprites/effects/energybullet1.png new file mode 100644 index 00000000..063396eb Binary files /dev/null and b/sprites/effects/energybullet1.png differ diff --git a/sprites/items/mk2-module.png b/sprites/items/mk2-module.png new file mode 100644 index 00000000..80b011f2 Binary files /dev/null and b/sprites/items/mk2-module.png differ diff --git a/sprites/mechs/ships/halberd-ship-heat.png b/sprites/mechs/ships/halberd-ship-heat.png new file mode 100644 index 00000000..2edcc2b5 Binary files /dev/null and b/sprites/mechs/ships/halberd-ship-heat.png differ diff --git a/sprites/mechs/ships/halberd-ship.png b/sprites/mechs/ships/halberd-ship.png index b5c9defc..e5ff76cc 100644 Binary files a/sprites/mechs/ships/halberd-ship.png and b/sprites/mechs/ships/halberd-ship.png differ diff --git a/sprites/mechs/ships/vortex-ship-shield0.png b/sprites/mechs/ships/vortex-ship-shield0.png new file mode 100644 index 00000000..15e6df22 Binary files /dev/null and b/sprites/mechs/ships/vortex-ship-shield0.png differ diff --git a/sprites/mechs/ships/vortex-ship-shield1.png b/sprites/mechs/ships/vortex-ship-shield1.png new file mode 100644 index 00000000..540598c3 Binary files /dev/null and b/sprites/mechs/ships/vortex-ship-shield1.png differ diff --git a/sprites/mechs/ships/vortex-ship-shield2.png b/sprites/mechs/ships/vortex-ship-shield2.png new file mode 100644 index 00000000..90e9d6b6 Binary files /dev/null and b/sprites/mechs/ships/vortex-ship-shield2.png differ diff --git a/sprites/mechs/ships/vortex-ship-trail.png b/sprites/mechs/ships/vortex-ship-trail.png new file mode 100644 index 00000000..439f78cb Binary files /dev/null and b/sprites/mechs/ships/vortex-ship-trail.png differ diff --git a/sprites/mechs/ships/vortex-ship.png b/sprites/mechs/ships/vortex-ship.png new file mode 100644 index 00000000..855b1d20 Binary files /dev/null and b/sprites/mechs/ships/vortex-ship.png differ diff --git a/sprites/units/anarchy-base.png b/sprites/units/anarchy-base.png new file mode 100644 index 00000000..5276f5d7 Binary files /dev/null and b/sprites/units/anarchy-base.png differ diff --git a/sprites/units/anarchy-leg.png b/sprites/units/anarchy-leg.png new file mode 100644 index 00000000..3d1a8685 Binary files /dev/null and b/sprites/units/anarchy-leg.png differ diff --git a/sprites/units/anarchy.png b/sprites/units/anarchy.png new file mode 100644 index 00000000..635735c2 Binary files /dev/null and b/sprites/units/anarchy.png differ diff --git a/sprites/units/battleaxe.png b/sprites/units/battleaxe.png new file mode 100644 index 00000000..fc32e4d2 Binary files /dev/null and b/sprites/units/battleaxe.png differ diff --git a/sprites/units/m-tron-base.png b/sprites/units/m-tron-base.png new file mode 100644 index 00000000..416d31d7 Binary files /dev/null and b/sprites/units/m-tron-base.png differ diff --git a/sprites/units/m-tron-leg.png b/sprites/units/m-tron-leg.png new file mode 100644 index 00000000..436fedfc Binary files /dev/null and b/sprites/units/m-tron-leg.png differ diff --git a/sprites/units/m-tron.png b/sprites/units/m-tron.png new file mode 100644 index 00000000..7b48e4b1 Binary files /dev/null and b/sprites/units/m-tron.png differ diff --git a/sprites/units/nullifier-base.png b/sprites/units/nullifier-base.png index 2589694d..1ce5e53a 100644 Binary files a/sprites/units/nullifier-base.png and b/sprites/units/nullifier-base.png differ diff --git a/sprites/units/nullifier-leg.png b/sprites/units/nullifier-leg.png index 030f580b..fce36652 100644 Binary files a/sprites/units/nullifier-leg.png and b/sprites/units/nullifier-leg.png differ diff --git a/sprites/units/nullifier.png b/sprites/units/nullifier.png index 362f9216..59d5ebf7 100644 Binary files a/sprites/units/nullifier.png and b/sprites/units/nullifier.png differ diff --git a/sprites/units/serpent.png b/sprites/units/serpent.png new file mode 100644 index 00000000..fb98701a Binary files /dev/null and b/sprites/units/serpent.png differ diff --git a/sprites/weapons/anarchy-blaster-equip.png b/sprites/weapons/anarchy-blaster-equip.png new file mode 100644 index 00000000..6672e638 Binary files /dev/null and b/sprites/weapons/anarchy-blaster-equip.png differ diff --git a/sprites/weapons/axe-launcher-equip.png b/sprites/weapons/axe-launcher-equip.png new file mode 100644 index 00000000..9bb788db Binary files /dev/null and b/sprites/weapons/axe-launcher-equip.png differ diff --git a/sprites/weapons/m-rifle-equip.png b/sprites/weapons/m-rifle-equip.png new file mode 100644 index 00000000..fdc990bc Binary files /dev/null and b/sprites/weapons/m-rifle-equip.png differ diff --git a/sprites/weapons/serpent-gun-equip.png b/sprites/weapons/serpent-gun-equip.png new file mode 100644 index 00000000..9d67e86f Binary files /dev/null and b/sprites/weapons/serpent-gun-equip.png differ diff --git a/sprites/weapons/vortex-lance-equip.png b/sprites/weapons/vortex-lance-equip.png new file mode 100644 index 00000000..02da9308 Binary files /dev/null and b/sprites/weapons/vortex-lance-equip.png differ diff --git a/sprites/zones/back-door-zone.png b/sprites/zones/back-door-zone.png new file mode 100644 index 00000000..5f8bda1d Binary files /dev/null and b/sprites/zones/back-door-zone.png differ diff --git a/sprites/zones/front-gate-zone.png b/sprites/zones/front-gate-zone.png index 62b6fd9b..76b5606c 100644 Binary files a/sprites/zones/front-gate-zone.png and b/sprites/zones/front-gate-zone.png differ diff --git a/storage/core-origin.png b/storage/core-origin.png deleted file mode 100644 index 98dd3171..00000000 Binary files a/storage/core-origin.png and /dev/null differ