This commit is contained in:
Anuken
2022-05-09 11:45:01 -04:00
parent 900e3ec334
commit 3bbb00db9a
2 changed files with 80 additions and 67 deletions

View File

@@ -407,72 +407,79 @@ public class Control implements ApplicationListener, Loadable{
//if there is no base, simulate a new game and place the right loadout at the spawn position //if there is no base, simulate a new game and place the right loadout at the spawn position
if(state.rules.defaultTeam.cores().isEmpty() || hadNoCore){ if(state.rules.defaultTeam.cores().isEmpty() || hadNoCore){
//no spawn set -> delete the sector save if(sector.planet.clearSectorOnLose){
if(sector.info.spawnPosition == 0){ playNewSector(origin, sector, reloader);
//delete old save }else{
sector.save = null; //no spawn set -> delete the sector save
slot.delete(); if(sector.info.spawnPosition == 0){
//play again //delete old save
playSector(origin, sector, reloader); sector.save = null;
return; slot.delete();
} //play again
playSector(origin, sector, reloader);
return;
}
//set spawn for sector damage to use //set spawn for sector damage to use
Tile spawn = world.tile(sector.info.spawnPosition); Tile spawn = world.tile(sector.info.spawnPosition);
spawn.setBlock(Blocks.coreShard, state.rules.defaultTeam); spawn.setBlock(Blocks.coreShard, state.rules.defaultTeam);
//add extra damage. //add extra damage.
SectorDamage.apply(1f); SectorDamage.apply(1f);
//reset wave so things are more fair //reset wave so things are more fair
state.wave = 1; state.wave = 1;
//set up default wave time //set up default wave time
state.wavetime = state.rules.initialWaveSpacing <= 0f ? (state.rules.waveSpacing * (sector.preset == null ? 2f : sector.preset.startWaveTimeMultiplier)) : state.rules.initialWaveSpacing; state.wavetime = state.rules.initialWaveSpacing <= 0f ? (state.rules.waveSpacing * (sector.preset == null ? 2f : sector.preset.startWaveTimeMultiplier)) : state.rules.initialWaveSpacing;
//reset captured state //reset captured state
sector.info.wasCaptured = false; sector.info.wasCaptured = false;
if(state.rules.sector.planet.allowWaves){ if(state.rules.sector.planet.allowWaves){
//re-enable waves //re-enable waves
state.rules.waves = true; state.rules.waves = true;
//reset win wave?? //reset win wave??
state.rules.winWave = state.rules.attackMode ? -1 : sector.preset != null && sector.preset.captureWave > 0 ? sector.preset.captureWave : state.rules.winWave > state.wave ? state.rules.winWave : 30; state.rules.winWave = state.rules.attackMode ? -1 : sector.preset != null && sector.preset.captureWave > 0 ? sector.preset.captureWave : state.rules.winWave > state.wave ? state.rules.winWave : 30;
} }
//if there's still an enemy base left, fix it //if there's still an enemy base left, fix it
if(state.rules.attackMode){ if(state.rules.attackMode){
//replace all broken blocks //replace all broken blocks
for(var plan : state.rules.waveTeam.data().plans){ for(var plan : state.rules.waveTeam.data().plans){
Tile tile = world.tile(plan.x, plan.y); Tile tile = world.tile(plan.x, plan.y);
if(tile != null){ if(tile != null){
tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation); tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation);
if(plan.config != null && tile.build != null){ if(plan.config != null && tile.build != null){
tile.build.configureAny(plan.config); tile.build.configureAny(plan.config);
}
} }
} }
state.rules.waveTeam.data().plans.clear();
} }
state.rules.waveTeam.data().plans.clear();
//kill all units, since they should be dead anyway
Groups.unit.clear();
Groups.fire.clear();
Groups.puddle.clear();
//reset to 0, so replaced cores don't count
state.rules.defaultTeam.data().unitCap = 0;
Schematics.placeLaunchLoadout(spawn.x, spawn.y);
//set up camera/player locations
player.set(spawn.x * tilesize, spawn.y * tilesize);
camera.position.set(player);
Events.fire(new SectorLaunchEvent(sector));
Events.fire(Trigger.newGame);
state.set(State.playing);
reloader.end();
} }
}else{
//kill all units, since they should be dead anyway state.set(State.playing);
Groups.unit.clear(); reloader.end();
Groups.fire.clear();
Groups.puddle.clear();
//reset to 0, so replaced cores don't count
state.rules.defaultTeam.data().unitCap = 0;
Schematics.placeLaunchLoadout(spawn.x, spawn.y);
//set up camera/player locations
player.set(spawn.x * tilesize, spawn.y * tilesize);
camera.position.set(player);
Events.fire(new SectorLaunchEvent(sector));
Events.fire(Trigger.newGame);
} }
state.set(State.playing);
reloader.end();
}catch(SaveException e){ }catch(SaveException e){
Log.err(e); Log.err(e);
sector.save = null; sector.save = null;
@@ -482,21 +489,26 @@ public class Control implements ApplicationListener, Loadable{
} }
ui.planet.hide(); ui.planet.hide();
}else{ }else{
reloader.begin(); playNewSector(origin, sector, reloader);
world.loadSector(sector);
state.rules.sector = sector;
//assign origin when launching
sector.info.origin = origin;
sector.info.destination = origin;
logic.play();
control.saves.saveSector(sector);
Events.fire(new SectorLaunchEvent(sector));
Events.fire(Trigger.newGame);
reloader.end();
} }
}); });
} }
public void playNewSector(@Nullable Sector origin, Sector sector, WorldReloader reloader){
reloader.begin();
world.loadSector(sector);
state.rules.sector = sector;
//assign origin when launching
sector.info.origin = origin;
sector.info.destination = origin;
logic.play();
control.saves.saveSector(sector);
Events.fire(new SectorLaunchEvent(sector));
Events.fire(Trigger.newGame);
reloader.end();
state.set(State.playing);
}
public boolean isHighScore(){ public boolean isHighScore(){
return hiscore; return hiscore;
} }

View File

@@ -323,7 +323,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
} }
boolean canSelect(Sector sector){ boolean canSelect(Sector sector){
if(mode == select) return sector.hasBase(); if(mode == select) return sector.hasBase() && launchSector != null && sector.planet == launchSector.planet;
//cannot launch to existing sector w/ accelerator TODO test //cannot launch to existing sector w/ accelerator TODO test
if(mode == planetLaunch) return sector.id == sector.planet.startSector; if(mode == planetLaunch) return sector.id == sector.planet.startSector;
if(sector.hasBase() || sector.id == sector.planet.startSector) return true; if(sector.hasBase() || sector.id == sector.planet.startSector) return true;
@@ -489,6 +489,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
boolean selectable(Planet planet){ boolean selectable(Planet planet){
//TODO what if any sector is selectable? //TODO what if any sector is selectable?
//TODO launch criteria - which planets can be launched to? Where should this be defined? Should planets even be selectable? //TODO launch criteria - which planets can be launched to? Where should this be defined? Should planets even be selectable?
if(mode == select) return planet == state.planet;
if(mode == planetLaunch) return launchSector != null && planet != launchSector.planet && launchSector.planet.launchCandidates.contains(planet); if(mode == planetLaunch) return launchSector != null && planet != launchSector.planet && launchSector.planet.launchCandidates.contains(planet);
return (planet.alwaysUnlocked && planet.isLandable()) || planet.sectors.contains(Sector::hasBase) || debugSelect; return (planet.alwaysUnlocked && planet.isLandable()) || planet.sectors.contains(Sector::hasBase) || debugSelect;
} }