Added unit drops, boosting
This commit is contained in:
@@ -40,7 +40,7 @@ public class Vars{
|
||||
//waves can last no longer than 3 minutes, otherwise the next one spawns
|
||||
public static final float maxwavespace = 60*60*4f;
|
||||
|
||||
public static final float coreBuildRange = 400f;
|
||||
public static final float coreBuildRange = 800f;
|
||||
//discord group URL
|
||||
public static final String discordURL = "https://discord.gg/BKADYds";
|
||||
|
||||
|
||||
@@ -15,32 +15,32 @@ public class AmmoTypes implements ContentList {
|
||||
|
||||
//bullets
|
||||
|
||||
bulletIron = new AmmoType(Items.iron, StandardBullets.iron, 5) {{
|
||||
bulletIron = new AmmoType(Items.iron, StandardBullets.iron, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
bulletLead = new AmmoType(Items.lead, StandardBullets.lead, 5) {{
|
||||
bulletLead = new AmmoType(Items.lead, StandardBullets.lead, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
bulletSteel = new AmmoType(Items.steel, StandardBullets.steel, 5) {{
|
||||
bulletSteel = new AmmoType(Items.steel, StandardBullets.steel, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
bulletThorium = new AmmoType(Items.thorium, StandardBullets.thorium, 5) {{
|
||||
bulletThorium = new AmmoType(Items.thorium, StandardBullets.thorium, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
bulletSilicon = new AmmoType(Items.silicon, StandardBullets.homing, 5) {{
|
||||
bulletSilicon = new AmmoType(Items.silicon, StandardBullets.homing, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
bulletThermite = new AmmoType(Items.thermite, StandardBullets.tracer, 5) {{
|
||||
bulletThermite = new AmmoType(Items.thermite, StandardBullets.tracer, 3) {{
|
||||
shootEffect = ShootFx.shootSmall;
|
||||
smokeEffect = ShootFx.shootSmallSmoke;
|
||||
}};
|
||||
|
||||
@@ -17,26 +17,22 @@ public class Mechs implements ContentList {
|
||||
|
||||
alpha = new Mech("alpha-mech", false){{
|
||||
drillPower = 2;
|
||||
speed = 1.1f;
|
||||
maxSpeed = 1.1f;
|
||||
speed = 0.5f;
|
||||
}};
|
||||
|
||||
delta = new Mech("delta-mech", false){{
|
||||
drillPower = -1;
|
||||
speed = 1.5f;
|
||||
maxSpeed = 1.5f;
|
||||
speed = 0.6f;
|
||||
}};
|
||||
|
||||
tau = new Mech("tau-mech", false){{
|
||||
drillPower = 2;
|
||||
speed = 1.1f;
|
||||
maxSpeed = 1.1f;
|
||||
speed = 0.5f;
|
||||
}};
|
||||
|
||||
omega = new Mech("omega-mech", false){{
|
||||
drillPower = 1;
|
||||
speed = 1.0f;
|
||||
maxSpeed = 1.0f;
|
||||
speed = 0.4f;
|
||||
}};
|
||||
|
||||
dart = new Mech("dart-ship", true){{
|
||||
|
||||
@@ -40,6 +40,7 @@ public class Recipes implements ContentList{
|
||||
new Recipe(power, PowerBlocks.battery, new ItemStack(Items.iron, 8), new ItemStack(Items.lead, 30));
|
||||
//new Recipe(power, PowerBlocks.batteryLarge, new ItemStack(Items.steel, 5), new ItemStack(Items.iron, 5));
|
||||
new Recipe(power, PowerBlocks.combustiongenerator, new ItemStack(Items.iron, 30), new ItemStack(Items.lead, 30));
|
||||
|
||||
//new Recipe(distribution, StorageBlocks.vault, new ItemStack(Items.steel, 50));
|
||||
//new Recipe(distribution, StorageBlocks.core, new ItemStack(Items.steel, 50));
|
||||
//new Recipe(distribution, StorageBlocks.unloader, new ItemStack(Items.steel, 5));
|
||||
@@ -49,6 +50,10 @@ public class Recipes implements ContentList{
|
||||
new Recipe(production, ProductionBlocks.reinforcedDrill, new ItemStack(Items.iron, 20), new ItemStack(Items.lead, 20));
|
||||
new Recipe(production, ProductionBlocks.steelDrill, new ItemStack(Items.iron, 40), new ItemStack(Items.lead, 25), new ItemStack(Items.steel, 25));
|
||||
new Recipe(production, ProductionBlocks.titaniumDrill, new ItemStack(Items.iron, 40), new ItemStack(Items.titanium, 40), new ItemStack(Items.steel, 40));
|
||||
|
||||
new Recipe(units, UnitBlocks.droneFactory, new ItemStack(Items.iron, 50), new ItemStack(Items.lead, 50));
|
||||
new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 20), new ItemStack(Items.steel, 10));
|
||||
|
||||
/*
|
||||
new Recipe(production, ProductionBlocks.laserdrill, new ItemStack(Items.titanium, 40), new ItemStack(Items.surgealloy, 40));
|
||||
new Recipe(production, ProductionBlocks.nucleardrill, new ItemStack(Items.titanium, 40), new ItemStack(Items.surgealloy, 40));
|
||||
|
||||
@@ -21,7 +21,8 @@ public class DefenseBlocks extends BlockList implements ContentList {
|
||||
}};
|
||||
|
||||
ironwalllarge = new Wall("ironwall-large") {{
|
||||
health = 80 * wallHealthMultiplier;
|
||||
health = 80 * 4 * wallHealthMultiplier;
|
||||
size = 2;
|
||||
}};
|
||||
|
||||
steelwall = new Wall("steelwall") {{
|
||||
|
||||
@@ -170,8 +170,10 @@ public class NetServer extends Module{
|
||||
|
||||
long elapsed = TimeUtils.timeSinceMillis(connection.lastRecievedTime);
|
||||
|
||||
float maxSpeed = packet.boosting ? player.mech.boostSpeed : player.mech.speed;
|
||||
|
||||
//extra 1.1x multiplicaton is added just in case
|
||||
float maxMove = elapsed / 1000f * 60f * player.mech.maxSpeed * 1.1f;
|
||||
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.1f;
|
||||
|
||||
player.pointerX = packet.pointerX;
|
||||
player.pointerY = packet.pointerY;
|
||||
|
||||
@@ -32,7 +32,10 @@ import io.anuke.ucore.entities.EntityGroup;
|
||||
import io.anuke.ucore.entities.trait.SolidTrait;
|
||||
import io.anuke.ucore.graphics.Draw;
|
||||
import io.anuke.ucore.graphics.Lines;
|
||||
import io.anuke.ucore.util.*;
|
||||
import io.anuke.ucore.util.Angles;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
import io.anuke.ucore.util.ThreadQueue;
|
||||
import io.anuke.ucore.util.Timer;
|
||||
|
||||
import java.io.DataInput;
|
||||
import java.io.DataOutput;
|
||||
@@ -54,7 +57,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
public float pointerX, pointerY;
|
||||
public String name = "name";
|
||||
public String uuid, usid;
|
||||
public boolean isAdmin, isTransferring, isShooting;
|
||||
public boolean isAdmin, isTransferring, isShooting, isBoosting;
|
||||
public float boostHeat;
|
||||
public Color color = new Color();
|
||||
public Mech mech;
|
||||
|
||||
@@ -83,7 +87,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
|
||||
//region unit and event overrides, utility methods
|
||||
|
||||
|
||||
@Override
|
||||
public int getItemCapacity() {
|
||||
return mech.itemCapacity;
|
||||
@@ -250,10 +253,12 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
if((debug && (!showPlayer || !showUI)) || dead) return;
|
||||
|
||||
if(!movement.isZero() && moved){
|
||||
walktime += Timers.delta() * movement.len()/1.6f * getFloorOn().speedMultiplier;
|
||||
walktime += Timers.delta() * movement.len()/0.7f * getFloorOn().speedMultiplier;
|
||||
baseRotation = Mathf.slerpDelta(baseRotation, movement.angle(), 0.13f);
|
||||
}
|
||||
|
||||
boostHeat = Mathf.lerpDelta(boostHeat, isBoosting ? 1f : 0f, 0.08f);
|
||||
|
||||
boolean snap = snapCamera && isLocal;
|
||||
|
||||
float px = x, py =y;
|
||||
@@ -263,7 +268,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
y = (int)y;
|
||||
}
|
||||
|
||||
float ft = Mathf.sin(walktime, 6f, 2f);
|
||||
float ft = Mathf.sin(walktime, 6f, 2f) * (1f-boostHeat);
|
||||
|
||||
Floor floor = getFloorOn();
|
||||
|
||||
@@ -275,11 +280,15 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
Draw.tint(Color.WHITE, floor.liquidColor, 0.5f);
|
||||
}
|
||||
|
||||
float boostTrnsY = -boostHeat * 3f;
|
||||
float boostTrnsX = boostHeat * 3f;
|
||||
float boostAng = boostHeat*40f;
|
||||
|
||||
for (int i : Mathf.signs) {
|
||||
Draw.rect(mech.legRegion,
|
||||
x + Angles.trnsx(baseRotation, ft * i),
|
||||
y + Angles.trnsy(baseRotation, ft * i),
|
||||
12f * i, 12f - Mathf.clamp(ft * i, 0, 2), baseRotation - 90);
|
||||
x + Angles.trnsx(baseRotation, ft * i + boostTrnsY, -boostTrnsX*i),
|
||||
y + Angles.trnsy(baseRotation, ft * i + boostTrnsY, -boostTrnsX*i),
|
||||
12f * i, 12f - Mathf.clamp(ft * i, 0, 2), baseRotation - 90 + boostAng*i);
|
||||
}
|
||||
|
||||
Draw.rect(mech.baseRegion, x, y, baseRotation- 90);
|
||||
@@ -328,8 +337,13 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
drawBuilding(this);
|
||||
}
|
||||
|
||||
if(mech.flying){
|
||||
trail.draw(Palette.lighterOrange, Palette.lightishOrange, 5f);
|
||||
if(mech.flying || boostHeat > 0.001f){
|
||||
float wobblyness = 0.6f;
|
||||
trail.update(x + Angles.trnsx(rotation + 180f, 5f) + Mathf.range(wobblyness),
|
||||
y + Angles.trnsy(rotation + 180f, 5f) + Mathf.range(wobblyness));
|
||||
trail.draw(Palette.lighterOrange, Palette.lightishOrange, 5f * (isFlying() ? 1f : boostHeat));
|
||||
}else{
|
||||
trail.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -421,11 +435,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
|
||||
avoidOthers(8f);
|
||||
|
||||
float wobblyness = 0.6f;
|
||||
|
||||
trail.update(x + Angles.trnsx(rotation + 180f, 6f) + Mathf.range(wobblyness),
|
||||
y + Angles.trnsy(rotation + 180f, 6f) + Mathf.range(wobblyness));
|
||||
|
||||
if(!isShooting()) {
|
||||
updateBuilding(this);
|
||||
}
|
||||
@@ -444,7 +453,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
|
||||
if(ui.chatfrag.chatOpen()) return;
|
||||
|
||||
float speed = Inputs.keyDown("dash") && debug ? 5f : mech.speed;
|
||||
float speed = isBoosting ? mech.boostSpeed : mech.speed;
|
||||
float carrySlowdown = 0.3f;
|
||||
|
||||
speed *= ((1f-carrySlowdown) + (inventory.hasItem() ? (float)inventory.getItem().amount/inventory.capacity(): 1f) * carrySlowdown);
|
||||
@@ -474,14 +483,12 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
}
|
||||
}
|
||||
|
||||
movement.set(0, 0);
|
||||
movement.setZero();
|
||||
|
||||
String section = "player_" + (playerIndex + 1);
|
||||
|
||||
float xa = Inputs.getAxis(section, "move_x");
|
||||
float ya = Inputs.getAxis(section, "move_y");
|
||||
if(Math.abs(xa) < 0.3) xa = 0;
|
||||
if(Math.abs(ya) < 0.3) ya = 0;
|
||||
|
||||
movement.y += ya*speed;
|
||||
movement.x += xa*speed;
|
||||
@@ -497,7 +504,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
velocity.add(movement);
|
||||
|
||||
float prex = x, prey = y;
|
||||
updateVelocityStatus(mech.drag, debug ? speed : mech.maxSpeed);
|
||||
updateVelocityStatus(mech.drag, 10f);
|
||||
moved = distanceTo(prex, prey) > 0.01f;
|
||||
|
||||
if(!isShooting()){
|
||||
@@ -620,7 +627,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
}
|
||||
|
||||
public boolean isShooting(){
|
||||
return isShooting && inventory.hasAmmo();
|
||||
return isShooting && inventory.hasAmmo() && !isBoosting;
|
||||
}
|
||||
|
||||
public void setRespawning(){
|
||||
@@ -680,6 +687,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
buffer.writeInt(Color.rgba8888(color));
|
||||
buffer.writeBoolean(dead);
|
||||
buffer.writeByte(mech.id);
|
||||
buffer.writeBoolean(isBoosting);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -691,12 +699,15 @@ public class Player extends Unit implements BuilderTrait, CarryTrait {
|
||||
color.set(buffer.readInt());
|
||||
dead = buffer.readBoolean();
|
||||
mech = Upgrade.getByID(buffer.readByte());
|
||||
boolean dashing = buffer.readBoolean();
|
||||
interpolator.read(lastx, lasty, x, y, time, rotation);
|
||||
rotation = lastrot;
|
||||
|
||||
if(isLocal){
|
||||
x = lastx;
|
||||
y = lasty;
|
||||
}else{
|
||||
isBoosting = dashing;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -306,6 +306,7 @@ public abstract class BaseUnit extends Unit{
|
||||
if(unit == null) return;
|
||||
|
||||
unit.onSuperDeath();
|
||||
UnitDrops.dropItems(unit);
|
||||
|
||||
Effects.effect(ExplosionFx.explosion, unit);
|
||||
Effects.shake(2f, 2f, unit);
|
||||
|
||||
24
core/src/io/anuke/mindustry/entities/units/UnitDrops.java
Normal file
24
core/src/io/anuke/mindustry/entities/units/UnitDrops.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package io.anuke.mindustry.entities.units;
|
||||
|
||||
import io.anuke.mindustry.content.Items;
|
||||
import io.anuke.mindustry.gen.CallEntity;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.ucore.util.Mathf;
|
||||
|
||||
public class UnitDrops {
|
||||
private static Item[] dropTable;
|
||||
|
||||
public static void dropItems(BaseUnit unit){
|
||||
if(dropTable == null){
|
||||
dropTable = new Item[]{Items.iron, Items.lead, Items.steel};
|
||||
}
|
||||
|
||||
for(Item item : dropTable){
|
||||
if(Mathf.chance(0.2)){
|
||||
int amount = Mathf.random(1, 30);
|
||||
CallEntity.createItemDrop(item, amount, unit.x + Mathf.range(2f), unit.y + Mathf.range(2f),
|
||||
unit.getVelocity().x + Mathf.range(0.5f), unit.getVelocity().y + Mathf.range(0.5f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -126,6 +126,8 @@ public class DesktopInput extends InputHandler{
|
||||
public void update(){
|
||||
if(player.isDead() || state.is(State.menu) || ui.hasDialog()) return;
|
||||
|
||||
player.isBoosting = Inputs.keyDown("dash");
|
||||
|
||||
//deslect if not placing
|
||||
if(!isPlacing() && mode == placing){
|
||||
mode = none;
|
||||
|
||||
@@ -104,6 +104,7 @@ public class Packets {
|
||||
public long timeSent;
|
||||
//player snapshot data
|
||||
public float x, y, pointerX, pointerY, rotation, baseRotation, xv, yv;
|
||||
public boolean boosting;
|
||||
|
||||
@Override
|
||||
public void write(ByteBuffer buffer) {
|
||||
@@ -117,6 +118,7 @@ public class Packets {
|
||||
buffer.putFloat(player.y);
|
||||
buffer.putFloat(player.pointerX);
|
||||
buffer.putFloat(player.pointerY);
|
||||
buffer.put(player.isBoosting ? (byte)1 : 0);
|
||||
|
||||
buffer.put((byte)(Mathf.clamp(player.getVelocity().x, -Unit.maxAbsVelocity, Unit.maxAbsVelocity) * Unit.velocityPercision));
|
||||
buffer.put((byte)(Mathf.clamp(player.getVelocity().y, -Unit.maxAbsVelocity, Unit.maxAbsVelocity) * Unit.velocityPercision));
|
||||
@@ -135,6 +137,7 @@ public class Packets {
|
||||
y = buffer.getFloat();
|
||||
pointerX = buffer.getFloat();
|
||||
pointerY = buffer.getFloat();
|
||||
boosting = buffer.get() == 1;
|
||||
xv = buffer.get() / Unit.velocityPercision;
|
||||
yv = buffer.get() / Unit.velocityPercision;
|
||||
rotation = buffer.getShort()/2f;
|
||||
|
||||
@@ -9,6 +9,7 @@ public class Mech extends Upgrade {
|
||||
|
||||
public float speed = 1.1f;
|
||||
public float maxSpeed = 1.1f;
|
||||
public float boostSpeed = 0.75f;
|
||||
public float drag = 0.4f;
|
||||
public float mass = 1f;
|
||||
public float armor = 1f;
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package io.anuke.mindustry.ui.fragments;
|
||||
|
||||
import com.badlogic.gdx.graphics.Color;
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.math.Interpolation;
|
||||
import com.badlogic.gdx.utils.Array;
|
||||
import io.anuke.mindustry.core.GameState.State;
|
||||
import io.anuke.mindustry.entities.Player;
|
||||
import io.anuke.mindustry.entities.TileEntity;
|
||||
import io.anuke.mindustry.input.InputHandler;
|
||||
import io.anuke.mindustry.type.Category;
|
||||
import io.anuke.mindustry.type.ItemStack;
|
||||
@@ -116,6 +118,7 @@ public class BlocksFragment implements Fragment{
|
||||
|
||||
int cati = 0;
|
||||
int checkedi = 0;
|
||||
int rowsUsed = 0;
|
||||
|
||||
//add categories
|
||||
for (Category cat : Category.values()) {
|
||||
@@ -184,6 +187,8 @@ public class BlocksFragment implements Fragment{
|
||||
}
|
||||
|
||||
image.getImageCell().setActor(istack).size(size);
|
||||
image.getStyle().imageUpColor = Color.WHITE;
|
||||
image.getStyle().imageDisabledColor = Color.GRAY;
|
||||
image.addChild(istack);
|
||||
image.setTouchable(Touchable.enabled);
|
||||
image.getImage().remove();
|
||||
@@ -225,9 +230,23 @@ public class BlocksFragment implements Fragment{
|
||||
}
|
||||
});
|
||||
|
||||
image.setDisabled(() -> {
|
||||
TileEntity entity = players[0].getClosestCore();
|
||||
|
||||
if(entity == null) return true;
|
||||
|
||||
for(ItemStack s : r.requirements){
|
||||
if(!entity.items.hasItem(s.item, Mathf.ceil(s.amount/2f))){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
recipeTable.add(image).size(size + 8);
|
||||
|
||||
image.update(() -> {
|
||||
image.getImage().setColor(image.isDisabled() ? Color.GRAY : Color.WHITE);
|
||||
for(Player player : players){
|
||||
if(control.input(player.playerIndex).recipe == r){
|
||||
image.setChecked(true);
|
||||
@@ -238,6 +257,7 @@ public class BlocksFragment implements Fragment{
|
||||
});
|
||||
|
||||
if (i % rows == rows - 1) {
|
||||
rowsUsed = Math.max((i+1)/rows, rowsUsed);
|
||||
recipeTable.row();
|
||||
}
|
||||
|
||||
@@ -252,7 +272,7 @@ public class BlocksFragment implements Fragment{
|
||||
}
|
||||
|
||||
selectTable.row();
|
||||
selectTable.add(stack).growX().left().top().colspan(Category.values().length).padBottom(-5).height((size + 12)*maxrow);
|
||||
selectTable.add(stack).growX().left().top().colspan(Category.values().length).padBottom(-5).height((size + 12)*rowsUsed);
|
||||
}
|
||||
|
||||
void toggle(boolean show, float t, Interpolation ip){
|
||||
@@ -305,14 +325,7 @@ public class BlocksFragment implements Fragment{
|
||||
|
||||
for(ItemStack stack : recipe.requirements){
|
||||
requirements.addImage(stack.item.region).size(8*3);
|
||||
Label reqlabel = new Label("");
|
||||
|
||||
reqlabel.update(() -> {
|
||||
int current = stack.amount;
|
||||
String text = Mathf.clamp(current, 0, stack.amount) + "/" + stack.amount;
|
||||
|
||||
reqlabel.setText(text);
|
||||
});
|
||||
Label reqlabel = new Label(() -> Mathf.clamp(stack.amount, 0, stack.amount) + "/" + stack.amount);
|
||||
|
||||
requirements.add(reqlabel).left();
|
||||
requirements.row();
|
||||
|
||||
@@ -36,7 +36,8 @@ public class ColorMapper{
|
||||
"c3a490", pair(Blocks.iron),
|
||||
"161616", pair(Blocks.coal),
|
||||
"6277bc", pair(Blocks.titanium),
|
||||
"83bc58", pair(Blocks.thorium),
|
||||
"c594dc", pair(Blocks.thorium),
|
||||
"9790b5", pair(Blocks.lead),
|
||||
"000000", pair(Blocks.space)
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user