All hail the cuteness of this crater roomba critter

This commit is contained in:
Patrick 'Quezler' Mounier 2019-12-27 20:45:27 +01:00
parent 8ac0949ddf
commit e0cfbc7609
No known key found for this signature in database
GPG Key ID: 0D6CA7326C76D8EA
22 changed files with 4216 additions and 3819 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -923,6 +923,8 @@ block.conveyor.name = Conveyor
block.titanium-conveyor.name = Titanium Conveyor
block.armored-conveyor.name = Armored Conveyor
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts.
block.compressed-conveyor.name = Compressed Conveyor
block.compressed-conveyor.description = Employs craters to move items around,\ninput items at the start,\nextract at the end.
block.junction.name = Junction
block.router.name = Router
block.distributor.name = Distributor
@ -1037,6 +1039,7 @@ unit.spirit.name = Spirit Repair Drone
unit.draug.name = Draug Miner Drone
unit.phantom.name = Phantom Builder Drone
unit.dagger.name = Dagger
unit.crater.name = Crater
unit.crawler.name = Crawler
unit.titan.name = Titan
unit.ghoul.name = Ghoul Bomber
@ -1102,6 +1105,7 @@ unit.draug.description = A primitive mining drone. Cheap to produce. Expendable.
unit.spirit.description = A modified draug drone, designed for repair instead of mining. Automatically fixes any damaged blocks in the area.
unit.phantom.description = An advanced drone unit. Follows users. Assists in block construction.
unit.dagger.description = The most basic ground mech. Cheap to produce. Overwhelming when used in swarms.
unit.crater.description = Logistic roomba, inhabits compressed conveyors to move items around.
unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies.
unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers.
unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 B

After

Width:  |  Height:  |  Size: 751 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 957 KiB

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 KiB

After

Width:  |  Height:  |  Size: 333 KiB

View File

@ -57,7 +57,7 @@ public class Blocks implements ContentList{
scrapWall, scrapWallLarge, scrapWallHuge, scrapWallGigantic, thruster, //ok, these names are getting ridiculous, but at least I don't have humongous walls yet
//transport
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, massDriver,
conveyor, titaniumConveyor, armoredConveyor, compressedConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, massDriver,
//liquids
mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit,
@ -897,6 +897,12 @@ public class Blocks implements ContentList{
speed = 0.08f;
}};
compressedConveyor = new CompressedConveyor("compressed-conveyor"){{
requirements(Category.distribution, ItemStack.with(Items.plastanium, 1, Items.surgealloy, 1, Items.phasefabric, 1));
health = 150;
speed = 0f;
}};
junction = new Junction("junction"){{
requirements(Category.distribution, ItemStack.with(Items.copper, 1), true);
speed = 26;

View File

@ -11,12 +11,30 @@ import mindustry.type.*;
public class UnitTypes implements ContentList{
public static UnitType
draug, spirit, phantom,
crater, draug, spirit, phantom,
wraith, ghoul, revenant, lich, reaper,
dagger, crawler, titan, fortress, eruptor, chaosArray, eradicator;
@Override
public void load(){
crater = new UnitType("crater", CraterUnit::new){{
maxVelocity = 0.75f;
speed = 0.1f;
drag = 0.25f;
hitsize = 4f;
mass = 0.5f;
health = 50;
rotatespeed = 0.1f;
itemCapacity = 10;
weapon = new Weapon(){{
length = 1.5f;
reload = 28f;
alternate = true;
ejectEffect = Fx.shellEjectSmall;
bullet = Bullets.standardCopper;
}};
}};
draug = new UnitType("draug", MinerDrone::new){{
flying = true;
drag = 0.01f;

View File

@ -0,0 +1,122 @@
package mindustry.entities.type.base;
import arc.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.scene.ui.layout.*;
import arc.util.*;
import mindustry.content.*;
import mindustry.entities.*;
import mindustry.entities.Effects.*;
import mindustry.entities.units.*;
import mindustry.game.EventType.*;
import mindustry.graphics.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.distribution.*;
import static mindustry.Vars.*;
public class CraterUnit extends GroundUnit{
public final Effect io = Fx.plasticburn;
public int inactivity = 0;
public final UnitState
load = new UnitState(){
public void update(){
if(item().amount >= getItemCapacity() || !velocity.isZero(1f) || inactivity++ > 120) state.set(move);
}
},
move = new UnitState(){
public void update(){
velocity.add(vec.trnsExact(angleTo(on().front()), type.speed * Time.delta()));
rotation = Mathf.slerpDelta(rotation, baseRotation, type.rotatespeed);
if(dst(on()) < 2.5f && on().block() instanceof CompressedConveyor && ((CompressedConveyor) on().block()).end(on())){
state.set(unload);
}
}
},
unload = new UnitState(){
public void update(){
if(on().block() instanceof CompressedConveyor && !((CompressedConveyor)on().block()).end(on())){
state.set(move);
return;
}
if(item().amount-- > 0){
int rot = on().rotation();
on().block().offloadNear(on(), item().item);
on().rotation(rot);
}
}
};
@Override
public UnitState getStartState(){
return load;
}
@Override
public void drawStats(){
if(item.amount > 0) drawBackItems();
drawLight();
}
@Override
public void update(){
super.update();
if(on() == null || !on().block().compressable || item.amount == 0){
Effects.effect(io, x, y);
kill();
}
}
@Override
public void added(){
super.added();
Effects.effect(io, x, y);
baseRotation = rotation;
}
@Override
public void onDeath(){
Events.fire(new UnitDestroyEvent(this));
}
@Override
public boolean isCommanded(){
return false;
}
public Tile on(){
return world.ltileWorld(x, y);
}
private void drawBackItems(){
float itemtime = 0.5f;
float backTrns = 0f;
float size = itemSize / 1.5f;
Draw.rect(item.item.icon(Cicon.medium),
x + Angles.trnsx(rotation + 180f, backTrns),
y + Angles.trnsy(rotation + 180f, backTrns),
size, size, rotation);
Fonts.outline.draw(item.amount + "",
x + Angles.trnsx(rotation + 180f, backTrns),
y + Angles.trnsy(rotation + 180f, backTrns) - 1,
Pal.accent, 0.25f * itemtime / Scl.scl(1f), false, Align.center);
Draw.reset();
}
public boolean loading(){
return state.is(load);
}
}

View File

@ -99,6 +99,8 @@ public class Block extends BlockStorage{
public boolean sync;
/** Whether this block uses conveyor-type placement mode.*/
public boolean conveyorPlacement;
/** Whether this block uses is compatible with compressed.*/
public boolean compressable;
/**
* The color of this block when displayed on the minimap or map preview.
* Do not set manually! This is overriden when loading for most blocks.

View File

@ -0,0 +1,119 @@
package mindustry.world.blocks.distribution;
import arc.*;
import arc.graphics.g2d.*;
import mindustry.content.*;
import mindustry.entities.type.*;
import mindustry.entities.type.base.*;
import mindustry.game.EventType.*;
import mindustry.type.*;
import mindustry.world.*;
public class CompressedConveyor extends ArmoredConveyor{
protected TextureRegion start;
public TextureRegion end;
protected static int cooldown = 10;
public CompressedConveyor(String name){
super(name);
compressable = true;
entityType = CompressedConveyorEntity::new;
}
@Override
public void load(){
int i;
for(i = 0; i < regions.length; i++){
for(int j = 0; j < 4; j++){
regions[i][j] = Core.atlas.find(name + "-" + i + "-" + 0);
}
}
start = Core.atlas.find(name + "-5-0");
end = Core.atlas.find(name + "-6-0");
}
@Override
public void draw(Tile tile){
super.draw(tile);
if(start(tile) && end(tile)) return;
if(start(tile)) Draw.rect(start, tile.drawx(), tile.drawy(), tile.rotation() * 90);
if( end(tile)) Draw.rect( end, tile.drawx(), tile.drawy(), tile.rotation() * 90);
}
protected boolean start(Tile tile){
Tile[] inputs = new Tile[]{tile.back(), tile.left(), tile.right()};
for(Tile input : inputs){
if(input != null && input.getTeam() == tile.getTeam() && input.block().compressable && input.front() == tile) return false;
}
return true;
}
public boolean end(Tile tile){
Tile next = tile.front();
if(next == null) return true;
if(next.getTeam() != tile.getTeam()) return true;
return !next.block().compressable;
}
@Override
public void unitOn(Tile tile, Unit unit){
CompressedConveyorEntity entity = tile.ent();
entity.reload = cooldown;
if(unit instanceof CraterUnit) entity.crater = (CraterUnit)unit;
}
@Override
public void update(Tile tile){
CompressedConveyorEntity entity = tile.ent();
if(entity.reload > 0) entity.reload--;
}
class CompressedConveyorEntity extends ConveyorEntity{
public int reload = 0;
public CraterUnit crater = null;
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
CompressedConveyorEntity entity = tile.ent();
if(!start(tile)) return false;
if(entity.crater == null || entity.crater.dead || !entity.crater.loading() || entity.crater.on() != tile){
if(entity.reload > 0) return false;
entity.reload = cooldown;
entity.crater = (CraterUnit)UnitTypes.crater.create(tile.getTeam());
entity.crater.set(tile.drawx(), tile.drawy());
entity.crater.rotation = tile.rotation() * 90;
entity.crater.add();
Events.fire(new UnitCreateEvent(entity.crater));
}
if(entity.crater.item().amount > 0 && entity.crater.item().item != item) return false;
if(entity.crater.item().amount >= entity.crater.getItemCapacity()) return false;
return true;
}
@Override
public void handleItem(Item item, Tile tile, Tile source){
CompressedConveyorEntity entity = tile.ent();
entity.crater.item().item = item;
entity.crater.item().amount++;
entity.crater.inactivity = 0;
}
@Override
public int acceptStack(Item item, int amount, Tile tile, Unit source){
return 0;
}
@Override
public void handleStack(Item item, int amount, Tile tile, Unit source){
//
}
}

View File

@ -30,7 +30,7 @@ public class Conveyor extends Block implements Autotiler{
private static ItemPos pos2 = new ItemPos();
private final Vec2 tr1 = new Vec2();
private final Vec2 tr2 = new Vec2();
private TextureRegion[][] regions = new TextureRegion[7][4];
protected TextureRegion[][] regions = new TextureRegion[7][4];
public float speed = 0f;