From 244304887910de1bffd64922b07b88311f27bec6 Mon Sep 17 00:00:00 2001 From: WMF Date: Sat, 25 Nov 2023 21:11:21 +0100 Subject: [PATCH] v1.7 Build 2 --- README.md | 6 +- assets/bundles/bundle.properties | 79 ++++---- assets/mod.hjson | 4 +- .../defence/{slowray.png => cavern.png} | Bin ...illery-outline.png => hexagon-outline.png} | Bin .../{exagon-altillery.png => hexagon.png} | Bin .../defence/{fastray.png => underglow.png} | Bin .../sprites/blocks/effect/core-ark-team.png | Bin 0 -> 2010 bytes assets/sprites/blocks/effect/core-ark.png | Bin 0 -> 1586 bytes .../blocks/environment/amethyst-crystal.png | Bin 0 -> 2156 bytes .../blocks/environment/ore/amethyst1.png | Bin 0 -> 419 bytes .../blocks/environment/ore/amethyst2.png | Bin 0 -> 457 bytes .../blocks/environment/ore/amethyst3.png | Bin 0 -> 437 bytes .../blocks/extraction/crysta-cutter-top.png | Bin 0 -> 120 bytes .../extraction/crystal-cutter-rotator.png | Bin 0 -> 1435 bytes .../blocks/extraction/crystal-cutter.png | Bin 0 -> 3973 bytes assets/sprites/icons/repair.png | Bin 0 -> 224 bytes assets/sprites/items/amethyst.png | Bin 0 -> 590 bytes assets/sprites/statuses/frozen.png | Bin 0 -> 468 bytes assets/sprites/statuses/warm.png | Bin 0 -> 424 bytes .../{stormer-cell.png => agrid-cell.png} | Bin .../units/{rusher-foot.png => agrid-foot.png} | Bin .../{rusher-joint.png => agrid-joint.png} | Bin ...rusher-leg-base.png => agrid-leg-base.png} | Bin .../units/{rusher-leg.png => agrid-leg.png} | Bin .../sprites/units/{stormer.png => agrid.png} | Bin .../{breadnight-base.png => convoy-base.png} | Bin .../{toastnight-cell.png => convoy-cell.png} | Bin .../{breadnight-leg.png => convoy-leg.png} | Bin .../units/{toastnight.png => convoy.png} | Bin assets/sprites/units/creo-cell.png | Bin 0 -> 333 bytes assets/sprites/units/creo.png | Bin 0 -> 874 bytes .../{toastnight-base.png => requer-base.png} | Bin .../{breadnight-cell.png => requer-cell.png} | Bin .../{toastnight-leg.png => requer-leg.png} | Bin .../units/{breadnight.png => requer.png} | Bin assets/sprites/units/stormer-foot.png | Bin 359 -> 0 bytes assets/sprites/units/stormer-joint.png | Bin 230 -> 0 bytes assets/sprites/units/stormer-leg-base.png | Bin 273 -> 0 bytes assets/sprites/units/stormer-leg.png | Bin 400 -> 0 bytes .../{stormer-weapon.png => agrid-weapon.png} | Bin ...oastnight-weapon.png => convoy-weapon.png} | Bin ...{breadnight-laser.png => requer-laser.png} | Bin ...readnight-weapon.png => requer-weapon.png} | Bin .../sprites/units/weapons/rusher-weapon.png | Bin 691 -> 0 bytes ...sher-artillery.png => xerad-artillery.png} | Bin assets/sprites/units/weapons/xerad-weapon.png | Bin 0 -> 664 bytes .../units/{rusher-cell.png => xerad-cell.png} | Bin .../sprites/units/{rusher.png => xerad.png} | Bin build.gradle | 4 +- .../ExpandedIndustries.java | 5 +- src/ExpandedIndustries/ai/EICommands.java | 9 + .../ai/types/RepairUnitAI.java | 34 ++++ src/ExpandedIndustries/content/EIBlocks.java | 80 +++++--- src/ExpandedIndustries/content/EIItems.java | 5 +- .../content/EILoadouts.java | 3 - .../content/EIStatusEffects.java | 26 ++- .../content/EITechTree.java | 45 ++--- src/ExpandedIndustries/content/EIUnits.java | 182 +++++++----------- .../content/EIWeathers.java | 33 ++++ .../bullet/abilities/OverloadAbility.java | 22 ++- .../world/blocks/environment/PropOre.java | 91 +++++++++ .../blocks/production/WhitelistDrill.java | 136 +++++++++++++ .../world/blocks/storage/StatusCore.java | 85 ++++++++ 64 files changed, 626 insertions(+), 223 deletions(-) rename assets/sprites/blocks/defence/{slowray.png => cavern.png} (100%) rename assets/sprites/blocks/defence/{exagon-altillery-outline.png => hexagon-outline.png} (100%) rename assets/sprites/blocks/defence/{exagon-altillery.png => hexagon.png} (100%) rename assets/sprites/blocks/defence/{fastray.png => underglow.png} (100%) create mode 100644 assets/sprites/blocks/effect/core-ark-team.png create mode 100644 assets/sprites/blocks/effect/core-ark.png create mode 100644 assets/sprites/blocks/environment/amethyst-crystal.png create mode 100644 assets/sprites/blocks/environment/ore/amethyst1.png create mode 100644 assets/sprites/blocks/environment/ore/amethyst2.png create mode 100644 assets/sprites/blocks/environment/ore/amethyst3.png create mode 100644 assets/sprites/blocks/extraction/crysta-cutter-top.png create mode 100644 assets/sprites/blocks/extraction/crystal-cutter-rotator.png create mode 100644 assets/sprites/blocks/extraction/crystal-cutter.png create mode 100644 assets/sprites/icons/repair.png create mode 100644 assets/sprites/items/amethyst.png create mode 100644 assets/sprites/statuses/frozen.png create mode 100644 assets/sprites/statuses/warm.png rename assets/sprites/units/{stormer-cell.png => agrid-cell.png} (100%) rename assets/sprites/units/{rusher-foot.png => agrid-foot.png} (100%) rename assets/sprites/units/{rusher-joint.png => agrid-joint.png} (100%) rename assets/sprites/units/{rusher-leg-base.png => agrid-leg-base.png} (100%) rename assets/sprites/units/{rusher-leg.png => agrid-leg.png} (100%) rename assets/sprites/units/{stormer.png => agrid.png} (100%) rename assets/sprites/units/{breadnight-base.png => convoy-base.png} (100%) rename assets/sprites/units/{toastnight-cell.png => convoy-cell.png} (100%) rename assets/sprites/units/{breadnight-leg.png => convoy-leg.png} (100%) rename assets/sprites/units/{toastnight.png => convoy.png} (100%) create mode 100644 assets/sprites/units/creo-cell.png create mode 100644 assets/sprites/units/creo.png rename assets/sprites/units/{toastnight-base.png => requer-base.png} (100%) rename assets/sprites/units/{breadnight-cell.png => requer-cell.png} (100%) rename assets/sprites/units/{toastnight-leg.png => requer-leg.png} (100%) rename assets/sprites/units/{breadnight.png => requer.png} (100%) delete mode 100644 assets/sprites/units/stormer-foot.png delete mode 100644 assets/sprites/units/stormer-joint.png delete mode 100644 assets/sprites/units/stormer-leg-base.png delete mode 100644 assets/sprites/units/stormer-leg.png rename assets/sprites/units/weapons/{stormer-weapon.png => agrid-weapon.png} (100%) rename assets/sprites/units/weapons/{toastnight-weapon.png => convoy-weapon.png} (100%) rename assets/sprites/units/weapons/{breadnight-laser.png => requer-laser.png} (100%) rename assets/sprites/units/weapons/{breadnight-weapon.png => requer-weapon.png} (100%) delete mode 100644 assets/sprites/units/weapons/rusher-weapon.png rename assets/sprites/units/weapons/{rusher-artillery.png => xerad-artillery.png} (100%) create mode 100644 assets/sprites/units/weapons/xerad-weapon.png rename assets/sprites/units/{rusher-cell.png => xerad-cell.png} (100%) rename assets/sprites/units/{rusher.png => xerad.png} (100%) create mode 100644 src/ExpandedIndustries/ai/EICommands.java create mode 100644 src/ExpandedIndustries/ai/types/RepairUnitAI.java create mode 100644 src/ExpandedIndustries/content/EIWeathers.java create mode 100644 src/ExpandedIndustries/world/blocks/environment/PropOre.java create mode 100644 src/ExpandedIndustries/world/blocks/production/WhitelistDrill.java create mode 100644 src/ExpandedIndustries/world/blocks/storage/StatusCore.java diff --git a/README.md b/README.md index 81525383..3f16b47d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # Expanded Industries -Current version - 1.7 Build 1\ -Some content for people to enjoy! +Current version - 1.7 Build 2 (Preview build)\ +Some content for people to enjoy!\ +\ +Special thanks to Siede for making the WhitelistDrill class :D diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index 2751facc..591b0fe8 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -41,54 +41,48 @@ unit.ei-centurion.name = Centurion unit.ei-centurion.description = Harvests resources. Heals units within range.\nCan mine titanium. unit.ei-alturion.name = Alturion unit.ei-alturion.description = Harvests resources. Heals units within range.\nCan mine thorium. -unit.ei-stormer.name = Stormer -unit.ei-stormer.description = Fires piercing laser beams that damage enemy targets and repair allied structures. Can step over most terrain. -unit.ei-rusher.name = Rusher -unit.ei-rusher.description = Fires piercing laser beams and artillery shells at enemies. Can step over most terrain. +unit.ei-agrid.name = Agrid +unit.ei-agrid.description = Fires piercing laser beams that damage enemy targets and repair allied structures. Can step over most terrain. +unit.ei-xerad.name = Xerad +unit.ei-xerad.description = Fires piercing laser beams and artillery shells at enemies. Can step over most terrain. unit.ei-escapade.name = Escapade unit.ei-escapade.description = Fires piercing laser beams and artillery shells at enemies. Can step over most terrain. unit.ei-natorin.name = Natorin unit.ei-natorin.description = Fires continuous laser beams at enemies. Pierces through armor and sets on fire. Can step over most terrain. unit.ei-terrand.name = Terrand unit.ei-terrand.description = Fires charged energy projectiles, shrapnel artillery shells and continuous laser beams.\nPierces through armor, does not pierce through buildings. Can step over most terrain. -unit.ei-small-boi.name = SmolBoi -unit.ei-small-boi.description = Carries small amounts of items. Explodes nearby enemies. -unit.ei-medium-boi.name = MediumBoi -unit.ei-medium-boi.description = Carries mediocre amounts of items. Explodes nearby enemies. -unit.ei-large-boi.name = LargeBoi -unit.ei-large-boi.description = Carries large amounts of items. Explodes nearby enemies. Produces SmolBois. -unit.ei-payload-boi.name = PayloadBoi -unit.ei-payload-boi.description = Carries massive amounts of items. Can carry payload. unit.ei-pygmy.name = Pygmy unit.ei-pygmy.description = Fires homing bullets at enemies. Steals health on hit. unit.ei-schaus.name = Schaus unit.ei-schaus.description = Fires homing bullets in all directions. Steals health on hit. unit.ei-ageronia.name = Ageronia unit.ei-ageronia.description = Fires homing interval bullets at enemies. Steals health on hit. -unit.ei-breadnight.name = BreadNight +unit.ei-requer.name = Requer unit.ei-breadnight.description = Fires standard bullets and laser beams at enemies. Boosts damaged allies. Disables enemy unit weapons. -unit.ei-toastnight.name = ToastNight +unit.ei-convoy.name = Convoy unit.ei-toastnight.description = Fires salvos of bullets at enemies. Boosts damaged allies. Disables enemy unit weapons. unit.ei-piece.name = Piece unit-ei-piece.description = Defends the Frag core from enemies. Builds structures. unit.ei-guardian.name = Guardian unit.ei-guardian.description = Defends the Extensio core from enemies. Builds structures. +unit.ei-creo.name = Creo +unit.ei-creo.description = Seeks out damaged allies to heal them. Can heal structures. #turrets -block.ei-exagon-altillery.name = Exagon Artillery +block.ei-hexagon.name = Hexagon block.ei-exagon-altillery.description = Fires frag artillery bullets at enemies. Especially effective against structures. block.ei-anado.name = Anado block.ei-anado.description = Fires frag bullets at enemies. block.ei-deuse.name = Deuse block.ei-deuse.description = Fires salvos of frag bullets at enemies. -block.ei-fastray.name = Fastray -block.ei-fastray.description = Fires charged energy projectiles that persist on hit. +block.ei-underglow.name = Underglow +block.ei-underglow.description = Fires charged energy projectiles that persist on hit. block.ei-piercer.name = Piercer -block.ei-piercer.description = Fires charged energy projectiles that release multiple lasers. Pierces. Cannot target air. -block.ei-slowray.name = Slowray -block.ei-slowray.description = Fires charged energy projectiles that create damage fields. +block.ei-piercer.description = Fires charged energy projectiles that release multiple lasers.\nPierces. Cannot target air. +block.ei-cavern.name = Cavern +block.ei-cavern.description = Fires crowd control projectiles that create damaging fields on hit. block.ei-enforcer.name = Enforcer -block.ei-enforcer.description = Fires charged energy projectiles that release arcs of electricity at enemy targets. +block.ei-enforcer.description = Fires crowd control projectiles that release arcs of electricity at enemy targets. block.ei-renoit.name = Renoit block.ei-renoit.description = Fires liquids at enemies. Can fire dense liquids. @@ -236,32 +230,51 @@ block.ei-reinforced-solar-panel.description = Provides a small amount of power f #Lequi #items item.ei-teranite.name = Teranite +item-ei.amethyst.name = Amethyst #environment +block.ei-amethyst-crystal.name = Amethyst Crystal block.ei-ionite.name = Ionite block.ei-ionite-wall.name = Ionite Wall block.ei-crayone.name = Crayone block.ei-crayone-wall.name = Crayone Wall block.ei-crayone-vent.name = Crayone Vent -#unfinished -item.ei-neorium.name = Unfinished -item.ei-xenite.name = Unfinished -item.ei-ion.name = Unfinished -liquid.ei-cryoplasm.name = Unfinished -block.ei-xeniteFloor.name = Unfinished -block.ei-xeniteWall.name = Unfinished -block.ei-arcaniteFloor.name = Unfinished -block.ei-arcaniteWall.name = Unfinished -block.ei-arcaniteVent.name = Unfinished +#drills +blocks.ei-crystal-cutter.name = [P] Crystal Cutter +blocks.ei-crystal-cutter.description = Cuts off chunks of crystals. -#abilities -ability.ei-overload = Overload Field: [accent]{0}[] blocks ~ [accent]{1}[]s every [accent]{2}[]s +#other +block.ei-core-ark.name = [P] Core Ark +block.ei-core-ark.description = Core of the base. Warms up units within range. + +#universal +#commands +command.heal-units.name = Repair Units #statuses status.ei-lockdown.name = Lockdown status.ei-sticky.name = Sticky status.ei-overload.name = Overload +status.ei-frozen.name = Frozen +status.ei-warm.name = Warm + +#abilities +ability.ei-overload = Overload Field: [accent]{0}[] blocks ~ [accent]{1}[]s every [accent]{2}[]s + +#weathers +weather.ei-hailstorm.name = [P] Hailstorm + +#unfinished +item.ei-neorium.name = [U] Neorium +item.ei-xenite.name = [U] Xenite +item.ei-ion.name = [U] Ion +liquid.ei-cryoplasm.name = [U] Cryoplasm +block.ei-xeniteFloor.name = [U] Xenite Floor +block.ei-xeniteWall.name = [U] Xenite Wall +block.ei-arcaniteFloor.name = [U] Acranite Floor +block.ei-arcaniteWall.name = [U] Arcanite Wall +block.ei-arcaniteVent.name = [U] Arcanite Vent #templates for things #block.ei- diff --git a/assets/mod.hjson b/assets/mod.hjson index 6613c0d5..cf8e227c 100644 --- a/assets/mod.hjson +++ b/assets/mod.hjson @@ -3,7 +3,7 @@ name: "EI" author: "WMF Industries" main: "ExpandedIndustries.ExpandedIndustries" description: "Some content for people to enjoy :> --Current version : 1.7 [B1]" -version: "1.7 [B1]" +-Current version : 1.7 [B2]" +version: "1.7 [B2]" minGameVersion: 145 java: true \ No newline at end of file diff --git a/assets/sprites/blocks/defence/slowray.png b/assets/sprites/blocks/defence/cavern.png similarity index 100% rename from assets/sprites/blocks/defence/slowray.png rename to assets/sprites/blocks/defence/cavern.png diff --git a/assets/sprites/blocks/defence/exagon-altillery-outline.png b/assets/sprites/blocks/defence/hexagon-outline.png similarity index 100% rename from assets/sprites/blocks/defence/exagon-altillery-outline.png rename to assets/sprites/blocks/defence/hexagon-outline.png diff --git a/assets/sprites/blocks/defence/exagon-altillery.png b/assets/sprites/blocks/defence/hexagon.png similarity index 100% rename from assets/sprites/blocks/defence/exagon-altillery.png rename to assets/sprites/blocks/defence/hexagon.png diff --git a/assets/sprites/blocks/defence/fastray.png b/assets/sprites/blocks/defence/underglow.png similarity index 100% rename from assets/sprites/blocks/defence/fastray.png rename to assets/sprites/blocks/defence/underglow.png diff --git a/assets/sprites/blocks/effect/core-ark-team.png b/assets/sprites/blocks/effect/core-ark-team.png new file mode 100644 index 0000000000000000000000000000000000000000..6a34bde3943074819f8e4b6157430f6d9c3d9746 GIT binary patch literal 2010 zcmV<02POE4P)Px+lu1NERCt{2olS1zIuL|Q!Q5o#63He@A7l<<Da}aVapL3#9>=6J~|=oPPBVU`>rgS&vz|6F1NE%+@iaY5`cUl9I5UBb5P8+H)G< z;G70HIHv&)&S`*y258z?1lZLjwR| z6Kshuq?%xF@n*;b-oyu-8UXlif<5sCtqHU%cb6vcD873>@Ao+c?Qv6%dCmoNCZ(y? zUZp9m3tOQ_Dz0Y(fw%xA=H+9@@Gd?ufB}H85G5C7gpM_W_`o0r0KN-SV@1yLn4^df z3}gV{e_?7a$NG9ah7uo$R0qFbud3ed>*WIAd<<%hbX0R6frBl8R{T&vC-t%9dh2QF zM+;yPU--P=XSSBW63_BIY{t%sC$vAow-z8re1R!pCCtcV=n}bIw*>zTP(plx!2~6R zV=zIzp0wLmnPT~ABaC*T29;|zEH{pmMW$tE$R-cEeVr=dx*c4 zcumr`{>E}EiN&rlqr_74iK*(EKuzE|;=f<7^ZIGx{d%20Znw<@$4szikhKXk!^XKL zsQtKHeNkxa-kvM|`t|Z>F%#qyO@%MPWT)th|mQJ9SJ;74? z1g%CNgR6q~5^U+Q|9yL#N(}y_9z*&dzn`B~EyCC1VKzZ%&7FnP1wU2^~@geI=n%jL(D$JXs;Px#R9HLXMI;t{R*#aaMX zMChg9TJb|aTN*-Md)f$E1KsxqmLk^4+Rqxt>8YP?U;hGRXQJht{EBQwxwQzLlJz=aiNpXDYe$=G3)6 zclhbxHG3_=(kSbxhganISk$cO_LoI=}b%=fL`gdC`K}ejE;sfo<(yALE zcD0r=fxNCUJGnN22)z`%wD>{`6I3sE>ai#^X1bJH!1{e97pMaImBB6-h02L*dfz!M zL5QuEKoiT>-}DlH?>M;(T^JH-2`nu@tD==9ZVN-$O2c|SdhRh?X&75^XsHV1mL_mp z9GY^U5)*h3Uua>19$!mWWJy?RC&k*M9+hdDrqmpk+Lm|dEn+;}0+w{yA|^FSIh#ZQ z?KfLw?gWO&edJ4>uu2{W$eCX4(d_34*jjubFGrTyO4C4)#RNU?`PNdl8nI}w=6n1E6IQL*HDYuVaxqQ$OS%h$(SkKu)(DuZN?z*>yB%lR+{ zSnm;7n&mM^GQkiANUb|aC3LJ&OyJ%C*17{Nv15#20@s^FY3dFvCP;Y?;}>S9;I;)w zsXM5Jd^Y2Fffkp}ZBciy*Sv>}=dmSl7jVnEgDn%(+S{N9u7d4RcaT!nE_gD5n?QTk z9cXqnS>we7E`nrOdd?6-4d?@8N<336rJxRuG2x6c@k>AckeX z-!-ki4b6-AfU{dbPGVCQZ{#fW@FYIq%m9Eb!4^R+@9`!+;Lrd7XQCNn(%{knC*?Q| zaBxlo9Guet2j?`v!J#rh&z-qi!FG;R!3dgXaJEExj2R$n0R+ZG<-&SSlm-BJ6J~+= sTxbmda3@X+`#De>0N_tx3=gsY2mKJ9s>Pcuga7~l07*qoM6N<$f_+b_#Q*>R literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/effect/core-ark.png b/assets/sprites/blocks/effect/core-ark.png new file mode 100644 index 0000000000000000000000000000000000000000..d1fe947bab289cc7bed7443893f061538a758956 GIT binary patch literal 1586 zcmYjSYfw{X5dCg)Be@|c+y)3BnvxrfJhYX;;scUsfF!7-7#>=|*hZiQtJ5lm2Jt3R z9;KRu8Y)&Em9`+FM3g~^g^Se=Rpe2MA}UF&Aax+dA`ldzY5S)?cF#GpGrKc8XJ?Bf zTcTZP-ZTJ!i%2Mlb0GdtP!~Az&k?(B0YI4%3HVaQsqyldPZ)ex!J4H(SDYSE7n3iH zR79m*%8N=)o+;{x-R#$YvoBuvJVi5pAv|a1w0-(jw@I@wCZwaQ$k2Jr9w3*Q1PNra06dptB{=i)d#d+j( z&q$!}HyUU+^SUcG53Y;{x7+DRK+efsyL+rfYj+0W!#w$WV>Q=0>34o|eNx;;HZ1vZ zxyzMRmgp|axGa$9gMRZY4)D0k2ZGfn!C)f&Y-wUVkVbq7N)zeTF=Ihs)rYk}kBtU^ zwd_cIA-bP|>om)F2apzoxEbY6u=&Fq)(uZuowI!jKmLtXA)F3;r3VP+H~Fm-v`CEJ3a+59$bKe_HD{Pz-Ofdm~Iv zf|fWL@>ow$?I<#^J5^-w8)&_kliNxWy8uitOh*&LDNl+V z7BYD3_Q`=}28)zi3Q#0vsj>vTkDN9q>SdDyTg_ats|$B4X*~O3oBh6+Ao+j6T&@aj za4+?oThZ`7DYdL0vyJq7bmcG7;mN7*BG}zT^)tQs1lOf_hw)mqMTvzy(rh#eiM+k~ zs@IhT2X&4?J`g5ZM>TxSBQNOB@PV>qMyd@{G3bqbY|5y=YQd&JNP;F!b>|1^3DR3+ z$9@~&ibEIQR4R9gWU6N<5deMA*59PlhR^h(NfsleM~ol;=)j)GzSdtgB?Or(1usI1 zChPt0Rbxy@jmhMTp~7K5j%?Tm`ihfres|ZCvRzIiVU8&R(+^)Q_P3A2HnDb6dbCTW zHpPJqRpX4w zqO~xOXArWkEQ=#$Ecr83hZa(Jr7MGb8XdQoswv@Np!&rzRFHN|D+>f?GgHgxNaJ6P zoP9{og`Q*C;b;$ByCXH)VQL9nn<7tynCNkoRd>CMq`;_e5OMqDs)rPV&@fnY-BZ;& zT+YIy)HUIw4PuR>!dy%-i1EDRNM(6@%Qv2_VsH+o3(IWxye=vI%x5WDG4XGa zKj=ei6@fpK|C8-~drp8mRlVAl6|v1vW1)(J&c60g?6NU|ZhDp5PUa@6Ycg)w%24?? z1BbF(l0}lI^YjxpJcabbSlDODXrWmHr>$_G?Ze)7;Z9V(r_QjKwH-vXmbAGF4zHkc hMycm{&GpR8L&l8r+RLNlBF8TPqR1_R^BZL9zX5m8u=xN0 literal 0 HcmV?d00001 diff --git a/assets/sprites/blocks/environment/amethyst-crystal.png b/assets/sprites/blocks/environment/amethyst-crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ee902c4198a235c30f0b9e32757835b9f1b932 GIT binary patch literal 2156 zcmV-y2$T1TP)VxyNGt@9@d5q-e*lm`07fE)KX8Ib5TO$wAt58M z1&O1D!*ZB%-|FhB?&>>Zwy(6VzWt~=bxwERhiB&OY#ob%#lT`DZ(uBnM*{3-2|}6C-5E-tgYyScfQ=*)8G2=oZ-4G_x#piuLw`H9A&h7 z$VZ%~UyMcj>E460@4vXeAsJpY@?+k&y}jgPWDQs8b-Dmv@(Ii<0?6l4CVOo1Yq(f1 z?NkAN|KZ}IXIp8BAjxMk6ya3JFLCj_v{MCOuuKs&@)?IB@I1ptww<1My9fYa86sHZ zGx>Mle2YcZ-u~>4TF*)lF8^3R%kCxs5*QJ|L%x@!nh3LJyM}L90eVHqB%dUdBFrMc zbvwGd08tTs{N`}CL-MjLMK~7u$Ybh*818~BvRZdLz2tv&_ggFMa9is-g8;3WPY_dA zfc2CL0M<33mwYBR)3yZmk`IhiR{%+fu7nZtTjUT^hSgR=gnVGwMF0fyitxCQkDSWm z^RM3v^BEpc292DzL>Rf-*>mP=IroqcKf4NmfHe_Lfqc)K(xNj}Fwgw}Qh5j|t}VA+no zteGM}Em&_oX1+WkiAO~!$$#nP8|JEuV39eneDVU6Ftc2MonmEVxS_@MIi}@hteWLsGVLT1~hq!kn5^g1ic8eGp ztM>3G`?SgyCSbXKv;7^0>I(3Z50JHYT$2O({&huoG((y#WUE!#ci8YU0<@UIFG zA)g?Z2xP)H^VxeN06xtenMHI2n<;|zKV-F8C$W?{SpG6sf_LT<>qY=JlnJnYhOKQ! z7HJU?EI-Vr6u~owV`-!0V_a1LH1>#4KFY(-$YBxT5y2W?;u;a5_0p}3#dGs62%R8; zCs8_tg$U2RaCnTDZ9Qd^#Cts+>tjk0&h9?ixA)Tzk9s+rnJa+ZPGKbw%du_tGmlFE zB)vp9NS`S}a|=3z?ca{14_VIKrlj9J$`B!AJKC&()_&i!5^99-b#SdcvwpL;XF4D7 zrLF*oU=fYBmQWE)*>_If*tOf=+W6?}lbRn{zgYonY!Pe;L?0tIbH-}EqU0l&o-r*B zssdo(|3QQ-@=0X22&Mp05zPB_W}sM&BzCjf*r#T-u^9wr_#o!Z$5Lu9;#yly@8|k8 zk_b*(?Q=u2y)0{fGl@gIjGruPt^g)xZAY`o2L_E$Vk@oIH!5K1Q#&91)fM=33xLj= z2z!u^*f=y|FIx`(YJEuljJvH-5!_qQA;rTj>Yn7w_>nTnmt$r;0QPQ2>T`eutCg`5 zS{GbxCThM|r|r+2u~A?2S+n%pBLv5mzVSO1(J$!1$7T!iyjIJC_0F=02r{Nd)M%ad5k~s7b`th!UW7eP=*)UgE{PZ+pRrECTI2&C zCU1*B^%~HdTW7W0DCoZ{zuuj_M79=}+%W@^O$oKkWzsUB3F_HNE zCXDvL$@o3iS_P>qfZ(_iBFS^CWuxRFKT{c*N!A4(367B8 znh277NoEAU99NciTLF@MfQZZ_Yfl{^A2_V>HS(kQ(ZA+!l`ElkKP|5_ zGL}^?SAs>p^b^4^$FV$p1z6+*MDI$dkq@7|&Y*jpqMtmx_~n>ZIc)_n zkO!ode1v?)j9RW*jPu|v{ag6UzBspXN?QR8>;YFx+5$@d+17)%j9J59_Cr3coYDmV z2v1UF5-p%*a+&8Iyk)!+f7$NMXNmv-<4KB1c)^xQ_MU6;Jb24^#9!7&&W8oik|6+3 zQr39-nPIiK9=s)%Q4xj(03a^ikg|`-SM1_Lw{!tKAWyZ=s0dN=!NU@u zm<_!m^pIbKUZ;zJ#lT`TF0000Gnv$zT~FTcinGy0K?);UHD2Pp-JfK_V%>6{pDyc#x1N-tk2K zFf40P;J+)dx`zOl_i?oHZuhGSZ*2wMy7zS*M|{?O3mkD9D|qf+S@FYe7(UOrEZqty zxPpQN*Xj5{x3XOdC^$2N1i>R<#&;>;y(>r@Uj3>G4qJ7l9?tPqjk5Bm=SLT(O93Sa zHSm?-8e{n`GY!`2uO*7GzoC7wZrF-h`^D@C4j2g&8$pGWK`h2$c8 zx(H+dtg18jmY79>KU3fvk&lhn>+f$)0000EWmrjOO-%qQ00008000000002eQ`}*Kmpo{iq+rfOU7f*c*1P4QX-*AMz-Jg zA18F(bp00xu7~Fnzt(zZk%AJ8`~B|LOh{3{u)+)6}N0O5p_L*a?X0Q}sb*wpC&fY$36?ALxBlNr!O`Aj&Uy|vV_&I=2W zi6t>LB0@9Z4ViZo6wBkt3952HzHS&Y00<$pb}bH}wwu!(0p&Vpe)b3?9Np`GL>9ps zfysE@y8Bw5}-03zB5R5L2Mre*i^ScpwL610zYRdxC3 zy7n~(ngh*&H#l(lc|7pTQ7v+VuNd)fCY z|3Hu8_tts#;ez3;DUza`ZIlvsgD`F9=m+=}2lW0e4aPXUtv5xG`m^%k%)1tyr1 z-p{FbJPiAuMpA2*1F$^;%CbK(C!gT$(FY&iv3VfC#-( zxpyCcd|nA2iS8C?_4@L8CtXRWszY+qXSpHF0bV3&6sus%wN41%R;TRM&_ASNs0WfhS7pr}P%gLOi5n5BH=PV*4 z(#8EQ*EP93m6@C(4m-0%*kQS?R-ASIs`EbI`}gyFFYo(ile~x;>iX&c0BCr)<9!sm z_$$Ly74qs(q?JNJ;(drXpqg*+Ug4-jx_Y_-Kwa(+pD9p7Y_j2d%iNHKjuLg z06=X$@UF*`Pe~>_t9KD}(?rS+;1h!Jz2f^NC9cQ0P=TPlti0@=NGVNySRfD_GoC@Z z1QPCgFTx@l8m2ye-0WLI`PIdFh1SeEi>XWePil%r-<+}y{<^6}*B8-!^294^A$<*+ zE6q-7IRx3M0we#A=9iA9ZmwOOm(#X3S2hwQo)<($=cf%#rCe-ZFVDrw<7fhDbCC?)dI%cHB&kZ~;J$y#@L56#iYSxEbe|jDj6Xn= z*GRUit_(=CZEbLNgk-2RXve(ovIPhiCX^^?zd@OF9hisww*0wAGM;b)RoR(f!taU* zkDxnKN1uhM(iyPqn%p}fcrF?QS23dYqSjr~SR%P%}-F6 zhch+ro^eEs_jBlNK?^rUS}QO&Z|_k%uTpAgn_1Kjj-^`SiMg2%+GI2dmS!ErOll2iHiyn%ICo7K5}1aAUYqKd|n@e z>~M4Ha()h*9AdgKW-G-F?+lBLdDM!2Q=CdxKLW{R>v=Z5$jcY9qaH6+Vf+`E4||Tb$HE7SH4B%Jy@LpDw$nu(8EvjdCL-ylYb7~b%g)y~Xq6$!!1 zbJj+zEXT-HTim16Cr|IktfF`w5xDQy?igsBMCf#`iAc-FZ**j9DGgzoJpw+)92*Jk9=2Qlgfp9oS6Xo7LlLZSi`j&sPh^m6!scyLpeeF zugxWU)ugaprEYUN#qVA?V0e~N#BGp2)|UmgsnDd26?NY0&yGp{Sc>wUU?Y(BngV3k zaQxfdQEEp}yzv9!xdMAdCqiAQ;%4DOg9-u-ZY&*a@?p$F;2f4O(*7cd%!=8571or$ z&7B_qAO6+!O~}e^$8+H<0h)^tTV~aAJkl)t$yyYnHNa?3S2}DWzZ>@0G>%Tj_F3?V zL4!005u}1^@s6i_d2*000j%Nkl?tS(?=ic+^*_&@a|J;k?D_{K@ z6q_7Bc={}~@6SH@ZD{>b7oS15$0+{a{`wcJE-!Btpyfi74fmq?xS2a+}-h?{`mWLncDuwH@~HhbAupQ^e&IH+tWw)?@eH2ZI6$hxxK!l%@ujR zIs@Xy+L^G|DX=-R2G)%V2Wz7T1qf`lZOwi=w{2@{v&Tj?9Ld?p8WunhfrD^l0~B<0 z?Wlmb??^cVm>D*$*haM*%@z35yH*4cjByY`|LQ{%QX3obb0#R+wzb%`u@PN**7QKA z0tlN@2=TRHk25%T!WLW>)C*C`)BXLX~6YyzDRx1T!CFLgpa=d?eE^b z6=yj^A5v2&rFFDFBOq#TM%@DAtq4-;X%LD4N}G8h9duK zHkX+{oFM=~Y6@X1ed~BTZUx@XA8D^lLnRH|-`WC%A9tIHMd*!7!s6T4m z3d|BlHU9s>%tYaSBOr~e!TqE%BQ{H8D@W8fe9{qtaOg1%!bhF?!+(E4n`#{$mnMxq zD~lxP&%gWiBgvl`{nmT%+Md!Q4Q&mK&47>Y`RaSG(dJcM^0^y84nEwe2SQvUmD=4k zx8_Ljq5mr(v~CvBCr_!JKqLqy0L4o%mr$;cI^1(Prt7$Rk6@NxoPF$Dedfb`p^WU^ z6LXK2)IYAS!3Xm>(6~OdEdmG=XpmU{<==mTYuR!&gyzpX!C77E``@Z+(AJgW8de-GwdNChK+yiG%&>>yUGoICfJl2^H;p>%BJp*dS zR-6e7J}m>+W6}?#q~Y~yy)_Fy*mW2{SUeL#NjOPp@aNVKNgGK^k6tt3gZ)DQf&mLc znA3Ymf=L4R+CTGrNh3+qh!&%lUAku&KrogGp(KzbNi#`f-U{EF1s_;{Y~9WBF7Uk>5Vn>jA=`P?eyD(?T?E2R_~4zH zyEEWkAZ#BQNCG~Tx_Tr9Bn?L(%!UtqzFdO0f)L(vqi?$*gpzQQ(A6(1AZghH;SBh| z;|qY$SPdZskJcr@z{fhq6p%FaKsXCNh~&|)e)NwAe;Fb3wH%(&TG=RYbnJ)U|IX4+ zrO>@^q2BwBiIk@it+-F)T%7^YXy%!a`w5eRD)=x1^U9txp_Hc)?>P9t4htX*%z{t~ zs^A0F*Bl-Qr96#zD8UD|L;zth8$v0lf)CVQduR|!c^dIhgAeSf0K$Y!2*F-^6nw2B z>)H~8SsqyM!9FH{FliQq1s|xp?J)~N4}1{03qY8d4Pn6ts_x^+hR_QiMDGSLQ>ub5 zQ_UP(*${fYS`J{r=S|J}d0RlZ6u^RSJyg9ru7=PJVCK6cy`t3oV=2({)}0H$4EU_y zjyjga=l0g~+jf=$UI?FLz-2j8@L3A&ZyX?u=FJ14>kJr?CmKX#?^+vEAmdDEc`y~g zg3pqF|KqbEoCaXQw|}_29?pbt3V;QlH?_x^Hw(ga01Lk3K-KH%38-Y*+PzzW4BEo`DQ|{Pf9DEp&1tHFB%WeQQ_|SMk zh)SHN)ZoJ?M<5gd7Yt<0X zfbGO;mjW{sC;(@uS~lGZ6o782YT^t93cwkvmQA+;1)y81nm9v&0&s?^Wz(%d0qB;h zCeBcx0Gy#}*>o#V0J^2Bi8B;X-wA0y5!3Tl+ze;S<}nm#KZ2#bGa{Y=TlgUKS6+I< ztw82CF1k0ZiBlBdzVlhy=!4hae=yVnNhgQ^(n+-Lfw17Cik+kGfsljGioP2_FsMOT z@L7@{cU*&T1U^tg1hD-iOe-4)VZqm`biOtRp#`7z8c@9n0SLL*f+#CM_|GqWg3T&# zL;(un$M1fmMy!E8v5OmH-GF6@;L|F^*O6ff~yIJcjh;VW;A+Kdzbgg80A_q&*p)}sIE(_(XMhlB7(g&m5P}M~b!5N?ilqPu zh6+MZ;Wmye_&}{R0Kr&62r8WW$b=7+N(B%M7KEU}Igf1kK&5m5!DvAUDxB+>0Uszd z1wb%d5P}NlIA*~I>P!O=j2DEU!m*E;@PRT@0fY?-LQvtD$87jOl_%OS9ieQ|Pd@{M zD}q6PtBfmcZsIVMB*t8%774~&(0Us#f1~7Uj+{#@L zwu)@m&W5k&_kvvjX2XY47lf$9c4anv7>O4`6Tn&Up`!&MDzUzt1s_J@flvi76F&H& zL+Kkd3qnlUx>ABq%hQN=7K9>z+3=zB1tBW2U8%u`UP*bv@t#tHkOgoSeCV_kT%8F~ zp?ReTKHOc(6OQ+k5`+%`%!E&S_e2V=AnZwN-`rLJ7lf!pUfIHzVL2PZ%OyDKoOZ+EwOtT;m9pna@JSlm z7Vl?dLYM+z27DNvB#3-y`58t_OFtsRz!vM~N595@ClZ3`~w^&M=NE-HN zG!sJeYZ~wuROl}it$+^&qF)PzeY8aXXrH&fm#>hJ;PJ#k^TN&VdDh3Rr+q!&35R}J z`BBe+bTQWV1Rsclfl{Ho^+@8qdsy=#K6qlcet<3i=(zVxNd2O9Y76TkfCwB;gp%u{ zh)siMP>BixaKpp&(&97j#t4)W6ivJahKy)-+PU2cU6~iGXx-5rV#D{K8#ih6vs!) z-WT(cx4bkTwX=z~4##FesKEz&OL-A5!RWA5;`apa2|n;OnjkLTUiiSq$Qo{M+LsZV zb#<|>PShW~99!_wHEn$uKrn<5wnn+O6__OqXH)9SNEF(RfD~Da`(v3IlclwlEA$D< z2z;0f|DS$0_nZO=DM&_>Y-O7QM!;FXADFA}F zErgomFy9Is=42f!5}D;I+F9wdm5Vl)G}loGhabbBP+UnL(QxBdz}%WuefXH7=kDI) z8z%7xu}kr^H=XpQg>^Yje+(lz3H`03bna0SfWT1SN9)uU0zPVM<~l7mTuw92glU)H zRv6AmD>NW=k1!vSB&IY&FsQv79T#mS0;=WM`MF2BigHXr0z%YnCmmEM|e_Pu%&gqQ_g;Lr}Jp5HcGS&~AoJu&W)T+KuK4e8II|2)h8J8)$*I zW9U@dZ?#7SwCsAuTVUF@W}}_kwzaj{W1||5#7N>1N7Mz+*ef^b&=ZYj_?5VND$ zQezIn-2k|yFm~F`HDgPyTL^an;Ff}%3oU;%TWU@r{2!{G1>4`IkM#fm01jnXNoGw= f04e|g00;m8000000Mb*F00000NkvXXu0mjfY0y^3 literal 0 HcmV?d00001 diff --git a/assets/sprites/icons/repair.png b/assets/sprites/icons/repair.png new file mode 100644 index 0000000000000000000000000000000000000000..83b1c27fed2d59136e642729b561d7c2f1351e99 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!BS5b#}Etuvy%?;H5hO>oB#hmzjT7rgsEp; z`1hUG5V_I#P2P_olIixF%__P~&t6uT-eeccHWGX-W*sW5T*bdf#E@&kl&1~q7Z@Yn z%vOBqANT)2qIAhyhD(W-s^Tu(6TGeoYaiZrGvU~(pLM>CcMM|hnQtj$oTXSl+wA)c RMxX;2JYD@<);T3K0RY*oOs4<< literal 0 HcmV?d00001 diff --git a/assets/sprites/items/amethyst.png b/assets/sprites/items/amethyst.png new file mode 100644 index 0000000000000000000000000000000000000000..18b1873c53faec190062e05035cc5300ea449847 GIT binary patch literal 590 zcmV-U0=u<$C~WyYHx7j{nMf35qEg9TS{rXI6KBp zSFOJXGN!SS$iz76%5GlIVE8qjelU z|9{Zk0auD-js!L@B~>v|oIX9f0sz`Xgchf*BI)DV9RUG2v*X|ojK0oVhjI0#1Y|^b zaTnonibx9>6VWS9lCg7i2Rt#_iQkZW{q6m~bl?j)iWmX?Cg>yp000hUSV?A0O#mtY c000O800000007cclK=n!07*qoM6N<$f*>jVzyJUM literal 0 HcmV?d00001 diff --git a/assets/sprites/statuses/frozen.png b/assets/sprites/statuses/frozen.png new file mode 100644 index 0000000000000000000000000000000000000000..48385048cf43d49ca5dc5c90f539017de64bcf61 GIT binary patch literal 468 zcmV;_0W1EAP)d*81tzr$gEQ`b~fkwq)R58&tuvJ_&Q5s0aZK_fVf5LPK3!iFhmhRs=jgdhT(Q20+*&0d7m| z8py=6{HTdTRe<@i7_T!9)MxvaFAbnjAp$mvcImPU-W@?i_{dyoz`rhAMZtl{Jk1CI z%G%|NfkjTK0oKQ<`dIM5XFcCW5Sic;KFR>|u6MwjV9>L~O|!WJkr127W^Fj^aZSXF z1Fs!05Ry@Wl2e3PXZ;|F1pGfG_U)9a5NfJ}l_Nl5WQ0!=VNeevQEWyK0az$IJ&W-= z<1RTF0000< KMNUMnLSTaWc|m|8aAY(0!hl0jlOK zUb!y;s5!@7G0AG007se|SPF2oc@u!6TNyj+rU`K2QTM|Ds}dOoutZisgaG;iMlG0y zZ~@f3Wn%mK_ZtE0`X4~AISWP*s>#n>d7}5NlWV=rBM7h7*8UQR3bXZIQ`Slo;KJ%X zr&a-*0;m`O9PfdC8w|Ig#~ctg0t9PA0HfwGWr(R3m>~BY1{ihE10PBN1}nxCz$0E^ z${OxhG55%dD^Ws}YqJC3*Wf0AO^B)xo1ms=WPKOF#JI@js~}X@ZGjo$YPG}a7>?87 zbv1^56Tk`;0uT3$QvkCNk-6!90Y=PwgG+U(5&!@I4rN$LW=%~1DgXcg2mk;800000 S(o>TF0000J=+aueb1QE^WCH+Q8sk#mcsQHx9Lnze*Cmz*007g`&-S|wqH+(zrOg5 z;rZpWZhfhp)mO7u^8Uj8(Z5X!wU_xm_LH6xQ=OKrqQ7}rPqdOPTh7|6`>I@iT+dMK z>B-gkJ~41&%o>T=Ycj7a?O4q4(Dakf;$yo%Zwa{EB~&PQW%Fyv$uW`Ira`~2hDvvG zg=a0gbw-&{NP$u42QQPpiA1iIM*Pvaz);{zjqptK^<~fkvN?bl1TFGg+&StK13=J3kwlH z8vDrEFw5E5Gqd;JY@x8X$elYMXMX?5-TjAj-MZEZtP}VrCva>DsyDlP2j9MY?WOMC zxg|B9J%4$CgmV|pch|SKWKIps@tS0n3uyKmVCM5RoLg!i2|NN|c(xfTs^y%_ZvK_| z#&%V*W{Bac@M^s_O%wOf3{q>iYE^@`Hp)Iwi)IygOM?uUW3}4F;F<9IcYDmx+qldA zJ|m!VtvKspIkp!)oS7hlY;Ioabv>{>xcmE`tZ#Sa>egU;qvU}tp12psnW1q8n1_ZR zK8A+R*TPq`n!zzeo3J&^rs!j+wcmu**X&K;+|b}Xn1Zkzt3eKHshY@lA__!))yROX z=Ix&kX7>BFjmyIsxn2Wjb;X7vVN^}rHxzoEhenR_`Pvd~t|<;*#}dTWlipdnrKzuaR{LiKVV+`;`XVL>+|lf(U}hn&Hg#NXyQsF zYUrU+t9uUW^g4O0U|exDXlqQ`jyXL_3G~Nb@_4g=UlHoe&*HbAx}-5U#;0! ze>ic5Mkf};nW1rRSzg2U@C@8TPFxkJw*d>aOq}b@R$oMF@{@_TKwHx#b~PZyG@7_d zP(lFo_w(%IlSSO$AN(HW`RiiAxyer^ZiU!Op}D5k_5-l`sJF#K@Tf3qlzquqvnVIh zj2NIN!SU*g#0*015g2l_n9_m|4C*zE*aVyt6?}9jA%>*@mG3b7@Tbz`-ppimqrX*D z0tCD;&Ma(Vw$FiD9(Jz{pVIbhlZm6yFD2x2Ha?DCP(IwBOL9tjL97TIi7d!AVzyq~ zcofn{G1g++G^2ge=-&OE(SKi~Lhpb2WM|O2{rcfZgQ1tuNAIB-gVc&MH0wn668aJx z4NJvqq3y#QRX+qTfp3K_h0pX;@C-f^HL#LBn*5ypEVzQ76DPx$AxT6*R9J=WnB5VAFbsgB=MWx)bp#$gM_>fcM@L{VjxF#h9`tDQ(*%&~_ox*< zk~E|OR4V&&vA*Er*-feM-mgx4KU2Y+93qvx>UEZIoLB)Jofs?BhEUv7brx+RbO;g*xQ2tnN z(FL2{7m*ngy8`1i6z^(MBPx#%Sl8*R7i>KmfH!1Fc3s1ViA%e#S$z*EHc=|y&pahN!;By1_cNF+c<}bxC4B8 znOxiT;?Ow6XO^=+2FL1CEiXKKAV50;(B@NFhL74MM}u;0*Q+9*LJ(&f?=Lbzm5|y@ z11(7n1eAfQtp|=!F@PzA?CUcn6jRDLH>t}&02hh^1n{6}KrGRKQb|}pZVC_!1|R@2 zVStSP(A_JYp0p^6na+RvEY#71k(=+u4 XJe^R|)_d~(00000NkvXXu0mjfi!W*M diff --git a/assets/sprites/units/stormer-leg.png b/assets/sprites/units/stormer-leg.png deleted file mode 100644 index b4ffb9cb8dedaf11bffb2b0caf89eeca0a451adc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmV;B0dM|^P)Px$N=ZaPR7i=<*F9>(Fc`-1zg#aRTfoq!h0>BKhv-mxjLacZ$Ps*mkSS!&F-nIV zB2(wk#wB~Yq(c)|{*vCR7WM-I$;j|S((4a3nZ`%VQ2_H<%woB+O#RJxG!)O(6AT7@ z+ngi7WE$&ZTl*6}0|Jnul4K936_d<&K?UcI1eGLv@2Ef@v;h_5FEou(i{+}c$~K!f zNAlBlpJtE*^}gMv{io+gfytclXsC>!s_4+VQH3)k ziGI$mdcCy&`m$~Y1pZJ?Tc)RK`ydO|W2$856)H;}kO!V)DwbM7b);5M9a|Ru2jHXp zoma@$v&aeL^TBA`vR1u1ntHjGu8<7_sGHksqNod}&kG4g@||5cLlR6Bb-iE;pr$by uP#Z8QNP+>pV*mmvWl0007dNkl=k}A8!+JcQNgkDP7C_DTwXPP

vPww5`pZFZ^hTF)gX(IQZmrUu20v4U8Oz(|k$NrKGoy z;WHbb=CUF|DI9jUpb6Y9h~b0XN%L6Z31$Tryf;4=c=22cs)BfdwsTFA6?oya)0{*U zl)^PhP0$oh65c0*w&9Q^0&Z_(Tr7Bfcq{T22{?Rhdb_i_zM=}<0trrJP2v)0a7z*d z-fs|&CD)`%DuEXc@bK{|#~0(>5;ze`B;kl?vA6e18Vj%yk7Oi)M`8-%uju%7Upzso z7FmmqgXhi|B?g& z8NI!?lB}S&xL~?GlB@u9uVncA5;nt+S`|nVx-|!)abXIi^(B%Zh#&qEv}vpo{1+UX zN?u!l00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0xd~IK~z{rwU@n0 z13?hS&wwBZA_OF;SOlB+6xxWrpuL4};8XYpf|iPcy`<67+QKwqAu2%#*a&vYTxO5` znAx4#+x#H8xqSS8x!vVvQ?=pn;P?+7cuF#dM>T%%_01WXl_lVQH6`ibQH&kl-T%dk zMf{jl5>2}VvgSY|X#{rj zFG($!RXE^mTV{bX2b#a9hWon*tZ0Hs)<{y}0J(}J5=l5f3V`AF1y=2F1S|b6R#RdU z?so1ITtR6GIYhoBMoPlYK`B}bQZ1Af*u(U+G{nk9(w`l{==2AxDKUw7+u}C}iA1$+ zfu|galxB!D5)IBAq$Ct}Kc)y)kw)T&``-lu0U(h`!U6I{gWv7UZQS1^bKwAa1qT0% yelQRV2cmBpxW1hV2SftEmq^0ZfJC new RepairUnitAI()); +} \ No newline at end of file diff --git a/src/ExpandedIndustries/ai/types/RepairUnitAI.java b/src/ExpandedIndustries/ai/types/RepairUnitAI.java new file mode 100644 index 00000000..62f8289f --- /dev/null +++ b/src/ExpandedIndustries/ai/types/RepairUnitAI.java @@ -0,0 +1,34 @@ +package ExpandedIndustries.ai.types; + +import arc.util.*; +import mindustry.entities.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.meta.BlockFlag; + + +public class RepairUnitAI extends AIController { + public static float retreatDelay = Time.toSeconds * 3f; + private float retreatTimer; + + @Override + public void updateTargeting() { + target = Units.closest(unit.team, unit.x, unit.y, Unit::damaged); + } + + @Override + public void updateMovement(){ + if(target != null){ + if(!unit.within(target, unit.type.range)){ + moveTo(target, unit.type.range * 0.9f , 50f); + unit.controlWeapons(true); + }else unit.controlWeapons(false); + unit.lookAt(target); + retreatTimer = 0f; + }else if((retreatTimer += Time.delta) >= retreatDelay){ + var retreatTarget = targetFlag(unit.x, unit.y, BlockFlag.repair, false); + if(retreatTarget == null) retreatTarget = unit.closestCore(); + moveTo(retreatTarget, (unit.type.range / 2)); + } + } +} diff --git a/src/ExpandedIndustries/content/EIBlocks.java b/src/ExpandedIndustries/content/EIBlocks.java index c98c49a7..2b69444e 100644 --- a/src/ExpandedIndustries/content/EIBlocks.java +++ b/src/ExpandedIndustries/content/EIBlocks.java @@ -1,6 +1,9 @@ package ExpandedIndustries.content; +import ExpandedIndustries.world.blocks.environment.PropOre; import ExpandedIndustries.world.blocks.power.OverheatSolarGenerator; +import ExpandedIndustries.world.blocks.production.WhitelistDrill; +import ExpandedIndustries.world.blocks.storage.StatusCore; import arc.Core; import arc.graphics.*; import arc.math.*; @@ -28,8 +31,10 @@ import mindustry.world.draw.*; import mindustry.world.meta.*; +import java.beans.Visibility; + import static ExpandedIndustries.content.EIUnits.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; import static mindustry.content.Fx.none; import static mindustry.type.ItemStack.with; @@ -38,7 +43,7 @@ public class EIBlocks { public static Block //environment - flower, orePeridotium, oreStarium, oreNeorium, oreTeranite, ion, + flower, orePeridotium, oreStarium, oreNeorium, oreTeranite, ion, propAmethyst, oreAmethyst, crayoneFloor, crayoneWall, crayoneVent, ioniteFloor, ioniteWall, xeniteFloor, xeniteWall, arcaniteFloor, arcaniteWall, arcaniteVent, grassWater, liquidReurium, cryoplasm, //distribution @@ -47,7 +52,7 @@ public class EIBlocks { //storage crate, //extraction - electricDrill, precisionDrill, hammerDrill, hugePlasmaBore, largeCliffCrusher, + electricDrill, precisionDrill, hammerDrill, hugePlasmaBore, largeCliffCrusher, crystalCutter, //production cryofluidPlant, cryofluidStirrer, oxygenLiquifier, coalLiquifier, oilCrystaliser, freezer, oilPurifier, heavyOilRefinery, fuelAssembler, siliconFabricator, @@ -58,10 +63,10 @@ public class EIBlocks { //logic controllerProcessor, armProcessor, threadripperProcessor, //other - coreFrag, coreExtensio, microPad, planetaryMender, planetaryOverdrive, hardenedUnloader, advancedUnloader, + coreFrag, coreExtensio, coreArk, microPad, planetaryMender, planetaryOverdrive, hardenedUnloader, advancedUnloader, //defense stariumWall, largeStariumWall, graphiteWall, largeGraphiteWall, anado, deuse, - exagonArtillery, slowRay, fastRay, piercer, enforcer, renoit, raven, region, + hexagon, cavern, underglow, piercer, enforcer, renoit, raven, region, //factories & recons groundFactory, airFactory, starruneReconstructor, eraniteReconstructor, ultraReconstructor, terraReconstructor, @@ -69,7 +74,6 @@ public class EIBlocks { overkillAssembler; public static void load() { - crayoneFloor = new Floor("crayone") {{ variants = 4; mapColor = Color.valueOf("853399"); @@ -129,9 +133,21 @@ public static void load() { attributes.set(Attribute.steam, 1f); }}; + propAmethyst = new Prop("amethyst-crystal"){{ + breakable = false; + alwaysReplace = false; + solid = true; + + cacheLayer = CacheLayer.normal; + buildVisibility = BuildVisibility.hidden; + }}; + oreAmethyst = new PropOre("ore-amethyst", EIItems.amethyst){{ + parent = propAmethyst; + blendGroup = crayoneFloor; + }}; grassWater = new Floor("grass-water") {{ shallow = supportsOverlay = isLiquid = placeableOn = true; - editorIcon = Core.atlas.find(name + "1"); + if(net.client()) editorIcon = Core.atlas.find(name + "1"); liquidDrop = Liquids.water; liquidMultiplier = 0.75f; @@ -469,6 +485,18 @@ public static void load() { consumeLiquid(Liquids.hydrogen, 3f / 60f); requirements(Category.production, with(Items.silicon, 70, Items.tungsten, 90, Items.beryllium, 80)); }}; + crystalCutter = new WhitelistDrill("crystal-cutter"){{ + hasLiquids = hasPower = false; + + itemsWhitelisted = Seq.with(EIItems.amethyst); + drillTime = 360; + size = 5; + liquidBoostIntensity = 1; + + rotateSpeed = 3.7f; + + requirements(Category.production, BuildVisibility.sandboxOnly, with(EIItems.neorium, 1)); + }}; siliconFabricator = new AttributeCrafter("silicon-fabricator") {{ hasPower = true; hasLiquids = false; @@ -844,6 +872,16 @@ public static void load() { requirements(Category.effect, with(Items.copper, 18000, Items.lead, 18000, Items.silicon, 10500, Items.thorium, 7000, Items.surgeAlloy, 1025)); }}; + coreArk = new StatusCore("core-ark"){{ + isFirstTier = alwaysUnlocked = true; + + unitType = piece; + health = 7000; + itemCapacity = 3500; + size = 4; + unitCapModifier = 8; + requirements(Category.effect, BuildVisibility.campaignOnly, with(EIItems.neorium, 1500, EIItems.xenite, 1000)); + }}; microPad = new LaunchPad("micro-pad") {{ hasPower = true; @@ -1068,7 +1106,7 @@ Items.plastanium, new BasicBulletType(4.5f, 29) {{ limitRange(); requirements(Category.turret, with(Items.lead, 130, Items.copper, 70, Items.silicon, 60, Items.titanium, 40)); }}; - exagonArtillery = new ItemTurret("exagon-altillery") {{ + hexagon = new ItemTurret("hexagon") {{ ammo( Items.surgeAlloy, new ArtilleryBulletType(5f, 42) {{ collidesTiles = collidesAir = false; @@ -1132,7 +1170,7 @@ EIItems.stariumAlloy, new ArtilleryBulletType(5f, 60) {{ limitRange(0f); requirements(Category.turret, with(Items.copper, 360, Items.lead, 290, Items.silicon, 220, Items.titanium, 160, Items.plastanium, 130, Items.surgeAlloy, 90)); }}; - slowRay = new PowerTurret("slowray") {{ + cavern = new PowerTurret("cavern") {{ moveWhileCharging = false; range = 230; @@ -1685,7 +1723,7 @@ EIItems.stariumAlloy, new ArtilleryBulletType(5f, 60) {{ } }; }}; - fastRay = new PowerTurret("fastray") {{ + underglow = new PowerTurret("underglow") {{ range = 210; coolantMultiplier = 1.1f; recoil = 7; @@ -1995,7 +2033,6 @@ EIItems.stariumAlloy, new ArtilleryBulletType(5f, 60) {{ colorTo = Color.valueOf("84f491"); }}, new ParticleEffect() {{ - startDelay(30); line = true; lenFrom = 4; lenTo = 5; @@ -2121,8 +2158,8 @@ EILiquids.reurium, new LiquidBulletType(EILiquids.reurium){{ requirements(Category.units, with(Items.copper, 90, Items.silicon, 70, Items.titanium, 50)); plans = Seq.with( - new UnitPlan(stormer, 60f * 10, with(Items.silicon, 30, Items.titanium, 10)), - new UnitPlan(breadnight, 60f * 15, with(Items.silicon, 25, Items.graphite, 20)) + new UnitPlan(agrid, 60f * 10, with(Items.silicon, 30, Items.titanium, 10)), + new UnitPlan(requer, 60f * 15, with(Items.silicon, 25, Items.graphite, 20)) ); }}; airFactory = new UnitFactory("air-factory"){{ @@ -2133,7 +2170,7 @@ EILiquids.reurium, new LiquidBulletType(EILiquids.reurium){{ plans = Seq.with( new UnitPlan(pygmy, 60f * 15, with(Items.silicon, 25, Items.graphite, 10)), - new UnitPlan(SmolBoi, 60f * 10, with(Items.silicon, 30, Items.titanium, 15)) + new UnitPlan(creo, 60f * 25, with(Items.silicon, 25, Items.titanium, 20)) ); }}; starruneReconstructor = new Reconstructor("starrune-reconstructor"){{ @@ -2145,11 +2182,10 @@ EILiquids.reurium, new LiquidBulletType(EILiquids.reurium){{ requirements(Category.units, with(Items.copper, 200, Items.lead, 120, Items.silicon, 90, Items.graphite, 70)); upgrades.addAll( - new UnitType[]{stormer, rusher}, - new UnitType[]{breadnight, toastnight}, + new UnitType[]{agrid, xerad}, + new UnitType[]{requer, convoy}, new UnitType[]{pygmy, schaus}, - new UnitType[]{UnitTypes.mono, centurion}, - new UnitType[]{SmolBoi, MediumBoi} + new UnitType[]{UnitTypes.mono, centurion} ); }}; eraniteReconstructor = new Reconstructor("eranite-reconstructor"){{ @@ -2161,10 +2197,9 @@ EILiquids.reurium, new LiquidBulletType(EILiquids.reurium){{ requirements(Category.units, with(Items.lead, 650, Items.silicon, 450, Items.titanium, 350, Items.thorium, 650, EIItems.starium, 250)); upgrades.addAll( - new UnitType[]{rusher, escapade}, + new UnitType[]{xerad, escapade}, new UnitType[]{schaus, ageronia}, - new UnitType[]{centurion, alturion}, - new UnitType[]{MediumBoi, LargeBoi} + new UnitType[]{centurion, alturion} ); }}; ultraReconstructor = new Reconstructor("ultra-reconstructor"){{ @@ -2177,8 +2212,7 @@ EILiquids.reurium, new LiquidBulletType(EILiquids.reurium){{ requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, EIItems.enhancedPeridotium, 600, EIItems.starium, 400)); upgrades.addAll( - new UnitType[]{escapade, natorin}, - new UnitType[]{LargeBoi, PayloadBoi} + new UnitType[]{escapade, natorin} ); }}; terraReconstructor = new Reconstructor("terra-reconstructor"){{ diff --git a/src/ExpandedIndustries/content/EIItems.java b/src/ExpandedIndustries/content/EIItems.java index 4f30d14b..27c27bea 100644 --- a/src/ExpandedIndustries/content/EIItems.java +++ b/src/ExpandedIndustries/content/EIItems.java @@ -4,7 +4,7 @@ import mindustry.type.*; public class EIItems { - public static Item starium, peridotium, lumium, stariumAlloy, enhancedPeridotium, ice, solidFuel, neorium, teranite, xenite, ion; + public static Item starium, peridotium, lumium, stariumAlloy, enhancedPeridotium, ice, solidFuel, neorium, teranite, xenite, ion, amethyst; public static void load(){ starium = new Item("starium", Color.valueOf("4c4379")){{ @@ -54,5 +54,8 @@ public static void load(){ }}; ion = new Item("ion"); + amethyst = new Item("amethyst"){{ + hardness = Integer.MAX_VALUE; + }}; } } diff --git a/src/ExpandedIndustries/content/EILoadouts.java b/src/ExpandedIndustries/content/EILoadouts.java index 66b7a7b5..bbec90e5 100644 --- a/src/ExpandedIndustries/content/EILoadouts.java +++ b/src/ExpandedIndustries/content/EILoadouts.java @@ -6,9 +6,6 @@ public class EILoadouts{ public static Schematic basicFrag; - public EILoadouts(){ - } - public static void load() { basicFrag = Schematics.readBase64("bXNjaAF4nGNgYmBiZmDJS8xNZeByzi9KtVJwK0pMZ+BOSS1OLsosKMnMz2NgYGDLSUxKzSlmYIqOZWTgSc3UTQYq1U0DqWRgYGSAAADGiBF7"); } diff --git a/src/ExpandedIndustries/content/EIStatusEffects.java b/src/ExpandedIndustries/content/EIStatusEffects.java index 62f69f80..8949b7a8 100644 --- a/src/ExpandedIndustries/content/EIStatusEffects.java +++ b/src/ExpandedIndustries/content/EIStatusEffects.java @@ -1,18 +1,20 @@ package ExpandedIndustries.content; +import arc.Events; import arc.graphics.Color; import arc.math.Mathf; import mindustry.content.Fx; +import mindustry.game.EventType; import mindustry.type.StatusEffect; -import static mindustry.content.StatusEffects.burning; -import static mindustry.content.StatusEffects.freezing; +import static mindustry.Vars.state; +import static mindustry.content.StatusEffects.*; public class EIStatusEffects { - public static StatusEffect lockdown, overload, sticky; + public static StatusEffect lockdown, overload, sticky, frozen, warm; - public static void load(){ - lockdown = new StatusEffect("lockdown"){{ + public static void load() { + lockdown = new StatusEffect("lockdown") {{ speedMultiplier = 0.6f; reloadMultiplier = 0.7f; buildSpeedMultiplier = 0.5f; @@ -20,11 +22,11 @@ public static void load(){ color = Color.clear; effect = Fx.none; }}; - overload = new StatusEffect("overload"){{ + overload = new StatusEffect("overload") {{ speedMultiplier = 0.2f; disarm = true; }}; - sticky = new StatusEffect("sticky"){{ + sticky = new StatusEffect("sticky") {{ speedMultiplier = 0.4f; reloadMultiplier = 0.6f; damageMultiplier = 0.7f; @@ -32,7 +34,7 @@ public static void load(){ effect = EIFx.reu; init(() -> { - opposite(freezing); + opposite(freezing, frozen); affinity(burning, (unit, result, time) -> { unit.damagePierce(transitionDamage); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); @@ -40,5 +42,13 @@ public static void load(){ }); }); }}; + frozen = new StatusEffect("frozen") {{ + speedMultiplier = 0; + reloadMultiplier = 0; + damage = 0.11f; + permanent = true; + init(() -> opposite(warm, burning, melting)); + }}; + warm = new StatusEffect("warm"); } } diff --git a/src/ExpandedIndustries/content/EITechTree.java b/src/ExpandedIndustries/content/EITechTree.java index 81ccf0da..1db0e889 100644 --- a/src/ExpandedIndustries/content/EITechTree.java +++ b/src/ExpandedIndustries/content/EITechTree.java @@ -12,7 +12,6 @@ import static mindustry.content.TechTree.TechNode; public class EITechTree { - //this is stupid but seems to work public static TechNode context = null; public static void mergeNode(UnlockableContent p, Runnable c) { @@ -230,15 +229,15 @@ public static void load() { }); }); mergeNode(Blocks.ripple, () -> { - node(exagonArtillery); + node(hexagon); }); mergeNode(Blocks.tsunami, () -> { node(renoit); }); mergeNode(Blocks.lancer, () -> { node(enforcer, () -> { - node(slowRay, () -> { - node(fastRay); + node(cavern, () -> { + node(underglow); }); }); node(piercer); @@ -264,13 +263,13 @@ public static void load() { }); }); mergeNode(UnitTypes.dagger, () -> { - node(breadnight, () -> { - node(toastnight); + node(requer, () -> { + node(convoy); }); }); mergeNode(UnitTypes.nova, () -> { - node(stormer, () -> { - node(rusher, () -> { + node(agrid, () -> { + node(xerad, () -> { node(escapade, () -> { node(natorin, () -> { node(terrand); @@ -278,6 +277,7 @@ public static void load() { }); }); }); + node(creo); }); mergeNode(UnitTypes.flare, () -> { node(pygmy, () -> { @@ -285,45 +285,38 @@ public static void load() { node(ageronia); }); }); - node(SmolBoi, () -> { - node(MediumBoi, () -> { - node(LargeBoi, () -> { - node(PayloadBoi); - }); - }); - }); }); mergeNode(Items.titanium, () -> { - node(EIItems.starium, () -> { - node(EIItems.stariumAlloy, () -> { + nodeProduce(EIItems.starium, () -> { + nodeProduce(EIItems.stariumAlloy, () -> { }); }); }); mergeNode(Items.thorium, () -> { - node(EIItems.peridotium, () -> { - node(EIItems.enhancedPeridotium, () -> { + nodeProduce(EIItems.peridotium, () -> { + nodeProduce(EIItems.enhancedPeridotium, () -> { }); }); - node(EIItems.lumium, () -> { + nodeProduce(EIItems.lumium, () -> { }); }); mergeNode(Liquids.oil, () -> { - node(EILiquids.heavyOil, () -> { - node(EILiquids.lightOil, () -> { - node(EIItems.solidFuel, () -> { + nodeProduce(EILiquids.heavyOil, () -> { + nodeProduce(EILiquids.lightOil, () -> { + nodeProduce(EIItems.solidFuel, () -> { }); }); }); }); mergeNode(Liquids.cryofluid, () -> { - node(EILiquids.lox, () -> { + nodeProduce(EILiquids.lox, () -> { }); }); mergeNode(Liquids.water, () -> { - node(EIItems.ice, () -> { + nodeProduce(EIItems.ice, () -> { }); - node(EILiquids.steam, () -> { + nodeProduce(EILiquids.steam, () -> { }); }); //erekir diff --git a/src/ExpandedIndustries/content/EIUnits.java b/src/ExpandedIndustries/content/EIUnits.java index 00766696..86d7e34a 100644 --- a/src/ExpandedIndustries/content/EIUnits.java +++ b/src/ExpandedIndustries/content/EIUnits.java @@ -1,14 +1,15 @@ package ExpandedIndustries.content; +import ExpandedIndustries.ai.EICommands; import ExpandedIndustries.ai.types.CircleTargetFlyingAI; import ExpandedIndustries.entities.bullet.LifestealBulletType; import ExpandedIndustries.entities.bullet.abilities.OverloadAbility; import arc.graphics.Color; +import arc.struct.Seq; +import mindustry.Vars; import mindustry.ai.UnitCommand; import mindustry.ai.types.BuilderAI; -import mindustry.ai.types.FlyingAI; import mindustry.ai.types.FlyingFollowAI; -import mindustry.ai.types.MinerAI; import mindustry.content.Fx; import mindustry.content.StatusEffects; import mindustry.content.UnitTypes; @@ -23,9 +24,10 @@ import mindustry.type.UnitType; import mindustry.type.Weapon; import mindustry.type.ammo.PowerAmmoType; +import mindustry.type.weapons.RepairBeamWeapon; import mindustry.world.meta.BlockFlag; -import static ExpandedIndustries.content.EIBullets.SuicideBulletType; +import static ExpandedIndustries.content.EIStatusEffects.frozen; import static mindustry.Vars.tilePayload; import static mindustry.Vars.tilesize; import static mindustry.content.Fx.none; @@ -33,22 +35,24 @@ public class EIUnits { public static UnitType - stormer, rusher, escapade, natorin, terrand, + agrid, xerad, escapade, natorin, terrand, - breadnight, toastnight, + requer, convoy, centurion, alturion, pygmy, schaus, ageronia, - SmolBoi, MediumBoi, LargeBoi, PayloadBoi, + creo, - piece, guardian, + quark, atrias, exatro, + + piece, guardian, quarad, //Overkill Content; starnight; public static void load() { - stormer = new UnitType("stormer") {{ + agrid = new UnitType("agrid") {{ constructor = LegsUnit::create; groundLayer = Layer.legUnit; @@ -70,7 +74,7 @@ public static void load() { ammoType = new PowerAmmoType(750); weapons.add( - new Weapon("ei-stormer-weapon") {{ + new Weapon("ei-agrid-weapon") {{ top = false; shake = 2f; @@ -94,10 +98,15 @@ public static void load() { }} ); }}; - rusher = new UnitType("rusher") {{ + xerad = new UnitType("xerad") {{ constructor = LegsUnit::create; groundLayer = Layer.legUnit; + legRegion = UnitTypes.atrax.legRegion; + legBaseRegion = UnitTypes.atrax.legBaseRegion; + jointRegion = UnitTypes.atrax.jointRegion; + footRegion = UnitTypes.atrax.footRegion; + allowLegStep = hovering = true; outlines = false; @@ -117,7 +126,7 @@ public static void load() { ammoType = new PowerAmmoType(1000); weapons.add( - new Weapon("ei-rusher-weapon") {{ + new Weapon("ei-xerad-weapon") {{ top = rotate = false; reload = 75f; @@ -140,7 +149,7 @@ public static void load() { colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; }}; }}, - new Weapon("ei-rusher-artillery") {{ + new Weapon("ei-xerad-artillery") {{ top = rotate = true; mirror = false; @@ -480,7 +489,7 @@ public static void load() { }} ); }}; - breadnight = new UnitType("breadnight"){{ + requer = new UnitType("requer"){{ constructor = MechUnit::create; outlines = false; @@ -496,7 +505,7 @@ public static void load() { ); weapons.add( - new Weapon("ei-breadnight-laser"){{ + new Weapon("ei-requer-laser"){{ mirror = alternate = true; rotate = top = false; @@ -514,7 +523,7 @@ public static void load() { length = 18 * tilesize; }}; }}, - new Weapon("ei-breadnight-weapon"){{ + new Weapon("ei-requer-weapon"){{ autoTarget = rotate = top = mirror = alternate = true; controllable = false; @@ -528,7 +537,7 @@ public static void load() { }} ); }}; - toastnight = new UnitType("toastnight"){{ + convoy = new UnitType("convoy"){{ constructor = MechUnit::create; outlines = false; @@ -544,7 +553,7 @@ public static void load() { ); weapons.add( - new Weapon("ei-toastnight-weapon"){{ + new Weapon("ei-convoy-weapon"){{ mirror = alternate = true; rotate = top = false; @@ -842,116 +851,50 @@ public static void load() { }}; }}); }}; - SmolBoi = new UnitType("small-boi"){{ + /*quark = new UnitType("quark"){{ + + }};*/ + creo = new UnitType("creo"){{ constructor = UnitEntity::create; - aiController = FlyingAI::new; + defaultCommand = EICommands.healUnitsCommand; - flying = faceTarget = true; - outlines = false; + flying = faceTarget = lowAltitude = true; + outlines = logicControllable = isEnemy = false; - health = 210; + health = 170; hitSize = 6f; - speed = 1.9f; - rotateSpeed = 3; - itemCapacity = 50; + speed = 2.35f; + rotateSpeed = 3.4f; + itemCapacity = 5; - lightRadius = 50; + lightRadius = 25; - targetFlags = new BlockFlag[]{BlockFlag.factory, BlockFlag.battery, null}; - - weapons.add(new Weapon() {{ + weapons.add(new RepairBeamWeapon() {{ + targetUnits = targetBuildings = true; top = mirror = false; - reload = 24; - shootCone = 180; - x = 0; - y = 0; - - shootSound = Sounds.explosion; - - bullet = SuicideBulletType; - }}); - }}; - MediumBoi = new UnitType("medium-boi"){{ - constructor = UnitEntity::create; - aiController = FlyingAI::new; - - flying = faceTarget = true; - outlines = false; - - health = 280; - hitSize = 12f; - speed = 1.8f; - rotateSpeed = 3; - itemCapacity = 90; - - engineOffset = 6.25f; - - lightRadius = 50; - - weapons.add(new Weapon() {{ - top = mirror = false; + range = 60; + beamWidth = 0.7f; + repairSpeed = 0.9f; + fractionRepairSpeed = 0.025f; - reload = 24; - shootCone = 180; x = 0; - y = 0; - - shootSound = Sounds.explosion; - - bullet = SuicideBulletType; + y = 1.25f; }}); - }}; - LargeBoi = new UnitType("large-boi"){{ - constructor = UnitEntity::create; - aiController = FlyingAI::new; - - flying = faceTarget = true; - outlines = false; - - health = 470; - hitSize = 20; - speed = 1.6f; - rotateSpeed = 3; - itemCapacity = 170; - - engineOffset = 11.25f; - engineSize = 2.75f; - lightRadius = 50; - - abilities.add(new UnitSpawnAbility(SmolBoi, 1050, 0, 2)); - - weapons.add(new Weapon() {{ - top = mirror = false; - - reload = 24; - shootCone = 180; - x = 0; - y = 0; - - shootSound = Sounds.explosion; - - bullet = SuicideBulletType; - }}); - }}; - PayloadBoi = new UnitType("payload-boi"){{ - constructor = PayloadUnit::create; - - flying = true; - outlines = false; - - health = 5300; - hitSize = 40f; - speed = 3.35f; - rotateSpeed = 3.3f; - drag = 0.1f; - accel = 0.2f; - itemCapacity = 340; - payloadCapacity = (4 * 4) * tilePayload; - - engineSize = 4.5f; - engineOffset = 16; - }}; + }public void init(){ + super.init(); + + Seq cmds = Seq.with(commands); + cmds.add(EICommands.healUnitsCommand); + + commands = cmds.toArray(); + } + public void update(Unit unit){ + super.update(unit); + if(unit.isPlayer() && (Vars.net.server() || !Vars.net.active())){ + unit.getPlayer().clearUnit(); + }} + }; piece = new UnitType("piece"){{ constructor = UnitEntity::create; aiController = BuilderAI::new; @@ -1038,6 +981,13 @@ public static void load() { }}; }}); }}; + /*quarad = new UnitType("quarad"){{ + constructor = UnitEntity::create; + + flying = lowAltitude = true; + + engineSize = -1; + }};*/ starnight = new UnitType("starnight"){{ constructor = UnitEntity::create; aiController = FlyingFollowAI::new; diff --git a/src/ExpandedIndustries/content/EIWeathers.java b/src/ExpandedIndustries/content/EIWeathers.java new file mode 100644 index 00000000..807a3680 --- /dev/null +++ b/src/ExpandedIndustries/content/EIWeathers.java @@ -0,0 +1,33 @@ +package ExpandedIndustries.content; + +import arc.graphics.Color; +import mindustry.gen.Sounds; +import mindustry.type.Weather; +import mindustry.type.weather.ParticleWeather; +import mindustry.world.meta.Attribute; + +public class EIWeathers { + public static Weather hailstorm; + public static void load() { + hailstorm = new ParticleWeather("hailstorm"){{ + particleRegion = "particle"; + color = Color.cyan; + yspeed = -8.7f; + xspeed = -4.4f; + sizeMax = 11f; + sizeMin = 4f; + density = 1500f; + opacityMultiplier = 0.73f; + attrs.set(Attribute.light, -0.20f); + attrs.set(Attribute.water, 1.5f); + + sound = Sounds.windhowl; + soundVol = 0f; + soundVolOscMag = 1.5f; + soundVolOscScl = 1100f; + soundVolMin = 0.02f; + + status = EIStatusEffects.frozen; + }}; + } +} diff --git a/src/ExpandedIndustries/entities/bullet/abilities/OverloadAbility.java b/src/ExpandedIndustries/entities/bullet/abilities/OverloadAbility.java index 51515ad2..c3449c4d 100644 --- a/src/ExpandedIndustries/entities/bullet/abilities/OverloadAbility.java +++ b/src/ExpandedIndustries/entities/bullet/abilities/OverloadAbility.java @@ -20,14 +20,15 @@ public class OverloadAbility extends Ability { private static final Seq all = new Seq<>(); + public boolean applyToSelf = false, infiniteSelfStatus = false; public float reload = 100, range = 60; public StatusEffect status = EIStatusEffects.overload; public StatusEffect teamStatus = StatusEffects.overclock; public float statusDuration = 60f * 15f, teamStatusDuration = 60f * 10.5f; public float x, y; - protected float timer, curStroke; - protected boolean anyNearby = false; + protected float timer, curStroke, selfStatusDuration = teamStatusDuration; + protected boolean anyNearby = false, reapply = true; public Effect activeEffect = EIFx.overload; public OverloadAbility(float reload, float range){ @@ -37,7 +38,7 @@ public OverloadAbility(float reload, float range){ @Override public String localized(){ - return Core.bundle.format("ability.ei-overload", range / Vars.tilesize, statusDuration/60, reload/60); + return Core.bundle.format("ability.ei-overload", range / Vars.tilesize, statusDuration / 60, reload / 60); } @Override @@ -64,7 +65,7 @@ public void update(Unit unit){ if(((Teamc)other).team() == unit.team){ anyNearby = true; - if(other instanceof Statusc s){ + if(other instanceof Statusc s) { s.apply(teamStatus, teamStatusDuration); } }else{ @@ -75,8 +76,17 @@ public void update(Unit unit){ } } - if(anyNearby){ - activeEffect.at(unit, range); + if(anyNearby || (applyToSelf && reapply)){ + if(anyNearby){ + activeEffect.at(unit, range); + } + if(applyToSelf){ + if(infiniteSelfStatus){ + selfStatusDuration = Float.MAX_VALUE; + reapply = false; + } + unit.apply(teamStatus, selfStatusDuration); + } timer = 0f; } } diff --git a/src/ExpandedIndustries/world/blocks/environment/PropOre.java b/src/ExpandedIndustries/world/blocks/environment/PropOre.java new file mode 100644 index 00000000..c02a14f6 --- /dev/null +++ b/src/ExpandedIndustries/world/blocks/environment/PropOre.java @@ -0,0 +1,91 @@ +package ExpandedIndustries.world.blocks.environment; + +import arc.Core; +import arc.graphics.Color; +import arc.graphics.Pixmap; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.PixmapRegion; +import arc.math.Mathf; +import arc.math.geom.Point2; +import mindustry.Vars; +import mindustry.content.Blocks; +import mindustry.graphics.MultiPacker; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.environment.Floor; +import mindustry.world.blocks.environment.OreBlock; +import mindustry.world.blocks.environment.OverlayFloor; +import mindustry.world.blocks.environment.Prop; + +import static mindustry.Vars.tilesize; + +public class PropOre extends OreBlock{ + public static final Point2[] offsets = { + new Point2(-2, -2), + new Point2(-2, -1), + new Point2(-2, 0), + new Point2(-2, 1), + new Point2(-2, 2), + new Point2(-1, -2), + new Point2(0, -2), + new Point2(1, -2), + new Point2(2, -2), + new Point2(-1, -1), + new Point2(-1, 0), + new Point2(-1, 1), + new Point2(-1, 2), + new Point2(0, -1), + new Point2(1, -1), + new Point2(2, -1), + new Point2(0, 0), + new Point2(0, 1), + new Point2(0, 2), + new Point2(1, 0), + new Point2(2, 0), + new Point2(1, 1), + new Point2(1, 2), + new Point2(2, 1), + new Point2(2, 2), + }; + + public Block parent = Blocks.air; + + static{ + for(var p : offsets){ + p.sub(1, 1); + } + } + + public PropOre(String name, Item ore){ + super(name); + this.localizedName = ore.localizedName; + this.itemDrop = ore; + this.variants = 3; + this.mapColor.set(ore.color); + this.useColor = true; + } + + public boolean checkAdjacent(Tile tile){ + for(var point : offsets){ + Tile other = Vars.world.tile(tile.x + point.x, tile.y + point.y); + if(other == null || other.overlay() != this){ + return false; + } + } + return true; + } + + @Override + public boolean updateRender(Tile tile){ + return checkAdjacent(tile); + } + + @Override + public void renderUpdate(UpdateRenderState state){ + Tile tile = Vars.world.tile(state.tile.x - 1, state.tile.y - 1); + if(tile.block() == Blocks.air || (tile.block() instanceof Prop && tile.block() != parent)){ + tile.setNet(parent); + } + } +} diff --git a/src/ExpandedIndustries/world/blocks/production/WhitelistDrill.java b/src/ExpandedIndustries/world/blocks/production/WhitelistDrill.java new file mode 100644 index 00000000..516093d6 --- /dev/null +++ b/src/ExpandedIndustries/world/blocks/production/WhitelistDrill.java @@ -0,0 +1,136 @@ +package ExpandedIndustries.world.blocks.production; + +import arc.Core; +import arc.graphics.Blending; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.math.Mathf; +import arc.struct.Seq; +import arc.util.Time; +import mindustry.content.Blocks; +import mindustry.content.Items; +import mindustry.game.Team; +import mindustry.graphics.Drawf; +import mindustry.graphics.Layer; +import mindustry.type.Item; +import mindustry.world.Block; +import mindustry.world.Tile; +import mindustry.world.blocks.environment.Prop; +import mindustry.world.blocks.production.Drill; +import mindustry.world.consumers.ConsumeLiquidBase; +import mindustry.world.meta.Stat; +import mindustry.world.meta.StatUnit; +import mindustry.world.meta.StatValues; + +import static mindustry.Vars.*; + +public class WhitelistDrill extends Drill{ + public String itemDisplayPrefix = "-crystal"; + public Seq itemsWhitelisted = Seq.with(Items.copper,Items.lead); + public WhitelistDrill(String name) + { + super(name); + tier = Integer.MAX_VALUE; + } + + @Override + public float getDrillTime(Item item){ + return drillTime + hardnessDrillMultiplier / drillMultipliers.get(item, 1f); + } + + @Override + public void setStats(){ + super.setStats(); + + stats.remove(Stat.drillTier); + + stats.remove(Stat.drillSpeed); + stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); + + if(liquidBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase) instanceof ConsumeLiquidBase consBase){ + stats.remove(Stat.booster); + stats.add(Stat.booster, + StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(), + consBase.amount, + liquidBoostIntensity * liquidBoostIntensity, false, this::consumesLiquid) + ); + } + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + Tile tile = world.tile(x, y); + if(tile == null) return; + + countOre(tile); + + if(returnItem != null){ + float width = drawPlaceText(Core.bundle.formatFloat("bar.drillspeed", 60f / getDrillTime(returnItem) * returnCount, 2), x, y, valid); + float dx = x * tilesize + offset - width/2f - 4f, dy = y * tilesize + offset + size * tilesize / 2f + 5, s = iconSmall / 4f; + Draw.mixcol(Color.darkGray, 1f); + Draw.rect(returnItem.fullIcon, dx, dy - 1, s, s); + Draw.reset(); + Draw.rect(returnItem.fullIcon, dx, dy, s, s); + }else{ + Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && (t.drop().hardness > tier || t.drop() == blockedItem)); + Item item = to == null ? null : to.drop(); + if(item != null){ + drawPlaceText(Core.bundle.get("bar.drilltierreq"), x, y, valid); + } + } + } + + @Override + public boolean canReplace(Block other){ + return other instanceof Prop || other == null || other == Blocks.air; + } + + @Override + public boolean canMine(Tile tile){ + if(tile == null || tile.block().isStatic()) return false; + Item drops = tile.drop(); + return drops != null && itemsWhitelisted.contains(drops); + } + + @Override + public boolean canPlaceOn(Tile tile, Team team, int rotation){ + for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ + if(canMine(other)){ + return returnCount == 25; + } + } + return false; + } + + public class WhitelistDrillBuild extends DrillBuild { + @Override + public void draw(){ + float s = 0.3f; + float ts = 0.6f; + + if(drawSpinSprite){ + Drawf.spinSprite(rotatorRegion, x, y, timeDrilled * rotateSpeed); + }else{ + Draw.rect(rotatorRegion, x, y, timeDrilled * rotateSpeed); + } + + Draw.rect(region, x, y); + Draw.z(Layer.blockCracks); + drawDefaultCracks(); + + Draw.z(Layer.blockAfterCracks); + if(drawRim){ + Draw.color(heatColor); + Draw.alpha(warmup * ts * (1f - s + Mathf.absin(Time.time, 3f, s))); + Draw.blend(Blending.additive); + Draw.rect(rimRegion, x, y); + Draw.blend(); + Draw.color(); + } + + if(itemDisplayPrefix != null) { + Draw.rect(dominantItem.name + itemDisplayPrefix, x, y); + } + } + } +} diff --git a/src/ExpandedIndustries/world/blocks/storage/StatusCore.java b/src/ExpandedIndustries/world/blocks/storage/StatusCore.java new file mode 100644 index 00000000..85e6703c --- /dev/null +++ b/src/ExpandedIndustries/world/blocks/storage/StatusCore.java @@ -0,0 +1,85 @@ +package ExpandedIndustries.world.blocks.storage; + +import ExpandedIndustries.content.EIStatusEffects; +import arc.graphics.Color; +import arc.graphics.g2d.Draw; +import arc.graphics.g2d.Lines; +import arc.struct.Seq; +import arc.util.Time; +import mindustry.entities.Units; +import mindustry.gen.Unit; +import mindustry.graphics.Layer; +import mindustry.logic.Ranged; +import mindustry.type.StatusEffect; +import mindustry.world.blocks.storage.CoreBlock; +import mindustry.world.meta.Stat; +import mindustry.world.meta.StatUnit; + +import static mindustry.Vars.tilesize; + +public class StatusCore extends CoreBlock{ + public StatusEffect statusEffect; + public Color effectColor; + public float statusDuration, applyRange, applyDelay, effectSize, effectLifetime; + public Seq targets = new Seq<>(); + + public StatusCore(String name){ + super(name); + + statusEffect = EIStatusEffects.warm; + effectColor = Color.orange; + effectSize = 3f; + applyRange = 15 * tilesize; + statusDuration = 15; + applyDelay = 60f; + effectLifetime = 210f; + } + + @Override + public void setStats(){ + super.setStats(); + + stats.add(Stat.range, applyRange / tilesize, StatUnit.blocks); + stats.add(Stat.boostEffect, statusEffect.emoji() + " " + statusEffect.localizedName, statusDuration, StatUnit.seconds); + } + + public class StatusCoreBuild extends CoreBuild implements Ranged { + public float refresh = 0, drawProgress = 0; + + @Override + public void updateTile() { + if ((refresh += Time.delta) > applyDelay) { + targets.clear(); + refresh = 0f; + + Units.nearby(team, x, y, applyRange, u -> { + targets.add(u); + }); + + for (var target : targets) { + target.apply(statusEffect, (statusDuration * 60)); + } + } + + drawProgress += Time.delta / effectLifetime; + } + + @Override + public void draw(){ + super.draw(); + + Draw.z(Layer.effect); + float mod = drawProgress % 1f; + Draw.color(effectColor); + Lines.circle(x, y, applyRange); + Lines.stroke(effectSize * (1f - mod)); + Lines.circle(x, y, applyRange * mod); + Draw.reset(); + } + + @Override + public float range() { + return applyRange; + } + } +}