AI tweaks / Control tweaks / Plastanium conveyor tweaks / Unit factories

This commit is contained in:
Anuken 2020-04-30 14:46:22 -04:00
parent 5887169f90
commit 2dbb099d79
22 changed files with 4261 additions and 4003 deletions

View File

@ -11,5 +11,6 @@ mindustry.entities.def.PuddleComp=7
mindustry.entities.def.TileComp=8 mindustry.entities.def.TileComp=8
mindustry.type.Weather.WeatherComp=9 mindustry.type.Weather.WeatherComp=9
phantom=10 phantom=10
titan=13
vanguard=11 vanguard=11
wraith=12 wraith=12

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -230,3 +230,5 @@
63514=block-launcher|block-block-launcher-medium 63514=block-launcher|block-block-launcher-medium
63513=plastanium-conveyor|block-plastanium-conveyor-medium 63513=plastanium-conveyor|block-plastanium-conveyor-medium
63512=crater|crater 63512=crater|crater
63511=naval-factory|block-naval-factory-medium
63510=air-factory|block-air-factory-medium

Binary file not shown.

Before

Width:  |  Height:  |  Size: 717 B

After

Width:  |  Height:  |  Size: 723 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 KiB

After

Width:  |  Height:  |  Size: 714 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 KiB

After

Width:  |  Height:  |  Size: 837 KiB

View File

@ -3,7 +3,6 @@ package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@ -33,7 +32,7 @@ public class FlyingAI extends AIController{
boolean shoot = false; boolean shoot = false;
if(target != null){ if(target != null && unit.hasWeapons()){
attack(80f); attack(80f);
shoot = unit.inRange(target); shoot = unit.inRange(target);
@ -42,9 +41,6 @@ public class FlyingAI extends AIController{
Vec2 to = Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed); Vec2 to = Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed);
unit.aim(to); unit.aim(to);
} }
}else{
target = unit.closestCore();
moveTo(Vars.state.rules.dropZoneRadius + 120f);
} }
unit.controlWeapons(shoot, shoot); unit.controlWeapons(shoot, shoot);

View File

@ -77,7 +77,7 @@ public class Blocks implements ContentList{
duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown,
//units //units
groundFactory, repairPoint, groundFactory, airFactory, navalFactory, repairPoint,
//misc experimental //misc experimental
@ -1669,14 +1669,40 @@ public class Blocks implements ContentList{
//region units //region units
//for testing only. //for testing only.
groundFactory = new UnitFactory("ground-factory"){{ groundFactory = new UnitFactory("ground-factory"){{
requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70)); requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{ plans = new UnitPlan[]{
new UnitPlan(UnitTypes.dagger, 60f, ItemStack.with(Items.silicon, 10)), new UnitPlan(UnitTypes.dagger, 200f, ItemStack.with(Items.silicon, 10)),
new UnitPlan(UnitTypes.wraith, 60f, ItemStack.with(Items.silicon, 10)), new UnitPlan(UnitTypes.titan, 400f, ItemStack.with(Items.silicon, 10)),
}; };
size = 3; size = 3;
consumes.power(1.2f); consumes.power(1.2f);
//TODO this is incorrect
consumes.items(new ItemStack(Items.silicon, 10));
}};
airFactory = new UnitFactory("air-factory"){{
requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{
new UnitPlan(UnitTypes.wraith, 200f, ItemStack.with(Items.silicon, 10)),
//new UnitPlan(UnitTypes.ghoul, 200f, ItemStack.with(Items.silicon, 10)),
};
size = 3;
consumes.power(1.2f);
//TODO
consumes.items(new ItemStack(Items.silicon, 10));
}};
navalFactory = new UnitFactory("naval-factory"){{
requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70));
plans = new UnitPlan[]{
new UnitPlan(UnitTypes.vanguard, 200f, ItemStack.with(Items.silicon, 10)),
};
size = 3;
requiresWater = true;
consumes.power(1.2f);
//TODO
consumes.items(new ItemStack(Items.silicon, 10)); consumes.items(new ItemStack(Items.silicon, 10));
}}; }};

View File

@ -10,8 +10,10 @@ public class UnitTypes implements ContentList{
//TODO reimplement - DO NOT USE //TODO reimplement - DO NOT USE
public static UnitType public static UnitType
ghoul, revenant, lich, ghoul, revenant, lich,
crawler, titan, fortress, eruptor, chaosArray, eradicator; crawler, fortress, eruptor, chaosArray, eradicator;
//TODO this is awful
public static @EntityDef({Unitc.class, Legsc.class}) UnitType titan;
public static @EntityDef({Unitc.class, Legsc.class}) UnitType dagger; public static @EntityDef({Unitc.class, Legsc.class}) UnitType dagger;
public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType vanguard; public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType vanguard;
public static @EntityDef({Unitc.class, Minerc.class}) UnitType draug; public static @EntityDef({Unitc.class, Minerc.class}) UnitType draug;
@ -42,10 +44,32 @@ public class UnitTypes implements ContentList{
}}); }});
}}; }};
titan = new UnitType("titan"){{
speed = 0.4f;
drag = 0.3f;
mass = 3.5f;
hitsize = 9f;
range = 10f;
health = 460;
immunities.add(StatusEffects.burning);
weapons.add(new Weapon("flamethrower"){{
shootSound = Sounds.flame;
shootY = 2f;
reload = 14f;
alternate = true;
recoil = 1f;
ejectEffect = Fx.none;
bullet = Bullets.basicFlame;
}});
}};
wraith = new UnitType("wraith"){{ wraith = new UnitType("wraith"){{
speed = 3f; speed = 3f;
accel = 0.08f; accel = 0.08f;
drag = 0f; drag = 0.01f;
mass = 1.5f; mass = 1.5f;
flying = true; flying = true;
health = 75; health = 75;
@ -137,8 +161,8 @@ public class UnitTypes implements ContentList{
flying = true; flying = true;
drag = 0.05f; drag = 0.05f;
mass = 2f; mass = 2f;
speed = 4f; speed = 3f;
rotateSpeed = 12f; rotateSpeed = 15f;
accel = 0.3f; accel = 0.3f;
range = 70f; range = 70f;
itemCapacity = 70; itemCapacity = 70;

View File

@ -38,6 +38,10 @@ abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitbox
lookAt(x, y); lookAt(x, y);
} }
public boolean hasWeapons(){
return type.hasWeapons();
}
@Override @Override
public float clipSize(){ public float clipSize(){
return type.region.getWidth() * 2f; return type.region.getWidth() * 2f;

View File

@ -529,6 +529,7 @@ public class DesktopInput extends InputHandler{
protected void updateMovement(Unitc unit){ protected void updateMovement(Unitc unit){
boolean omni = !(unit instanceof WaterMovec); boolean omni = !(unit instanceof WaterMovec);
boolean legs = unit.isGrounded();
float speed = unit.type().speed; float speed = unit.type().speed;
float xa = Core.input.axis(Binding.move_x); float xa = Core.input.axis(Binding.move_x);
float ya = Core.input.axis(Binding.move_y); float ya = Core.input.axis(Binding.move_y);
@ -540,14 +541,16 @@ public class DesktopInput extends InputHandler{
if(aimCursor){ if(aimCursor){
unit.lookAt(mouseAngle); unit.lookAt(mouseAngle);
}else{ }else{
if(!unit.vel().isZero(0.01f)) unit.lookAt(unit.vel().angle()); if(!unit.vel().isZero(0.01f)){
unit.lookAt(unit.vel().angle());
}
} }
if(omni){ if(omni){
unit.moveAt(movement); unit.moveAt(movement);
}else{ }else{
unit.moveAt(Tmp.v2.trns(unit.rotation(), movement.len())); unit.moveAt(Tmp.v2.trns(unit.rotation(), movement.len()));
if(!movement.isZero()){ if(!movement.isZero() && legs){
unit.vel().rotateTo(movement.angle(), unit.type().rotateSpeed * Time.delta()); unit.vel().rotateTo(movement.angle(), unit.type().rotateSpeed * Time.delta());
} }
} }

View File

@ -71,6 +71,8 @@ public class Block extends UnlockableContent{
public boolean breakable; public boolean breakable;
/** whether to add this block to brokenblocks */ /** whether to add this block to brokenblocks */
public boolean rebuildable = true; public boolean rebuildable = true;
/** whether this water can only be placed on water */
public boolean requiresWater = false;
/** whether this floor can be placed on. */ /** whether this floor can be placed on. */
public boolean placeableOn = true; public boolean placeableOn = true;
/** whether this block has insulating properties. */ /** whether this block has insulating properties. */

View File

@ -106,9 +106,13 @@ public class Build{
for(int dx = 0; dx < type.size; dx++){ for(int dx = 0; dx < type.size; dx++){
for(int dy = 0; dy < type.size; dy++){ for(int dy = 0; dy < type.size; dy++){
Tile other = world.tile(x + dx + offsetx, y + dy + offsety); Tile other = world.tile(x + dx + offsetx, y + dy + offsety);
if(other == null || (other.block() != Blocks.air && !other.block().alwaysReplace) || if(
!other.floor().placeableOn || other == null ||
(other.floor().isDeep() && !type.floating)){ (other.block() != Blocks.air && !other.block().alwaysReplace) ||
!other.floor().placeableOn ||
(other.floor().isDeep() && !type.floating && !type.requiresWater) ||
(type.requiresWater && tile.floor().liquidDrop != Liquids.water)
){
return false; return false;
} }
} }
@ -116,12 +120,13 @@ public class Build{
return true; return true;
}else{ }else{
return tile.interactable(team) return tile.interactable(team)
&& contactsGround(tile.x, tile.y, type) && contactsGround(tile.x, tile.y, type)
&& (!tile.floor().isDeep() || type.floating) && (!tile.floor().isDeep() || type.floating || type.requiresWater)
&& tile.floor().placeableOn && tile.floor().placeableOn
&& (((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.<BuildEntity>ent().cblock == type)) && (!type.requiresWater || tile.floor().liquidDrop == Liquids.water)
&& !(type == tile.block() && rotation == tile.rotation() && type.rotate)) || tile.block().alwaysReplace || tile.block() == Blocks.air) && (((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.<BuildEntity>ent().cblock == type))
&& tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile); && !(type == tile.block() && rotation == tile.rotation() && type.rotate)) || tile.block().alwaysReplace || tile.block() == Blocks.air)
&& tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile);
} }
} }

View File

@ -91,7 +91,7 @@ public class OverdriveProjector extends Block{
float realBoost = (speedBoost + phaseHeat * speedBoostPhase) * efficiency(); float realBoost = (speedBoost + phaseHeat * speedBoostPhase) * efficiency();
charge = 0f; charge = 0f;
indexer.eachBlock(this, realRange, other -> other.timeScale() < realBoost, other -> other.applyBoost(realBoost, reload + 1f)); indexer.eachBlock(this, realRange, other -> true, other -> other.applyBoost(realBoost, reload + 1f));
} }
} }

View File

@ -34,7 +34,7 @@ public class StackConveyor extends Block implements Autotiler{
update = true; update = true;
group = BlockGroup.transportation; group = BlockGroup.transportation;
hasItems = true; hasItems = true;
itemCapacity = 8; itemCapacity = 10;
conveyorPlacement = true; conveyorPlacement = true;
idleSound = Sounds.conveyor; idleSound = Sounds.conveyor;
@ -166,7 +166,7 @@ public class StackConveyor extends Block implements Autotiler{
@Override @Override
public void updateTile(){ public void updateTile(){
// reel in crater // reel in crater
if(cooldown > 0f) cooldown = Mathf.clamp(cooldown - speed, 0f, recharge); if(cooldown > 0f) cooldown = Mathf.clamp(cooldown - speed * edelta(), 0f, recharge);
if(link == -1){ if(link == -1){
return; return;
@ -207,11 +207,6 @@ public class StackConveyor extends Block implements Autotiler{
} }
} }
@Override
public int getMaximumAccepted(Item item){
return Mathf.round(super.getMaximumAccepted(item) * timeScale); // increased item capacity while boosted
}
@Override @Override
public boolean shouldIdleSound(){ public boolean shouldIdleSound(){
return false; // has no moving parts; return false; // has no moving parts;

View File

@ -23,7 +23,7 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class UnitFactory extends Block{ public class UnitFactory extends Block{
public float launchVelocity = 0f; public float launchVelocity = 5f;
public TextureRegion topRegion; public TextureRegion topRegion;
public int[] capacities; public int[] capacities;
@ -123,9 +123,11 @@ public class UnitFactory extends Block{
if(!net.client() && currentPlan != -1){ if(!net.client() && currentPlan != -1){
UnitPlan plan = plans[currentPlan]; UnitPlan plan = plans[currentPlan];
Unitc unit = plan.unit.create(team); Unitc unit = plan.unit.create(team);
unit.set(x + Mathf.range(4), y + Mathf.range(4)); unit.set(x, y );
unit.add(); unit.add();
unit.vel().y = launchVelocity; unit.rotation(90);
unit.vel().y = launchVelocity + Mathf.range(1f);
unit.vel().x = Mathf.range(1f);
Events.fire(new UnitCreateEvent(unit)); Events.fire(new UnitCreateEvent(unit));
} }
} }

View File

@ -0,0 +1,65 @@
package mindustry.world.consumers;
import arc.func.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.ArcAnnotate.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.meta.*;
//TODO
public class ConsumeItemDynamic extends Consume{
public final @NonNull Func<Tilec, ItemStack[]> items;
public ConsumeItemDynamic(Func<Tilec, ItemStack[]> items){
this.items = items;
}
@Override
public void applyItemFilter(Bits filter){
//this must be done dynamically
}
@Override
public ConsumeType type(){
return ConsumeType.item;
}
@Override
public void build(Tilec tile, Table table){
for(ItemStack stack : items.get(tile)){
table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount),
() -> tile.items() != null && tile.items().has(stack.item, stack.amount))).size(8 * 4).padRight(5);
}
}
@Override
public String getIcon(){
return "icon-item";
}
@Override
public void update(Tilec entity){
}
@Override
public void trigger(Tilec entity){
for(ItemStack stack : items.get(entity)){
entity.items().remove(stack);
}
}
@Override
public boolean valid(Tilec entity){
return entity.items() != null && entity.items().has(items.get(entity));
}
@Override
public void display(BlockStats stats){
//TODO
//stats.add(booster ? BlockStat.booster : BlockStat.input, new ItemListValue(items));
}
}

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=e8817285d699b8d4336229ded2b0079581c502bd archash=f3c9d742fecd62da79f37eb84c8351a9e0b16758