From 865a5d56edba72cf5ddd10e9b9b1c115070d0c53 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 1 May 2022 14:49:30 -0400 Subject: [PATCH] Two units complete --- .../sprites/effects/large-orb-back.png | Bin 0 -> 626 bytes core/assets-raw/sprites/effects/large-orb.png | Bin 0 -> 249 bytes .../sprites/units/obviate-blade-heat.png | Bin 0 -> 1594 bytes .../sprites/units/obviate-blade.png | Bin 0 -> 1396 bytes .../assets-raw/sprites/units/obviate-cell.png | Bin 875 -> 597 bytes .../sprites/units/obviate-preview.png | Bin 0 -> 2872 bytes .../assets-raw/sprites/units/obviate-side.png | Bin 0 -> 419 bytes core/assets-raw/sprites/units/obviate.png | Bin 2872 -> 1209 bytes core/src/mindustry/content/Fx.java | 5 + core/src/mindustry/content/UnitTypes.java | 145 +++++++++++++----- .../entities/abilities/MoveEffectAbility.java | 41 +++++ .../mindustry/entities/bullet/BulletType.java | 4 +- .../entities/pattern/ShootBarrel.java | 1 + .../entities/pattern/ShootHelix.java | 2 +- .../entities/pattern/ShootMulti.java | 6 +- core/src/mindustry/mod/Mods.java | 18 +-- core/src/mindustry/type/UnitType.java | 3 +- core/src/mindustry/type/Weapon.java | 15 +- tools/src/mindustry/tools/Generators.java | 12 +- 19 files changed, 182 insertions(+), 70 deletions(-) create mode 100644 core/assets-raw/sprites/effects/large-orb-back.png create mode 100644 core/assets-raw/sprites/effects/large-orb.png create mode 100644 core/assets-raw/sprites/units/obviate-blade-heat.png create mode 100644 core/assets-raw/sprites/units/obviate-blade.png create mode 100644 core/assets-raw/sprites/units/obviate-preview.png create mode 100644 core/assets-raw/sprites/units/obviate-side.png create mode 100644 core/src/mindustry/entities/abilities/MoveEffectAbility.java diff --git a/core/assets-raw/sprites/effects/large-orb-back.png b/core/assets-raw/sprites/effects/large-orb-back.png new file mode 100644 index 0000000000000000000000000000000000000000..261446c5177d11799fc3d5f1b8891aa11a9c557a GIT binary patch literal 626 zcmV-&0*(ENP)Px%EJ;K`RCt{2oZE85APhrEr~m)U=}YPC>})Q?l5BT$o`WqE2!ue!Fvb{TjA_Z1 zEnti>_I=-_Gv*>C88}LTgRh9 zQPHe9S%$9V0#(hMsP%nElC2;qG*i29g;vbg zAQ^@KGd3`Y4GdxfgV?|zHZX_{3_>-q!UUVG0b*c<3G*r_&4&h7XgyUp^Md{i%)Akb z+%N+>bz`Jf$taw107jJa)IjKFY@vxt-Ov`;p&O$$!n?5gyX;C1#to+IjZtsyVC78P z8>8Ny;9Xk#`MWQ z-igL#1brpjNcNkLe?At?qe$`&ZE-W>>z_K|C%UZg7-Nhv#{46G0DyvMbCv9E)Bpeg M07*qoM6N<$f<50L`2YX_ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/effects/large-orb.png b/core/assets-raw/sprites/effects/large-orb.png new file mode 100644 index 0000000000000000000000000000000000000000..414d8d2ab410a0324cea5895962c76b112dcbaad GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|Hha1_hE&XX zd()8buz~=K!{q<}XNH)FbS^q7)0Y+{ULLj0Fh(4x4h-6}u5zELdjI$G_iMKTt>rhL z+5RAHIZNceBkK>IUDd23JFm?=q%Fd%BDBIev_sW7yxlyc<;N}C5BGEIH}1Y={w8lB zTidpI*Y3WRF54Es?99Z&X`pgo0t1-w#9w7eqvCc$MP8nr0lv?}cw}Q<>OTm~6g)qx i+vaVeEYt}N$$J@9R@kWRIFoD*67qEQb6Mw<&;$SkPg*tr literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/obviate-blade-heat.png b/core/assets-raw/sprites/units/obviate-blade-heat.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d8f68a40017926ce4889177c770768a7e9135f GIT binary patch literal 1594 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 literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/obviate-cell.png b/core/assets-raw/sprites/units/obviate-cell.png index 80c360692626c592e23915e2e7c4d23d9e2c4bfe..9c807c22dcf9e12ce6f19db9fcef980a63f03a86 100644 GIT binary patch delta 520 zcmV+j0{8vv2Gs<;HdlkexLq43`43tWv_3q(#1bEW3<(j zzaJm>h=@P$?_K+Ey}q};%*qzN)Qr(mQ^sbG_J*eQ`ri7o`}OPsdTcdg=`)YbKEvFa zz4cX4E--tVK5fbsVVPTdPY|xG=_;jei_-)C{r1*;-RJE#`}?i0lh&`bf1@?^&Qi}% zrqH=29SKeA?9m#UqXDiGni55>-MV`kwRce63e6dJyS2J9NnhYuVHvG8e`&qX+pYU) zXlcDA*+Y|h=>5*H^w!ezc)V77_CYvpU^0be>$5*8G${j{28;uS|HANH!{{(IV=&y0~2xXpg9+eGhd{=!cbf~ zFju@4ovwNH`W2-uzU4hc)x)p6x3qVdtOxcTGVeWYU?OrK+*PvgMmcq0BJv;LnJVlx zePAML9OO||_E@6G(R5g>a==SoX)mc|{V#5hSK12z0002+ME?LWGY<;^%W;4J0000< KMNUMnLSTYEs{?ZY delta 806 zcmV+>1KIr51nUNnFfjuqNklnT!lWkN`>U z(eM4+syCN|B7`WBVI_aj+{backK@$4j#935CqwT7j#xJQ}9IkcG*%h4IJEJ$> zweBUWVslOZ{rM?L8ipa{c&2HZBuNuq@&g(X>r#wje4VPK?3 zXqI6~qJ(A{mL!G7Ei960V5I!Ukm3hMic@2$U%d-B%C+H=ckO?+fss5L?^yGkb@9pk ztv}iZiCo)T+d5w8EplxD000000Kls0kKT1e7o|^KPgO4)z^U_fk^0o_g>!ogq4`&| zK6SZTy)|n-!rN{XTfOLY=RxzpINxFsO^;qS4GdwqUhAGV3(VeuaSZdYw-+r#(`4g3 zo9X|z7{apZ*<^q6q{XE2>MuZ8t`Q|PRiB)&Tq{ConjOOsmh*DG%JsGe>$?WfUbVn1 zKaO(u72~{RZ)<*QsuGx7!Gz{|xt`VvP4kbW`2ab7DL3y~j~%efG0gYvMp#Z5hGFRS zZe4AoZM`Kru38XLj~+KY4!Zg20000000000=*|Di zrplMYNEhmkUfJFI_(;oiT*ZC>rORQQ{TaQzkB_!Y$5pIvGuc`WW9@G>rU0xxXK7td zYy-2W@$>(wIbUS{+@*E7u?$Sf#-FAs`?J4Cj$v|-xsPMf8g#A`p6otP=Z!A8MfB?X zkN4g;{;Yo%w<(oY#jfp@M>f<|8|m3^Pj1yP=M);7LeGXJx%ykmk>e5P&{z~1H7v`j|rpMvC9SD>;lcd|)JxMxNy|MvEeoS6a*MmBtd9>(s_I kuQV0_00000004lCAM88Nq~JGOFaQ7m07*qoM6N<$g6C$DX#fBK diff --git a/core/assets-raw/sprites/units/obviate-preview.png b/core/assets-raw/sprites/units/obviate-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..aac82cee84761d32242942741833c5df6f1602d0 GIT binary patch literal 2872 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 InE@s2KcgB;k^lez literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/obviate-side.png b/core/assets-raw/sprites/units/obviate-side.png new file mode 100644 index 0000000000000000000000000000000000000000..ebba8b2e875eb1fbd7d56363b0d62b6cbdd63d8e GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^c|e@P!3HGL53tS!QjEnx?oJHr&dIz4vSU46978JR zyuD@Xci2Fp;UWK#z!_B{5|J|ng&%RqEPi!os-RxemDYPpeI^PlTKV^8-p|T;nqG^J zoSLmM@ev2mw7SWggZUrmN3XlKyY}|G_j$9|?Ja0N<2rlG5#hXsNg0!KY#v&z?le1j zM0nj|pDmubKyGHI*~(7!7#ez$s9A1ai)`R1{-&AL|i4nGdQ=&KOZd@19; zuKca<0uLu;Ek3(;cJ%)K0?xJXx2&I-wb<1qW(!Zl9-lSmZ3;P;#@BTpeY(MrW4ejf zy>EZlX4pTJ`qCFJrR%gKZSSM2F5Lp_y02Aiy{OdkT1{GC7%03h>v8I0SB~qknR}*X z2p;0SXf=OHOF?r_pZXn#nHB5x&;L9Am&Np>7f?;Pi0a3zML^o5_#@C>j`EQEM^C#v qcA2*N>$_LKmfdDi28IAGaO@|;qnFj~so}k5ASIrzelF{r5}E*CeX@oC literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/obviate.png b/core/assets-raw/sprites/units/obviate.png index aac82cee84761d32242942741833c5df6f1602d0..a952fabb874941e8a28c786a0edb2fe5e59dd841 100644 GIT binary patch delta 1177 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 diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index ca6ebce0bd..6f918c4c95 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -1004,6 +1004,11 @@ public class Fx{ Fill.circle(e.x, e.y, e.rotation * e.fout()); }).layer(Layer.bullet - 0.001f), //below bullets + missileTrailShort = new Effect(22, e -> { + color(e.color); + Fill.circle(e.x, e.y, e.rotation * e.fout()); + }).layer(Layer.bullet - 0.001f), + absorb = new Effect(12, e -> { color(Pal.accent); stroke(2f * e.fout()); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 04d4a21131..ad2be53ac9 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3399,6 +3399,10 @@ public class UnitTypes{ itemCapacity = 0; useEngineElevation = false; + engineColor = Pal.sapBullet; + + abilities.add(new MoveEffectAbility(0f, -7f, Pal.sapBulletBack, Fx.missileTrailShort, 4f)); + for(float f : new float[]{-3f, 3f}){ parts.add(new HoverPart(){{ x = 3.9f; @@ -3413,18 +3417,25 @@ public class UnitTypes{ } weapons.add(new Weapon("osc-weapon"){{ - y = 3f; - x = 3f; + y = -2f; + x = 4f; + top = true; mirror = true; - layerOffset = -0.0001f; reload = 40f; + baseRotation = -35f; + shootCone = 360f; + + shoot = new ShootSpread(){{ + shots = 2; + spread = 11f; + }}; bullet = new BasicBulletType(5f, 20){{ - pierceCap = 2; - pierceBuilding = false; + homingPower = 0.2f; + homingDelay = 4f; width = 7f; height = 12f; - lifetime = 25f; + lifetime = 50f; shootEffect = Fx.sparkShoot; smokeEffect = Fx.shootBigSmoke; hitColor = backColor = trailColor = Pal.suppress; @@ -3486,8 +3497,8 @@ public class UnitTypes{ obviate = new ErekirUnitType("obviate"){{ flying = true; drag = 0.08f; - speed = 1.9f; - rotateSpeed = 4f; + speed = 1.8f; + rotateSpeed = 2.5f; accel = 0.09f; health = 2300f; armor = 3f; @@ -3499,46 +3510,106 @@ public class UnitTypes{ lowAltitude = true; setEnginesMirror( - new UnitEngine(59 / 4f, -25 / 4f, 3.1f, 315f) + new UnitEngine(38 / 4f, -46 / 4f, 3.1f, 315f) ); - parts.add(new RegionPart("-heat"){{ - blending = Blending.additive; - progress = PartProgress.heat; - outline = false; - colorTo = new Color(1f, 0.5f, 0.5f, 0.7f); - color = colorTo.cpy().a(0f); - layerOffset = 0.01f; + parts.add( + new RegionPart("-blade"){{ + moveRot = -10f; + moveX = -1f; + moves.add(new PartMove(PartProgress.reload, 2f, 1f, -5f)); + progress = PartProgress.warmup; + mirror = true; + + children.add(new RegionPart("-side"){{ + moveX = 2f; + moveY = -2f; + progress = PartProgress.warmup; + under = true; + mirror = true; + moves.add(new PartMove(PartProgress.reload, -2f, 2f, 0f)); + }}); }}); - //TODO this is really dumb. weapons.add(new Weapon(){{ - y = 2f; - shootY = 0f; x = 0f; + y = -2f; + shootY = 0f; reload = 140f; mirror = false; - continuous = true; - // minWarmup = 0.5f; + minWarmup = 0.95f; + shake = 3f; + cooldownTime = reload - 10f; - bullet = new ContinuousLaserBulletType(140){{ - shake = 0f; - lifetime = 120f; - colors = new Color[]{Color.valueOf("bf92f9").a(0.4f), Color.valueOf("bf92f9"), Color.white}; - //TODO merge - chargeEffect = new MultiEffect(Fx.lancerLaserCharge, Fx.lancerLaserChargeBegin); - width = 4f; - largeHit = false; + bullet = new BasicBulletType(){{ + shoot = new ShootHelix(){{ + mag = 1f; + scl = 5f; + }}; - buildingDamageMultiplier = 0.25f; - hitEffect = Fx.hitLancer; - hitSize = 4; - drawSize = 400f; - length = 173f; - ammoMultiplier = 1f; - pierceCap = 4; - hitColor = colors[1]; + shootEffect = new MultiEffect(Fx.shootTitan, new WaveEffect(){{ + colorTo = Pal.sapBulletBack; + sizeTo = 26f; + lifetime = 14f; + strokeFrom = 4f; + }}); + smokeEffect = Fx.shootSmokeTitan; + hitColor = Pal.sapBullet; + + sprite = "large-orb"; + trailEffect = Fx.missileTrail; + trailInterval = 3f; + trailParam = 4f; + speed = 3f; + damage = 80f; + lifetime = 70f; + width = height = 15f; + backColor = Pal.sapBulletBack; + frontColor = Pal.sapBullet; + shrinkX = shrinkY = 0f; + trailColor = Pal.sapBulletBack; + trailLength = 12; + trailWidth = 2.2f; + despawnEffect = hitEffect = new ExplosionEffect(){{ + waveColor = Pal.sapBullet; + smokeColor = Color.gray; + sparkColor = Pal.sap; + waveStroke = 4f; + waveRad = 20f; + }}; + + intervalBullet = new LightningBulletType(){{ + damage = 15; + collidesAir = false; + ammoMultiplier = 1f; + lightningColor = Pal.sapBullet; + lightningLength = 2; + lightningLengthRand = 6; + + //for visual stats only. + buildingDamageMultiplier = 0.25f; + + lightningType = new BulletType(0.0001f, 0f){{ + lifetime = Fx.lightning.lifetime; + hitEffect = Fx.hitLancer; + despawnEffect = Fx.none; + status = StatusEffects.shocked; + statusDuration = 10f; + hittable = false; + lightColor = Color.white; + buildingDamageMultiplier = 0.25f; + }}; + }}; + + bulletInterval = 4f; + + lightningColor = Pal.sapBullet; + lightningDamage = 19; + lightning = 8; + lightningLength = 2; + lightningLengthRand = 8; }}; + }}); }}; diff --git a/core/src/mindustry/entities/abilities/MoveEffectAbility.java b/core/src/mindustry/entities/abilities/MoveEffectAbility.java new file mode 100644 index 0000000000..bbb8d36a6c --- /dev/null +++ b/core/src/mindustry/entities/abilities/MoveEffectAbility.java @@ -0,0 +1,41 @@ +package mindustry.entities.abilities; + +import arc.graphics.*; +import arc.util.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; + +public class MoveEffectAbility extends Ability{ + public float minVelocity = 0.08f; + public float interval = 3f; + public float x, y; + public boolean rotateEffect = false; + public float effectParam = 3f; + public boolean teamColor = false; + public Color color = Color.white; + public Effect effect = Fx.missileTrail; + + protected float counter; + + public MoveEffectAbility(float x, float y, Color color, Effect effect, float interval){ + this.x = x; + this.y = y; + this.color = color; + this.effect = effect; + this.interval = interval; + } + + public MoveEffectAbility(){ + } + + @Override + public void update(Unit unit){ + counter += Time.delta; + if(unit.vel.len2() >= minVelocity * minVelocity && (counter >= interval)){ + Tmp.v1.trns(unit.rotation - 90f, x, y); + counter %= interval; + effect.at(Tmp.v1.x + unit.x, Tmp.v1.y + unit.y, rotateEffect ? unit.rotation : effectParam, teamColor ? unit.team.color : color); + } + } +} diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index ee7d5e918c..9b99917b3a 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -151,7 +151,7 @@ public class BulletType extends Content implements Cloneable{ public float fragVelocityMin = 0.2f, fragVelocityMax = 1f, fragLifeMin = 1f, fragLifeMax = 1f; public @Nullable BulletType fragBullet = null; public float bulletInterval = 20f; - public int intervalBulletCount = 1; + public int intervalBullets = 1; public @Nullable BulletType intervalBullet; public Color hitColor = Color.white; public Color healColor = Pal.heal; @@ -431,7 +431,7 @@ public class BulletType extends Content implements Cloneable{ public void updateBulletInterval(Bullet b){ if(intervalBullet != null && b.timer.get(2, bulletInterval)){ - for(int i = 0; i < intervalBulletCount; i++){ + for(int i = 0; i < intervalBullets; i++){ intervalBullet.create(b, b.x, b.y, Mathf.random(360f)); } } diff --git a/core/src/mindustry/entities/pattern/ShootBarrel.java b/core/src/mindustry/entities/pattern/ShootBarrel.java index 5c564e5551..18e6610ab6 100644 --- a/core/src/mindustry/entities/pattern/ShootBarrel.java +++ b/core/src/mindustry/entities/pattern/ShootBarrel.java @@ -11,6 +11,7 @@ public class ShootBarrel extends ShootPattern{ barrels = barrels.clone(); for(int i = 0; i < barrels.length; i += 3){ barrels[i] *= -1; + barrels[i + 2] *= -1; } } diff --git a/core/src/mindustry/entities/pattern/ShootHelix.java b/core/src/mindustry/entities/pattern/ShootHelix.java index 126c90532b..88ca6d20c0 100644 --- a/core/src/mindustry/entities/pattern/ShootHelix.java +++ b/core/src/mindustry/entities/pattern/ShootHelix.java @@ -10,7 +10,7 @@ public class ShootHelix extends ShootPattern{ for(int i = 0; i < shots; i++){ for(int sign : Mathf.signs){ handler.shoot(0, 0, 0, firstShotDelay + shotDelay * i, - b -> b.moveRelative(0f, Mathf.sin(b.time + offset, 2f, mag * sign))); + b -> b.moveRelative(0f, Mathf.sin(b.time + offset, scl, mag * sign))); } } } diff --git a/core/src/mindustry/entities/pattern/ShootMulti.java b/core/src/mindustry/entities/pattern/ShootMulti.java index 0d1c3ebefa..34497957cd 100644 --- a/core/src/mindustry/entities/pattern/ShootMulti.java +++ b/core/src/mindustry/entities/pattern/ShootMulti.java @@ -29,9 +29,9 @@ public class ShootMulti extends ShootPattern{ source.shoot(totalShots, (x, y, rotation, delay, move) -> { for(var pattern : dest){ pattern.shoot(totalShots, (x2, y2, rot2, delay2, mover) -> { - handler.shoot(x + x2, y + y2, rotation + rot2, delay + delay2, b -> { - move.move(b); - mover.move(b); + handler.shoot(x + x2, y + y2, rotation + rot2, delay + delay2, move == null && mover == null ? null : b -> { + if(move != null) move.move(b); + if(mover != null) mover.move(b); }); }); } diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 3af4656afa..fc4208c003 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -353,23 +353,13 @@ public class Mods implements Loadable{ Log.debug("Total time to generate & flush textures synchronously: @", Time.elapsed()); } - private PageType getPage(AtlasRegion region){ - return - region.texture == Core.atlas.find("white").texture ? PageType.main : - region.texture == Core.atlas.find("stone1").texture ? PageType.environment : - region.texture == Core.atlas.find("clear-editor").texture ? PageType.editor : - region.texture == Core.atlas.find("whiteui").texture ? PageType.ui : - region.texture == Core.atlas.find("rubble-1-0").texture ? PageType.rubble : - PageType.main; - } - private PageType getPage(Fi file){ String path = file.path(); return - path.contains("sprites/blocks/environment") ? PageType.environment : - path.contains("sprites/editor") ? PageType.editor : - path.contains("sprites/rubble") ? PageType.editor : - path.contains("sprites/ui") ? PageType.ui : + path.contains("sprites/blocks/environment") || path.contains("sprites-override/blocks/environment") ? PageType.environment : + path.contains("sprites/editor") || path.contains("sprites-override/editor") ? PageType.editor : + path.contains("sprites/rubble") || path.contains("sprites-override/rubble") ? PageType.rubble : + path.contains("sprites/ui") || path.contains("sprites-override/ui") ? PageType.ui : PageType.main; } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index fe5cc51fbd..49be96dae7 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -212,7 +212,7 @@ public class UnitType extends UnlockableContent{ public Sound deathSound = Sounds.bang; public Seq weapons = new Seq<>(); - public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, + public TextureRegion baseRegion, legRegion, region, previewRegion, shadowRegion, cellRegion, softShadowRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion, treadRegion; public TextureRegion[] wreckRegions, segmentRegions, segmentOutlineRegions; public TextureRegion[][] treadRegions; @@ -590,6 +590,7 @@ public class UnitType extends UnlockableContent{ } weapons.each(Weapon::load); region = Core.atlas.find(name); + previewRegion = Core.atlas.find(name + "-preview", name); legRegion = Core.atlas.find(name + "-leg"); jointRegion = Core.atlas.find(name + "-joint"); baseJointRegion = Core.atlas.find(name + "-joint-base"); diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 047d348a19..9ee9cfdfed 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -41,6 +41,8 @@ public class Weapon implements Cloneable{ public boolean alternate = true; /** whether to rotate toward the target independently of unit */ public boolean rotate = false; + /** rotation at which this weapon is locked to if rotate = false. TODO buggy!*/ + public float baseRotation = 0f; /** whether to draw the outline on top. */ public boolean top = true; /** whether to hold the bullet in place while firing */ @@ -180,7 +182,7 @@ public class Weapon implements Cloneable{ float rotation = unit.rotation - 90, - weaponRotation = rotation + (rotate ? mount.rotation : 0), + weaponRotation = rotation + (rotate ? mount.rotation : baseRotation), wx = unit.x + Angles.trnsx(rotation, x, y) + Angles.trnsx(weaponRotation, 0, -mount.recoil), wy = unit.y + Angles.trnsy(rotation, x, y) + Angles.trnsy(weaponRotation, 0, -mount.recoil); @@ -263,12 +265,12 @@ public class Weapon implements Cloneable{ } } }else if(!rotate){ - mount.rotation = 0; + mount.rotation = baseRotation; mount.targetRotation = unit.angleTo(mount.aimX, mount.aimY); } float - weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : 0), + weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : baseRotation), mountX = unit.x + Angles.trnsx(unit.rotation - 90, x, y), mountY = unit.y + Angles.trnsy(unit.rotation - 90, x, y), bulletX = mountX + Angles.trnsx(weaponRotation, this.shootX, this.shootY), @@ -346,7 +348,7 @@ public class Weapon implements Cloneable{ mount.warmup >= minWarmup && //must be warmed up unit.vel.len() >= minShootVelocity && //check velocity requirements mount.reload <= 0.0001f && //reload has to be 0 - Angles.within(rotate ? mount.rotation : unit.rotation, mount.targetRotation, shootCone) //has to be within the cone + Angles.within(rotate ? mount.rotation : unit.rotation + baseRotation, mount.targetRotation, shootCone) //has to be within the cone ){ shoot(unit, mount, bulletX, bulletY, shootAngle); @@ -368,7 +370,7 @@ public class Weapon implements Cloneable{ } protected float bulletRotation(Unit unit, WeaponMount mount, float bulletX, float bulletY){ - return rotate ? unit.rotation + mount.rotation : Angles.angle(bulletX, bulletY, mount.aimX, mount.aimY) + (unit.rotation - unit.angleTo(mount.aimX, mount.aimY)); + return rotate ? unit.rotation + mount.rotation : Angles.angle(bulletX, bulletY, mount.aimX, mount.aimY) + (unit.rotation - unit.angleTo(mount.aimX, mount.aimY)) + baseRotation; } protected void shoot(Unit unit, WeaponMount mount, float shootX, float shootY, float rotation){ @@ -393,7 +395,7 @@ public class Weapon implements Cloneable{ if(!unit.isAdded()) return; float - weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : 0), + weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : baseRotation), mountX = unit.x + Angles.trnsx(unit.rotation - 90, x, y), mountY = unit.y + Angles.trnsy(unit.rotation - 90, x, y), bulletX = mountX + Angles.trnsx(weaponRotation, this.shootX + xOffset, this.shootY + yOffset), @@ -421,6 +423,7 @@ public class Weapon implements Cloneable{ public void flip(){ x *= -1; shootX *= -1; + baseRotation *= -1f; flipSprite = !flipSprite; shoot = shoot.copy(); shoot.flip(); diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 0e4032aabd..d55f4227fe 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -557,7 +557,7 @@ public class Generators{ if(sample instanceof Legsc) outliner.get(type.legRegion); if(sample instanceof Tankc) outliner.get(type.treadRegion); - Pixmap image = type.segments > 0 ? get(type.segmentRegions[0]) : outline.get(get(type.region)); + Pixmap image = type.segments > 0 ? get(type.segmentRegions[0]) : outline.get(get(type.previewRegion)); Func weaponRegion = weapon -> Core.atlas.has(weapon.name + "-preview") ? get(weapon.name + "-preview") : get(weapon.region); Cons2 drawWeapon = (weapon, pixmap) -> @@ -585,7 +585,7 @@ public class Generators{ if(type.needsBodyOutline()){ save(image, type.name + "-outline"); }else{ - replace(type.name, image); + replace(type.name, type.segments > 0 ? get(type.segmentRegions[0]) : outline.get(get(type.region))); } //draw weapons that are under the base @@ -596,13 +596,13 @@ public class Generators{ //draw over the weapons under the image if(anyUnder){ - image.draw(outline.get(get(type.region)), true); + image.draw(outline.get(get(type.previewRegion)), true); } //draw treads if(sample instanceof Tankc){ image.draw(outline.get(get(type.treadRegion)), true); - image.draw(get(type.region), true); + image.draw(get(type.previewRegion), true); } //draw mech parts @@ -610,7 +610,7 @@ public class Generators{ drawCenter(image, get(type.baseRegion)); drawCenter(image, get(type.legRegion)); drawCenter(image, get(type.legRegion).flipX()); - image.draw(get(type.region), true); + image.draw(get(type.previewRegion), true); } //draw weapon outlines on base @@ -622,7 +622,7 @@ public class Generators{ } //draw base region on top to mask weapons - if(type.drawCell) image.draw(get(type.region), true); + if(type.drawCell) image.draw(get(type.previewRegion), true); if(type.drawCell){ Pixmap baseCell = get(type.cellRegion);