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(incinerator, () -> {
|
||||
node(melter, () -> {
|
||||
node(surgeSmelter, () -> {
|
||||
node(pulverizer, () -> {
|
||||
node(incinerator, () -> {
|
||||
node(melter, () -> {
|
||||
node(surgeSmelter, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
node(separator, () -> {
|
||||
node(pulverizer, () -> {
|
||||
node(separator, () -> {
|
||||
node(disassembler, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
node(cryofluidMixer, () -> {
|
||||
node(cryofluidMixer, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -10,21 +10,22 @@ import arc.scene.style.*;
|
||||
import arc.scene.ui.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.*;
|
||||
import mindustry.audio.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.content.TechTree.*;
|
||||
import mindustry.core.GameState.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.game.Objectives.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.game.Saves.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.input.*;
|
||||
import mindustry.io.*;
|
||||
import mindustry.io.SaveIO.*;
|
||||
import mindustry.maps.*;
|
||||
import mindustry.maps.Map;
|
||||
import mindustry.maps.*;
|
||||
import mindustry.net.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
@@ -506,6 +507,13 @@ public class Control implements ApplicationListener, Loadable{
|
||||
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()){
|
||||
input.update();
|
||||
|
||||
|
||||
@@ -49,7 +49,8 @@ public class ContinuousLaserBulletType extends BulletType{
|
||||
@Override
|
||||
public float estimateDPS(){
|
||||
//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
|
||||
|
||||
@@ -40,9 +40,10 @@ public class LaserBulletType extends BulletType{
|
||||
this(1f);
|
||||
}
|
||||
|
||||
//assume it pierces at least 3 blocks
|
||||
@Override
|
||||
public float estimateDPS(){
|
||||
return super.estimateDPS() * 2f;
|
||||
return super.estimateDPS() * 3f;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -73,7 +73,7 @@ public class SectorInfo{
|
||||
public boolean shown = false;
|
||||
|
||||
/** 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. */
|
||||
public int bossWave = -1;
|
||||
|
||||
|
||||
@@ -73,6 +73,11 @@ public class SectorDamage{
|
||||
enemyHealth += info.bossHealth;
|
||||
}
|
||||
|
||||
if(i == waveBegin){
|
||||
enemyDps += info.curEnemyDps;
|
||||
enemyHealth += info.curEnemyHealth;
|
||||
}
|
||||
|
||||
//happens due to certain regressions
|
||||
if(enemyHealth < 0 || enemyDps < 0) continue;
|
||||
|
||||
@@ -293,18 +298,19 @@ public class SectorDamage{
|
||||
//skip player
|
||||
if(unit.isPlayer()) continue;
|
||||
|
||||
if(unit.team == state.rules.defaultTeam){
|
||||
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
||||
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
||||
//scale health based on armor - yes, this is inaccurate, but better than nothing
|
||||
float healthMult = 1f + Mathf.clamp(unit.armor / 20f);
|
||||
|
||||
if(unit.team == state.rules.defaultTeam){
|
||||
sumHealth += unit.health*healthMult + unit.shield;
|
||||
sumDps += unit.type.dpsEstimate;
|
||||
if(unit.abilities.find(a -> a instanceof RepairFieldAbility) instanceof RepairFieldAbility h){
|
||||
sumRps += h.amount / h.reload * 60f;
|
||||
}
|
||||
}else{
|
||||
curEnemyDps += unit.type.dpsEstimate;
|
||||
curEnemyHealth += unit.health;
|
||||
float bossMult = unit.isBoss() ? 3f : 1f;
|
||||
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 ++){
|
||||
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){
|
||||
float healthMult = 1f + Mathf.clamp(group.type.armor / 20f);
|
||||
StatusEffect effect = (group.effect == null ? StatusEffects.none : group.effect);
|
||||
@@ -369,6 +369,11 @@ public class SectorDamage{
|
||||
info.sumDps = sumDps * 1.05f;
|
||||
info.sumRps = sumRps;
|
||||
|
||||
float cmult = 1.5f;
|
||||
|
||||
info.curEnemyDps = curEnemyDps*cmult;
|
||||
info.curEnemyHealth = curEnemyHealth*cmult;
|
||||
|
||||
info.wavesSurvived = getWavesSurvived(info);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ import java.util.zip.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class LogicBlock extends Block{
|
||||
private static final int maxByteLen = 1024 * 500;
|
||||
|
||||
public int maxInstructionScale = 5;
|
||||
public int instructionsPerTick = 1;
|
||||
public float range = 8 * 10;
|
||||
@@ -137,6 +139,9 @@ public class LogicBlock extends Block{
|
||||
stream.read();
|
||||
|
||||
int bytelen = stream.readInt();
|
||||
|
||||
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||
|
||||
byte[] bytes = new byte[bytelen];
|
||||
stream.readFully(bytes);
|
||||
|
||||
@@ -197,6 +202,7 @@ public class LogicBlock extends Block{
|
||||
int version = stream.read();
|
||||
|
||||
int bytelen = stream.readInt();
|
||||
if(bytelen > maxByteLen) throw new RuntimeException("Malformed logic data! Length: " + bytelen);
|
||||
byte[] bytes = new byte[bytelen];
|
||||
stream.readFully(bytes);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user