diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index bb17455eac..4f81328cce 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -107,6 +107,7 @@ importPackage(Packages.mindustry.maps.planet) importPackage(Packages.mindustry.net) importPackage(Packages.mindustry.service) importPackage(Packages.mindustry.type) +importPackage(Packages.mindustry.type.ammo) importPackage(Packages.mindustry.type.weapons) importPackage(Packages.mindustry.type.weather) importPackage(Packages.mindustry.ui) diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index e728149e15..32d93fe5dc 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -44,6 +44,7 @@ public class Renderer implements ApplicationListener{ public @Nullable Bloom bloom; public FrameBuffer effectBuffer = new FrameBuffer(); public boolean animateShields, drawWeather = true, drawStatus; + public float weatherAlpha; /** minZoom = zooming out, maxZoom = zooming in */ public float minZoom = 1.5f, maxZoom = 6f; public Seq envRenderers = new Seq<>(); @@ -51,9 +52,25 @@ public class Renderer implements ApplicationListener{ private @Nullable CoreBuild landCore; private Color clearColor = new Color(0f, 0f, 0f, 1f); - private float cloudSeed = 0f; - private float targetscale = Scl.scl(4), camerascale = targetscale, landscale, landTime, landPTimer, weatherAlpha, minZoomScl = Scl.scl(0.01f); - private float shakeIntensity, shaketime; + private float + //seed for cloud visuals, 0-1 + cloudSeed = 0f, + //target camera scale that is lerp-ed to + targetscale = Scl.scl(4), + //current actual camera scale + camerascale = targetscale, + //minimum camera zoom value for landing/launching; constant TODO make larger? + minZoomScl = Scl.scl(0.02f), + //starts at coreLandDuration, ends at 0. if positive, core is landing. + landTime, + //timer for core landing particles + landPTimer, + //intensity for screen shake + shakeIntensity, + //current duration of screen shake + shakeTime; + //for landTime > 0: if true, core is currently *launching*, otherwise landing. + private boolean isLaunching; private Vec2 camShakeOffset = new Vec2(); public Renderer(){ @@ -63,7 +80,7 @@ public class Renderer implements ApplicationListener{ public void shake(float intensity, float duration){ shakeIntensity = Math.max(shakeIntensity, intensity); - shaketime = Math.max(shaketime, duration); + shakeTime = Math.max(shakeTime, duration); } public void addEnvRenderer(int mask, Runnable render){ @@ -112,9 +129,13 @@ public class Renderer implements ApplicationListener{ if(!state.isPaused()){ landTime -= Time.delta; } - landscale = landInterp.apply(minZoomScl, Scl.scl(4f), 1f - landTime / coreLandDuration); - camerascale = landscale; + camerascale = landInterp.apply(minZoomScl, Scl.scl(4f), 1f - landTime / coreLandDuration); weatherAlpha = 0f; + + //snap camera to cutscene core regardless of player input + if(landCore != null){ + camera.position.set(landCore); + } }else{ weatherAlpha = Mathf.lerpDelta(weatherAlpha, 1f, 0.08f); } @@ -126,12 +147,12 @@ public class Renderer implements ApplicationListener{ landTime = 0f; graphics.clear(Color.black); }else{ - if(shaketime > 0){ + if(shakeTime > 0){ float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * 0.75f; camShakeOffset.setToRandomDirection().scl(Mathf.random(intensity)); camera.position.add(camShakeOffset); shakeIntensity -= 0.25f * Time.delta; - shaketime -= Time.delta; + shakeTime -= Time.delta; shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f); }else{ camShakeOffset.setZero(); @@ -148,16 +169,13 @@ public class Renderer implements ApplicationListener{ } } - public boolean isLanding(){ + /** @return whether a launch/land cutscene is playing. */ + public boolean isCutscene(){ return landTime > 0; } - public float weatherAlpha(){ - return weatherAlpha; - } - public float landScale(){ - return landTime > 0 ? landscale : 1f; + return landTime > 0 ? camerascale : 1f; } @Override @@ -290,7 +308,7 @@ public class Renderer implements ApplicationListener{ } private void drawBackground(){ - + //nothing to draw currently } void updateLandParticles(){ @@ -378,7 +396,7 @@ public class Renderer implements ApplicationListener{ if(state.rules.cloudColor.a > 0.0001f){ //clouds float scaling = cloudScaling; - float sscl = Math.max(1f + Mathf.clamp(fin + cfinOffset)* cfinScl, 0f) * landscale; + float sscl = Math.max(1f + Mathf.clamp(fin + cfinOffset)* cfinScl, 0f) * camerascale; Tmp.tr1.set(clouds); Tmp.tr1.set( @@ -454,11 +472,19 @@ public class Renderer implements ApplicationListener{ } public void showLanding(){ - landscale = minZoomScl; + isLaunching = false; + camerascale = minZoomScl; landTime = coreLandDuration; cloudSeed = Mathf.random(1f); } + public void showLaunch(){ + isLaunching = true; + landCore = player.team().core(); + cloudSeed = Mathf.random(1f); + //TODO other stuff. + } + public void takeMapScreenshot(){ int w = world.width() * tilesize, h = world.height() * tilesize; int memory = w * h * 4 / 1024 / 1024; diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 6506db2d34..11f37f34dc 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -204,7 +204,6 @@ public class DesktopInput extends InputHandler{ panning = false; } - //TODO awful UI state checking code if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && !scene.hasField() && !scene.hasDialog()){ if(input.keyDown(Binding.mouse_move)){ panCam = true; @@ -237,7 +236,7 @@ public class DesktopInput extends InputHandler{ } } - if(!player.dead() && !state.isPaused() && !scene.hasField()){ + if(!player.dead() && !state.isPaused() && !scene.hasField() && !renderer.isCutscene()){ updateMovement(player.unit()); if(Core.input.keyTap(Binding.respawn)){ diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index c97e92455c..7429eddaaa 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -681,7 +681,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } } - if(!player.dead() && !state.isPaused()){ + if(!player.dead() && !state.isPaused() && !renderer.isCutscene()){ updateMovement(player.unit()); } @@ -822,7 +822,7 @@ public class MobileInput extends InputHandler implements GestureListener{ shiftDeltaX %= tilesize; shiftDeltaY %= tilesize; } - }else if(!renderer.isLanding()){ + }else{ //pan player Core.camera.position.x -= deltaX; Core.camera.position.y -= deltaY; diff --git a/core/src/mindustry/mod/ClassMap.java b/core/src/mindustry/mod/ClassMap.java index 778bb894ad..9b7b017cf8 100644 --- a/core/src/mindustry/mod/ClassMap.java +++ b/core/src/mindustry/mod/ClassMap.java @@ -1,8 +1,6 @@ package mindustry.mod; import arc.struct.*; -import mindustry.type.ammo.*; - /** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */ @SuppressWarnings("deprecation") public class ClassMap{ @@ -54,8 +52,6 @@ public class ClassMap{ classes.put("Research", mindustry.game.Objectives.Research.class); classes.put("SectorComplete", mindustry.game.Objectives.SectorComplete.class); classes.put("AmmoType", mindustry.type.AmmoType.class); - classes.put("ItemAmmoType", ItemAmmoType.class); - classes.put("PowerAmmoType", PowerAmmoType.class); classes.put("Category", mindustry.type.Category.class); classes.put("ErrorContent", mindustry.type.ErrorContent.class); classes.put("Item", mindustry.type.Item.class); @@ -75,6 +71,8 @@ public class ClassMap{ classes.put("Weapon", mindustry.type.Weapon.class); classes.put("Weather", mindustry.type.Weather.class); classes.put("WeatherEntry", mindustry.type.Weather.WeatherEntry.class); + classes.put("ItemAmmoType", mindustry.type.ammo.ItemAmmoType.class); + classes.put("PowerAmmoType", mindustry.type.ammo.PowerAmmoType.class); classes.put("PointDefenseWeapon", mindustry.type.weapons.PointDefenseWeapon.class); classes.put("RepairBeamWeapon", mindustry.type.weapons.RepairBeamWeapon.class); classes.put("HealBeamMount", mindustry.type.weapons.RepairBeamWeapon.HealBeamMount.class); diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 86935bd8d1..0f62e423a4 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -342,15 +342,15 @@ public class Weather extends UnlockableContent{ @Override public void draw(){ - if(renderer.weatherAlpha() > 0.0001f && renderer.drawWeather && Core.settings.getBool("showweather")){ + if(renderer.weatherAlpha > 0.0001f && renderer.drawWeather && Core.settings.getBool("showweather")){ Draw.draw(Layer.weather, () -> { - Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + Draw.alpha(renderer.weatherAlpha * opacity * weather.opacityMultiplier); weather.drawOver(self()); Draw.reset(); }); Draw.draw(Layer.debris, () -> { - Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + Draw.alpha(renderer.weatherAlpha * opacity * weather.opacityMultiplier); weather.drawUnder(self()); Draw.reset(); }); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 229bc9aa9b..946d1effc3 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -920,8 +920,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ launching = true; zoom = 0.5f; - ui.hudfrag.showLaunchDirect(); - //TODO animation; 140 is fine + //TODO + renderer.showLaunch(); + hide(); Time.runTask(launchDuration, () -> control.playSector(from, sector)); }); } diff --git a/settings.gradle b/settings.gradle index 76eaa676a6..7a19432101 100644 --- a/settings.gradle +++ b/settings.gradle @@ -22,7 +22,11 @@ if(new File(settingsDir, 'local.properties').exists()){ if(System.getenv("JITPACK") == "true") hasSdk = false if(hasSdk){ - include 'android' + //hack: pretend the Android module doesn't exist when imported through IntelliJ + //why? because IntelliJ chokes on the new version of the Android plugin + if(!System.getProperty("jna.tmpdir")?.contains("JetBrains")){ + include 'android' + } }else{ println("No Android SDK found. Skipping Android module.") } diff --git a/tools/src/mindustry/tools/ScriptMainGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java index 14ffde2b2b..42ffc6d797 100644 --- a/tools/src/mindustry/tools/ScriptMainGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -80,6 +80,7 @@ public class ScriptMainGenerator{ "mindustry.ai.types", "mindustry.type.weather", "mindustry.type.weapons", + "mindustry.type.ammo", "mindustry.game.Objectives", "mindustry.world.blocks", "mindustry.world.draw",