Unit naming / Fixed #2209

This commit is contained in:
Anuken
2020-07-04 23:53:22 -04:00
parent 685275237a
commit add0d0cd86
29 changed files with 840 additions and 710 deletions

View File

@@ -5,6 +5,7 @@ block=1
cix=2 cix=2
draug=3 draug=3
mace=4 mace=4
mega=28
mindustry.entities.comp.BuildingComp=22 mindustry.entities.comp.BuildingComp=22
mindustry.entities.comp.Buildingomp=11 mindustry.entities.comp.Buildingomp=11
mindustry.entities.comp.BulletComp=24 mindustry.entities.comp.BulletComp=24
@@ -21,8 +22,13 @@ mindustry.type.Weather.WeatherComp=12
mindustry.type.Weather.WeatherStateComp=26 mindustry.type.Weather.WeatherStateComp=26
mindustry.world.blocks.campaign.CoreLauncher.LaunchCoreComp=13 mindustry.world.blocks.campaign.CoreLauncher.LaunchCoreComp=13
mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=14 mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=14
mono=29
nova=30
oculon=15 oculon=15
phantom=16 phantom=16
poly=31
quasar=32
risse=33
spirit=27 spirit=27
tau=17 tau=17
trident=18 trident=18

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

View File

Before

Width:  |  Height:  |  Size: 356 B

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 332 B

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 280 B

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 901 B

View File

Before

Width:  |  Height:  |  Size: 312 B

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 926 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 849 KiB

After

Width:  |  Height:  |  Size: 849 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 184 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -33,7 +33,7 @@ public class BlockIndexer{
/** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */ /** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */
private GridBits[] structQuadrants; private GridBits[] structQuadrants;
/** Stores all damaged tile entities by team. */ /** Stores all damaged tile entities by team. */
private TileArray[] damagedTiles = new TileArray[Team.all.length]; private BuildingArray[] damagedTiles = new BuildingArray[Team.all.length];
/** All ores available on this map. */ /** All ores available on this map. */
private ObjectSet<Item> allOres = new ObjectSet<>(); private ObjectSet<Item> allOres = new ObjectSet<>();
/** Stores teams that are present here as tiles. */ /** Stores teams that are present here as tiles. */
@@ -48,6 +48,8 @@ public class BlockIndexer{
private TileArray emptySet = new TileArray(); private TileArray emptySet = new TileArray();
/** Array used for returning and reusing. */ /** Array used for returning and reusing. */
private Seq<Tile> returnArray = new Seq<>(); private Seq<Tile> returnArray = new Seq<>();
/** Array used for returning and reusing. */
private Seq<Building> breturnArray = new Seq<>();
public BlockIndexer(){ public BlockIndexer(){
Events.on(BuildinghangeEvent.class, event -> { Events.on(BuildinghangeEvent.class, event -> {
@@ -68,7 +70,7 @@ public class BlockIndexer{
Events.on(WorldLoadEvent.class, event -> { Events.on(WorldLoadEvent.class, event -> {
scanOres.clear(); scanOres.clear();
scanOres.addAll(Item.getAllOres()); scanOres.addAll(Item.getAllOres());
damagedTiles = new TileArray[Team.all.length]; damagedTiles = new BuildingArray[Team.all.length];
flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
unitCaps = new int[Team.all.length]; unitCaps = new int[Team.all.length];
@@ -136,21 +138,21 @@ public class BlockIndexer{
} }
/** Returns all damaged tiles by team. */ /** Returns all damaged tiles by team. */
public TileArray getDamaged(Team team){ public BuildingArray getDamaged(Team team){
returnArray.clear(); returnArray.clear();
if(damagedTiles[team.id] == null){ if(damagedTiles[team.id] == null){
damagedTiles[team.id] = new TileArray(); damagedTiles[team.id] = new BuildingArray();
} }
TileArray set = damagedTiles[team.id]; BuildingArray set = damagedTiles[team.id];
for(Tile tile : set){ for(Building build : set){
if((tile.build == null || tile.build.team() != team || !tile.build.damaged()) || tile.block() instanceof BuildBlock){ if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof BuildBlock){
returnArray.add(tile); breturnArray.add(build);
} }
} }
for(Tile tile : returnArray){ for(Building tile : breturnArray){
set.remove(tile); set.remove(tile);
} }
@@ -211,11 +213,10 @@ public class BlockIndexer{
public void notifyTileDamaged(Building entity){ public void notifyTileDamaged(Building entity){
if(damagedTiles[entity.team().id] == null){ if(damagedTiles[entity.team().id] == null){
damagedTiles[entity.team().id] = new TileArray(); damagedTiles[entity.team().id] = new BuildingArray();
} }
TileArray set = damagedTiles[entity.team().id]; damagedTiles[entity.team().id].add(entity);
set.add(entity.tile());
} }
public Building findEnemyTile(Team team, float x, float y, float range, Boolf<Building> pred){ public Building findEnemyTile(Team team, float x, float y, float range, Boolf<Building> pred){
@@ -471,4 +472,35 @@ public class BlockIndexer{
return tiles.iterator(); return tiles.iterator();
} }
} }
//TODO copy-pasted code, generics would be nice here
public static class BuildingArray implements Iterable<Building>{
private Seq<Building> tiles = new Seq<>(false, 16);
private IntSet contained = new IntSet();
public void add(Building tile){
if(contained.add(tile.pos())){
tiles.add(tile);
}
}
public void remove(Building tile){
if(contained.remove(tile.pos())){
tiles.remove(tile);
}
}
public int size(){
return tiles.size;
}
public Building first(){
return tiles.first();
}
@Override
public Iterator<Building> iterator(){
return tiles.iterator();
}
}
} }

View File

@@ -1268,6 +1268,7 @@ public class Blocks implements ContentList{
requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 1000, Items.lead, 1000)); requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 1000, Items.lead, 1000));
alwaysUnlocked = true; alwaysUnlocked = true;
unitType = UnitTypes.alpha;
health = 1100; health = 1100;
itemCapacity = 4000; itemCapacity = 4000;
size = 3; size = 3;
@@ -1276,6 +1277,7 @@ public class Blocks implements ContentList{
coreFoundation = new CoreBlock("core-foundation"){{ coreFoundation = new CoreBlock("core-foundation"){{
requirements(Category.effect, with(Items.copper, 3000, Items.lead, 3000, Items.silicon, 2000)); requirements(Category.effect, with(Items.copper, 3000, Items.lead, 3000, Items.silicon, 2000));
unitType = UnitTypes.beta;
health = 2000; health = 2000;
itemCapacity = 9000; itemCapacity = 9000;
size = 4; size = 4;
@@ -1284,6 +1286,7 @@ public class Blocks implements ContentList{
coreNucleus = new CoreBlock("core-nucleus"){{ coreNucleus = new CoreBlock("core-nucleus"){{
requirements(Category.effect, with(Items.copper, 1000, Items.lead, 1000)); requirements(Category.effect, with(Items.copper, 1000, Items.lead, 1000));
unitType = UnitTypes.gamma;
health = 4000; health = 4000;
itemCapacity = 13000; itemCapacity = 13000;
size = 5; size = 5;
@@ -1678,7 +1681,7 @@ public class Blocks implements ContentList{
plans = new UnitPlan[]{ plans = new UnitPlan[]{
new UnitPlan(UnitTypes.dagger, 200f, with(Items.silicon, 10, Items.lead, 10)), new UnitPlan(UnitTypes.dagger, 200f, with(Items.silicon, 10, Items.lead, 10)),
new UnitPlan(UnitTypes.crawler, 200f, with(Items.silicon, 10, Items.blastCompound, 5)), new UnitPlan(UnitTypes.crawler, 200f, with(Items.silicon, 10, Items.blastCompound, 5)),
new UnitPlan(UnitTypes.tau, 200f, with(Items.silicon, 20, Items.lead, 10)), new UnitPlan(UnitTypes.nova, 200f, with(Items.silicon, 20, Items.lead, 10)),
}; };
size = 3; size = 3;
consumes.power(1.2f); consumes.power(1.2f);
@@ -1688,7 +1691,7 @@ public class Blocks implements ContentList{
requirements(Category.units, with(Items.copper, 30, Items.lead, 70)); requirements(Category.units, with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{ plans = new UnitPlan[]{
new UnitPlan(UnitTypes.wraith, 200f, with(Items.silicon, 10)), new UnitPlan(UnitTypes.wraith, 200f, with(Items.silicon, 10)),
new UnitPlan(UnitTypes.spirit, 200f, with(Items.silicon, 10)), new UnitPlan(UnitTypes.mono, 200f, with(Items.silicon, 10)),
new UnitPlan(UnitTypes.phantom, 200f, with(Items.silicon, 10)), new UnitPlan(UnitTypes.phantom, 200f, with(Items.silicon, 10)),
}; };
size = 3; size = 3;
@@ -1698,7 +1701,7 @@ public class Blocks implements ContentList{
navalFactory = new UnitFactory("naval-factory"){{ navalFactory = new UnitFactory("naval-factory"){{
requirements(Category.units, with(Items.copper, 30, Items.lead, 70)); requirements(Category.units, with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{ plans = new UnitPlan[]{
new UnitPlan(UnitTypes.vanguard, 200f, with(Items.silicon, 10)), new UnitPlan(UnitTypes.risse, 200f, with(Items.silicon, 10)),
}; };
size = 3; size = 3;
requiresWater = true; requiresWater = true;
@@ -1715,10 +1718,11 @@ public class Blocks implements ContentList{
constructTime = 60f * 5f; constructTime = 60f * 5f;
upgrades = new UnitType[][]{ upgrades = new UnitType[][]{
{UnitTypes.tau, UnitTypes.oculon}, {UnitTypes.nova, UnitTypes.quasar},
{UnitTypes.dagger, UnitTypes.mace}, {UnitTypes.dagger, UnitTypes.mace},
{UnitTypes.crawler, UnitTypes.eruptor}, {UnitTypes.crawler, UnitTypes.eruptor},
{UnitTypes.wraith, UnitTypes.ghoul}, {UnitTypes.wraith, UnitTypes.ghoul},
{UnitTypes.mono, UnitTypes.poly},
}; };
}}; }};
@@ -1734,6 +1738,7 @@ public class Blocks implements ContentList{
upgrades = new UnitType[][]{ upgrades = new UnitType[][]{
{UnitTypes.ghoul, UnitTypes.revenant}, {UnitTypes.ghoul, UnitTypes.revenant},
{UnitTypes.mace, UnitTypes.fortress}, {UnitTypes.mace, UnitTypes.fortress},
{UnitTypes.poly, UnitTypes.mega},
}; };
}}; }};

View File

@@ -16,10 +16,10 @@ public class UnitTypes implements ContentList{
public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, siegeArray, eradicator; public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, siegeArray, eradicator;
//ground + builder //ground + builder
public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType tau; public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType nova;
//ground + builder + miner + commander //ground + builder + miner + commander
public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType oculon; public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType quasar;
//legs //legs
public static @EntityDef({Unitc.class, Legsc.class}) UnitType cix, eruptor; public static @EntityDef({Unitc.class, Legsc.class}) UnitType cix, eruptor;
@@ -28,20 +28,22 @@ public class UnitTypes implements ContentList{
public static @EntityDef({Unitc.class}) UnitType wraith, reaper, ghoul, revenant, lich; public static @EntityDef({Unitc.class}) UnitType wraith, reaper, ghoul, revenant, lich;
//air + building //air + building
public static @EntityDef({Unitc.class, Builderc.class}) UnitType spirit; public static @EntityDef({Unitc.class, Builderc.class}) UnitType mono;
//air + building + mining
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType poly;
//air + building + mining + payload
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType mega;
//air + mining //air + mining
public static @EntityDef({Unitc.class, Minerc.class}) UnitType phantom; public static @EntityDef({Unitc.class, Minerc.class}) UnitType phantom;
//air + building + mining //air + building + mining
//TODO implement other starter drones
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Trailc.class}) UnitType alpha, beta, gamma; public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Trailc.class}) UnitType alpha, beta, gamma;
//air + building + mining + payload
public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType trident;
//water //water
public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType vanguard; public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risse, minke, bryde;
//special block unit type //special block unit type
public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block;
@@ -93,7 +95,7 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
tau = new UnitType("tau"){{ nova = new UnitType("nova"){{
itemCapacity = 60; itemCapacity = 60;
canBoost = true; canBoost = true;
boostMultiplier = 1.5f; boostMultiplier = 1.5f;
@@ -114,7 +116,7 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
oculon = new UnitType("oculon"){{ quasar = new UnitType("quasar"){{
mineTier = 1; mineTier = 1;
hitsize = 9f; hitsize = 9f;
boostMultiplier = 2f; boostMultiplier = 2f;
@@ -388,7 +390,7 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
vanguard = new UnitType("vanguard"){{ risse = new UnitType("risse"){{
speed = 1.3f; speed = 1.3f;
drag = 0.1f; drag = 0.1f;
hitsize = 8f; hitsize = 8f;
@@ -403,23 +405,33 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
spirit = new UnitType("spirit"){{ minke = new UnitType("minke"){{
flying = true; speed = 1.3f;
drag = 0.05f; drag = 0.1f;
accel = 0.2f; hitsize = 8f;
speed = 2f; health = 130;
range = 50f; immunities = ObjectSet.with(StatusEffects.wet);
health = 100; weapons.add(new Weapon("mount-weapon"){{
engineSize = 1.8f; reload = 10f;
engineOffset = 5.7f; x = 1.25f;
weapons.add(new Weapon(){{ rotate = true;
y = 1.5f; ejectEffect = Fx.shellEjectSmall;
reload = 40f; bullet = Bullets.standardCopper;
x = 0.5f; }});
ejectEffect = Fx.none; }};
recoil = 2f;
bullet = Bullets.healBulletBig; bryde = new UnitType("bryde"){{
shootSound = Sounds.pew; speed = 1.3f;
drag = 0.1f;
hitsize = 8f;
health = 130;
immunities = ObjectSet.with(StatusEffects.wet);
weapons.add(new Weapon("mount-weapon"){{
reload = 10f;
x = 1.25f;
rotate = true;
ejectEffect = Fx.shellEjectSmall;
bullet = Bullets.standardCopper;
}}); }});
}}; }};
@@ -458,7 +470,97 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
phantom = new UnitType("phantom"){{ beta = new UnitType("beta"){{
//TODO maybe these should be changed
defaultController = BuilderAI::new;
isCounted = false;
flying = true;
mineSpeed = 2f;
mineTier = 1;
buildSpeed = 0.5f;
drag = 0.05f;
speed = 2.4f;
rotateSpeed = 15f;
accel = 0.1f;
range = 70f;
itemCapacity = 30;
health = 80f;
engineOffset = 6f;
hitsize = 8f;
weapons.add(new Weapon("small-basic-weapon"){{
reload = 15f;
x = 2.75f;
y = 1f;
bullet = new BasicBulletType(2.5f, 9){{
width = 7f;
height = 9f;
lifetime = 60f;
shootEffect = Fx.shootSmall;
smokeEffect = Fx.shootSmallSmoke;
tileDamageMultiplier = 0.1f;
}};
}});
}};
gamma = new UnitType("gamma"){{
//TODO maybe these should be changed
defaultController = BuilderAI::new;
isCounted = false;
flying = true;
mineSpeed = 2f;
mineTier = 1;
buildSpeed = 0.5f;
drag = 0.05f;
speed = 2.4f;
rotateSpeed = 15f;
accel = 0.1f;
range = 70f;
itemCapacity = 30;
health = 80f;
engineOffset = 6f;
hitsize = 8f;
weapons.add(new Weapon("small-basic-weapon"){{
reload = 15f;
x = 2.75f;
y = 1f;
bullet = new BasicBulletType(2.5f, 9){{
width = 7f;
height = 9f;
lifetime = 60f;
shootEffect = Fx.shootSmall;
smokeEffect = Fx.shootSmallSmoke;
tileDamageMultiplier = 0.1f;
}};
}});
}};
mono = new UnitType("mono"){{
flying = true;
drag = 0.05f;
accel = 0.2f;
speed = 2f;
range = 50f;
health = 100;
engineSize = 1.8f;
engineOffset = 5.7f;
weapons.add(new Weapon(){{
y = 1.5f;
reload = 40f;
x = 0.5f;
ejectEffect = Fx.none;
recoil = 2f;
bullet = Bullets.healBulletBig;
shootSound = Sounds.pew;
}});
}};
poly = new UnitType("poly"){{
defaultController = BuilderAI::new; defaultController = BuilderAI::new;
flying = true; flying = true;
@@ -474,7 +576,7 @@ public class UnitTypes implements ContentList{
hitsize = 8f; hitsize = 8f;
}}; }};
trident = new UnitType("trident"){{ mega = new UnitType("mega"){{
health = 500; health = 500;
speed = 2f; speed = 2f;
@@ -484,7 +586,7 @@ public class UnitTypes implements ContentList{
flying = true; flying = true;
engineOffset = 10.5f; engineOffset = 10.5f;
rotateShooting = false; rotateShooting = false;
hitsize = 14f; hitsize = 15f;
engineSize = 3f; engineSize = 3f;
weapons.add( weapons.add(

View File

@@ -92,8 +92,7 @@ public class Units{
/** Returns the neareset damaged tile. */ /** Returns the neareset damaged tile. */
public static Building findDamagedTile(Team team, float x, float y){ public static Building findDamagedTile(Team team, float x, float y){
Tile tile = Geometry.findClosest(x, y, indexer.getDamaged(team)); return Geometry.findClosest(x, y, indexer.getDamaged(team));
return tile == null ? null : tile.build;
} }
/** Returns the neareset ally tile in a range. */ /** Returns the neareset ally tile in a range. */

View File

@@ -79,6 +79,7 @@ public class UnitType extends UnlockableContent{
super(name); super(name);
constructor = EntityMapping.map(name); constructor = EntityMapping.map(name);
if(constructor == null) throw new IllegalArgumentException("no unit for " + name);
} }
public UnitController createController(){ public UnitController createController(){

View File

@@ -102,8 +102,7 @@ public abstract class Turret extends Block{
stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks); stats.add(BlockStat.shootRange, range / tilesize, StatUnit.blocks);
stats.add(BlockStat.inaccuracy, (int)inaccuracy, StatUnit.degrees); stats.add(BlockStat.inaccuracy, (int)inaccuracy, StatUnit.degrees);
stats.add(BlockStat.reload, 60f / reloadTime, StatUnit.none); stats.add(BlockStat.reload, 60f / reloadTime * shots, StatUnit.none);
stats.add(BlockStat.shots, shots, StatUnit.none);
stats.add(BlockStat.targetsAir, targetAir); stats.add(BlockStat.targetsAir, targetAir);
stats.add(BlockStat.targetsGround, targetGround); stats.add(BlockStat.targetsGround, targetGround);

View File

@@ -87,7 +87,7 @@ public class Sorter extends Block{
} }
boolean isSame(Building other){ boolean isSame(Building other){
//uncomment comment below to prevent sorter/gate chaining (hacky) //uncomment code below to prevent sorter/gate chaining
return other != null && (other.block() instanceof Sorter/* || other.block() instanceof OverflowGate */); return other != null && (other.block() instanceof Sorter/* || other.block() instanceof OverflowGate */);
} }

View File

@@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=5e12ee82715df10aa81012c6b9db0865d47ceb16 archash=351143a87915cb3d0aa7840d0a8277145988edbb