diff --git a/assets/bundles/bundle.properties b/assets/bundles/bundle.properties index c1023ea..261eadf 100644 --- a/assets/bundles/bundle.properties +++ b/assets/bundles/bundle.properties @@ -33,7 +33,7 @@ block.sw-nickel-forge.name = Nickel Forge block.sw-nickel-forge.description = A crafter able to create Nickel where it is less abundant. block.sw-batch-press.name = Batch Press block.sw-batch-press.description = An advanced form of a multi press, consumes materials slowly for a big batch of graphite. -block.sw-batch-press.details = Behold! The amazing batch furn- i mean press! +block.sw-batch-press.details = Behold! The amazing batch furn- I mean press! block.sw-stirling-generator.name = Stirling Generator block.sw-stirling-generator.description = An efficient steam generator that doesn't boil water directly. @@ -74,6 +74,13 @@ unit.sw-retreat.description = A unit with short range artillery, is invisible to unit.sw-evade.name = Evade unit.sw-evade.description = A moderately sized submarine that has a torpedo launcher and short range fuse-like mounts. +unit.sw-sentry.name = Sentry +unit.sw-sentry.description = A small Tank with a fuse like shot and an energy ball afterwards. +unit.sw-tower.name = Tower +unit.sw-tower.description = A tank with a laser-shotgun mix in a weapon. +unit.sw-castle.name = Castle +unit.sw-castle.description = An armoured tank with an electrified laser beam. + unit.sw-bakler.name = Bakler unit.sw-bakler.description = A small Silicon crucible inside a unit. diff --git a/assets/sprites/units/tank/castle-cell.png b/assets/sprites/units/tank/castle-cell.png new file mode 100644 index 0000000..fd5c193 Binary files /dev/null and b/assets/sprites/units/tank/castle-cell.png differ diff --git a/assets/sprites/units/tank/castle-full.png b/assets/sprites/units/tank/castle-full.png new file mode 100644 index 0000000..295209f Binary files /dev/null and b/assets/sprites/units/tank/castle-full.png differ diff --git a/assets/sprites/units/tank/castle-treads.png b/assets/sprites/units/tank/castle-treads.png new file mode 100644 index 0000000..25fd071 Binary files /dev/null and b/assets/sprites/units/tank/castle-treads.png differ diff --git a/assets/sprites/units/tank/castle.png b/assets/sprites/units/tank/castle.png new file mode 100644 index 0000000..02a64dd Binary files /dev/null and b/assets/sprites/units/tank/castle.png differ diff --git a/assets/sprites/units/weapons/castle-gun.png b/assets/sprites/units/weapons/castle-gun.png new file mode 100644 index 0000000..89e7377 Binary files /dev/null and b/assets/sprites/units/weapons/castle-gun.png differ diff --git a/src/sw/content/SWTechTree.java b/src/sw/content/SWTechTree.java index e576f7d..503beae 100644 --- a/src/sw/content/SWTechTree.java +++ b/src/sw/content/SWTechTree.java @@ -34,7 +34,7 @@ public static void load() { // crafting node(nickelForge, () -> { node(rebuilder, () -> node(burner)); - node(boiler, with(new Research(burner)), () -> node(thermalBoiler)); + node(boiler, with(new Research(burner), new SectorComplete(SectorPresets.extractionOutpost)), () -> node(thermalBoiler)); nodeObj(batchPress, with(new Research(Blocks.multiPress))); }); @@ -63,6 +63,11 @@ public static void load() { }); node(crafterFactory, with(new Research(Blocks.siliconCrucible)), () -> node(bakler)); node(swarm, with(new Produce(compound), new Research(Blocks.airFactory)), () -> { + node(sentry, () -> { + node(tower, with(new Research(Blocks.additiveReconstructor)), () -> { + nodeObj(castle, with(new Research(Blocks.multiplicativeReconstructor))); + }); + }); node(ambush, with(new Research(Blocks.additiveReconstructor)), () -> { nodeObj(trap, with(new Research(Blocks.multiplicativeReconstructor))); }); diff --git a/src/sw/content/SWUnitTypes.java b/src/sw/content/SWUnitTypes.java index abc8007..e767e1c 100644 --- a/src/sw/content/SWUnitTypes.java +++ b/src/sw/content/SWUnitTypes.java @@ -251,7 +251,7 @@ public static void load() { range = maxRange = 160f; hitSize = 8f; rotateSpeed = 4; - outlines = false; + outlines = faceTarget = false; treadRects = new Rect[]{new Rect(11f - 32f, 8f - 32f, 14, 53)}; ammoType = new ItemAmmoType(Items.copper); constructor = TankUnit::create; @@ -261,7 +261,9 @@ public static void load() { y = 0.25f; reload = 120f; recoil = 0f; + range = 160f; rotate = true; + rotateSpeed = 7f; mirror = false; shootY = 4; shootSound = Sounds.pulseBlast; @@ -274,7 +276,8 @@ public static void load() { new ShrapnelBulletType() {{ damage = 36; length = 160f; - toColor = Pal.accent; + fromColor = Pal.accent; + toColor = Color.gray; }}, new BasicBulletType(2f, 0, "circle-bullet") {{ lifetime = 80f; @@ -283,7 +286,7 @@ public static void load() { intervalBullets = 10; intervalBullet = new LightningBulletType() {{ damage = 1; - lightningColor = this.hitColor = Pal.accent; + lightningColor = hitColor = Pal.accent; lightningLength = 5; lightningLengthRand = 3; lightningType = new BulletType(1.0E-4f, 0.0f) {{ @@ -303,8 +306,7 @@ public static void load() { range = maxRange = 160f; hitSize = 10f; rotateSpeed = 3; - outlineColor = Pal.darkerMetal; - outlines = false; + outlines = faceTarget = false; treadRects = new Rect[]{new Rect(-25, -36, 13, 71)}; ammoType = new ItemAmmoType(Items.copper); constructor = TankUnit::create; @@ -313,10 +315,13 @@ public static void load() { x = 0f; y = 0.5f; reload = 60f; + range = 160f; mirror = false; rotate = true; + rotateSpeed = 5f; shootSound = Sounds.shootAltLong; bullet = new MultiBulletType() {{ + range = 160f; shake = 3f; shootEffect = Fx.shootBigColor; smokeEffect = Fx.shootSmokeSquareSparse; @@ -338,7 +343,59 @@ public static void load() { new LaserBulletType(30) {{ length = 160; width = 7.5f; - colors = new Color[]{Pal.accent, Color.white, Color.white}; + colors = new Color[]{Pal.accent, Pal.accent, Color.white}; + }} + ); + }}; + }}); + }}; + castle = new TankUnitType("castle") {{ + health = 1400; + speed = 0.7f; + range = maxRange = 220f; + hitSize = 14f; + rotateSpeed = 2.5f; + outlines = false; + treadFrames = 20; + treadRects = new Rect[]{new Rect(-8f, -49, 16, 95), new Rect(-34, -40, 13, 88)}; + ammoType = new ItemAmmoType(Items.copper); + constructor = TankUnit::create; + + weapons.add(new Weapon("sw-castle-gun") {{ + x = y = 0f; + reload = 120f; + range = 220f; + shake = 5f; + shootY = 8f; + mirror = false; + rotate = true; + rotateSpeed = 3f; + shootSound = Sounds.pulseBlast; + bullet = new MultiBulletType() {{ + range = 220f; + shootEffect = smokeEffect = Fx.sparkShoot; + bullets.add( + new BulletType(10f, 0) {{ + lifetime = 22f; + bulletInterval = 1; + intervalBullets = 10; + hitEffect = despawnEffect = Fx.none; + intervalBullet = new LightningBulletType() {{ + damage = 5; + lightningColor = hitColor = Pal.accent; + lightningLength = 5; + lightningLengthRand = 3; + lightningType = new BulletType(1.0E-4f, 0.0f) {{ + lifetime = Fx.lightning.lifetime; + despawnEffect = Fx.none; + hittable = false; + }}; + }}; + }}, + new LaserBulletType(300) {{ + length = 220f; + lifetime = 22f; + colors = new Color[]{Pal.accent, Pal.accent, Color.white}; }} ); }}; @@ -368,8 +425,17 @@ public static void load() { constructor = CrafterUnit::new; }}; + ((UnitFactory) Blocks.groundFactory).plans.add(new UnitPlan(sentry, 60f * 40f, with(SWItems.compound, 16, Items.silicon, 7, Items.titanium, 7))); ((UnitFactory) Blocks.airFactory).plans.add(new UnitPlan(swarm, 60f * 10f, with(SWItems.compound, 12, Items.silicon, 7))); - ((Reconstructor) Blocks.additiveReconstructor).upgrades.add(new UnitType[]{swarm, ambush}, new UnitType[]{recluse, retreat}); - ((Reconstructor) Blocks.multiplicativeReconstructor).upgrades.add(new UnitType[]{ambush, trap}, new UnitType[]{retreat, evade}); + ((Reconstructor) Blocks.additiveReconstructor).upgrades.addAll( + new UnitType[]{swarm, ambush}, + new UnitType[]{recluse, retreat}, + new UnitType[]{sentry, tower} + ); + ((Reconstructor) Blocks.multiplicativeReconstructor).upgrades.addAll( + new UnitType[]{ambush, trap}, + new UnitType[]{retreat, evade}, + new UnitType[]{tower, castle} + ); } }