From 858791de3b881b5304fafd0675fce4d5ce51451d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 18 Nov 2017 20:40:04 -0500 Subject: [PATCH] Changed to use new effects system --- build.gradle | 2 +- core/assets-raw/sprites/blocks/block-2x2.png | Bin 201 -> 254 bytes core/assets-raw/sprites/chainbullet.png | Bin 0 -> 203 bytes core/assets-raw/sprites/shell.png | Bin 0 -> 221 bytes core/assets-raw/sprites/titanshell.png | Bin 0 -> 224 bytes core/assets/sprites/sprites.atlas | 241 +++++++------ core/assets/sprites/sprites.png | Bin 46644 -> 47014 bytes core/src/io/anuke/mindustry/Control.java | 16 +- .../src/io/anuke/mindustry/EffectCreator.java | 301 ---------------- core/src/io/anuke/mindustry/Fx.java | 332 ++++++++++++++++++ core/src/io/anuke/mindustry/Vars.java | 4 + core/src/io/anuke/mindustry/ai/Pathfind.java | 5 +- .../anuke/mindustry/entities/BulletType.java | 71 +++- .../io/anuke/mindustry/entities/Player.java | 3 +- .../anuke/mindustry/entities/TileEntity.java | 3 +- .../mindustry/entities/effect/DamageArea.java | 45 ++- .../anuke/mindustry/entities/effect/EMP.java | 3 +- .../mindustry/entities/effect/TeslaOrb.java | 3 +- .../mindustry/entities/enemies/Enemy.java | 3 +- .../io/anuke/mindustry/resource/Weapon.java | 11 +- core/src/io/anuke/mindustry/world/Block.java | 4 +- core/src/io/anuke/mindustry/world/World.java | 9 +- .../anuke/mindustry/world/blocks/Blocks.java | 7 +- .../world/blocks/ProductionBlocks.java | 5 +- .../mindustry/world/blocks/WeaponBlocks.java | 74 ++-- .../blocks/types/defense/LaserTurret.java | 4 +- .../world/blocks/types/defense/Turret.java | 6 +- .../blocks/types/production/Crafter.java | 3 +- .../world/blocks/types/production/Drill.java | 3 +- .../blocks/types/production/Generator.java | 9 +- .../types/production/ItemPowerGenerator.java | 3 +- .../types/production/LiquidCrafter.java | 4 +- .../production/LiquidPowerGenerator.java | 4 +- .../anuke/ucore/function/EffectProvider.java | 4 +- desktop/mindustry-saves/0.mins | Bin 4450 -> 1591 bytes desktop/mindustry-saves/1.mins | Bin 3159 -> 2375 bytes 36 files changed, 678 insertions(+), 504 deletions(-) create mode 100644 core/assets-raw/sprites/chainbullet.png create mode 100644 core/assets-raw/sprites/shell.png create mode 100644 core/assets-raw/sprites/titanshell.png delete mode 100644 core/src/io/anuke/mindustry/EffectCreator.java create mode 100644 core/src/io/anuke/mindustry/Fx.java diff --git a/build.gradle b/build.gradle index 8072bd94a8..9fc594f5f5 100644 --- a/build.gradle +++ b/build.gradle @@ -79,7 +79,7 @@ project(":core") { apply plugin: "java" dependencies { - compile 'com.github.anuken:ucore:ea3563b5e4' + compile 'com.github.anuken:ucore:e8865d2b26' compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx-ai:1.8.1" } diff --git a/core/assets-raw/sprites/blocks/block-2x2.png b/core/assets-raw/sprites/blocks/block-2x2.png index b257fe47abf9969ebbe23ec355e22218d295b941..e8651c2bd8e54c35eb1e123f8e36a816f4d7855b 100644 GIT binary patch delta 161 zcmV;S0ABye0saAyBo78+OGiWi{{a60|De66laV1H2oVGu4PG~Vmyt;*duB;QK~yNu zwUNOMz%U2{X~dTuym)qF2NvjqkA*~)q^+OW$b!4(oMtA=Qg;WyBi@gQVkw8xE}`NM z*_3j1cMNxKHw+PR_myb&A2s~HP{4J1$AMXP|M`M+im~K*?CLYPVga}T<{2?n%5RxJ P00000NkvXXu0mjfwkk&W delta 136 zcmeyzc#?5~iYjM;M`SSr1Gg{;GcwGYBf-GHz+U3%>&pI+n^Q!XQ-b4N+r(&%2xm_h z#}JM4$#bmB_4M`inJ+dxJ=o07#l_{a>ejA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s(o^E;>&pI+TaZPZ@wZ9+2B45+iEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8c$Xr;B3<$Mv;+8+jQFcn%f(-_OUlDA=mBN4=%BWlP&zzHQdF pldf#rFL+?)geRRUOgDa(F`6riKQLEZwHK(J!PC{xWt~$(699w-J8S>| literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/shell.png b/core/assets-raw/sprites/shell.png new file mode 100644 index 0000000000000000000000000000000000000000..747f735e656c9ad881d0223ad802edff182c9aeb GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPtw~zok>wZSwT|gnp64!_l=ltB<)VvY~=c3falGGH1 z^30M91$R&1fbd2>aiAhsPZ!4!iOa41j$8*Ec$j=&lz;kPKZD&@pLfdJX>%v9;9y&@ zaQDO|tGYg}Q~e=QJWF_8)V808%~lE@D0}*G%6j%&FD>rwVYJN)Un3TD=nv3922WQ% Jmvv4FO#mXTN5KF9 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/titanshell.png b/core/assets-raw/sprites/titanshell.png new file mode 100644 index 0000000000000000000000000000000000000000..7f90039999901045bd5c8cab807981449d3ce3e8 GIT binary patch literal 224 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 QFbM$Gd+q-!w(z<1e+<`wUjP6A literal 46644 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


+!&tt+QUxe>8lnrba9Z0?3&lkRx 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 try{ Constructor c = ClassReflection.getConstructor(spawn.type, int.class); Enemy enemy = (Enemy)c.newInstance(fl); - enemy.set(tile.worldx(), tile.worldy()); + enemy.set(tile.worldx() + Mathf.range(range), tile.worldy() + Mathf.range(range)); enemy.tier = spawn.tier(wave, fl); - Effects.effect("spawn", enemy); + Effects.effect(Fx.spawn, enemy); enemy.add(); enemies ++; @@ -294,10 +297,10 @@ public class Control extends Module{ Tile core = World.core; for(int i = 0; i < 16; i ++){ Timers.run(i*2, ()->{ - Effects.effect("explosion", core.worldx()+Mathf.range(40), core.worldy()+Mathf.range(40)); + Effects.effect(Fx.explosion, core.worldx()+Mathf.range(40), core.worldy()+Mathf.range(40)); }); } - Effects.effect("coreexplosion", core.worldx(), core.worldy()); + Effects.effect(Fx.coreexplosion, core.worldx(), core.worldy()); Timers.run(60, ()->{ ui.showRestart(); @@ -393,8 +396,6 @@ public class Control extends Module{ Entities.setCollider(tilesize, (x, y)->{ return World.solid(x, y); }); - - EffectCreator.create(); } @Override @@ -402,7 +403,8 @@ public class Control extends Module{ if(debug){ if(Inputs.keyUp(Keys.P)){ - Effects.effect("blockexplosion", player); + Effects.effect(Fx.shellsmoke, player); + Effects.effect(Fx.shellexplosion, player); } if(Inputs.keyUp(Keys.C)){ diff --git a/core/src/io/anuke/mindustry/EffectCreator.java b/core/src/io/anuke/mindustry/EffectCreator.java deleted file mode 100644 index c24be63794..0000000000 --- a/core/src/io/anuke/mindustry/EffectCreator.java +++ /dev/null @@ -1,301 +0,0 @@ -package io.anuke.mindustry; - -import static io.anuke.mindustry.Vars.respawnduration; - -import com.badlogic.gdx.graphics.Color; - -import io.anuke.ucore.core.Draw; -import io.anuke.ucore.core.Effects; -import io.anuke.ucore.graphics.Hue; -import io.anuke.ucore.util.Angles; -import io.anuke.ucore.util.Mathf; - -public class EffectCreator{ - static Color lightRed = Hue.mix(Color.WHITE, Color.FIREBRICK, 0.1f); - static Color lightOrange = Color.valueOf("f68021"); - - public static void create(){ - - Effects.create("generatorexplosion", 28, e -> { - Angles.randLenVectors(e.id, 16, 10f + e.ifract()*8f, (x, y)->{ - float size = e.fract()*12f + 1f; - Draw.color(Color.WHITE, lightOrange, e.ifract()); - Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); - }); - }); - - Effects.create("chainshot", 9f, e -> { - Draw.color(Color.WHITE, lightOrange, e.ifract()); - Draw.thick(e.fract()*4f); - Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*7f); - Draw.thick(e.fract()*2f); - Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*10f); - Draw.reset(); - }); - - Effects.create("shockwave", 10f, e -> { - Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); - Draw.thick(e.fract()*2f + 0.2f); - Draw.circle(e.x, e.y, e.ifract()*28f); - Draw.reset(); - }); - - Effects.create("empshockwave", 7f, e -> { - Draw.color(Color.WHITE, Color.SKY, e.ifract()); - Draw.thick(e.fract()*2f); - Draw.circle(e.x, e.y, e.ifract()*40f); - Draw.reset(); - }); - - Effects.create("empspark", 13, e -> { - Angles.randLenVectors(e.id, 7, 1f + e.ifract()*12f, (x, y)->{ - float len = 1f+e.fract()*6f; - Draw.color(Color.SKY); - Draw.lineAngle(e.x + x, e.y + y, Mathf.atan2(x, y), len); - Draw.reset(); - }); - }); - - Effects.create("shellsmoke", 21, e -> { - Angles.randLenVectors(e.id, 8, 1f + e.ifract()*16f, (x, y)->{ - float size = 2f+e.fract()*5f; - Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); - Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); - }); - }); - - Effects.create("blastsmoke", 26, e -> { - Angles.randLenVectors(e.id, 12, 1f + e.ifract()*23f, (x, y)->{ - float size = 2f+e.fract()*6f; - Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); - Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); - }); - }); - - Effects.create("lava", 18, e -> { - Angles.randLenVectors(e.id, 3, 1f + e.ifract()*10f, (x, y)->{ - float size = e.sfract()*4f; - Draw.color(Color.ORANGE, Color.GRAY, e.ifract()); - Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); - }); - }); - - Effects.create("lavabubble", 45f, e -> { - Draw.color(Color.ORANGE); - float scl = 0.35f; - Draw.thick(1f - Mathf.clamp(e.ifract() - (1f-scl)) * (1f/scl)); - Draw.circle(e.x, e.y, e.ifract()*4f); - Draw.reset(); - }); - - Effects.create("oilbubble", 64f, e -> { - Draw.color(Color.DARK_GRAY); - float scl = 0.25f; - Draw.thick(1f - Mathf.clamp(e.ifract() - (1f-scl)) * (1f/scl)); - Draw.circle(e.x, e.y, e.ifract()*3f); - Draw.reset(); - }); - - Effects.create("shellexplosion", 15, e -> { - Draw.thickness(1.3f - e.ifract()); - Draw.color(Color.WHITE, Color.ORANGE, e.ifract()); - Draw.circle(e.x, e.y, 1f + e.ifract() * 7f); - Draw.reset(); - }); - - Effects.create("blastexplosion", 16, e -> { - Draw.thickness(1.2f - e.ifract()); - Draw.color(Color.WHITE, Color.SCARLET, e.ifract()); - Draw.circle(e.x, e.y, 1.5f + e.ifract() * 9f); - Draw.reset(); - }); - - Effects.create("place", 16, e -> { - Draw.thickness(3f - e.ifract() * 2f); - Draw.square(e.x, e.y, Vars.tilesize / 2f + e.ifract() * 3f); - Draw.reset(); - }); - - Effects.create("purify", 10, e -> { - Draw.color(Color.ROYAL, Color.GRAY, e.ifract()); - Draw.thickness(2f); - Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); - Draw.reset(); - }); - - Effects.create("purifyoil", 10, e -> { - Draw.color(Color.BLACK, Color.GRAY, e.ifract()); - Draw.thickness(2f); - Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); - Draw.reset(); - }); - - Effects.create("generate", 11, e -> { - Draw.color(Color.ORANGE, Color.YELLOW, e.ifract()); - Draw.thickness(1f); - Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); - Draw.reset(); - }); - - Effects.create("spark", 10, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.GRAY, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); - Draw.reset(); - }); - - Effects.create("sparkbig", 11, e -> { - Draw.thickness(1f); - Draw.color(lightRed, Color.GRAY, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 5f, 2.3f, 8); - Draw.reset(); - }); - - Effects.create("smelt", 10, e -> { - Draw.thickness(1f); - Draw.color(Color.YELLOW, Color.RED, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); - Draw.reset(); - }); - - Effects.create("break", 12, e -> { - Draw.thickness(2f); - Draw.color(Color.WHITE, Color.GRAY, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 5); - Draw.reset(); - }); - - Effects.create("hit", 10, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.ORANGE, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 3f, 2, 8); - Draw.reset(); - }); - - Effects.create("laserhit", 10, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.SKY, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 2f, 2, 6); - Draw.reset(); - }); - - Effects.create("shoot", 8, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.GOLD, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 2f, 2, 5); - Draw.reset(); - }); - - Effects.create("shoot2", 8, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.SKY, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 2f, 1, 5); - Draw.reset(); - }); - - Effects.create("shoot3", 8, e -> { - Draw.thickness(1f); - Draw.color(Color.WHITE, Color.GOLD, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 2f, 1, 5); - Draw.reset(); - }); - - Effects.create("railshoot", 8, e -> { - Draw.thickness(2f - e.ifract()*2f); - Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); - Draw.spikes(e.x, e.y, 1f + e.ifract() * 4f, 1, 5); - Draw.reset(); - }); - - Effects.create("mortarshoot", 9, e -> { - Draw.thickness(1.3f - e.ifract()); - Draw.color(Color.WHITE, Color.ORANGE, e.ifract()); - Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); - Draw.circle(e.x, e.y, e.ifract() * 5f + 1f); - Draw.reset(); - }); - - Effects.create("explosion", 11, e -> { - Draw.thickness(2f*e.fract()+0.5f); - Draw.color(Color.WHITE, Color.DARK_GRAY, e.powfract()); - Draw.circle(e.x, e.y, 5f + e.powfract() * 6f); - - Draw.color(e.ifract() < 0.5f ? Color.WHITE : Color.DARK_GRAY); - float rad = e.fract()*10f + 5f; - Angles.randLenVectors(e.id, 5, 8f, (x, y)->{ - Draw.rect("circle2", e.x + x, e.y + y, rad, rad); - }); - - Draw.reset(); - }); - - Effects.create("blockexplosion", 13, e -> { - Angles.randLenVectors(e.id+1, 8, 5f + e.ifract()*11f, (x, y)->{ - float size = 2f+e.fract()*8f; - Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); - Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); - }); - - Draw.thickness(2f*e.fract()+0.4f); - Draw.color(Color.WHITE, Color.ORANGE, e.powfract()); - Draw.circle(e.x, e.y, 2f + e.powfract() * 9f); - - Draw.color(e.ifract() < 0.5f ? Color.WHITE : Color.DARK_GRAY); - float rad = e.fract()*10f + 2f; - Angles.randLenVectors(e.id, 5, 8f, (x, y)->{ - Draw.rect("circle2", e.x + x, e.y + y, rad, rad); - }); - - Draw.reset(); - }); - - Effects.create("coreexplosion", 13, e -> { - Draw.thickness(3f-e.ifract()*2f); - Draw.color(Color.ORANGE, Color.WHITE, e.ifract()); - Draw.spikes(e.x, e.y, 5f + e.ifract() * 40f, 6, 6); - Draw.circle(e.x, e.y, 4f + e.ifract() * 40f); - Draw.reset(); - }); - - Effects.create("smoke", 100, e -> { - Draw.color(Color.GRAY, new Color(0.3f, 0.3f, 0.3f, 1f), e.ifract()); - float size = 7f-e.ifract()*7f; - Draw.rect("circle", e.x, e.y, size, size); - Draw.reset(); - }); - - Effects.create("railsmoke", 30, e -> { - Draw.color(Color.LIGHT_GRAY, Color.WHITE, e.ifract()); - float size = e.fract()*4f; - Draw.rect("circle", e.x, e.y, size, size); - Draw.reset(); - }); - - Effects.create("spawn", 23, e -> { - Draw.thickness(2f); - Draw.color(Color.DARK_GRAY, Color.SCARLET, e.ifract()); - Draw.circle(e.x, e.y, 7f - e.ifract() * 6f); - Draw.reset(); - }); - - Effects.create("ind", 100, e -> { - Draw.thickness(3f); - Draw.color("royal"); - Draw.circle(e.x, e.y, 3); - Draw.reset(); - }); - - Effects.create("respawn", respawnduration, e -> { - Draw.tcolor(Color.SCARLET); - Draw.tscl(0.25f); - Draw.text("Respawning in " + (int)((e.lifetime-e.time)/60), e.x, e.y); - Draw.tscl(0.5f); - Draw.reset(); - }); - } -} diff --git a/core/src/io/anuke/mindustry/Fx.java b/core/src/io/anuke/mindustry/Fx.java new file mode 100644 index 0000000000..7e97243ccd --- /dev/null +++ b/core/src/io/anuke/mindustry/Fx.java @@ -0,0 +1,332 @@ +package io.anuke.mindustry; + +import com.badlogic.gdx.graphics.Color; + +import io.anuke.ucore.core.Draw; +import io.anuke.ucore.core.Effects.Effect; +import io.anuke.ucore.graphics.Hue; +import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Mathf; + +public class Fx{ + static Color lightRed = Hue.mix(Color.WHITE, Color.FIREBRICK, 0.1f); + static Color lightOrange = Color.valueOf("f68021"); + static Color whiteOrange = Hue.mix(lightOrange, Color.WHITE, 0.6f); + + public static final Effect + + generatorexplosion = new Effect(28, e -> { + Angles.randLenVectors(e.id, 16, 10f + e.ifract()*8f, (x, y)->{ + float size = e.fract()*12f + 1f; + Draw.color(Color.WHITE, lightOrange, e.ifract()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }), + + chainshot = new Effect(9f, e -> { + Draw.color(Color.WHITE, lightOrange, e.ifract()); + Draw.thick(e.fract()*4f); + Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*7f); + Draw.thick(e.fract()*2f); + Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*10f); + Draw.reset(); + }), + + titanshot = new Effect(12f, e -> { + Draw.color(Color.WHITE, lightOrange, e.ifract()); + Draw.thick(e.fract()*7f); + Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*12f); + Draw.thick(e.fract()*4f); + Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*16f); + Draw.thick(e.fract()*2f); + Draw.lineAngle(e.x, e.y, e.rotation, e.fract()*18f); + Draw.reset(); + }), + + shockwave = new Effect(10f, e -> { + Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); + Draw.thick(e.fract()*2f + 0.2f); + Draw.circle(e.x, e.y, e.ifract()*28f); + Draw.reset(); + }), + + shockwaveSmall = new Effect(10f, e -> { + Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); + Draw.thick(e.fract()*2f + 0.1f); + Draw.circle(e.x, e.y, e.ifract()*15f); + Draw.reset(); + }), + + empshockwave = new Effect(7f, e -> { + Draw.color(Color.WHITE, Color.SKY, e.ifract()); + Draw.thick(e.fract()*2f); + Draw.circle(e.x, e.y, e.ifract()*40f); + Draw.reset(); + }), + + empspark = new Effect(13, e -> { + Angles.randLenVectors(e.id, 7, 1f + e.ifract()*12f, (x, y)->{ + float len = 1f+e.fract()*6f; + Draw.color(Color.SKY); + Draw.lineAngle(e.x + x, e.y + y, Mathf.atan2(x, y), len); + Draw.reset(); + }); + }), + + shellsmoke = new Effect(20, e -> { + Angles.randLenVectors(e.id, 8, 3f + e.ifract()*17f, (x, y)->{ + float size = 2f+e.fract()*5f; + Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }), + + blastsmoke = new Effect(26, e -> { + Angles.randLenVectors(e.id, 12, 1f + e.ifract()*23f, (x, y)->{ + float size = 2f+e.fract()*6f; + Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }), + + lava = new Effect(18, e -> { + Angles.randLenVectors(e.id, 3, 1f + e.ifract()*10f, (x, y)->{ + float size = e.sfract()*4f; + Draw.color(Color.ORANGE, Color.GRAY, e.ifract()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + }), + + lavabubble = new Effect(45f, e -> { + Draw.color(Color.ORANGE); + float scl = 0.35f; + Draw.thick(1f - Mathf.clamp(e.ifract() - (1f-scl)) * (1f/scl)); + Draw.circle(e.x, e.y, e.ifract()*4f); + Draw.reset(); + }), + + oilbubble = new Effect(64f, e -> { + Draw.color(Color.DARK_GRAY); + float scl = 0.25f; + Draw.thick(1f - Mathf.clamp(e.ifract() - (1f-scl)) * (1f/scl)); + Draw.circle(e.x, e.y, e.ifract()*3f); + Draw.reset(); + }), + + shellexplosion = new Effect(9, e -> { + Draw.thickness(2f - e.ifract()*1.7f); + Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); + Draw.circle(e.x, e.y, 3f + e.ifract() * 9f); + Draw.reset(); + }), + + blastexplosion = new Effect(16, e -> { + Draw.thickness(1.2f - e.ifract()); + Draw.color(Color.WHITE, Color.SCARLET, e.ifract()); + Draw.circle(e.x, e.y, 1.5f + e.ifract() * 9f); + Draw.reset(); + }), + + place = new Effect(16, e -> { + Draw.thickness(3f - e.ifract() * 2f); + Draw.square(e.x, e.y, Vars.tilesize / 2f + e.ifract() * 3f); + Draw.reset(); + }), + + purify = new Effect(10, e -> { + Draw.color(Color.ROYAL, Color.GRAY, e.ifract()); + Draw.thickness(2f); + Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); + Draw.reset(); + }), + + purifyoil = new Effect(10, e -> { + Draw.color(Color.BLACK, Color.GRAY, e.ifract()); + Draw.thickness(2f); + Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); + Draw.reset(); + }), + + generate = new Effect(11, e -> { + Draw.color(Color.ORANGE, Color.YELLOW, e.ifract()); + Draw.thickness(1f); + Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); + Draw.reset(); + }), + + spark = new Effect(10, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.GRAY, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); + Draw.reset(); + }), + + sparkbig = new Effect(11, e -> { + Draw.thickness(1f); + Draw.color(lightRed, Color.GRAY, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 5f, 2.3f, 8); + Draw.reset(); + }), + + smelt = new Effect(10, e -> { + Draw.thickness(1f); + Draw.color(Color.YELLOW, Color.RED, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 8); + Draw.reset(); + }), + + breakBlock = new Effect(12, e -> { + Draw.thickness(2f); + Draw.color(Color.WHITE, Color.GRAY, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 5f, 2, 5); + Draw.reset(); + }), + + hit = new Effect(10, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.ORANGE, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 3f, 2, 8); + Draw.reset(); + }), + + laserhit = new Effect(10, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.SKY, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 2f, 2, 6); + Draw.reset(); + }), + + shoot = new Effect(8, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.GOLD, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 2f, 2, 5); + Draw.reset(); + }), + + shoot2 = new Effect(8, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.SKY, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 2f, 1, 5); + Draw.reset(); + }), + + shoot3 = new Effect(8, e -> { + Draw.thickness(1f); + Draw.color(Color.WHITE, Color.GOLD, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 2f, 1, 5); + Draw.reset(); + }), + + railshoot = new Effect(8, e -> { + Draw.thickness(2f - e.ifract()*2f); + Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.ifract()); + Draw.spikes(e.x, e.y, 1f + e.ifract() * 4f, 1, 5); + Draw.reset(); + }), + + mortarshoot = new Effect(9, e -> { + Draw.thickness(1.3f - e.ifract()); + Draw.color(Color.WHITE, Color.ORANGE, e.ifract()); + Draw.spikes(e.x, e.y, e.ifract() * 4f, 2, 6); + Draw.circle(e.x, e.y, e.ifract() * 5f + 1f); + Draw.reset(); + }), + + titanExplosion = new Effect(11, e -> { + Draw.thickness(2f*e.fract()+0.5f); + Draw.color(Color.WHITE, Color.DARK_GRAY, e.powfract()); + Draw.circle(e.x, e.y, 5f + e.powfract() * 8f); + + Draw.color(e.ifract() < 0.5f ? whiteOrange : Color.DARK_GRAY); + float rad = e.fract()*10f + 5f; + Angles.randLenVectors(e.id, 5, 9f, (x, y)->{ + Draw.rect("circle2", e.x + x, e.y + y, rad, rad); + }); + + Draw.reset(); + }), + + explosion = new Effect(11, e -> { + Draw.thickness(2f*e.fract()+0.5f); + Draw.color(Color.WHITE, Color.DARK_GRAY, e.powfract()); + Draw.circle(e.x, e.y, 5f + e.powfract() * 6f); + + Draw.color(e.ifract() < 0.5f ? Color.WHITE : Color.DARK_GRAY); + float rad = e.fract()*10f + 5f; + Angles.randLenVectors(e.id, 5, 8f, (x, y)->{ + Draw.rect("circle2", e.x + x, e.y + y, rad, rad); + }); + + Draw.reset(); + }), + + + blockexplosion = new Effect(13, e -> { + Angles.randLenVectors(e.id+1, 8, 5f + e.ifract()*11f, (x, y)->{ + float size = 2f+e.fract()*8f; + Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.ifract()); + Draw.rect("circle", e.x + x, e.y + y, size, size); + Draw.reset(); + }); + + Draw.thickness(2f*e.fract()+0.4f); + Draw.color(Color.WHITE, Color.ORANGE, e.powfract()); + Draw.circle(e.x, e.y, 2f + e.powfract() * 9f); + + Draw.color(e.ifract() < 0.5f ? Color.WHITE : Color.DARK_GRAY); + float rad = e.fract()*10f + 2f; + Angles.randLenVectors(e.id, 5, 8f, (x, y)->{ + Draw.rect("circle2", e.x + x, e.y + y, rad, rad); + }); + + Draw.reset(); + }), + + coreexplosion = new Effect(13, e -> { + Draw.thickness(3f-e.ifract()*2f); + Draw.color(Color.ORANGE, Color.WHITE, e.ifract()); + Draw.spikes(e.x, e.y, 5f + e.ifract() * 40f, 6, 6); + Draw.circle(e.x, e.y, 4f + e.ifract() * 40f); + Draw.reset(); + }), + + smoke = new Effect(100, e -> { + Draw.color(Color.GRAY, new Color(0.3f, 0.3f, 0.3f, 1f), e.ifract()); + float size = 7f-e.ifract()*7f; + Draw.rect("circle", e.x, e.y, size, size); + Draw.reset(); + }), + + railsmoke = new Effect(30, e -> { + Draw.color(Color.LIGHT_GRAY, Color.WHITE, e.ifract()); + float size = e.fract()*4f; + Draw.rect("circle", e.x, e.y, size, size); + Draw.reset(); + }), + + spawn = new Effect(23, e -> { + Draw.thickness(2f); + Draw.color(Color.DARK_GRAY, Color.SCARLET, e.ifract()); + Draw.circle(e.x, e.y, 7f - e.ifract() * 6f); + Draw.reset(); + }), + + ind = new Effect(100, e -> { + Draw.thickness(3f); + Draw.color("royal"); + Draw.circle(e.x, e.y, 3); + Draw.reset(); + }), + + respawn = new Effect(Vars.respawnduration, e -> { + Draw.tcolor(Color.SCARLET); + Draw.tscl(0.25f); + Draw.text("Respawning in " + (int)((e.lifetime-e.time)/60), e.x, e.y); + Draw.tscl(0.5f); + Draw.reset(); + }); +} diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 9571b03b0b..74336ade17 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -29,6 +29,10 @@ public class Vars{ public static boolean debug = false; //whether to debug openGL info public static boolean debugGL = false; + //whether turrets have infinite ammo (only with debug) + public static boolean infiniteAmmo = true; + //whether to show paths of enemies + public static boolean showPaths = false; //number of save slots-- increasing may lead to layout issues //TODO named save slots, possibly with a scroll dialog public static final int saveSlots = 4; diff --git a/core/src/io/anuke/mindustry/ai/Pathfind.java b/core/src/io/anuke/mindustry/ai/Pathfind.java index 564d9c53fe..918ddf426d 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfind.java +++ b/core/src/io/anuke/mindustry/ai/Pathfind.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.ai.pfa.indexed.IndexedAStarPathFinder; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.world.Tile; @@ -85,9 +86,9 @@ public class Pathfind{ } - if(Vars.debug) + if(Vars.debug && Vars.showPaths) for(Tile tile : path){ - Effects.effect("ind", tile.worldx(), tile.worldy()); + Effects.effect(Fx.ind, tile.worldx(), tile.worldy()); } } diff --git a/core/src/io/anuke/mindustry/entities/BulletType.java b/core/src/io/anuke/mindustry/entities/BulletType.java index 326ddaafdc..b4477bc27d 100644 --- a/core/src/io/anuke/mindustry/entities/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/BulletType.java @@ -2,7 +2,10 @@ package io.anuke.mindustry.entities; import com.badlogic.gdx.graphics.Color; +import io.anuke.mindustry.Fx; +import io.anuke.mindustry.entities.effect.DamageArea; import io.anuke.mindustry.entities.effect.EMP; +import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; @@ -14,6 +17,9 @@ import io.anuke.ucore.util.Mathf; public abstract class BulletType extends BaseBulletType{ static Color glowy = Color.valueOf("fdc056"); static Color lightGold = Hue.mix(Color.GOLD, Color.WHITE, 0.4f); + static Color lightRed = Hue.mix(Color.WHITE, Color.FIREBRICK, 0.1f); + static Color lightOrange = Color.valueOf("f68021"); + static Color whiteOrange = Hue.mix(lightOrange, Color.WHITE, 0.6f); public static final BulletType @@ -36,8 +42,8 @@ public abstract class BulletType extends BaseBulletType{ }, chain = new BulletType(2f, 8){ public void draw(Bullet b){ - Draw.color("gray"); - Draw.rect("bullet", b.x, b.y, b.angle()); + Draw.color(whiteOrange); + Draw.rect("chainbullet", b.x, b.y, b.angle()); Draw.reset(); } }, @@ -51,7 +57,7 @@ public abstract class BulletType extends BaseBulletType{ public void update(Bullet b){ if(Timers.get(b, "smoke", 4)){ - Effects.effect("railsmoke", b.x, b.y); + Effects.effect(Fx.railsmoke, b.x, b.y); } } }, @@ -72,7 +78,7 @@ public abstract class BulletType extends BaseBulletType{ public void update(Bullet b){ if(Timers.get(b, "smoke", 2)){ - Effects.effect("empspark", b.x + Mathf.range(2), b.y + Mathf.range(2)); + Effects.effect(Fx.empspark, b.x + Mathf.range(2), b.y + Mathf.range(2)); } } @@ -84,19 +90,20 @@ public abstract class BulletType extends BaseBulletType{ Timers.run(5f, ()->{ new EMP(b.x, b.y, b.damage).add(); }); - Effects.effect("empshockwave", b); + Effects.effect(Fx.empshockwave, b); Effects.shake(3f, 3f, b); } }, - //TODO use DamageArea instead - shell = new BulletType(1.1f, 85){ + //TODO better visuals for shell + shell = new BulletType(1.1f, 60){ { lifetime = 110f; - hitsize = 8f; + hitsize = 11f; } public void draw(Bullet b){ float rad = 8f; + Draw.color(Color.ORANGE); Draw.color(Color.GRAY); Draw.rect("circle", b.x, b.y, rad, rad); rad += Mathf.sin(Timers.time(), 3f, 1f); @@ -107,7 +114,7 @@ public abstract class BulletType extends BaseBulletType{ public void update(Bullet b){ if(Timers.get(b, "smoke", 7)){ - Effects.effect("smoke", b.x + Mathf.range(2), b.y + Mathf.range(2)); + Effects.effect(Fx.smoke, b.x + Mathf.range(2), b.y + Mathf.range(2)); } } @@ -118,13 +125,41 @@ public abstract class BulletType extends BaseBulletType{ public void removed(Bullet b){ Effects.shake(3f, 3f, b); - Effects.effect("shellsmoke", b); - Effects.effect("shellexplosion", b); + Effects.effect(Fx.shellsmoke, b); + Effects.effect(Fx.shellexplosion, b); - Angles.circle(25, f->{ - Angles.translation(f, 5f); - new Bullet(shellshot, b.owner, b.x + Angles.x(), b.y + Angles.y(), f).add(); - }); + DamageArea.damage(b.owner instanceof Enemy, b.x, b.y, 25f, (int)(damage * 2f/3f)); + } + }, + titanshell = new BulletType(1.8f, 60){ + { + lifetime = 70f; + hitsize = 11f; + } + + public void draw(Bullet b){ + Draw.color(whiteOrange); + Draw.rect("titanshell", b.x, b.y, b.angle()); + Draw.reset(); + } + + public void update(Bullet b){ + if(Timers.get(b, "smoke", 4)){ + Effects.effect(Fx.smoke, b.x + Mathf.range(2), b.y + Mathf.range(2)); + } + } + + public void despawned(Bullet b){ + removed(b); + } + + public void removed(Bullet b){ + Effects.shake(3f, 3f, b); + + Effects.effect(Fx.shellsmoke, b); + Effects.effect(Fx.shockwaveSmall, b); + + DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 25f, (int)(damage * 2f/3f)); } }, blast = new BulletType(1.1f, 80){ @@ -141,8 +176,8 @@ public abstract class BulletType extends BaseBulletType{ public void removed(Bullet b){ Effects.shake(3f, 3f, b); - Effects.effect("blastsmoke", b); - Effects.effect("blastexplosion", b); + Effects.effect(Fx.blastsmoke, b); + Effects.effect(Fx.blastexplosion, b); Angles.circle(30, f->{ Angles.translation(f, 6f); @@ -239,6 +274,6 @@ public abstract class BulletType extends BaseBulletType{ @Override public void removed(Bullet b){ - Effects.effect("hit", b); + Effects.effect(Fx.hit, b); } } diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 0b75e011af..5ee14ac993 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.resource.Recipe; import io.anuke.mindustry.resource.Weapon; @@ -35,7 +36,7 @@ public class Player extends DestructibleEntity{ @Override public void onDeath(){ remove(); - Effects.effect("explosion", this); + Effects.effect(Fx.explosion, this); Effects.shake(4f, 5f, this); Effects.sound("die", this); diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index f1d82d653b..887bdf65b2 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -6,6 +6,7 @@ import java.io.IOException; import com.badlogic.gdx.utils.ObjectMap; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.resource.Item; @@ -89,7 +90,7 @@ public class TileEntity extends Entity{ if(health != 0 && !(tile.block() instanceof Wall) && Mathf.chance(0.009f*Timers.delta()*(1f-(float)health/maxhealth))){ - Effects.effect("smoke", x+Mathf.range(4), y+Mathf.range(4)); + Effects.effect(Fx.smoke, x+Mathf.range(4), y+Mathf.range(4)); } tile.block().update(tile); diff --git a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java index ffd229c4bb..e90673946d 100644 --- a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java +++ b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java @@ -1,8 +1,47 @@ package io.anuke.mindustry.entities.effect; -import io.anuke.ucore.entities.Entity; +import com.badlogic.gdx.math.Vector2; + +import io.anuke.mindustry.Vars; +import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.World; +import io.anuke.ucore.entities.Entities; +import io.anuke.ucore.util.Mathf; //TODO -public class DamageArea extends Entity{ - +public class DamageArea{ + + public static void damage(boolean enemies, float x, float y, float radius, int damage){ + + if(enemies){ + Entities.getNearby(x, y, radius*2, entity->{ + if(entity instanceof Enemy){ + Enemy enemy = (Enemy)entity; + if(enemy.distanceTo(x, y) > radius){ + return; + } + int amount = calculateDamage(x, y, enemy.x, enemy.y, radius, damage); + enemy.damage(amount); + } + }); + }else{ + int trad = (int)(radius / Vars.tilesize); + for(int dx = -trad; dx <= trad; dx ++){ + for(int dy= -trad; dy <= trad; dy ++){ + Tile tile = World.tile(Mathf.scl2(x, Vars.tilesize) + dx, Mathf.scl2(y, Vars.tilesize) + dy); + if(tile != null && tile.entity != null && Vector2.dst(dx, dy, 0, 0) <= trad){ + int amount = calculateDamage(x, y, tile.worldx(), tile.worldy(), radius, damage); + tile.entity.damage(amount); + } + } + } + } + } + + static int calculateDamage(float x, float y, float tx, float ty, float radius, int damage){ + float dist = Vector2.dst(x, y, tx, ty); + float scaled = 1f - dist/radius; + return (int)(damage * scaled); + } } diff --git a/core/src/io/anuke/mindustry/entities/effect/EMP.java b/core/src/io/anuke/mindustry/entities/effect/EMP.java index 339222a2b1..e2d6a280f9 100644 --- a/core/src/io/anuke/mindustry/entities/effect/EMP.java +++ b/core/src/io/anuke/mindustry/entities/effect/EMP.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.World; @@ -57,7 +58,7 @@ public class EMP extends TimedEntity{ p.setPower(tile, 0f); } - Effects.effect("empspark", tile.entity); + Effects.effect(Fx.empspark, tile.entity); tile.entity.damage(damage); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java b/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java index 8b9074b82e..1572a21c50 100644 --- a/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java +++ b/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectSet; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; @@ -64,7 +65,7 @@ public class TeslaOrb extends Entity{ void damageEnemy(Enemy enemy){ //TODO enemy.damage(damage); - Effects.effect("laserhit", enemy.x + Mathf.range(2f), enemy.y + Mathf.range(2f)); + Effects.effect(Fx.laserhit, enemy.x + Mathf.range(2f), enemy.y + Mathf.range(2f)); } @Override diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java index 6f7faafdb1..096bbe84d2 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/Enemy.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.reflect.ClassReflection; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Shaders; import io.anuke.mindustry.Vars; import io.anuke.mindustry.ai.Pathfind; @@ -171,7 +172,7 @@ public class Enemy extends DestructibleEntity{ @Override public void onDeath(){ - Effects.effect("explosion", this); + Effects.effect(Fx.explosion, this); Effects.shake(3f, 4f, this); Effects.sound("explosion", this); remove(); diff --git a/core/src/io/anuke/mindustry/resource/Weapon.java b/core/src/io/anuke/mindustry/resource/Weapon.java index 80b472460d..5fe88c67eb 100644 --- a/core/src/io/anuke/mindustry/resource/Weapon.java +++ b/core/src/io/anuke/mindustry/resource/Weapon.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.BulletType; @@ -22,7 +23,7 @@ public enum Weapon{ @Override public void shoot(Player p){ super.shoot(p); - Effects.effect("shoot3", p.x + vector.x, p.y+vector.y); + Effects.effect(Fx.shoot3, p.x + vector.x, p.y+vector.y); } }, triblaster(13, BulletType.shot, "Shoots 3 bullets in a spread.", stack(Item.iron, 40)){ @@ -36,7 +37,7 @@ public enum Weapon{ bullet(p, p.x, p.y, ang+space); bullet(p, p.x, p.y, ang-space); - Effects.effect("shoot", p.x + vector.x, p.y+vector.y); + Effects.effect(Fx.shoot, p.x + vector.x, p.y+vector.y); } }, @@ -48,7 +49,7 @@ public enum Weapon{ bullet(p, p.x, p.y, ang + Mathf.range(8)); - Effects.effect("shoot2", p.x + vector.x, p.y+vector.y); + Effects.effect(Fx.shoot, p.x + vector.x, p.y+vector.y); } }, flamer(5, BulletType.flame, "Shoots a stream of fire.", stack(Item.steel, 60), stack(Item.coal, 60)){ @@ -73,7 +74,7 @@ public enum Weapon{ float ang = mouseAngle(p); bullet(p, p.x, p.y, ang); - Effects.effect("railshoot", p.x + vector.x, p.y+vector.y); + Effects.effect(Fx.railshoot, p.x + vector.x, p.y+vector.y); } }, mortar(100, BulletType.shell, "Shoots a slow, but damaging shell.", stack(Item.titanium, 40), stack(Item.steel, 60)){ @@ -82,7 +83,7 @@ public enum Weapon{ public void shoot(Player p){ float ang = mouseAngle(p); bullet(p, p.x, p.y, ang); - Effects.effect("mortarshoot", p.x + vector.x, p.y+vector.y); + Effects.effect(Fx.mortarshoot, p.x + vector.x, p.y+vector.y); Effects.shake(2f, 2f, Vars.player); } }; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index ec5838c4ff..e22ae3baa1 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.GameState; import io.anuke.mindustry.GameState.State; import io.anuke.mindustry.Vars; @@ -13,6 +14,7 @@ import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.Liquid; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.util.Tmp; public class Block{ private static int lastid; @@ -26,7 +28,7 @@ public class Block{ /**display name*/ public String formalName; /**played on destroy*/ - public String explosionEffect = "blockexplosion"; + public Effect explosionEffect = Fx.blockexplosion; /**played on destroy*/ public String explosionSound = "break"; /**whether this block has a tile entity that updates*/ diff --git a/core/src/io/anuke/mindustry/world/World.java b/core/src/io/anuke/mindustry/world/World.java index c78a1b2d1e..c0b2b5320a 100644 --- a/core/src/io/anuke/mindustry/world/World.java +++ b/core/src/io/anuke/mindustry/world/World.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.math.*; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.ai.Pathfind; import io.anuke.mindustry.entities.TileEntity; @@ -222,11 +223,11 @@ public class World{ toplace.setLinked((byte)(dx + offsetx), (byte)(dy + offsety)); } - Effects.effect("place", worldx * Vars.tilesize, worldy * Vars.tilesize); + Effects.effect(Fx.place, worldx * Vars.tilesize, worldy * Vars.tilesize); } } }else{ - Effects.effect("place", x * Vars.tilesize, y * Vars.tilesize); + Effects.effect(Fx.place, x * Vars.tilesize, y * Vars.tilesize); } Effects.shake(2f, 2f, player); @@ -307,14 +308,14 @@ public class World{ if(!tile.block().isMultiblock() && !tile.isLinked()){ tile.setBlock(Blocks.air); - Effects.effect("break", tile.worldx(), tile.worldy()); + Effects.effect(Fx.breakBlock, tile.worldx(), tile.worldy()); }else{ Tile target = tile.isLinked() ? tile.getLinked() : tile; Array removals = target.getLinkedTiles(); for(Tile toremove : removals){ //note that setting a new block automatically unlinks it toremove.setBlock(Blocks.air); - Effects.effect("break", toremove.worldx(), toremove.worldy()); + Effects.effect(Fx.breakBlock, toremove.worldx(), toremove.worldy()); } } } diff --git a/core/src/io/anuke/mindustry/world/blocks/Blocks.java b/core/src/io/anuke/mindustry/world/blocks/Blocks.java index db40495857..bfd48c6914 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/Blocks.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.blocks; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.GameState; import io.anuke.mindustry.GameState.State; import io.anuke.mindustry.resource.Item; @@ -51,11 +52,11 @@ public class Blocks{ @Override public void update(Tile tile){ if(Mathf.chance(0.001 * Timers.delta())){ - Effects.effect("lava", tile.worldx() + Mathf.range(5f), tile.worldy() + Mathf.range(5f)); + Effects.effect(Fx.lava, tile.worldx() + Mathf.range(5f), tile.worldy() + Mathf.range(5f)); } if(Mathf.chance(0.003 * Timers.delta())){ - Effects.effect("lavabubble", tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f)); + Effects.effect(Fx.lavabubble, tile.worldx() + Mathf.range(3f), tile.worldy() + Mathf.range(3f)); } } }, @@ -70,7 +71,7 @@ public class Blocks{ @Override public void update(Tile tile){ if(Mathf.chance(0.0025 * Timers.delta())){ - Effects.effect("oilbubble", tile.worldx() + Mathf.range(2f), tile.worldy() + Mathf.range(2f)); + Effects.effect(Fx.oilbubble, tile.worldx() + Mathf.range(2f), tile.worldy() + Mathf.range(2f)); } } }, diff --git a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java index a9249b2662..88b6fd87b7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.blocks; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.resource.Liquid; @@ -113,7 +114,7 @@ public class ProductionBlocks{ purifyTime = 70; output = Item.coal; health = 80; - craftEffect = "purifyoil"; + craftEffect = Fx.purifyoil; } @Override @@ -164,7 +165,7 @@ public class ProductionBlocks{ if(tile.floor().drops != null && Timers.get(tile, "drill", 60 * time)){ offloadNear(tile, tile.floor().drops.item); - Effects.effect("sparkbig", tile.worldx(), tile.worldy()); + Effects.effect(Fx.sparkbig, tile.worldx(), tile.worldy()); } if(Timers.get(tile, "dump", 30)){ diff --git a/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java b/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java index 16ef70742c..174ea2b2d7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/WeaponBlocks.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.world.blocks; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.effect.TeslaOrb; @@ -167,15 +168,49 @@ public class WeaponBlocks{ chainturret = new Turret("chainturret"){ { - inaccuracy = 7f; + inaccuracy = 8f; formalName = "chain turret"; - range = 60f; - reload = 10f; + range = 80f; + reload = 7f; bullet = BulletType.chain; - ammo = Item.stone; //TODO + ammo = Item.uranium; health = 430; - ammoMultiplier = 10; width = height = 2; + shootCone = 9f; + } + + //TODO specify turret shoot effect in turret instead of doing it manually + @Override + protected void shoot(Tile tile){ + TurretEntity entity = tile.entity(); + Vector2 offset = getPlaceOffset(); + + float len = 8; + float space = 3.5f; + + for(int i = -1; i < 1; i ++){ + Angles.vector.set(len, Mathf.sign(i) * space).rotate(entity.rotation); + bullet(tile, entity.rotation); + Effects.effect(Fx.chainshot, tile.worldx() + Angles.x() + offset.x, + tile.worldy()+ Angles.y() + offset.y, entity.rotation); + } + + Effects.shake(1f, 1f, tile.worldx(), tile.worldy()); + } + }, + + titanturret = new Turret("titancannon"){ + { + formalName = "titan cannon"; + range = 120f; + reload = 20f; + bullet = BulletType.titanshell; + ammo = Item.uranium; + health = 800; + ammoMultiplier = 5; + width = height = 3; + rotatespeed = 0.07f; + shootCone = 9f; } @Override @@ -183,31 +218,12 @@ public class WeaponBlocks{ TurretEntity entity = tile.entity(); Vector2 offset = getPlaceOffset(); - float len = 8; - float space = 4f; + Angles.translation(entity.rotation, 14f); + bullet(tile, entity.rotation); + Effects.effect(Fx.titanshot, tile.worldx() + Angles.x() + offset.x, + tile.worldy()+ Angles.y() + offset.y, entity.rotation); - Angles.vector.set(len, -space).rotate(entity.rotation); - bullet(tile, entity.rotation); - Effects.effect("chainshot", tile.worldx() + Angles.x() + offset.x, tile.worldy()+ Angles.y() + offset.y, entity.rotation); - - Angles.vector.set(len, space).rotate(entity.rotation); - bullet(tile, entity.rotation); - Effects.effect("chainshot", tile.worldx() + Angles.x() + offset.x, tile.worldy()+ Angles.y() + offset.y, entity.rotation); - } - }, - - titanturret = new Turret("titancannon"){ - { - inaccuracy = 7f; - formalName = "titan cannon"; - range = 120f; - reload = 40f; - bullet = BulletType.shell; - ammo = Item.coal; - health = 800; - ammoMultiplier = 10; - width = height = 3; - rotatespeed = 0.08f; + Effects.shake(3f, 3f, tile.worldx(), tile.worldy()); } }; } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java index 57727c298a..18f5585ce6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java @@ -3,10 +3,12 @@ package io.anuke.mindustry.world.blocks.types.defense; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; @@ -14,7 +16,7 @@ import io.anuke.ucore.util.Tmp; public class LaserTurret extends PowerTurret{ protected Color beamColor = Color.WHITE.cpy(); - protected String hiteffect = "laserhit"; + protected Effect hiteffect = Fx.laserhit; protected int damage = 4; protected float cone = 15f; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java index ae609d80df..8c498abdff 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java @@ -7,6 +7,7 @@ import java.io.IOException; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.BulletType; @@ -188,7 +189,7 @@ public class Turret extends Block{ if(Timers.getTime(tile, "reload") <= 0){ Timers.run(hittime, ()->{ - Effects.effect("spawn", predictX, predictY); + Effects.effect(Fx.spawn, predictX, predictY); }); } } @@ -206,7 +207,8 @@ public class Turret extends Block{ } protected void bullet(Tile tile, float angle){ - Bullet out = new Bullet(bullet, tile.entity, tile.worldx() + Angles.x(), tile.worldy() + Angles.y(), angle).add(); + Vector2 offset = getPlaceOffset(); + Bullet out = new Bullet(bullet, tile.entity, tile.worldx() + Angles.x() + offset.x, tile.worldy() + Angles.y() + offset.y, angle).add(); out.damage = (int)(bullet.damage*Vars.multiplier); } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java index 3a451eec56..9648b5d805 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Crafter.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.blocks.types.production; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -34,7 +35,7 @@ public class Crafter extends Block{ } offloadNear(tile, result); - Effects.effect("smelt", tile.entity); + Effects.effect(Fx.smelt, tile.entity); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java index ece8d267a4..6e16f4196b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.blocks.types.production; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -25,7 +26,7 @@ public class Drill extends Block{ if(tile.floor() == resource && Timers.get(tile, "drill", 60 * time) && tile.entity.totalItems() < capacity){ offloadNear(tile, result); - Effects.effect("spark", tile.worldx(), tile.worldy()); + Effects.effect(Fx.spark, tile.worldx(), tile.worldy()); } if(Timers.get(tile, "dump", 30)){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java index 65c09d2649..9a332f83a0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Generator.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.GridPoint2; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.World; @@ -35,13 +36,13 @@ public class Generator extends PowerBlock{ if(explosive){ float x = tile.worldx(), y = tile.worldy(); - Effects.effect("shellsmoke", x, y); - Effects.effect("blastsmoke", x, y); + Effects.effect(Fx.shellsmoke, x, y); + Effects.effect(Fx.blastsmoke, x, y); Timers.run(Mathf.random(8f + Mathf.random(6f)), () -> { Effects.shake(6f, 8f, x, y); - Effects.effect("generatorexplosion", x, y); - Effects.effect("shockwave", x, y); + Effects.effect(Fx.generatorexplosion, x, y); + Effects.effect(Fx.shockwave, x, y); Timers.run(12f + Mathf.random(20f), () -> { tile.damageNearby(3, 40, 0f); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/ItemPowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/ItemPowerGenerator.java index a0be1e9a6f..15795421b8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/ItemPowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/ItemPowerGenerator.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.types.production; import com.badlogic.gdx.graphics.Color; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.resource.Item; @@ -37,7 +38,7 @@ public class ItemPowerGenerator extends Generator{ PowerEntity entity = tile.entity(); if(entity.hasItem(generateItem) && tryAddPower(tile, generateAmount)){ - Effects.effect("generate", tile.entity); + Effects.effect(Fx.generate, tile.entity); entity.removeItem(generateItem, 1); } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java index 6fcd3552a5..2b74722d8f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidCrafter.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.world.blocks.types.production; import com.badlogic.gdx.graphics.Color; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.resource.Item; @@ -10,6 +11,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.LiquidBlock; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; public class LiquidCrafter extends LiquidBlock{ @@ -21,7 +23,7 @@ public class LiquidCrafter extends LiquidBlock{ public Item output = null; public int itemCapacity = 90; public int purifyTime = 80; - public String craftEffect = "purify"; + public Effect craftEffect = Fx.purify; public LiquidCrafter(String name) { super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java index 4edc0d5274..f12f119e22 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidPowerGenerator.java @@ -6,12 +6,14 @@ import java.io.IOException; import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.Fx; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.resource.Liquid; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.LiquidAcceptor; import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{ @@ -22,7 +24,7 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{ /**How much liquid to consume to get one generatePower.*/ public float inputLiquid = 5f; public float liquidCapacity = 30f; - public String generateEffect = "generate"; + public Effect generateEffect = Fx.generate; public LiquidPowerGenerator(String name) { super(name); diff --git a/core/src/io/anuke/ucore/function/EffectProvider.java b/core/src/io/anuke/ucore/function/EffectProvider.java index 141601399b..4f40ffe705 100644 --- a/core/src/io/anuke/ucore/function/EffectProvider.java +++ b/core/src/io/anuke/ucore/function/EffectProvider.java @@ -2,6 +2,8 @@ package io.anuke.ucore.function; import com.badlogic.gdx.graphics.Color; +import io.anuke.ucore.core.Effects.Effect; + public interface EffectProvider{ - public void createEffect(String name, Color color, float x, float y, float rotation); + public void createEffect(Effect effect, Color color, float x, float y, float rotation); } diff --git a/desktop/mindustry-saves/0.mins b/desktop/mindustry-saves/0.mins index 45bc7ffc0ea3409eac81f02a4610fc7ce40292e6..e7e476f70ce95ac01e0416f0cbc320225bec44c0 100644 GIT binary patch literal 1591 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 ByEFg* literal 3159 zcmZuzX-t$?6uonC8?>U##{e_TuvrS|h@dcF++ZFeirA{S;R41zb!lp%wKjZeQ?>f1 zX%o;|wX}7q7GkPDYD{cZkRqs!ZLle(soEx1O^w*bq&4Y%@6G*S80N=t-nr+VckkN< z02l;dTUPsK)XJ5qEjkoZxhm{XmjhbYQd zwTQ|)Pt?!`fj690B7btUwj%MfZ6dEVjh##9wu|ikd-RaRZO?_@G`q!j#gqqaES^z1 zPfV^q#Nu_2Ofl(5FjqRiA|_qF$>Oq<6j3t0gvCqWJ|$a(0e937Uz$oUzgcni5xnR8p5 z_Y1|5i#JUna?a9->hqjn&V7<|y&93ubBeh{jmRZaBZ}sCbElP#qAnk2xGm)Uin*xK zjJ#tQ4a;T}mBYwoq0wI}j+}GHa@0AFQS4bpG5HqyMj@(i+yq8ZlNmWKGICoe&qCwB z<*1_&i-QmC%Nzw}tb9rkJIRkG6QPO1zKrV%aay6ovqJ@eQGDLTw zBP6MdGOl#f+*6F$Ed_Ey9es&LxIj{3Z!i*jMFQE3QLG(gr#%WcDZ5x*7U|PeC)I?U z#p<#U$}X0aEZi|Qyaq>eIA;WP)=bm_T^d764c?ZR-gc2tW5T*!P}T^(^$=yk)3tDG zJ)Hj%4rYN_Li^ForQ}#>{8YtJgN_naO7}6j8ag(5#HkyIyUK2(G$M~I3mMZ?wmP;O zpzx^F8ZDZW9S~RbK_NiwG#QZ#oT3p~r&?Tg3rCIbLvpKg<7v4|6*ovPRAJ(aZM5*3 zvj@2(nQyd)Z!H<)+PLZlp%U`F`Y#@m4gof;rFp@R~gx;ap+|XSf!qXg_PO z24Ibem02iGVET1*)*x)A=lXWHYMD$OB2_Cl?pyeHQ0DU^>Be^(s?1So}a_l)U~Kj|1&tN9rI6PaxvQH;j?wvxe=S|vEe2jsz-A_ zK%%}Pw70IxUJirRYE|RhI`pr`q)%{QHQwKiO93UzAbE1Ch{& zZZvICaB&v*np!VT0B2R9e=H_%M7s~Wc4Fr{*t`;tH(=f8Xl|m}bzbP~oyseOOXx#4 ze2F#tl0IkOj??#G{zObZkC8jDD;GN|PucRTV&QjcZviBMP{x!Z~NPRdRKB)b$%j)3q+0T$U@H z`Zq=&VA70Ou7ngGeorAPA>lrA1uGPy0t+-p(J{X>7xM>axK?pSisr~KYc1=>YDBsI g2h91_G0ORqQNcrnNN0bYQO;wI4%xt*|8I@{2NiU9Jpcdz