Fixed campaign idle boss spoofing
This commit is contained in:
@@ -154,22 +154,22 @@ public class TechTree implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
node(kiln, Seq.with(new SectorComplete(craters)), () -> {
|
node(kiln, Seq.with(new SectorComplete(craters)), () -> {
|
||||||
node(incinerator, () -> {
|
node(pulverizer, () -> {
|
||||||
node(melter, () -> {
|
node(incinerator, () -> {
|
||||||
node(surgeSmelter, () -> {
|
node(melter, () -> {
|
||||||
|
node(surgeSmelter, () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
node(separator, () -> {
|
node(separator, () -> {
|
||||||
node(pulverizer, () -> {
|
|
||||||
node(disassembler, () -> {
|
node(disassembler, () -> {
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
node(cryofluidMixer, () -> {
|
node(cryofluidMixer, () -> {
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,21 +10,22 @@ import arc.scene.style.*;
|
|||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.audio.*;
|
import mindustry.audio.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.content.TechTree.*;
|
import mindustry.content.TechTree.*;
|
||||||
import mindustry.core.GameState.*;
|
import mindustry.core.GameState.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.game.*;
|
|
||||||
import mindustry.game.Objectives.*;
|
import mindustry.game.Objectives.*;
|
||||||
|
import mindustry.game.*;
|
||||||
import mindustry.game.Saves.*;
|
import mindustry.game.Saves.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
import mindustry.io.SaveIO.*;
|
import mindustry.io.SaveIO.*;
|
||||||
import mindustry.maps.*;
|
|
||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
|
import mindustry.maps.*;
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -506,6 +507,13 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
settings.put("fullscreen", !full);
|
settings.put("fullscreen", !full);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Float.isNaN(Vars.player.x) || Float.isNaN(Vars.player.y)){
|
||||||
|
player.set(0, 0);
|
||||||
|
if(!player.dead()) player.unit().kill();
|
||||||
|
}
|
||||||
|
if(Float.isNaN(camera.position.x)) camera.position.x = world.unitWidth()/2f;
|
||||||
|
if(Float.isNaN(camera.position.y)) camera.position.y = world.unitHeight()/2f;
|
||||||
|
|
||||||
if(state.isGame()){
|
if(state.isGame()){
|
||||||
input.update();
|
input.update();
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ public class ContinuousLaserBulletType extends BulletType{
|
|||||||
@Override
|
@Override
|
||||||
public float estimateDPS(){
|
public float estimateDPS(){
|
||||||
//assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method
|
//assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method
|
||||||
return damage * 100f / 5f;
|
//assume it pierces 3 blocks/units
|
||||||
|
return damage * 100f / 5f * 3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -40,9 +40,10 @@ public class LaserBulletType extends BulletType{
|
|||||||
this(1f);
|
this(1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//assume it pierces at least 3 blocks
|
||||||
@Override
|
@Override
|
||||||
public float estimateDPS(){
|
public float estimateDPS(){
|
||||||
return super.estimateDPS() * 2f;
|
return super.estimateDPS() * 3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class SectorInfo{
|
|||||||
public boolean shown = false;
|
public boolean shown = false;
|
||||||
|
|
||||||
/** Special variables for simulation. */
|
/** Special variables for simulation. */
|
||||||
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps;
|
public float sumHealth, sumRps, sumDps, waveHealthBase, waveHealthSlope, waveDpsBase, waveDpsSlope, bossHealth, bossDps, curEnemyHealth, curEnemyDps;
|
||||||
/** Wave where first boss shows up. */
|
/** Wave where first boss shows up. */
|
||||||
public int bossWave = -1;
|
public int bossWave = -1;
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,11 @@ public class SectorDamage{
|
|||||||
enemyHealth += info.bossHealth;
|
enemyHealth += info.bossHealth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(i == waveBegin){
|
||||||
|
enemyDps += info.curEnemyDps;
|
||||||
|
enemyHealth += info.curEnemyHealth;
|
||||||
|
}
|
||||||
|
|
||||||
//happens due to certain regressions
|
//happens due to certain regressions
|
||||||
if(enemyHealth < 0 || enemyDps < 0) continue;
|
if(enemyHealth < 0 || enemyDps < 0) continue;
|
||||||
|
|
||||||
@@ -293,18 +298,19 @@ public class SectorDamage{
|
|||||||
//skip player
|
//skip player
|
||||||
if(unit.isPlayer()) continue;
|
if(unit.isPlayer()) continue;
|
||||||
|
|
||||||
if(unit.team == state.rules.defaultTeam){
|
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
||||||
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
||||||
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
|
||||||
|
|
||||||
|
if(unit.team == state.rules.defaultTeam){
|
||||||
sumHealth += unit.health*healthMult + unit.shield;
|
sumHealth += unit.health*healthMult + unit.shield;
|
||||||
sumDps += unit.type.dpsEstimate;
|
sumDps += unit.type.dpsEstimate;
|
||||||
if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
|
if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
|
||||||
sumRps += h.amount / h.reload * 60f;
|
sumRps += h.amount / h.reload * 60f;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
curEnemyDps += unit.type.dpsEstimate;
|
float bossMult = unit.isBoss() ? 3f : 1f;
|
||||||
curEnemyHealth += unit.health;
|
curEnemyDps += unit.type.dpsEstimate * unit.damageMultiplier() * bossMult;
|
||||||
|
curEnemyHealth += unit.health * healthMult * unit.healthMultiplier() * bossMult + unit.shield;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,12 +322,6 @@ public class SectorDamage{
|
|||||||
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
for(int wave = state.wave; wave < state.wave + 10; wave ++){
|
||||||
float sumWaveDps = 0f, sumWaveHealth = 0f;
|
float sumWaveDps = 0f, sumWaveHealth = 0f;
|
||||||
|
|
||||||
//first wave has to take into account current dps
|
|
||||||
if(wave == state.wave){
|
|
||||||
sumWaveDps += curEnemyDps;
|
|
||||||
sumWaveHealth += curEnemyHealth;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(SpawnGroup group : state.rules.spawns){
|
for(SpawnGroup group : state.rules.spawns){
|
||||||
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
||||||
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
||||||
@@ -369,6 +369,11 @@ public class SectorDamage{
|
|||||||
info.sumDps = sumDps * 1.05f;
|
info.sumDps = sumDps * 1.05f;
|
||||||
info.sumRps = sumRps;
|
info.sumRps = sumRps;
|
||||||
|
|
||||||
|
float cmult = 1.5f;
|
||||||
|
|
||||||
|
info.curEnemyDps = curEnemyDps*cmult;
|
||||||
|
info.curEnemyHealth = curEnemyHealth*cmult;
|
||||||
|
|
||||||
info.wavesSurvived = getWavesSurvived(info);
|
info.wavesSurvived = getWavesSurvived(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ import java.util.zip.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class LogicBlock extends Block{
|
public class LogicBlock extends Block{
|
||||||
|
private static final int maxByteLen = 1024 * 500;
|
||||||
|
|
||||||
public int maxInstructionScale = 5;
|
public int maxInstructionScale = 5;
|
||||||
public int instructionsPerTick = 1;
|
public int instructionsPerTick = 1;
|
||||||
public float range = 8 * 10;
|
public float range = 8 * 10;
|
||||||
@@ -137,6 +139,9 @@ public class LogicBlock extends Block{
|
|||||||
stream.read();
|
stream.read();
|
||||||
|
|
||||||
int bytelen = stream.readInt();
|
int bytelen = stream.readInt();
|
||||||
|
|
||||||
|
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||||
|
|
||||||
byte[] bytes = new byte[bytelen];
|
byte[] bytes = new byte[bytelen];
|
||||||
stream.readFully(bytes);
|
stream.readFully(bytes);
|
||||||
|
|
||||||
@@ -197,6 +202,7 @@ public class LogicBlock extends Block{
|
|||||||
int version = stream.read();
|
int version = stream.read();
|
||||||
|
|
||||||
int bytelen = stream.readInt();
|
int bytelen = stream.readInt();
|
||||||
|
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||||
byte[] bytes = new byte[bytelen];
|
byte[] bytes = new byte[bytelen];
|
||||||
stream.readFully(bytes);
|
stream.readFully(bytes);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user