1
0
mirror of https://github.com/Anuken/Mindustry.git synced 2024-09-22 22:07:31 +03:00

Flying unit factory implementation, bugfixes

This commit is contained in:
Anuken 2018-03-25 15:04:29 -04:00
parent 3418979f4d
commit 684b57d139
31 changed files with 479 additions and 345 deletions

View File

@ -25,7 +25,7 @@ allprojects {
appName = 'Mindustry'
gdxVersion = '1.9.8'
aiVersion = '1.8.1'
uCoreVersion = '64d13cc'
uCoreVersion = '238babe'
getVersionString = {
String buildVersion = getBuildVersion()

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

View File

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 195 B

View File

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 177 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

View File

@ -1,7 +1,7 @@
#Autogenerated file. Do not modify.
#Sun Mar 25 13:11:36 EDT 2018
#Sun Mar 25 15:04:04 EDT 2018
version=release
androidBuildCode=641
androidBuildCode=650
name=Mindustry
code=3.4
build=custom build

View File

@ -3,7 +3,7 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerBlock;
import io.anuke.mindustry.world.blocks.types.generation.PowerDistributor;
import io.anuke.mindustry.world.blocks.types.power.PowerDistributor;
public class DebugBlocks {
public static final Block

View File

@ -7,18 +7,18 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.defense.RepairTurret;
import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock;
import io.anuke.mindustry.world.blocks.types.distribution.Teleporter;
import io.anuke.mindustry.world.blocks.types.generation.*;
import io.anuke.mindustry.world.blocks.types.power.ItemPowerGenerator;
public class PowerBlocks {
public static final Block
coalgenerator = new ItemPowerGenerator("coalgenerator") {{
coalgenerator = new io.anuke.mindustry.world.blocks.types.power.ItemPowerGenerator("coalgenerator") {{
generateItem = Items.coal;
powerOutput = 0.04f;
powerCapacity = 40f;
}},
thermalgenerator = new LiquidPowerGenerator("thermalgenerator") {{
thermalgenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("thermalgenerator") {{
generateLiquid = Liquids.lava;
maxLiquidGenerate = 0.5f;
powerPerLiquid = 0.08f;
@ -26,7 +26,7 @@ public class PowerBlocks {
generateEffect = Fx.redgeneratespark;
}},
combustiongenerator = new LiquidPowerGenerator("combustiongenerator") {{
combustiongenerator = new io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator("combustiongenerator") {{
generateLiquid = Liquids.oil;
maxLiquidGenerate = 0.4f;
powerPerLiquid = 0.12f;
@ -40,16 +40,16 @@ public class PowerBlocks {
itemDuration = 240f;
}},
solarpanel = new SolarGenerator("solarpanel") {{
solarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("solarpanel") {{
generation = 0.003f;
}},
largesolarpanel = new SolarGenerator("largesolarpanel") {{
largesolarpanel = new io.anuke.mindustry.world.blocks.types.power.SolarGenerator("largesolarpanel") {{
size = 3;
generation = 0.012f;
}},
nuclearReactor = new NuclearReactor("nuclearreactor") {{
nuclearReactor = new io.anuke.mindustry.world.blocks.types.power.NuclearReactor("nuclearreactor") {{
size = 3;
health = 600;
breaktime *= 2.3f;
@ -74,16 +74,16 @@ public class PowerBlocks {
health = 400;
}},
battery = new PowerGenerator("battery") {{
battery = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("battery") {{
powerCapacity = 320f;
}},
batteryLarge = new PowerGenerator("batterylarge") {{
batteryLarge = new io.anuke.mindustry.world.blocks.types.power.PowerGenerator("batterylarge") {{
size = 3;
powerCapacity = 2000f;
}},
powernode = new PowerDistributor("powernode"),
powernode = new io.anuke.mindustry.world.blocks.types.power.PowerDistributor("powernode"),
teleporter = new Teleporter("teleporter");
}

View File

@ -1,6 +1,8 @@
package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.UnitTypes;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.production.UnitFactory;
@ -9,5 +11,10 @@ public class UnitBlocks {
flierFactory = new UnitFactory("flierfactory"){{
type = UnitTypes.flier;
produceTime = 400;
size = 2;
requirements = new ItemStack[]{
new ItemStack(Items.stone, 5)
};
}};
}

View File

@ -38,6 +38,8 @@ public class Units {
Unit[] result = {null};
float[] cdist = {0};
rect.setSize(range*2f).setCenter(x, y);
getNearbyEnemies(team, rect, e -> {
if (!predicate.test(e))
return;

View File

@ -12,6 +12,7 @@ import io.anuke.ucore.util.Timer;
import java.nio.ByteBuffer;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.unitGroups;
public class BaseUnit extends Unit {
@ -71,7 +72,7 @@ public class BaseUnit extends Unit {
@Override
public boolean collides(SolidEntity other){
return (other instanceof Bullet) && !(((Bullet) other).owner instanceof BaseUnit);
return other instanceof Bullet && state.teams.areEnemies((((Bullet) other).team), team);
}
@Override

View File

@ -2,27 +2,47 @@ package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.ObjectSet;
import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.graphics.Fx;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;
import static io.anuke.mindustry.Vars.state;
public class FlyingUnitType extends UnitType {
private static Vector2 vec = new Vector2();
protected float boosterLength = 4.5f;
public FlyingUnitType(String name) {
super(name);
speed = 1f;
speed = 0.2f;
maxVelocity = 4f;
drag = 0.01f;
}
@Override
public void update(BaseUnit unit) {
super.update(unit);
unit.rotation = unit.velocity.angle();
if(unit.velocity.len() > 0.2f && unit.timer.get(timerBoost, 2f)){
Effects.effect(Fx.dashsmoke, unit.x + Angles.trnsx(unit.rotation + 180f, boosterLength),
unit.y + Angles.trnsy(unit.rotation + 180f, boosterLength));
}
}
@Override
public void draw(BaseUnit unit) {
Draw.alpha(unit.hitTime / Unit.hitDuration);
Draw.rect(name, unit.x, unit.y, unit.rotation);
Draw.rect(name, unit.x, unit.y, unit.rotation - 90);
Draw.alpha(1f);
}
@ -30,10 +50,22 @@ public class FlyingUnitType extends UnitType {
@Override
public void behavior(BaseUnit unit) {
vec.set(unit.target.x - unit.x, unit.target.y - unit.y);
vec.setLength(speed);
unit.velocity.lerp(vec, 0.1f * Timers.delta()); //TODO clamp it so it doesn't glitch out at low fps
float ang = vec.angle();
float circleLength = 40f;
if(vec.len() < circleLength){
vec.rotate((circleLength-vec.len())/circleLength * 180f);
}
vec.setLength(speed * Timers.delta());
unit.velocity.add(vec); //TODO clamp it so it doesn't glitch out at low fps
if(unit.timer.get(timerReload, reload)){
shoot(unit, BulletType.shot, ang, 4f);
}
}
@Override

View File

@ -1,6 +1,7 @@
package io.anuke.mindustry.entities.units;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.Bullet;
import io.anuke.mindustry.entities.BulletType;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
@ -9,6 +10,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.tilesize;
@ -21,6 +23,8 @@ public abstract class UnitType {
private static int timerIndex = 0;
protected static final int timerTarget = timerIndex++;
protected static final int timerBoost = timerIndex++;
protected static final int timerReload = timerIndex++;
public final String name;
public final byte id;
@ -35,6 +39,8 @@ public abstract class UnitType {
protected float mass = 1f;
protected boolean isFlying;
protected float drag = 0.1f;
protected float maxVelocity = 5f;
protected float reload = 40f;
public UnitType(String name){
this.id = lastid++;
@ -64,6 +70,7 @@ public abstract class UnitType {
//TODO logic
unit.velocity.limit(maxVelocity);
unit.x += unit.velocity.x / mass;
unit.y += unit.velocity.y / mass;
@ -88,8 +95,10 @@ public abstract class UnitType {
}
}
public void onShoot(BaseUnit unit, BulletType type, float rotation){
//TODO remove?
public void shoot(BaseUnit unit, BulletType type, float rotation, float translation){
new Bullet(type, unit,
unit.x + Angles.trnsx(rotation, translation),
unit.y + Angles.trnsy(rotation, translation), rotation).add();
}
public void onDeath(BaseUnit unit){

View File

@ -9,7 +9,7 @@ import io.anuke.mindustry.world.blocks.types.defense.Turret;
import io.anuke.mindustry.world.blocks.types.distribution.Conveyor;
import io.anuke.mindustry.world.blocks.types.distribution.Router;
import io.anuke.mindustry.world.blocks.types.production.Drill;
import io.anuke.mindustry.world.blocks.types.generation.PowerDistributor;
import io.anuke.mindustry.world.blocks.types.power.PowerDistributor;
import io.anuke.mindustry.world.blocks.types.production.Smelter;
import io.anuke.ucore.util.Bundles;

View File

@ -30,8 +30,8 @@ public class MapIO {
Pixmap pixmap = new Pixmap(data.width(), data.height(), Format.RGBA8888);
data.position(0, 0);
for(int x = 0; x < data.width(); x ++){
for(int y = 0; y < data.height(); y ++){
for(int y = 0; y < data.height(); y ++){
for(int x = 0; x < data.width(); x ++){
TileDataMarker marker = data.read();
Block floor = Block.getByID(marker.floor);
Block wall = Block.getByID(marker.wall);

View File

@ -3,6 +3,8 @@ package io.anuke.mindustry.io.versions;
import com.badlogic.gdx.utils.IntMap;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.content.Weapons;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.game.Difficulty;
@ -13,9 +15,9 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Upgrade;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.world.blocks.types.BlockPart;
import io.anuke.ucore.core.Core;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.util.Bits;
@ -140,6 +142,8 @@ public class Save16 extends SaveFileVersion {
short width = stream.readShort();
short height = stream.readShort();
Entities.resizeTree(0, 0, width * tilesize, height * tilesize);
Tile[][] tiles = world.createTiles(width, height);
for(int x = 0; x < width; x ++){
@ -161,6 +165,8 @@ public class Save16 extends SaveFileVersion {
byte team = Bits.getLeftByte(tr);
byte rotation = Bits.getRightByte(tr);
Team t = Team.values()[team];
tile.setTeam(Team.values()[team]);
tile.entity.health = health;
tile.setRotation(rotation);
@ -170,6 +176,11 @@ public class Save16 extends SaveFileVersion {
if (tile.entity.liquid != null) tile.entity.liquid.read(stream);
tile.entity.read(stream);
if(tile.block() == StorageBlocks.core &&
state.teams.has(t)){
state.teams.get(t).cores.add(tile);
}
}
tiles[x][y] = tile;

View File

@ -7,7 +7,8 @@ public enum BarType {
inventory(Color.GREEN),
power(Color.YELLOW),
liquid(Color.ROYAL),
heat(Color.CORAL);
heat(Color.CORAL),
production(Color.PURPLE);
public final Color color;

View File

@ -8,7 +8,6 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.io.MapTileData;
import io.anuke.mindustry.io.MapTileData.TileDataMarker;
import io.anuke.ucore.noise.Noise;
import io.anuke.ucore.util.Log;
import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world;
@ -27,9 +26,9 @@ public class WorldGenerator {
Noise.setSeed(world.getSeed());
IntArray multiblocks = new IntArray();
for(int x = 0; x < data.width(); x ++){
for(int y = 0; y < data.height(); y ++){
for(int y = 0; y < data.height(); y ++){
for(int x = 0; x < data.width(); x ++){
TileDataMarker tile = data.read();
tiles[x][y] = new Tile(x, y, tile.floor, tile.wall, tile.rotation, tile.team);

View File

@ -133,7 +133,7 @@ public class Turret extends Block{
if(entity.timer.get(timerTarget, targetInterval)){
entity.target = Units.getClosestEnemy(tile.getTeam(),
tile.worldx(), tile.worldy(), range, e -> !e.isDead());
tile.drawx(), tile.drawy(), range, e -> !e.isDead());
}
if(entity.target != null){

View File

@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.graphics.Fx;
@ -6,7 +6,6 @@ import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.generation.PowerGenerator.GeneratorEntity;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;

View File

@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.graphics.Fx;
@ -11,7 +11,7 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
public class LiquidPowerGenerator extends PowerGenerator {
public class LiquidPowerGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator {
public Liquid generateLiquid;
public float powerPerLiquid = 0.13f;
/**Maximum liquid used per frame.*/

View File

@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.content.Liquids;
@ -24,7 +24,7 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.tilesize;
public class NuclearReactor extends LiquidPowerGenerator{
public class NuclearReactor extends io.anuke.mindustry.world.blocks.types.power.LiquidPowerGenerator {
protected final int timerFuel = timers++;
protected final Translator tr = new Translator();

View File

@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
@ -258,7 +258,8 @@ public class PowerDistributor extends PowerBlock{
return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy()) <= Math.max(laserRange * tilesize,
((PowerDistributor)link.block()).laserRange * tilesize) - tilesize/2f;
}else{
return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy()) <= laserRange * tilesize - tilesize/2f;
return Vector2.dst(tile.worldx(), tile.worldy(), link.worldx(), link.worldy())
<= laserRange * tilesize - tilesize/2f + (link.block().size-1)*tilesize;
}
}

View File

@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import com.badlogic.gdx.math.GridPoint2;
import io.anuke.mindustry.entities.TileEntity;

View File

@ -1,9 +1,9 @@
package io.anuke.mindustry.world.blocks.types.generation;
package io.anuke.mindustry.world.blocks.types.power;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Timers;
public class SolarGenerator extends PowerGenerator {
public class SolarGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator {
/**power generated per frame*/
protected float generation = 0.005f;

View File

@ -1,13 +1,22 @@
package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Tmp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@ -18,6 +27,7 @@ public class UnitFactory extends Block {
protected ItemStack[] requirements;
protected float produceTime = 1000f;
protected float powerUse = 0.1f;
protected String unitRegion;
public UnitFactory(String name) {
super(name);
@ -26,6 +36,43 @@ public class UnitFactory extends Block {
hasPower = true;
}
@Override
public void setBars() {
super.setBars();
bars.add(new BlockBar(BarType.production, true, tile -> tile.<UnitFactoryEntity>entity().buildTime / produceTime));
bars.remove(BarType.inventory);
}
@Override
public void draw(Tile tile) {
UnitFactoryEntity entity = tile.entity();
TextureRegion region = Draw.region(unitRegion == null ? type.name : unitRegion);
int w = (int)(entity.buildTime/produceTime * region.getRegionWidth());
Draw.rect(name(), tile.drawx(), tile.drawy());
Draw.alpha(0.2f);
//Draw.rect(region, tile.drawx(), tile.drawy());
Draw.color();
Tmp.tr1.setRegion(region, region.getRegionWidth() - w, 0, w, region.getRegionHeight());
Draw.rect(Tmp.tr1, tile.drawx(), tile.drawy());
Draw.color("accent");
Lines.lineAngleCenter(
tile.drawx() + Mathf.sin(Timers.time(), 5f, Vars.tilesize/2f*size - 2f),
tile.drawy(),
90,
size * Vars.tilesize - 4f);
Draw.reset();
Draw.rect(name + "-top", tile.drawx(), tile.drawy());
}
@Override
public void update(Tile tile) {
UnitFactoryEntity entity = tile.entity();
@ -40,7 +87,8 @@ public class UnitFactory extends Block {
if(entity.buildTime >= produceTime){
BaseUnit unit = new BaseUnit(type, tile.getTeam());
unit.set(tile.drawx(), tile.drawy());
unit.set(tile.drawx(), tile.drawy()).add();
unit.velocity.y = 4f;
entity.buildTime = 0f;
for(ItemStack stack : requirements){
@ -50,6 +98,16 @@ public class UnitFactory extends Block {
}
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source) {
for(ItemStack stack : requirements){
if(item == stack.item && tile.entity.inventory.getItem(item) <= stack.amount*2){
return true;
}
}
return false;
}
@Override
public TileEntity getEntity() {
return new UnitFactoryEntity();