Fixed campaign idle boss spoofing

This commit is contained in:
Anuken
2020-12-03 10:05:52 -05:00
parent 6686584003
commit 9fa2691b02
7 changed files with 45 additions and 24 deletions

View File

@@ -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, () -> {
});
});
});
});

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);