diff --git a/core/assets-raw/sprites/units/vtol-booster-1.png b/core/assets-raw/sprites/units/vtol-booster-1.png index bddcf0738a..509bba3e21 100644 Binary files a/core/assets-raw/sprites/units/vtol-booster-1.png and b/core/assets-raw/sprites/units/vtol-booster-1.png differ diff --git a/core/assets-raw/sprites/units/vtol-booster-2.png b/core/assets-raw/sprites/units/vtol-booster-2.png index af530d4dd1..c98ed041f5 100644 Binary files a/core/assets-raw/sprites/units/vtol-booster-2.png and b/core/assets-raw/sprites/units/vtol-booster-2.png differ diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index c711641c28..6f065da3e1 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java index 3b79d0e3d6..d50d6944b4 100644 --- a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java @@ -4,6 +4,7 @@ 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.units.ResupplyPoint; import io.anuke.mindustry.world.blocks.types.units.UnitFactory; public class UnitBlocks { @@ -34,5 +35,10 @@ public class UnitBlocks { requirements = new ItemStack[]{ new ItemStack(Items.stone, 1) }; + }}, + + resupplyPoint = new ResupplyPoint("resupplypoint"){{ + size = 2; + itemCapacity = 30; }}; } diff --git a/core/src/io/anuke/mindustry/content/fx/Fx.java b/core/src/io/anuke/mindustry/content/fx/Fx.java index 1fbe04b74c..e2be53d3bf 100644 --- a/core/src/io/anuke/mindustry/content/fx/Fx.java +++ b/core/src/io/anuke/mindustry/content/fx/Fx.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.content.fx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Colors; +import io.anuke.mindustry.graphics.Palette; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Fill; @@ -36,13 +37,6 @@ public class Fx{ Draw.reset(); }), - dash = new Effect(30, e -> { - Draw.color(Color.CORAL, Color.GRAY, e.fin()); - float size = e.fout()*4f; - Draw.rect("circle", e.x, e.y, size, size); - Draw.reset(); - }), - spawn = new Effect(23, e -> { Lines.stroke(2f); Draw.color(Color.DARK_GRAY, Color.SCARLET, e.fin()); diff --git a/core/src/io/anuke/mindustry/content/fx/UnitFx.java b/core/src/io/anuke/mindustry/content/fx/UnitFx.java new file mode 100644 index 0000000000..92664c373a --- /dev/null +++ b/core/src/io/anuke/mindustry/content/fx/UnitFx.java @@ -0,0 +1,20 @@ +package io.anuke.mindustry.content.fx; + +import io.anuke.mindustry.graphics.Palette; +import io.anuke.ucore.core.Effects.Effect; +import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.graphics.Fill; +import io.anuke.ucore.util.Angles; +import io.anuke.ucore.util.Mathf; + +public class UnitFx { + public static final Effect + + vtolHover = new Effect(40f, e -> { + float len = e.finpow()*10f; + float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f); + Draw.color(Palette.lightFlame); + Fill.circle(e.x + Angles.trnsx(ang, len), e.y + Angles.trnsy(ang, len), 2f * e.fout()); + Draw.reset(); + }); +} diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index cfc252588f..55f9aa8fce 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -60,9 +60,9 @@ public class ContentLoader { //TODO 128 blocks! Log.info("--- CONTENT INFO ---"); - Log.info("Blocks loaded: {0}\nItems loaded: {1}\nLiquids loaded: {2}\nUpgrades loaded: {3}\nUnits loaded: {4}\nAmmo types loaded: {5}\nStatus effects loaded: {6}", + Log.info("Blocks loaded: {0}\nItems loaded: {1}\nLiquids loaded: {2}\nUpgrades loaded: {3}\nUnits loaded: {4}\nAmmo types loaded: {5}\nStatus effects loaded: {6}\nTotal content classes: {7}", Block.getAllBlocks().size, Item.getAllItems().size, Liquid.getAllLiquids().size, - Mech.getAllUpgrades().size, UnitType.getAllTypes().size, AmmoType.getAllTypes().size, StatusEffect.getAllEffects().size); + Mech.getAllUpgrades().size, UnitType.getAllTypes().size, AmmoType.getAllTypes().size, StatusEffect.getAllEffects().size, content.length); Log.info("-------------------"); } diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index f8247f08e3..c7ed0d553d 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -33,7 +33,7 @@ import static io.anuke.mindustry.Vars.*; /**Control module. * Handles all input, saving, keybinds and keybinds. - * Should not handle any game-critical state. + * Should not handle any logic-critical state. * This class is not created in the headless server.*/ public class Control extends Module{ private Tutorial tutorial = new Tutorial(); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 3c6bd27b26..37a6d1f22c 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -251,22 +251,21 @@ public class Renderer extends RendererModule{ if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.team == team) == 0 && flying) continue; + Entities.drawWith(unitGroups[team.ordinal()], u -> u.isFlying() == flying, Unit::drawUnder); + Entities.drawWith(playerGroup, p -> p.isFlying() == flying && p.team == team, Unit::drawUnder); + Shaders.outline.color.set(team.color); Graphics.beginShaders(Shaders.outline); Graphics.shader(Shaders.hit, false); - drawTeam(team, flying); + Entities.draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying); + Entities.draw(playerGroup, p -> p.isFlying() == flying && p.team == team); Graphics.shader(); blocks.drawTeamBlocks(Layer.turret, team); Graphics.endShaders(); } } - private void drawTeam(Team team, boolean flying){ - Entities.draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying); - Entities.draw(playerGroup, p -> p.isFlying() == flying && p.team == team); - } - @Override public void resize(int width, int height){ super.resize(width, height); @@ -533,6 +532,8 @@ public class Renderer extends RendererModule{ } void drawStats(Unit unit){ + if(unit.isDead()) return; + float x = unit.getDrawPosition().x; float y = unit.getDrawPosition().y; @@ -541,8 +542,9 @@ public class Renderer extends RendererModule{ y = (int)y; } - drawBar(Color.SCARLET, x, y - 7f, unit.health / unit.maxhealth); - drawBar(Color.valueOf("32cf6d"), x, y - 8f, unit.inventory.totalAmmo() / (float) unit.inventory.ammoCapacity()); + drawEncloser(x, y - 8f, 2f); + drawBar(Color.SCARLET, x, y - 8f, unit.health / unit.maxhealth); + drawBar(Color.valueOf("32cf6d"), x, y - 9f, unit.inventory.totalAmmo() / (float) unit.inventory.ammoCapacity()); } //TODO optimize! @@ -557,12 +559,6 @@ public class Renderer extends RendererModule{ x -= 0.5f; y += 0.5f; - /* - Lines.stroke(3f); - Draw.color(Color.SLATE); - Lines.line(x - len + 1, y, x + len + 1.5f, y); - - Lines.stroke(1f);*/ Draw.color(Color.BLACK); Lines.line(x - len + 1, y, x + len + 0.5f, y); @@ -572,6 +568,19 @@ public class Renderer extends RendererModule{ Draw.reset(); } + public void drawEncloser(float x, float y, float height){ + x -= 0.5f; + y += 0.5f - (height-1f)/2f; + + float len = 3; + + Lines.stroke(2f + height); + Draw.color(Color.SLATE); + Lines.line(x - len - 0.5f, y, x + len + 1.5f, y, CapStyle.none); + + Draw.reset(); + } + public void setCameraScale(int amount){ targetscale = amount; clampScale(); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 301abeffe5..805d398a72 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -6,7 +6,6 @@ import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Weapons; import io.anuke.mindustry.content.fx.ExplosionFx; -import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.entities.effect.DamageArea; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.Palette; @@ -271,10 +270,6 @@ public class Player extends Unit{ weapon.update(player, false); } - if(dashing && timer.get(timerDash, 3) && movement.len() > 0){ - Effects.effect(Fx.dash, x + Angles.trnsx(rotation + 180f, 3f), y + Angles.trnsy(rotation + 180f, 3f)); - } - movement.limit(speed); velocity.add(movement); @@ -326,6 +321,11 @@ public class Player extends Unit{ if(isLocal){ super.writeSave(stream); + + stream.writeByte(upgrades.size); + for(Upgrade u : upgrades){ + stream.writeByte(u.id); + } } } @@ -340,13 +340,18 @@ public class Player extends Unit{ private void readSaveSuper(DataInputStream stream) throws IOException { super.readSave(stream); + + byte uamount = stream.readByte(); + for (int i = 0; i < uamount; i++) { + upgrades.add(Upgrade.getByID(stream.readByte())); + } + add(); } @Override public void writeSpawn(ByteBuffer buffer) { - buffer.put((byte)name.getBytes().length); - buffer.put(name.getBytes()); + IOUtils.writeString(buffer, name); buffer.put(weapon.id); buffer.put(mech.id); buffer.put(isAdmin ? 1 : (byte)0); @@ -358,10 +363,7 @@ public class Player extends Unit{ @Override public void readSpawn(ByteBuffer buffer) { - byte nlength = buffer.get(); - byte[] n = new byte[nlength]; - buffer.get(n); - name = new String(n); + name = IOUtils.readString(buffer); weapon = Upgrade.getByID(buffer.get()); mech = Upgrade.getByID(buffer.get()); isAdmin = buffer.get() == 1; @@ -410,14 +412,6 @@ public class Player extends Unit{ float tx = x + Angles.trnsx(rotation + 180f, 4f); float ty = y + Angles.trnsy(rotation + 180f, 4f); - - if(mech.flying && i.target.dst(i.last) > 2f && timer.get(timerDash, 1)){ - Effects.effect(Fx.dash, tx, ty); - } - - if(dashing && !dead && timer.get(timerDash, 3) && i.target.dst(i.last) > 1f){ - Effects.effect(Fx.dash, tx, ty); - } } public Color getColor(){ diff --git a/core/src/io/anuke/mindustry/entities/SyncEntity.java b/core/src/io/anuke/mindustry/entities/SyncEntity.java index 3dea8724de..164c5e797c 100644 --- a/core/src/io/anuke/mindustry/entities/SyncEntity.java +++ b/core/src/io/anuke/mindustry/entities/SyncEntity.java @@ -20,9 +20,9 @@ public abstract class SyncEntity extends DestructibleEntity{ private Vector3 spos = new Vector3(); /**rotation of the top, usually used as the 'shoot' direction.*/ - public float rotation; + public float rotation = 90; /**rotation of the base, usually leg rotation for mechs.*/ - public float baseRotation; + public float baseRotation = 90; /**Called when a death event is recieved remotely.*/ public abstract void onRemoteDeath(); diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index bb5dd5fc0a..ec86539f62 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -26,7 +26,7 @@ public abstract class Unit extends SyncEntity implements SerializableEntity { public UnitInventory inventory = new UnitInventory(100, 100); public Team team = Team.blue; - public Vector2 velocity = new Vector2(); + public Vector2 velocity = new Vector2(0f, 0.0001f); public float hitTime; public float drownTime; @@ -148,6 +148,8 @@ public abstract class Unit extends SyncEntity implements SerializableEntity { } } + public void drawUnder(){} + public abstract boolean acceptsAmmo(Item item); public abstract void addAmmo(Item item); public abstract float getMass(); diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 897b19cebf..6edb24f2b2 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -7,7 +7,10 @@ import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.resource.Item; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.entities.Entity; +import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Timer; @@ -40,6 +43,12 @@ public class BaseUnit extends Unit{ rotation = Mathf.slerpDelta(rotation, angle, type.rotatespeed); } + public void effectAt(Effect effect, float rotation, float dx, float dy){ + Effects.effect(effect, + x + Angles.trnsx(rotation, dx, dy), + y + Angles.trnsy(rotation, dx, dy), Mathf.atan2(dx, dy)); + } + @Override public boolean acceptsAmmo(Item item) { return type.ammo.containsKey(item) && inventory.canAcceptAmmo(type.ammo.get(item)); @@ -81,6 +90,12 @@ public class BaseUnit extends Unit{ type.draw(this); } + @Override + public void drawUnder(){ + type.drawUnder(this); + } + + @Override public float drawSize(){ return 14; diff --git a/core/src/io/anuke/mindustry/entities/units/FlyingUnitType.java b/core/src/io/anuke/mindustry/entities/units/FlyingUnitType.java index 41b80b547f..4735c8706e 100644 --- a/core/src/io/anuke/mindustry/entities/units/FlyingUnitType.java +++ b/core/src/io/anuke/mindustry/entities/units/FlyingUnitType.java @@ -2,20 +2,17 @@ package io.anuke.mindustry.entities.units; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.ObjectSet; -import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.resource.AmmoType; 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 static Vector2 vec = new Vector2(); protected float boosterLength = 4.5f; @@ -34,8 +31,8 @@ public class FlyingUnitType extends UnitType { unit.rotation = unit.velocity.angle(); if(unit.velocity.len() > 0.2f && unit.timer.get(timerBoost, 2f)){ - Effects.effect(Fx.dash, unit.x + Angles.trnsx(unit.rotation + 180f, boosterLength), - unit.y + Angles.trnsy(unit.rotation + 180f, boosterLength)); + //Effects.effect(UnitFx.vtolHover, unit.x + Angles.trnsx(unit.rotation + 180f, boosterLength), + // unit.y + Angles.trnsy(unit.rotation + 180f, boosterLength)); } } diff --git a/core/src/io/anuke/mindustry/entities/units/UnitType.java b/core/src/io/anuke/mindustry/entities/units/UnitType.java index f17b736a03..4b63e6b62f 100644 --- a/core/src/io/anuke/mindustry/entities/units/UnitType.java +++ b/core/src/io/anuke/mindustry/entities/units/UnitType.java @@ -59,6 +59,8 @@ public abstract class UnitType { public abstract void draw(BaseUnit unit); + public void drawUnder(BaseUnit unit){} + public boolean isFlying(){ return isFlying; } diff --git a/core/src/io/anuke/mindustry/entities/units/types/Vtol.java b/core/src/io/anuke/mindustry/entities/units/types/Vtol.java index d1446f4551..5438e971f1 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Vtol.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Vtol.java @@ -1,10 +1,15 @@ package io.anuke.mindustry.entities.units.types; +import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.content.AmmoTypes; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.FlyingUnitType; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.graphics.Fill; +import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; public class Vtol extends FlyingUnitType { @@ -14,16 +19,70 @@ public class Vtol extends FlyingUnitType { setAmmo(AmmoTypes.basicIron); } + @Override + public void drawUnder(BaseUnit unit) { + + + for(int i : Mathf.signs) { + + float rotation = unit.rotation - 90; + float dx = 5f * i, dx2 = 6f * i; + float dy = 4f, dy2 = -5f; + + float rad = 1.5f + Mathf.absin(Timers.time(), 3f, 0.6f); + float ds = 1.2f; + + Draw.color(Palette.lightishOrange, Palette.lightFlame, Mathf.absin(Timers.time(), 3f, 0.3f)); + + Fill.circle( + unit.x + Angles.trnsx(rotation, dx, dy), + unit.y + Angles.trnsy(rotation, dx, dy), rad); + + Fill.circle( + unit.x + Angles.trnsx(rotation, dx2, dy2), + unit.y + Angles.trnsy(rotation, dx2, dy2), rad); + + Draw.color(Color.GRAY); + + Fill.circle( + unit.x + Angles.trnsx(rotation, dx, dy)/ds, + unit.y + Angles.trnsy(rotation, dx, dy)/ds, 2f); + + Fill.circle( + unit.x + Angles.trnsx(rotation, dx2, dy2)/ds, + unit.y + Angles.trnsy(rotation, dx2, dy2)/ds, 2f); + + Draw.color(Color.WHITE); + } + + + } + @Override public void draw(BaseUnit unit) { Draw.alpha(unit.hitTime / Unit.hitDuration); Draw.rect(name, unit.x, unit.y, unit.rotation - 90); for(int i : Mathf.signs){ - Draw.rect(name + "-booster-1", unit.x, unit.y, 12*i, 12, unit.rotation - 90); - Draw.rect(name + "-booster-2", unit.x, unit.y, 12*i, 12, unit.rotation - 90); + Draw.rect(name + "-booster-1", unit.x + i, unit.y, 12*i, 12, unit.rotation - 90); + Draw.rect(name + "-booster-2", unit.x + i, unit.y, 12*i, 12, unit.rotation - 90); } Draw.alpha(1f); } + + @Override + public void update(BaseUnit unit) { + super.update(unit); + + unit.x += Mathf.sin(Timers.time() + unit.id*999, 25f, 0.07f); + unit.y += Mathf.cos(Timers.time() + unit.id*999, 25f, 0.07f); + unit.rotation += Mathf.sin(Timers.time() + unit.id*99, 10f, 8f); + } + + @Override + public void behavior(BaseUnit unit) { + //super.behavior(unit); + + } } diff --git a/core/src/io/anuke/mindustry/graphics/Palette.java b/core/src/io/anuke/mindustry/graphics/Palette.java index 3ff88162c5..22937e2a21 100644 --- a/core/src/io/anuke/mindustry/graphics/Palette.java +++ b/core/src/io/anuke/mindustry/graphics/Palette.java @@ -12,6 +12,7 @@ public class Palette { public static final Color turretHeat = Color.valueOf("ab3400"); public static final Color lightOrange = Color.valueOf("f68021"); + public static final Color lightishOrange = Color.valueOf("f8ad42"); public static final Color lighterOrange = Color.valueOf("f6e096"); public static final Color lightishGray = Color.valueOf("a2a2a2"); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java b/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java index f4b5548bc3..aaa98a189d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java @@ -1,4 +1,50 @@ package io.anuke.mindustry.world.blocks.types.units; -public class ResupplyPoint { +import com.badlogic.gdx.math.Rectangle; +import io.anuke.mindustry.entities.Units; +import io.anuke.mindustry.entities.effect.ItemTransferEffect; +import io.anuke.mindustry.resource.Item; +import io.anuke.mindustry.world.Block; +import io.anuke.mindustry.world.Tile; + +public class ResupplyPoint extends Block{ + private static Rectangle rect = new Rectangle(); + + protected int timerSupply = timers ++; + + protected float supplyRadius = 50f; + protected float supplyInterval = 5f; + + public ResupplyPoint(String name) { + super(name); + update = true; + solid = true; + } + + @Override + public void update(Tile tile) { + + if(tile.entity.timer.get(timerSupply, supplyInterval)){ + rect.setSize(supplyRadius*2).setCenter(tile.drawx(), tile.drawy()); + + Units.getNearby(tile.getTeam(), rect, unit -> { + if(unit.distanceTo(tile.drawx(), tile.drawy()) > supplyRadius) return; + + for(int i = 0; i < tile.entity.items.items.length; i ++){ + Item item = Item.getByID(i); + if(tile.entity.items.items[i] > 0 && unit.acceptsAmmo(item)){ + tile.entity.items.items[i] --; + unit.addAmmo(item); + new ItemTransferEffect(item, tile.drawx(), tile.drawy(), unit).add(); + return; + } + } + }); + } + } + + @Override + public boolean acceptItem(Item item, Tile tile, Tile source) { + return tile.entity.items.totalItems() < itemCapacity; + } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java index e4be3463e1..cc32202952 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java @@ -38,7 +38,7 @@ public class UnitFactory extends Block { protected float produceTime = 1000f; protected float powerUse = 0.1f; protected float openDuration = 50f; - protected float launchVelocity = 4f; + protected float launchVelocity = 0f; protected String unitRegion; public UnitFactory(String name) {