diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index efe2327074..e4b4e3d44f 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -160,9 +160,7 @@ public class Control implements ApplicationListener, Loadable{ //delete the save, it is gone. if(saves.getCurrent() != null && !state.rules.tutorial){ - Sector sector = state.getSector(); - sector.save = null; - saves.getCurrent().delete(); + saves.getCurrent().save(); } } }); @@ -283,18 +281,16 @@ public class Control implements ApplicationListener, Loadable{ state.rules.sector = sector; //if there is no base, simulate a new game and place the right loadout at the spawn position - //TODO this is broken? if(state.rules.defaultTeam.cores().isEmpty()){ + //reset wave so things are more fair + state.wave = 1; - //kill all friendly units, since they should be dead anwyay + //kill all units, since they should be dead anwyay for(Unit unit : Groups.unit){ - if(unit.team() == state.rules.defaultTeam){ - unit.remove(); - } + unit.remove(); } Tile spawn = world.tile(sector.getSpawnPosition()); - //TODO PLACE CORRECT LOADOUT Schematics.placeLoadout(universe.getLastLoadout(), spawn.x, spawn.y); //set up camera/player locations diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 4d95b22820..3829c98cb6 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -120,7 +120,7 @@ public class Logic implements ApplicationListener{ } //waves depend on attack status. - state.rules.waves = state.rules.sector.isUnderAttack(); + state.rules.waves = state.rules.sector.isUnderAttack() || !state.rules.sector.hasBase(); //add resources based on turns passed if(state.rules.sector.save != null && core != null){ diff --git a/core/src/mindustry/game/Objectives.java b/core/src/mindustry/game/Objectives.java index a4097c51fc..7fc844a180 100644 --- a/core/src/mindustry/game/Objectives.java +++ b/core/src/mindustry/game/Objectives.java @@ -28,7 +28,6 @@ public class Objectives{ } } - //TODO fix public static class SectorComplete extends SectorObjective{ public SectorComplete(SectorPreset zone){ @@ -39,12 +38,12 @@ public class Objectives{ @Override public boolean complete(){ - return preset.sector.save != null && preset.sector.save.meta.wave >= preset.sector.save.meta.rules.winWave; + return preset.sector.save != null && preset.sector.save.meta.wave >= preset.captureWave; } @Override public String display(){ - return Core.bundle.format("requirement.wave", preset.sector.save == null ? "" : preset.sector.save.meta.rules.winWave, preset.localizedName); + return Core.bundle.format("requirement.capture", preset.localizedName); } } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 82b53ce604..8eb9a8d2af 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -161,17 +161,14 @@ public class Universe{ //if so, just delete the save for now. it's lost. //TODO don't delete it later maybe - sector.save.delete(); - //clear recieved sector.setExtraItems(new ItemSeq()); - sector.save = null; - sector.setDamage(0f); + sector.setDamage(1.01f); }else if(attacked && wavesPassed > 0 && sector.save.meta.wave + wavesPassed >= sector.save.meta.rules.winWave && !sector.hasEnemyBase()){ //autocapture the sector sector.setUnderAttack(false); //fire the event - Events.fire(new SectorCaptureEvent(state.rules.sector)); + Events.fire(new SectorCaptureEvent(sector)); } } @@ -179,9 +176,10 @@ public class Universe{ if(sector.save != null && sector.save.meta != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.destination != null){ Sector to = sector.save.meta.secinfo.destination; if(to.save != null){ + float scl = Math.max(1f - sector.getDamage(), 0); ItemSeq items = new ItemSeq(); //calculated exported items to this sector - sector.save.meta.secinfo.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed))); + sector.save.meta.secinfo.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * scl))); to.addItems(items); } } diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index b8afb42688..fb7ee28e8f 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -360,6 +360,13 @@ public class SectorDamage{ } } + //kill every core if damage is maximum + if(damage >= 1){ + for(Building c : state.rules.defaultTeam.cores().copy()){ + c.tile.remove(); + } + } + float falloff = (damage) / (Math.max(tiles.width, tiles.height) * Mathf.sqrt2); int peak = 0; diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index f692293309..59fc6de8da 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -86,7 +86,7 @@ public class Sector{ /** @return whether the player has a base here. */ public boolean hasBase(){ - return save != null && !save.meta.tags.getBool("nocores"); + return save != null && !save.meta.tags.getBool("nocores") && getDamage() < 1f; } /** @return whether the enemy has a generated base here. */ @@ -229,9 +229,10 @@ public class Sector{ if(save != null){ long seconds = getSecondsPassed(); + float scl = Math.max(1f - getDamage(), 0); //add produced items - save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds))); + save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds * scl))); //add received items count.add(getExtraItems()); @@ -253,6 +254,8 @@ public class Sector{ /** @return sector damage from enemy, 0 to 1 */ public float getDamage(){ + //dead sector + if(save != null & save.meta.tags.getBool("nocores")) return 1.01f; return Core.settings.getFloat(key("damage"), 0f); } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index d730d455d9..44ef8eb17a 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -394,8 +394,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.table(t -> { t.left(); + float scl = Math.max(1f - sector.getDamage(), 0); + sector.save.meta.secinfo.production.each((item, stat) -> { - int total = (int)(stat.mean * 60); + int total = (int)(stat.mean * 60 * scl); if(total > 1){ t.image(item.icon(Cicon.small)).padRight(3); t.add(UI.formatAmount(total) + " " + Core.bundle.get("unit.perminute")).color(Color.lightGray); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 190c4109f2..efcc6e68bb 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -291,7 +291,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } return s + "%"; }); - graphics.sliderPref("bridgeopacity", 75, 0, 100, 5, s -> s + "%"); + graphics.sliderPref("bridgeopacity", 100, 0, 100, 5, s -> s + "%"); if(!mobile){ graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b)); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 44c39795be..d37095be54 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -71,7 +71,7 @@ public class HudFragment extends Fragment{ //TODO details and stuff Events.on(SectorCaptureEvent.class, e ->{ //TODO localize - showToast("Sector[accent] captured[]!"); + showToast("Sector [accent]" + (e.sector.isBeingPlayed() ? "" : e.sector.id + " ") + "[]captured!"); }); //TODO localize diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index bdb16eb674..e0aae707fa 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -310,23 +310,6 @@ public class CoreBlock extends StorageBlock{ } } - @Override - public void onDestroyed(){ - super.onDestroyed(); - - if(state.isCampaign() && team == state.rules.waveTeam){ - //do not recache - world.setGenerating(true); - tile.setOverlay(Blocks.spawn); - world.setGenerating(false); - - if(!spawner.getSpawns().contains(tile)){ - spawner.getSpawns().add(tile); - } - spawner.doShockwave(x, y); - } - } - @Override public void placed(){ super.placed(); diff --git a/gradle.properties b/gradle.properties index 0cde4e83bc..6015307e9d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=171cba8dda6deed931b998a0eb368d61f68ea38c +archash=7ce118ba1fcbe652dd3b225fd7d16a7a761c238e diff --git a/tests/src/test/java/power/FakeGraphics.java b/tests/src/test/java/power/FakeGraphics.java index 378f675224..5f64aa61f3 100644 --- a/tests/src/test/java/power/FakeGraphics.java +++ b/tests/src/test/java/power/FakeGraphics.java @@ -63,11 +63,6 @@ public class FakeGraphics extends Graphics{ return 0; } - @Override - public float getRawDeltaTime(){ - return 0; - } - @Override public int getFramesPerSecond(){ return 0;