From 1cd30e90579b93616ec68ab99acb8a2847ac7a47 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Mar 2018 18:02:35 -0400 Subject: [PATCH] Mass-deletion of enemy code --- .../sprites/blocks/extra/cross-3.png | Bin 0 -> 268 bytes .../blocks/production/coalextractor.png | Bin 274 -> 248 bytes .../blocks/production/titaniumextractor.png | Bin 260 -> 269 bytes core/assets/shaders/oil.fragment | 4 +- core/assets/sprites/sprites.png | Bin 92790 -> 92807 bytes core/assets/version.properties | 4 +- core/src/Mindustry.gwt.xml | 2 +- core/src/io/anuke/mindustry/Vars.java | 4 +- core/src/io/anuke/mindustry/ai/Pathfind.java | 117 +------ core/src/io/anuke/mindustry/core/Control.java | 3 +- core/src/io/anuke/mindustry/core/Logic.java | 31 +- .../io/anuke/mindustry/core/NetClient.java | 6 +- .../io/anuke/mindustry/core/NetServer.java | 4 +- .../src/io/anuke/mindustry/core/Renderer.java | 6 +- .../io/anuke/mindustry/entities/Bullet.java | 4 +- .../anuke/mindustry/entities/BulletType.java | 10 +- .../io/anuke/mindustry/entities/Player.java | 107 ++++--- .../anuke/mindustry/entities/SyncEntity.java | 64 ++-- .../src/io/anuke/mindustry/entities/Unit.java | 15 + .../mindustry/entities/effect/DamageArea.java | 6 +- .../mindustry/entities/effect/Shield.java | 4 +- .../mindustry/entities/effect/TeslaOrb.java | 12 +- .../enemies/{Enemy.java => BaseUnit.java} | 77 +---- .../mindustry/entities/enemies/EnemyType.java | 289 ------------------ .../entities/enemies/EnemyTypes.java | 32 -- .../mindustry/entities/enemies/UnitType.java | 81 +++++ .../mindustry/entities/enemies/UnitTypes.java | 5 + .../entities/enemies/types/BlastType.java | 54 ---- .../entities/enemies/types/EmpType.java | 19 -- .../entities/enemies/types/FastType.java | 17 -- .../entities/enemies/types/FlamerType.java | 20 -- .../entities/enemies/types/FortressType.java | 60 ---- .../entities/enemies/types/HealerType.java | 99 ------ .../entities/enemies/types/MortarType.java | 21 -- .../entities/enemies/types/RapidType.java | 21 -- .../entities/enemies/types/StandardType.java | 10 - .../entities/enemies/types/TankType.java | 30 -- .../entities/enemies/types/TargetType.java | 64 ---- .../entities/enemies/types/TitanType.java | 47 --- .../io/anuke/mindustry/game/EnemySpawn.java | 8 +- .../io/anuke/mindustry/game/EventType.java | 4 +- core/src/io/anuke/mindustry/game/Team.java | 15 + .../io/anuke/mindustry/game/WaveCreator.java | 122 +------- .../mindustry/graphics/BlockRenderer.java | 6 +- .../anuke/mindustry/io/versions/Save16.java | 14 +- .../src/io/anuke/mindustry/net/NetEvents.java | 4 +- .../io/anuke/mindustry/net/ServerDebug.java | 4 +- .../src/io/anuke/mindustry/resource/Mech.java | 9 +- .../io/anuke/mindustry/resource/Upgrade.java | 4 +- .../mindustry/ui/fragments/DebugFragment.java | 10 +- core/src/io/anuke/mindustry/world/Tile.java | 11 + .../anuke/mindustry/world/WorldGenerator.java | 6 +- .../world/blocks/ProductionBlocks.java | 2 +- .../blocks/types/defense/LaserTurret.java | 6 +- .../world/blocks/types/defense/Turret.java | 8 +- .../blocks/types/production/Centrifuge.java | 2 + 56 files changed, 313 insertions(+), 1271 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/extra/cross-3.png create mode 100644 core/src/io/anuke/mindustry/entities/Unit.java rename core/src/io/anuke/mindustry/entities/enemies/{Enemy.java => BaseUnit.java} (51%) delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/EnemyType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/EnemyTypes.java create mode 100644 core/src/io/anuke/mindustry/entities/enemies/UnitType.java create mode 100644 core/src/io/anuke/mindustry/entities/enemies/UnitTypes.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/BlastType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/EmpType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/FastType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/FlamerType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/FortressType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/HealerType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/MortarType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/RapidType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/StandardType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/TankType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/TargetType.java delete mode 100644 core/src/io/anuke/mindustry/entities/enemies/types/TitanType.java create mode 100644 core/src/io/anuke/mindustry/game/Team.java diff --git a/core/assets-raw/sprites/blocks/extra/cross-3.png b/core/assets-raw/sprites/blocks/extra/cross-3.png new file mode 100644 index 0000000000000000000000000000000000000000..60567dc1bf0ec33983b89bc80b732ade14ebd9f3 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoI14-?iy0WWg+Z8+Vb&aw z3ic9DUsv`=%zVPuLJxiBO=e(VkSuYHC~?lu%}vcKVQ?-=O)N=GQ7F$W$xv|j^bH7a zTzWhlsR;7 zW)iEB-0bP0l+XkKq48I` literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/production/coalextractor.png b/core/assets-raw/sprites/blocks/production/coalextractor.png index a0ab6216b937afc81b2b30189bbd1d78b64d08f8..27e85b12589b5ff6fa99a5dc4f1ac18ebfe7e66b 100644 GIT binary patch delta 184 zcmbQl^n-DNiYjM;M`SSr1Gg{;GcwGYBf-GHz+U3%>&pI!nNP@6_eAy=@rltI^+ld8 zjv*44YkN2Hx+wBE%g39uoU%D{km*Z~!(_u5&6SIC4vH>!`E_>b=4AWnTd%F%%JkqJ zLknBQ8J=?Y(90oLdF&ag-{-hl@7Z*17eiWGN6H7+ALa7KkLNHuWWQ~lU;K|_Z#jdD nO8Oz~2C_wZ&UnVwUdE?fq}!*)z4*}Q$iB}qRvNz delta 184 zcmeytIEiV33O`$tx4R3&e-K=-clqRrigH{JIYotyb+4RnHlOIJQD5ch;us=vxwLO1 zFN-1%OZ#Qf#GP`l3YediJZLdm(Ojide$f5H{6A^RZ`W+w@moxg!AQ8_FhjnJ!E=@c z-}w$mJpNQXE6pu!(##n*V>RCGQ)UWPRbmJTb!j>CNAJ&RVZk+9*R5Rjy}jeZyk~PJ pM`<4rW$?<*mAClzemeg~bK?&J2g>eWW?*1o@O1TaS?83{1OO@dP)Yy* diff --git a/core/assets-raw/sprites/blocks/production/titaniumextractor.png b/core/assets-raw/sprites/blocks/production/titaniumextractor.png index 82d2b8584858c387d449d60b3275cc7e86277393..81dca5c35a45ecfc028939807d28a1788b08c4fe 100644 GIT binary patch delta 178 zcmZo+>SdZ>&-I9zPsm)%JFI@=L{E+Sc25__5Q)pRy&HL(9Ryg|zXbWNtS8RR5f6UTuB-$sBu4RfapV4V##^Oe!e9mb|9G_E^;& zrag}rn|bfvkdU_FyvHJA<^&J!cYWfA_j68q@!tOzN0sk%yF&%hb!~a`84Zlz)C5N` j$WCCHm9=B8T7$l|nc?mWDh?_P3=9mOu6{1-oD!MJLA)) zePK%F*BC|1pI7c@RN(Y%?&IL9U*_?sVjt6kcRPN6FxY&*-A;e8((lGtBiTvU%)`s= aM0VacJnQapGme3Qfx*+&&t;ucLK6TgIYpZQ diff --git a/core/assets/shaders/oil.fragment b/core/assets/shaders/oil.fragment index a1077bb9f1..52701e09a2 100644 --- a/core/assets/shaders/oil.fragment +++ b/core/assets/shaders/oil.fragment @@ -71,8 +71,8 @@ void main() { color = old; } - float n1 = snoise(coords / 20.0 + vec2(-time) / 340.0); - float n2 = snoise((coords + vec2(632.0)) / 7.0 + vec2(0.0, time) / 310.0); + float n1 = snoise(coords / 22.0 + vec2(-time) / 540.0); + float n2 = snoise((coords + vec2(632.0)) / 8.0 + vec2(0.0, time) / 510.0); float r = (n1 + n2) / 2.0; diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index b77326b83e981920cec8ed8641c5b6a362994e88..91e95d302bd1d1adc90a457879e68fbb1a0e5a1e 100644 GIT binary patch delta 61749 zcmex%g|+=E>jpy!IsUiHbB)ej=|AWE`|EEWh8yctA8@gj>}%G3zG}horJFq^gc$i^ z7zEPZRNCA088N)Lb7gaeq%mW?mBfYHC*~x}8~xid-=DMM;Y7iOHzj2lE?B;>n;Xr} zVDYM7`LFG}`74?>F_thSa98b{p&1+=uW!G^MQNgk$}Wa8^{$Q$VhMkOn;C4G9rQoA ze|}l{L5J~hQQpMqj3$i@3sjk!r!lI0mQ?*}_2%ot1r6yUFJ`i^$o!~geeXY`vc9fl z-|I)07f4s!IsQAMXZPXh#!rrKe##>|d1Cl)wJ>R8>l%gwZ8mHK=!^tR<9 zx%uo24{9xVE_Exh$(~-wTK{j2Sxf1Y`TxH0-;)Yp=_`=0=iQUj$il#I*x-~r7lQ$h z^4~CqhQe>=@&|s;ui@Hn|5c)9PqlK*j*?~d>F<0Q8n&i#F?iJ6^!Hw2r=j(0`|6i} zN*zD%uRZFtmH+Y`L53U8-mowIAuPk8B_zSd^+=3yPXNP#tUYP3%}?}ePV`U_>Wo_O zvt6err&Z#=m-+wBWvnwU-Tiu%p@bn}#lQF7-SH-c95>v4<_a|UOJ3-|-2e0@qkFk7 zYtIta%k@n@D(5vWxHobNym&8JW!rx4HqV(O)ogO#cjnqLp9xQ1@bv465BzKIGE0=q z*WLYGc5(kcfBBmUrVsL>FKX8Mj{NEd?r^SBu)f?|U{?g{k^!mOZC+ry+ z>TK@2&t%xV%=gOK`iK?#gwyz2*LCl@b!NY24#NRX&h_t$z0;c0-p!rh!NOoyo0uJF za$cUz{Qr-ltN-S{uTc-0#?9F9)%aLNE3>9^f~&9Tmv?t>PiI^pU3qy=ZFJ*-4RvY( z3C0Ju{Vv&)>*cU>Im3tgrusc<42%uI>2YBnujSiw^tj8{GZ}yrm(W%lh6$Y$MIX

IC#`D+}O9%@|0;0D@)$KpJ_Xu&#Ru| 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 =7{pUsBqo2`$g$z?WKD;^N@~+Z88qwdzHP0& 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

X$|_6vZ+)rN8*n|0RkkZ}l?H4O~(T3w0Ti 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 diff --git a/core/assets/version.properties b/core/assets/version.properties index 78d196f785..b817bacf7c 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,7 +1,7 @@ #Autogenerated file. Do not modify. -#Wed Mar 14 14:12:06 EDT 2018 +#Wed Mar 14 17:58:02 EDT 2018 version=release -androidBuildCode=496 +androidBuildCode=499 name=Mindustry code=3.4 build=custom build diff --git a/core/src/Mindustry.gwt.xml b/core/src/Mindustry.gwt.xml index c964b6179d..b99a471915 100644 --- a/core/src/Mindustry.gwt.xml +++ b/core/src/Mindustry.gwt.xml @@ -4,7 +4,7 @@ - + diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index bb4dd8453d..855e4fce3c 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.effect.Shield; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.net.ClientDebug; import io.anuke.mindustry.net.ServerDebug; @@ -136,7 +136,7 @@ public class Vars{ public static Player player; public static final EntityGroup playerGroup = Entities.addGroup(Player.class).enableMapping(); - public static final EntityGroup enemyGroup = Entities.addGroup(Enemy.class).enableMapping(); + public static final EntityGroup enemyGroup = Entities.addGroup(BaseUnit.class).enableMapping(); public static final EntityGroup tileGroup = Entities.addGroup(TileEntity.class, false); public static final EntityGroup bulletGroup = Entities.addGroup(Bullet.class); public static final EntityGroup shieldGroup = Entities.addGroup(Shield.class, false); diff --git a/core/src/io/anuke/mindustry/ai/Pathfind.java b/core/src/io/anuke/mindustry/ai/Pathfind.java index 1d65921692..c2e48d6e03 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfind.java +++ b/core/src/io/anuke/mindustry/ai/Pathfind.java @@ -4,15 +4,14 @@ import com.badlogic.gdx.ai.pfa.PathFinderRequest; import com.badlogic.gdx.ai.pfa.PathSmoother; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.game.SpawnPoint; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Log; -import io.anuke.ucore.util.Mathf; -import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.Vars.state; +import static io.anuke.mindustry.Vars.world; public class Pathfind{ /**Maximum time taken per frame on pathfinding for a single path.*/ @@ -33,91 +32,9 @@ public class Pathfind{ * If the path is not yet calculated, this returns the enemy's position (i. e. "don't move") * @param enemy The enemy to find a path for * @return The position the enemy should move to.*/ - public Vector2 find(Enemy enemy){ - //TODO fix -1/-2 node usage - if(enemy.node == -1 || enemy.node == -2){ - findNode(enemy); - } - - if(enemy.node == -2){ - enemy.node = -1; - } - - if(enemy.node < 0 || world.getSpawns().get(enemy.lane).pathTiles == null){ - return vector.set(enemy.x, enemy.y); - } - - Tile[] path = world.getSpawns().get(enemy.lane).pathTiles; - - if(enemy.node >= path.length){ - enemy.node = -1; - return vector.set(enemy.x, enemy.y); - } - - if(enemy.node <= -1){ - return vector.set(enemy.x, enemy.y); - } - - //TODO documentation on what this does - Tile prev = path[enemy.node - 1]; - - Tile target = path[enemy.node]; - - //a bridge has been broken, re-path - if(!world.passable(target.x, target.y)){ - remakePath(); - return vector.set(enemy.x, enemy.y); - } - - float projectLen = Vector2.dst(prev.worldx(), prev.worldy(), target.worldx(), target.worldy()) / 6f; - - Vector2 projection = projectPoint(prev.worldx(), prev.worldy(), - target.worldx(), target.worldy(), enemy.x, enemy.y); - - boolean canProject = true; - - if(projectLen < 8 || !onLine(projection, prev.worldx(), prev.worldy(), target.worldx(), target.worldy())){ - canProject = false; - }else{ - projection.add(v1.set(projectLen, 0).rotate(Angles.angle(prev.worldx(), prev.worldy(), - target.worldx(), target.worldy()))); - } - - float dst = Vector2.dst(enemy.x, enemy.y, target.worldx(), target.worldy()); - float nlinedist = enemy.node >= path.length - 1 ? 9999 : - pointLineDist(path[enemy.node].worldx(), path[enemy.node].worldy(), - path[enemy.node + 1].worldx(), path[enemy.node + 1].worldy(), enemy.x, enemy.y); - - if(dst < 8 || nlinedist < 8){ - if(enemy.node <= path.length-2) - enemy.node ++; - - target = path[enemy.node]; - } - - if(canProject && projection.dst(enemy.x, enemy.y) < Vector2.dst(target.x, target.y, enemy.x, enemy.y)){ - vector.set(projection); - }else{ - vector.set(target.worldx(), target.worldy()); - } - - //near the core, stop - if(enemy.node == path.length - 1){ - vector.set(target.worldx(), target.worldy()); - } - - return vector; - - } - - /**Re-calculate paths for all enemies. Runs when a path changes while moving.*/ - private void remakePath(){ - for(int i = 0; i < enemyGroup.size(); i ++){ - Enemy enemy = enemyGroup.all().get(i); - enemy.node = -1; - } - - resetPaths(); + public Vector2 find(BaseUnit enemy){ + //TODO! + return v1.set(enemy.x, enemy.y); } /**Update the pathfinders and continue calculating the path if it hasn't been calculated yet. @@ -185,28 +102,6 @@ public class Pathfind{ point.request.statusChanged = true; //IMPORTANT! } - /**For an enemy that was just loaded from a save, find the node in the path it should be following.*/ - void findNode(Enemy enemy){ - if(enemy.lane >= world.getSpawns().size || enemy.lane < 0){ - enemy.lane = 0; - } - - if(world.getSpawns().get(enemy.lane).pathTiles == null){ - return; - } - - Tile[] path = world.getSpawns().get(enemy.lane).pathTiles; - - int closest = findClosest(path, enemy.x, enemy.y); - - closest = Mathf.clamp(closest, 1, path.length-1); - if(closest == -1){ - return; - } - - enemy.node = closest; - } - /**Finds the closest tile to a position, in an array of tiles.*/ private int findClosest(Tile[] tiles, float x, float y){ int cindex = -2; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 59072b4de1..eed3b75d35 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -17,6 +17,7 @@ import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.io.Saves; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.resource.Item; +import io.anuke.mindustry.resource.Mech; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Map; import io.anuke.ucore.UCore; @@ -132,7 +133,7 @@ public class Control extends Module{ player = new Player(); player.name = Settings.getString("name"); - player.isAndroid = android; + player.mech = android ? Mech.standardShip : Mech.standard; player.color.set(Settings.getInt("color")); player.isLocal = true; diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index ef703fd940..562bc2fda7 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -2,25 +2,19 @@ package io.anuke.mindustry.core; import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.game.EnemySpawn; import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.game.EventType.PlayEvent; import io.anuke.mindustry.game.EventType.ResetEvent; import io.anuke.mindustry.game.EventType.WaveEvent; -import io.anuke.mindustry.game.SpawnPoint; import io.anuke.mindustry.game.WaveCreator; -import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.NetEvents; -import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.ProductionBlocks; -import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.modules.Module; -import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.*; @@ -73,30 +67,7 @@ public class Logic extends Module { } for(EnemySpawn spawn : spawns){ - Array spawns = world.getSpawns(); - - for(int lane = 0; lane < spawns.size; lane ++){ - int fl = lane; - Tile tile = spawns.get(lane).start; - int spawnamount = spawn.evaluate(state.wave, lane); - - for(int i = 0; i < spawnamount; i ++){ - float range = 12f; - - Timers.runTask(i*5f, () -> { - - Enemy enemy = new Enemy(spawn.type); - enemy.set(tile.worldx() + Mathf.range(range), tile.worldy() + Mathf.range(range)); - enemy.lane = fl; - enemy.tier = spawn.tier(state.wave, fl); - enemy.add(); - - Effects.effect(Fx.spawn, enemy); - - state.enemies ++; - }); - } - } + //TODO spawn enemies for that spawnpoint } state.wave ++; diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 97cb4668c4..a12c3fc52b 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.SyncEntity; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; @@ -139,7 +139,7 @@ public class NetClient extends Module { SyncEntity entity = (SyncEntity) group.getByID(id); if(entity instanceof Player) players ++; - if(entity instanceof Enemy) enemies ++; + if(entity instanceof BaseUnit) enemies ++; if (entity == null || id == player.id) { if (id != player.id) { @@ -199,7 +199,7 @@ public class NetClient extends Module { }); Net.handleClient(EnemyDeathPacket.class, packet -> { - Enemy enemy = enemyGroup.getByID(packet.id); + BaseUnit enemy = enemyGroup.getByID(packet.id); if (enemy != null){ enemy.type.onDeath(enemy, true); }else if(recent.get(packet.id) != null){ diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index bca30b9f46..a04470aede 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -85,7 +85,7 @@ public class NetServer extends Module{ player.isAdmin = admins.isAdmin(Net.getConnection(id).address); player.clientid = id; player.name = packet.name; - player.isAndroid = packet.android; + player.mech = packet.android ? Mech.standardShip : Mech.standard; player.set(world.getSpawnX(), world.getSpawnY()); player.setNet(player.x, player.y); player.setNet(player.x, player.y); @@ -219,7 +219,7 @@ public class NetServer extends Module{ Net.handleServer(UpgradePacket.class, (id, packet) -> { Player player = connections.get(id); - Weapon weapon = (Weapon) Upgrade.getByID(packet.id); + Weapon weapon = Upgrade.getByID(packet.id); if (!weapons.containsKey(player.name)) weapons.put(player.name, new ByteArray()); if (!weapons.get(player.name).contains(weapon.id)) weapons.get(player.name).add(weapon.id); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 5dea8438a6..0667505660 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -15,7 +15,7 @@ import com.badlogic.gdx.utils.Pools; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.SyncEntity; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.game.SpawnPoint; import io.anuke.mindustry.graphics.BlockRenderer; import io.anuke.mindustry.graphics.Shaders; @@ -282,7 +282,7 @@ public class Renderer extends RendererModule{ Graphics.surface(indicatorSurface); Draw.color(Color.RED); - for(Enemy enemy : enemyGroup.all()) { + for(BaseUnit enemy : enemyGroup.all()) { if (rect.setSize(camera.viewportWidth, camera.viewportHeight).setCenter(camera.position.x, camera.position.y) .overlaps(enemy.hitbox.getRect(enemy.x, enemy.y))) { @@ -503,7 +503,7 @@ public class Renderer extends RendererModule{ if((!debug || showUI) && Settings.getBool("healthbars")){ //draw entity health bars - for(Enemy entity : enemyGroup.all()){ + for(BaseUnit entity : enemyGroup.all()){ drawHealth(entity); } diff --git a/core/src/io/anuke/mindustry/entities/Bullet.java b/core/src/io/anuke/mindustry/entities/Bullet.java index 279993b4c4..60e43ddd4f 100644 --- a/core/src/io/anuke/mindustry/entities/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/Bullet.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.entities; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.entities.BulletEntity; import io.anuke.ucore.entities.Entity; @@ -37,7 +37,7 @@ public class Bullet extends BulletEntity{ } public boolean collidesTiles(){ - return owner instanceof Enemy; + return owner instanceof BaseUnit; } @Override diff --git a/core/src/io/anuke/mindustry/entities/BulletType.java b/core/src/io/anuke/mindustry/entities/BulletType.java index 4a3963ecc9..386b86c745 100644 --- a/core/src/io/anuke/mindustry/entities/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/BulletType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.entities; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.effect.DamageArea; import io.anuke.mindustry.entities.effect.EMP; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.graphics.Fx; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.core.Effects; @@ -122,7 +122,7 @@ public abstract class BulletType extends BaseBulletType{ Effects.effect(Fx.shellsmoke, b); Effects.effect(Fx.shellexplosion, b); - DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 25f, (int)(damage * 2f/3f)); + DamageArea.damage(!(b.owner instanceof BaseUnit), b.x, b.y, 25f, (int)(damage * 2f/3f)); } }, flak = new BulletType(2.9f, 8) { @@ -202,7 +202,7 @@ public abstract class BulletType extends BaseBulletType{ Effects.effect(Fx.shellsmoke, b); Effects.effect(Fx.shockwaveSmall, b); - DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 50f, (int)(damage * 2f/3f)); + DamageArea.damage(!(b.owner instanceof BaseUnit), b.x, b.y, 50f, (int)(damage * 2f/3f)); } }, yellowshell = new BulletType(1.2f, 20){ @@ -233,7 +233,7 @@ public abstract class BulletType extends BaseBulletType{ Effects.effect(Fx.shellsmoke, b); Effects.effect(Fx.shockwaveSmall, b); - DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 25f, (int)(damage * 2f/3f)); + DamageArea.damage(!(b.owner instanceof BaseUnit), b.x, b.y, 25f, (int)(damage * 2f/3f)); } }, blast = new BulletType(1.1f, 90){ @@ -371,7 +371,7 @@ public abstract class BulletType extends BaseBulletType{ Effects.effect(Fx.clusterbomb, b); - DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 35f, damage); + DamageArea.damage(!(b.owner instanceof BaseUnit), b.x, b.y, 35f, damage); } }, vulcan = new BulletType(4.5f, 12) { diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 0a53034999..a878be07f2 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -23,17 +23,14 @@ import java.nio.ByteBuffer; import static io.anuke.mindustry.Vars.*; -public class Player extends SyncEntity{ +public class Player extends Unit{ static final float speed = 1.1f; static final float dashSpeed = 1.8f; static final int timerDash = 0; - static final int timerShootLeft = 1; - static final int timerShootRight = 2; static final int timerRegen = 3; public String name = "name"; - public boolean isAndroid; public boolean isAdmin; public Color color = new Color(); @@ -60,9 +57,14 @@ public class Player extends SyncEntity{ heal(); } + @Override + public float getMass(){ + return mech.mass; + } + @Override public void damage(int amount){ - if(debug || isAndroid) return; + if(debug || mech.flying) return; health -= amount; if(health <= 0 && !dead && isLocal){ //remote players don't die normally @@ -79,7 +81,7 @@ public class Player extends SyncEntity{ return false; } } - return !isDead() && super.collides(other) && !isAndroid; + return !isDead() && super.collides(other) && !mech.flying; } @Override @@ -113,34 +115,33 @@ public class Player extends SyncEntity{ @Override public void drawSmooth(){ - if((debug && (!showPlayer || !showUI)) || (isAndroid && isLocal) || dead) return; + if((debug && (!showPlayer || !showUI)) || dead) return; boolean snap = snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate") && isLocal; - String part = isAndroid ? "ship" : "mech"; + String mname = "mech-" + mech.name; Shaders.outline.color.set(getColor()); Shaders.outline.lighten = 0f; - Shaders.outline.region = Draw.region(part + "-" + mech.name); + Shaders.outline.region = Draw.region(mname); Shaders.outline.apply(); - if(!isAndroid) { - for (int i : Mathf.signs) { - Weapon weapon = i < 0 ? weaponLeft : weaponRight; - tr.trns(angle - 90, 3*i, 2); - float w = i > 0 ? -8 : 8; - if(snap){ - Draw.rect(weapon.name + "-equip", (int)x + tr.x, (int)y + tr.y, w, 8, angle - 90); - }else{ - Draw.rect(weapon.name + "-equip", x + tr.x, y + tr.y, w, 8, angle - 90); - } + for (int i : Mathf.signs) { + Weapon weapon = i < 0 ? weaponLeft : weaponRight; + tr.trns(rotation - 90, 3*i, 2); + float w = i > 0 ? -8 : 8; + if(snap){ + Draw.rect(weapon.name + "-equip", (int)x + tr.x, (int)y + tr.y, w, 8, rotation - 90); + }else{ + Draw.rect(weapon.name + "-equip", x + tr.x, y + tr.y, w, 8, rotation - 90); } } + if(snap){ - Draw.rect(part + "-" + mech.name, (int)x, (int)y, angle-90); + Draw.rect(mname, (int)x, (int)y, rotation -90); }else{ - Draw.rect(part + "-" + mech.name, x, y, angle-90); + Draw.rect(mname, x, y, rotation -90); } Graphics.flush(); @@ -148,16 +149,25 @@ public class Player extends SyncEntity{ @Override public void update(){ - if(!isLocal || isAndroid){ - if(isAndroid && isLocal){ - angle = Mathf.slerpDelta(angle, targetAngle, 0.2f); - } - if(!isLocal) interpolate(); + if(!isLocal){ + interpolate(); return; } if(isDead()) return; + if(mech.flying){ + updateFlying(); + }else{ + updateMech(); + } + + x = Mathf.clamp(x, 0, world.width() * tilesize); + y = Mathf.clamp(y, 0, world.height() * tilesize); + } + + protected void updateMech(){ + Tile tile = world.tileWorld(x, y); //if player is in solid block @@ -175,14 +185,14 @@ public class Player extends SyncEntity{ if(ui.chatfrag.chatOpen()) return; dashing = Inputs.keyDown("dash"); - + float speed = dashing ? (debug ? Player.dashSpeed * 5f : Player.dashSpeed) : Player.speed; - + if(health < maxhealth && timer.get(timerRegen, 20)) health ++; health = Mathf.clamp(health, -1, maxhealth); - + movement.set(0, 0); float xa = Inputs.getAxis("move_x"); @@ -192,7 +202,7 @@ public class Player extends SyncEntity{ movement.y += ya*speed; movement.x += xa*speed; - + boolean shooting = !Inputs.keyDown("dash") && Inputs.keyDown("shoot") && control.input().recipe == null && !ui.hasMouse() && !control.input().onConfigurable(); @@ -200,30 +210,31 @@ public class Player extends SyncEntity{ weaponLeft.update(player, true); weaponRight.update(player, false); } - + if(dashing && timer.get(timerDash, 3) && movement.len() > 0){ - Effects.effect(Fx.dashsmoke, x + Angles.trnsx(angle + 180f, 3f), y + Angles.trnsy(angle + 180f, 3f)); + Effects.effect(Fx.dashsmoke, x + Angles.trnsx(rotation + 180f, 3f), y + Angles.trnsy(rotation + 180f, 3f)); } - + movement.limit(speed); - + if(!noclip){ move(movement.x*Timers.delta(), movement.y*Timers.delta()); }else{ x += movement.x*Timers.delta(); y += movement.y*Timers.delta(); } - + if(!shooting){ if(!movement.isZero()) - angle = Mathf.slerpDelta(angle, movement.angle(), 0.13f); + rotation = Mathf.slerpDelta(rotation, movement.angle(), 0.13f); }else{ float angle = Angles.mouseAngle(x, y); - this.angle = Mathf.slerpDelta(this.angle, angle, 0.1f); + this.rotation = Mathf.slerpDelta(this.rotation, angle, 0.1f); } + } - x = Mathf.clamp(x, 0, world.width() * tilesize); - y = Mathf.clamp(y, 0, world.height() * tilesize); + protected void updateFlying(){ + rotation = Mathf.slerpDelta(rotation, targetAngle, 0.2f); } @Override @@ -233,7 +244,7 @@ public class Player extends SyncEntity{ @Override public String toString() { - return "Player{" + id + ", android=" + isAndroid + ", local=" + isLocal + ", " + x + ", " + y + "}\n"; + return "Player{" + id + ", mech=" + mech.name + ", local=" + isLocal + ", " + x + ", " + y + "}\n"; } @Override @@ -242,7 +253,7 @@ public class Player extends SyncEntity{ buffer.put(name.getBytes()); buffer.put(weaponLeft.id); buffer.put(weaponRight.id); - buffer.put(isAndroid ? 1 : (byte)0); + buffer.put(mech.id); buffer.put(isAdmin ? 1 : (byte)0); buffer.putInt(Color.rgba8888(color)); buffer.putFloat(x); @@ -255,9 +266,9 @@ public class Player extends SyncEntity{ byte[] n = new byte[nlength]; buffer.get(n); name = new String(n); - weaponLeft = (Weapon) Upgrade.getByID(buffer.get()); - weaponRight = (Weapon) Upgrade.getByID(buffer.get()); - isAndroid = buffer.get() == 1; + weaponLeft = Upgrade.getByID(buffer.get()); + weaponRight = Upgrade.getByID(buffer.get()); + mech = Upgrade.getByID(buffer.get()); isAdmin = buffer.get() == 1; color.set(buffer.getInt()); x = buffer.getFloat(); @@ -274,7 +285,7 @@ public class Player extends SyncEntity{ data.putFloat(interpolator.target.x); data.putFloat(interpolator.target.y); } - data.putFloat(angle); + data.putFloat(rotation); data.putShort((short)health); data.put((byte)(dashing ? 1 : 0)); } @@ -299,10 +310,10 @@ public class Player extends SyncEntity{ Interpolator i = interpolator; - float tx = x + Angles.trnsx(angle + 180f, 4f); - float ty = y + Angles.trnsy(angle + 180f, 4f); + float tx = x + Angles.trnsx(rotation + 180f, 4f); + float ty = y + Angles.trnsy(rotation + 180f, 4f); - if(isAndroid && i.target.dst(i.last) > 2f && timer.get(timerDash, 1)){ + if(mech.flying && i.target.dst(i.last) > 2f && timer.get(timerDash, 1)){ Effects.effect(Fx.dashsmoke, tx, ty); } diff --git a/core/src/io/anuke/mindustry/entities/SyncEntity.java b/core/src/io/anuke/mindustry/entities/SyncEntity.java index 21f3000a24..1e34c724e8 100644 --- a/core/src/io/anuke/mindustry/entities/SyncEntity.java +++ b/core/src/io/anuke/mindustry/entities/SyncEntity.java @@ -3,9 +3,7 @@ package io.anuke.mindustry.entities; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.utils.ObjectIntMap; import com.badlogic.gdx.utils.TimeUtils; -import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.DestructibleEntity; import io.anuke.ucore.util.Mathf; @@ -14,24 +12,13 @@ import java.nio.ByteBuffer; import static io.anuke.mindustry.Vars.threads; +/**Base class for any entity that needs to be synced across clients.*/ public abstract class SyncEntity extends DestructibleEntity{ - private static ObjectIntMap> writeSizes = new ObjectIntMap<>(); - protected transient Interpolator interpolator = new Interpolator(); - - //smoothed position/angle + /**smoothed position and rotation*/ private Vector3 spos = new Vector3(); - - public float angle; - - static{ - setWriteSize(Enemy.class, 4 + 4 + 2 + 2); - setWriteSize(Player.class, 4 + 4 + 4 + 2 + 1); - } - - public static boolean isSmoothing(){ - return threads.isEnabled() && threads.getFPS() <= Gdx.graphics.getFramesPerSecond() / 2f; - } + /**the general rotation.*/ + public float rotation; public abstract void writeSpawn(ByteBuffer data); public abstract void readSpawn(ByteBuffer data); @@ -39,56 +26,47 @@ public abstract class SyncEntity extends DestructibleEntity{ public abstract void write(ByteBuffer data); public abstract void read(ByteBuffer data, long time); + /**Interpolate everything needed. Should be called in update() for non-local entities.*/ public void interpolate(){ interpolator.update(); x = interpolator.pos.x; y = interpolator.pos.y; - angle = interpolator.angle; + rotation = interpolator.rotation; } + /**Same as draw, but for interpolated drawing at low tick speeds.*/ + public abstract void drawSmooth(); + + /**Do not override, use drawSmooth instead.*/ @Override public final void draw(){ - final float x = this.x, y = this.y, angle = this.angle; + final float x = this.x, y = this.y, rotation = this.rotation; //interpolates data at low tick speeds. if(isSmoothing()){ if(Vector2.dst(spos.x, spos.y, x, y) > 128){ - spos.set(x, y, angle); + spos.set(x, y, rotation); } this.x = spos.x = Mathf.lerpDelta(spos.x, x, 0.2f); this.y = spos.y = Mathf.lerpDelta(spos.y, y, 0.2f); - this.angle = spos.z = Mathf.slerpDelta(spos.z, angle, 0.3f); + this.rotation = spos.z = Mathf.slerpDelta(spos.z, rotation, 0.3f); } drawSmooth(); this.x = x; this.y = y; - this.angle = angle; + this.rotation = rotation; } + /**Returns smoothed position. x = x, y = y, z = rotation.*/ public Vector3 getDrawPosition(){ - return isSmoothing() ? spos : spos.set(x, y, angle); - } - - public void drawSmooth(){} - - public int getWriteSize(){ - return getWriteSize(getClass()); - } - - public static int getWriteSize(Class type){ - int i = writeSizes.get(type, -1); - if(i == -1) throw new RuntimeException("Write size for class \"" + type + "\" is not defined!"); - return i; - } - - protected static void setWriteSize(Class type, int size){ - writeSizes.put(type, size); + return isSmoothing() ? spos : spos.set(x, y, rotation); } + /**Set position and interpolator position.*/ public T setNet(float x, float y){ set(x, y); interpolator.target.set(x, y); @@ -98,6 +76,10 @@ public abstract class SyncEntity extends DestructibleEntity{ return (T)this; } + private static boolean isSmoothing(){ + return threads.isEnabled() && threads.getFPS() <= Gdx.graphics.getFramesPerSecond() / 2f; + } + public static class Interpolator { //used for movement public Vector2 target = new Vector2(); @@ -108,7 +90,7 @@ public abstract class SyncEntity extends DestructibleEntity{ //current state public Vector2 pos = new Vector2(); - public float angle; + public float rotation; public void read(float cx, float cy, float x, float y, float angle, long sent){ targetrot = angle; @@ -124,7 +106,7 @@ public abstract class SyncEntity extends DestructibleEntity{ Mathf.lerp2(pos.set(last), target, time); - angle = Mathf.slerpDelta(angle, targetrot, 0.6f); + rotation = Mathf.slerpDelta(rotation, targetrot, 0.6f); if(target.dst(pos) > 128){ pos.set(target); diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java new file mode 100644 index 0000000000..61467c19a9 --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -0,0 +1,15 @@ +package io.anuke.mindustry.entities; + +import com.badlogic.gdx.math.Vector2; +import io.anuke.mindustry.game.Team; + +public abstract class Unit extends SyncEntity { + //total duration of hit effect + public static final float hitDuration = 5f; + + public Team team = Team.blue; + public Vector2 velocity = new Vector2(); + public float hitTime; + + public abstract float getMass(); +} diff --git a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java index c1ce0382f9..d58ba9727a 100644 --- a/core/src/io/anuke/mindustry/entities/effect/DamageArea.java +++ b/core/src/io/anuke/mindustry/entities/effect/DamageArea.java @@ -45,7 +45,7 @@ public class DamageArea{ rect.height += expand*2; Consumer cons = e -> { - if(e == owner || (e instanceof Player && ((Player)e).isAndroid)) return; + if(e == owner) return; DestructibleEntity enemy = (DestructibleEntity) e; Rectangle other = enemy.hitbox.getRect(enemy.x, enemy.y); other.y -= expand; @@ -69,7 +69,7 @@ public class DamageArea{ damage(true, x, y, radius, damage); for(Player player : playerGroup.all()){ - if(player.isAndroid) continue; + //if(player.isAndroid) continue; int amount = calculateDamage(x, y, player.x, player.y, radius, damage); player.damage(amount); } @@ -78,7 +78,7 @@ public class DamageArea{ public static void damage(boolean enemies, float x, float y, float radius, int damage){ Consumer cons = entity -> { DestructibleEntity enemy = (DestructibleEntity)entity; - if(enemy.distanceTo(x, y) > radius || (entity instanceof Player && ((Player)entity).isAndroid)){ + if(enemy.distanceTo(x, y) > radius){ return; } int amount = calculateDamage(x, y, enemy.x, enemy.y, radius, damage); diff --git a/core/src/io/anuke/mindustry/entities/effect/Shield.java b/core/src/io/anuke/mindustry/entities/effect/Shield.java index 0b46e777a7..e829f6c30a 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Shield.java +++ b/core/src/io/anuke/mindustry/entities/effect/Shield.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.entities.effect; import com.badlogic.gdx.math.Interpolation; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock; import io.anuke.ucore.core.Timers; @@ -55,7 +55,7 @@ public class Shield extends Entity{ Entities.getNearby(bulletGroup, x, y, block.shieldRadius * 2*uptime + 10, entity->{ BulletEntity bullet = (BulletEntity)entity; - if((bullet.owner instanceof Enemy || hitPlayers)){ + if((bullet.owner instanceof BaseUnit || hitPlayers)){ float dst = entity.distanceTo(this); diff --git a/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java b/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java index eb35433236..89b84e40e5 100644 --- a/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java +++ b/core/src/io/anuke/mindustry/entities/effect/TeslaOrb.java @@ -4,7 +4,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectSet; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.graphics.Fx; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; @@ -19,7 +19,7 @@ import static io.anuke.mindustry.Vars.enemyGroup; public class TeslaOrb extends Entity{ private Array points = new Array<>(); - private ObjectSet hit = new ObjectSet<>(); + private ObjectSet hit = new ObjectSet<>(); private int damage = 0; private float range = 0; private float lifetime = 30f; @@ -47,10 +47,10 @@ public class TeslaOrb extends Entity{ Array enemies = Entities.getNearby(enemyGroup, curx, cury, range*2f); for(SolidEntity entity : enemies){ - if(entity != null && entity.distanceTo(curx, cury) < range && !hit.contains((Enemy)entity)){ - hit.add((Enemy)entity); + if(entity != null && entity.distanceTo(curx, cury) < range && !hit.contains((BaseUnit)entity)){ + hit.add((BaseUnit)entity); points.add(new Vector2(entity.x + Mathf.range(shake), entity.y + Mathf.range(shake))); - damageEnemy((Enemy)entity); + damageEnemy((BaseUnit)entity); curx = entity.x; cury = entity.y; break; @@ -63,7 +63,7 @@ public class TeslaOrb extends Entity{ } } - void damageEnemy(Enemy enemy){ + void damageEnemy(BaseUnit enemy){ enemy.damage(damage); Effects.effect(Fx.laserhit, enemy.x + Mathf.range(2f), enemy.y + Mathf.range(2f)); } diff --git a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java b/core/src/io/anuke/mindustry/entities/enemies/BaseUnit.java similarity index 51% rename from core/src/io/anuke/mindustry/entities/enemies/Enemy.java rename to core/src/io/anuke/mindustry/entities/enemies/BaseUnit.java index 8050b08d20..19c2c11c26 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/Enemy.java +++ b/core/src/io/anuke/mindustry/entities/enemies/BaseUnit.java @@ -1,50 +1,31 @@ package io.anuke.mindustry.entities.enemies; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.math.Vector2; import io.anuke.mindustry.entities.Bullet; -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.SyncEntity; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.NetEvents; +import io.anuke.mindustry.entities.Unit; import io.anuke.ucore.entities.Entity; import io.anuke.ucore.entities.SolidEntity; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Timer; -import io.anuke.ucore.util.Translator; import java.nio.ByteBuffer; import static io.anuke.mindustry.Vars.enemyGroup; -public class Enemy extends SyncEntity { - public EnemyType type; - +public class BaseUnit extends Unit { + public UnitType type; public Timer timer = new Timer(5); - public float idletime = 0f; - public int lane; - public int node = -1; - - public Enemy spawner; - public int spawned; - - public Vector2 velocity = new Vector2(); - public Vector2 totalMove = new Vector2(); - public Vector2 tpos = new Vector2(-999, -999); public Entity target; - public float hitTime; - public int tier = 1; - public TextureRegion region; - public Translator tr = new Translator(); - - public Enemy(EnemyType type){ + public BaseUnit(UnitType type){ this.type = type; } /**internal constructor used for deserialization, DO NOT USE*/ - public Enemy(){} + public BaseUnit(){} + + @Override + public float getMass() { + return type.mass; + } @Override public void update(){ @@ -68,13 +49,13 @@ public class Enemy extends SyncEntity { @Override public boolean collides(SolidEntity other){ - return (other instanceof Bullet) && !(((Bullet) other).owner instanceof Enemy); + return (other instanceof Bullet) && !(((Bullet) other).owner instanceof BaseUnit); } @Override public void damage(int amount){ super.damage(amount); - hitTime = EnemyType.hitDuration; + hitTime = hitDuration; } @Override @@ -91,22 +72,16 @@ public class Enemy extends SyncEntity { public void added(){ hitbox.setSize(type.hitsize); hitboxTile.setSize(type.hitsizeTile); - maxhealth = type.health * tier; - region = Draw.region(type.name + "-t" + Mathf.clamp(tier, 1, 3)); - - heal(); } @Override - public Enemy add(){ + public BaseUnit add(){ return add(enemyGroup); } @Override public void writeSpawn(ByteBuffer buffer) { buffer.put(type.id); - buffer.put((byte)lane); - buffer.put((byte)tier); buffer.putFloat(x); buffer.putFloat(y); buffer.putShort((short)health); @@ -114,9 +89,7 @@ public class Enemy extends SyncEntity { @Override public void readSpawn(ByteBuffer buffer) { - type = EnemyType.getByID(buffer.get()); - lane = buffer.get(); - tier = buffer.get(); + type = UnitType.getByID(buffer.get()); x = buffer.getFloat(); y = buffer.getFloat(); health = buffer.getShort(); @@ -127,38 +100,18 @@ public class Enemy extends SyncEntity { public void write(ByteBuffer data) { data.putFloat(x); data.putFloat(y); - data.putShort((short)(angle*2)); + data.putShort((short)(rotation *2)); data.putShort((short)health); } @Override public void read(ByteBuffer data, long time) { - float x = data.getFloat(); float y = data.getFloat(); short angle = data.getShort(); short health = data.getShort(); this.health = health; - interpolator.read(this.x, this.y, x, y, angle/2f, time); } - - public void shoot(BulletType bullet){ - shoot(bullet, 0); - } - - public void shoot(BulletType bullet, float rotation){ - - if(!(Net.client())) { - tr.trns(angle + rotation, type.length); - Bullet out = new Bullet(bullet, this, x + tr.x, y + tr.y, this.angle + rotation).add(); - out.damage = (int) ((bullet.damage * (1 + (tier - 1) * 1f))); - type.onShoot(this, bullet, rotation); - - if(Net.server()){ - NetEvents.handleBullet(bullet, this, x + tr.x, y + tr.y, this.angle + rotation, (short)out.damage); - } - } - } } diff --git a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java b/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java deleted file mode 100644 index b5603fd8a9..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java +++ /dev/null @@ -1,289 +0,0 @@ -package io.anuke.mindustry.entities.enemies; - -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.Player; -import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.graphics.Fx; -import io.anuke.mindustry.graphics.Shaders; -import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.NetEvents; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.Blocks; -import io.anuke.ucore.core.Effects; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.core.Timers; -import io.anuke.ucore.entities.Entities; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.graphics.Lines; -import io.anuke.ucore.util.Mathf; -import io.anuke.ucore.util.Strings; - -import static io.anuke.mindustry.Vars.*; - -public class EnemyType { - - //TODO documentation, comments - private static byte lastid = 0; - private static Array types = new Array<>(); - - public final static Color[] tierColors = { - Color.valueOf("ffe451"), Color.valueOf("f48e20"), Color.valueOf("ff6757"), - Color.valueOf("ff2d86"), Color.valueOf("cb2dff"), Color.valueOf("362020") }; - public final static int maxtier = tierColors.length; - public final static float maxIdleLife = 60f*2f; //2 seconds idle = death - public final static float hitDuration = 5f; - - public final String name; - public final byte id; - - protected int timeid; - protected int health = 60; - protected float hitsize = 5f; - protected float hitsizeTile = 4f; - protected float speed = 0.4f; - protected float reload = 32; - protected float range = 60; - protected float length = 4; - protected float rotatespeed = 0.1f; - protected float turretrotatespeed = 0.2f; - protected boolean alwaysRotate = false; - protected BulletType bullet = BulletType.small; - protected String shootsound = "enemyshoot"; - protected boolean targetCore = false; - protected boolean stopNearCore = true; - protected boolean targetClient = false; - protected float mass = 1f; - - protected final int timerTarget = timeid ++; - protected final int timerReload = timeid ++; - protected final int timerReset = timeid ++; - - protected final Vector2 shift = new Vector2(); - protected final Vector2 move = new Vector2(); - protected final Vector2 calc = new Vector2(); - - public EnemyType(String name){ - this.id = lastid++; - this.name = name; - types.add(this); - } - - public void draw(Enemy enemy){ - Shaders.outline.color.set(tierColors[enemy.tier - 1]); - Shaders.outline.lighten = Mathf.clamp(enemy.hitTime/hitDuration); - Shaders.outline.region = enemy.region; - - Shaders.outline.apply(); - - Draw.rect(enemy.region, enemy.x, enemy.y, enemy.angle - 90); - Draw.color(); - - Graphics.flush(); - - if(isCalculating(enemy)){ - Draw.color(Color.SKY); - Lines.polySeg(20, 0, 4, enemy.x, enemy.y, 11f, Timers.time() * 2f + enemy.id*52f); - Lines.polySeg(20, 0, 4, enemy.x, enemy.y, 11f, Timers.time() * 2f + enemy.id*52f + 180f); - Draw.color(); - } - - if(showPaths){ - Draw.tscl(0.25f); - Draw.text((int)enemy.idletime + " " + enemy.node + " " + enemy.id + "\n" + Strings.toFixed(enemy.totalMove.x, 2) + ", " - + Strings.toFixed(enemy.totalMove.x, 2), enemy.x, enemy.y); - Draw.tscl(fontscale); - } - - Shaders.outline.lighten = 0f; - } - - public void drawOver(Enemy enemy){ } - - public void update(Enemy enemy){ - float lastx = enemy.x, lasty = enemy.y; - if(enemy.hitTime > 0){ - enemy.hitTime -= Timers.delta(); - } - - if(enemy.lane >= world.getSpawns().size || enemy.lane < 0) enemy.lane = 0; - - boolean waiting = enemy.lane >= world.getSpawns().size || enemy.lane < 0 - || world.getSpawns().get(enemy.lane).pathTiles == null || enemy.node <= 0; - - move(enemy); - - enemy.velocity.set(enemy.x - lastx, enemy.y - lasty).scl(1f / Timers.delta()); - enemy.totalMove.add(enemy.velocity); - - float minv = 0.07f; - - if(enemy.timer.get(timerReset, 80)){ - enemy.totalMove.setZero(); - } - - if(enemy.velocity.len() < minv && !waiting && enemy.target == null){ - enemy.idletime += Timers.delta(); - }else{ - enemy.idletime = 0; - } - - if(enemy.timer.getTime(timerReset) > 50 && enemy.totalMove.len() < 0.2f && !waiting && enemy.target == null){ - enemy.idletime = 999999f; - } - - Tile tile = world.tileWorld(enemy.x, enemy.y); - if(tile != null && tile.floor().liquid && tile.block() == Blocks.air){ - enemy.damage(enemy.health+1); //drown - } - - if(Float.isNaN(enemy.angle)){ - enemy.angle = 0; - } - - if(enemy.target == null || alwaysRotate){ - enemy.angle = Mathf.slerpDelta(enemy.angle, enemy.velocity.angle(), rotatespeed); - }else{ - enemy.angle = Mathf.slerpDelta(enemy.angle, enemy.angleTo(enemy.target), turretrotatespeed); - } - - enemy.x = Mathf.clamp(enemy.x, 0, world.width() * tilesize); - enemy.y = Mathf.clamp(enemy.y, 0, world.height() * tilesize); - } - - public void move(Enemy enemy){ - if(Net.client()){ - enemy.interpolate(); - if(targetClient) updateTargeting(enemy, false); - return; - } - - float speed = this.speed + 0.04f * enemy.tier; - float range = this.range + enemy.tier * 5; - - Tile core = world.getCore(); - - if(core == null) return; - - if(enemy.idletime > maxIdleLife && enemy.node > 0){ - enemy.onDeath(); - return; - } - - boolean nearCore = enemy.distanceTo(core.worldx(), core.worldy()) <= range - 18f && stopNearCore; - Vector2 vec; - - if(nearCore){ - vec = move.setZero(); - if(targetCore) enemy.target = core.entity; - }else{ - vec = world.pathfinder().find(enemy); - vec.sub(enemy.x, enemy.y).limit(speed); - } - - shift.setZero(); - float shiftRange = enemy.hitbox.width + 2f; - float avoidRange = shiftRange + 4f; - float attractRange = avoidRange + 7f; - float avoidSpeed = this.speed/2.7f; - - Entities.getNearby(enemyGroup, enemy.x, enemy.y, range, en -> { - Enemy other = (Enemy)en; - if(other == enemy) return; - float dst = other.distanceTo(enemy); - - if(dst < shiftRange){ - float scl = Mathf.clamp(1.4f - dst / shiftRange) * mass * 1f/mass; - shift.add((enemy.x - other.x) * scl, (enemy.y - other.y) * scl); - }else if(dst < avoidRange){ - calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed); - shift.add(calc.scl(1.1f)); - }else if(dst < attractRange && !nearCore && !isCalculating(enemy)){ - calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed); - shift.add(calc.scl(-1)); - } - }); - - shift.limit(1f); - vec.add(shift.scl(0.5f)); - - enemy.move(vec.x * Timers.delta(), vec.y * Timers.delta()); - - updateTargeting(enemy, nearCore); - - behavior(enemy); - } - - public void behavior(Enemy enemy){} - - public void updateTargeting(Enemy enemy, boolean nearCore){ - if(enemy.target != null && enemy.target instanceof TileEntity && ((TileEntity)enemy.target).dead){ - enemy.target = null; - } - - if(enemy.timer.get(timerTarget, 15) && !nearCore){ - enemy.target = world.findTileTarget(enemy.x, enemy.y, null, range, false); - - //no tile found - if(enemy.target == null){ - enemy.target = Entities.getClosest(playerGroup, enemy.x, enemy.y, range, e -> !((Player)e).isAndroid && - !((Player)e).isDead()); - } - }else if(nearCore){ - enemy.target = world.getCore().entity; - } - - if(enemy.target != null && bullet != null){ - updateShooting(enemy); - } - } - - public void updateShooting(Enemy enemy){ - float reload = this.reload / Math.max(enemy.tier / 1.5f, 1f); - - if(enemy.timer.get(timerReload, reload)){ - shoot(enemy); - } - } - - public void shoot(Enemy enemy){ - enemy.shoot(bullet); - if(shootsound != null) Effects.sound(shootsound, enemy); - } - - public void onShoot(Enemy enemy, BulletType type, float rotation){} - - public void onDeath(Enemy enemy, boolean force){ - if(Net.server()){ - NetEvents.handleEnemyDeath(enemy); - } - - if(!Net.client() || force) { - Effects.effect(Fx.explosion, enemy); - Effects.shake(3f, 4f, enemy); - Effects.sound("bang2", enemy); - enemy.remove(); - enemy.dead = true; - } - } - - public void removed(Enemy enemy){ - if(!enemy.dead){ - if(enemy.spawner != null){ - enemy.spawner.spawned --; - }else{ - state.enemies --; - } - } - } - - public boolean isCalculating(Enemy enemy){ - return enemy.node < 0 && !Net.client(); - } - - public static EnemyType getByID(byte id){ - return types.get(id); - } -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/EnemyTypes.java b/core/src/io/anuke/mindustry/entities/enemies/EnemyTypes.java deleted file mode 100644 index 799b8fb1be..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/EnemyTypes.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.anuke.mindustry.entities.enemies; - -import io.anuke.mindustry.entities.enemies.types.BlastType; -import io.anuke.mindustry.entities.enemies.types.EmpType; -import io.anuke.mindustry.entities.enemies.types.FastType; -import io.anuke.mindustry.entities.enemies.types.FlamerType; -import io.anuke.mindustry.entities.enemies.types.FortressType; -import io.anuke.mindustry.entities.enemies.types.HealerType; -import io.anuke.mindustry.entities.enemies.types.MortarType; -import io.anuke.mindustry.entities.enemies.types.RapidType; -import io.anuke.mindustry.entities.enemies.types.*; -import io.anuke.mindustry.entities.enemies.types.TankType; -import io.anuke.mindustry.entities.enemies.types.TargetType; -import io.anuke.mindustry.entities.enemies.types.TitanType; - -public class EnemyTypes { - public static final EnemyType - - standard = new StandardType(), - fast = new FastType(), - rapid = new RapidType(), - flamer = new FlamerType(), - tank = new TankType(), - blast = new BlastType(), - mortar = new MortarType(), - healer = new HealerType(), - titan = new TitanType(), - emp = new EmpType(), - fortress = new FortressType(), - target = new TargetType(); - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/UnitType.java b/core/src/io/anuke/mindustry/entities/enemies/UnitType.java new file mode 100644 index 0000000000..c465d68e24 --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/enemies/UnitType.java @@ -0,0 +1,81 @@ +package io.anuke.mindustry.entities.enemies; + +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.entities.BulletType; +import io.anuke.ucore.util.Mathf; + +import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.world; + +public class UnitType { + private static byte lastid = 0; + private static Array types = new Array<>(); + + public final String name; + public final byte id; + + protected int health = 60; + protected float hitsize = 5f; + protected float hitsizeTile = 4f; + protected float speed = 0.4f; + protected float range = 60; + protected float rotatespeed = 0.1f; + protected float mass = 1f; + protected boolean isFlying; + + public UnitType(String name){ + this.id = lastid++; + this.name = name; + types.add(this); + } + + public void draw(BaseUnit enemy){ + //TODO + } + + public void drawOver(BaseUnit enemy){ + //TODO + } + + public void update(BaseUnit enemy){ + //TODO + enemy.x = Mathf.clamp(enemy.x, 0, world.width() * tilesize); + enemy.y = Mathf.clamp(enemy.y, 0, world.height() * tilesize); + } + + public void move(BaseUnit enemy){ + //TODO + } + + public void behavior(BaseUnit enemy){ + //TODO + } + + public void updateTargeting(BaseUnit enemy){ + //TODO + } + + public void updateShooting(BaseUnit enemy){ + //TODO + } + + public void shoot(BaseUnit enemy){ + //TODO + } + + public void onShoot(BaseUnit enemy, BulletType type, float rotation){ + //TODO + } + + public void onDeath(BaseUnit enemy, boolean force){ + //TODO + } + + public void removed(BaseUnit enemy){ + //TODO + } + + public static UnitType getByID(byte id){ + return types.get(id); + } +} diff --git a/core/src/io/anuke/mindustry/entities/enemies/UnitTypes.java b/core/src/io/anuke/mindustry/entities/enemies/UnitTypes.java new file mode 100644 index 0000000000..249f9e92fb --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/enemies/UnitTypes.java @@ -0,0 +1,5 @@ +package io.anuke.mindustry.entities.enemies; + +public class UnitTypes { + //TODO list types here. +} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/BlastType.java b/core/src/io/anuke/mindustry/entities/enemies/types/BlastType.java deleted file mode 100644 index 9132d5a666..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/BlastType.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.Bullet; -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; - -import static io.anuke.mindustry.Vars.tilesize; - -public class BlastType extends EnemyType { - - public BlastType() { - super("blastenemy"); - health = 30; - speed = 0.8f; - bullet = null; - turretrotatespeed = 0f; - mass = 0.8f; - stopNearCore = false; - } - - @Override - public void behavior(Enemy enemy){ - - float range = 10f; - float ox = 0, oy = 0; - - if(enemy.target instanceof TileEntity){ - TileEntity e = (TileEntity)enemy.target; - range = (e.tile.block().size * tilesize) /2f + 8f; - ox = e.tile.block().getPlaceOffset().x; - oy = e.tile.block().getPlaceOffset().y; - } - - if(enemy.target != null && enemy.target.distanceTo(enemy.x - ox, enemy.y - oy) < range){ - explode(enemy); - } - } - - @Override - public void onDeath(Enemy enemy, boolean force){ - if(force) explode(enemy); - super.onDeath(enemy, force); - } - - void explode(Enemy enemy){ - Bullet b = new Bullet(BulletType.blast, enemy, enemy.x, enemy.y, 0).add(); - b.damage = BulletType.blast.damage + (enemy.tier-1) * 40; - enemy.damage(999); - enemy.remove(); - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/EmpType.java b/core/src/io/anuke/mindustry/entities/enemies/types/EmpType.java deleted file mode 100644 index cfe1a62da2..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/EmpType.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class EmpType extends EnemyType { - - public EmpType() { - super("empenemy"); - - speed = 0.3f; - reload = 70; - health = 210; - range = 80f; - bullet = BulletType.emp; - turretrotatespeed = 0.1f; - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/FastType.java b/core/src/io/anuke/mindustry/entities/enemies/types/FastType.java deleted file mode 100644 index 29c7ed5a0c..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/FastType.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class FastType extends EnemyType { - - public FastType() { - super("fastenemy"); - - speed = 0.73f; - reload = 20; - mass = 0.2f; - - health = 50; - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/FlamerType.java b/core/src/io/anuke/mindustry/entities/enemies/types/FlamerType.java deleted file mode 100644 index 0aad1e7b10..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/FlamerType.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class FlamerType extends EnemyType { - - public FlamerType() { - super("flamerenemy"); - - speed = 0.35f; - health = 150; - reload = 6; - bullet = BulletType.flameshot; - shootsound = "flame"; - mass = 1.5f; - range = 40; - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/FortressType.java b/core/src/io/anuke/mindustry/entities/enemies/types/FortressType.java deleted file mode 100644 index d02c85fe7c..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/FortressType.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; -import io.anuke.mindustry.entities.enemies.EnemyTypes; -import io.anuke.mindustry.graphics.Fx; -import io.anuke.ucore.core.Effects; -import io.anuke.ucore.core.Timers; -import io.anuke.ucore.util.Angles; - -import static io.anuke.mindustry.Vars.world; - -public class FortressType extends EnemyType { - final int maxSpawn = 6; - final float spawnTime = 190; - - public FortressType() { - super("fortressenemy"); - - speed = 0.25f; - reload = 90; - health = 700; - range = 70f; - bullet = BulletType.yellowshell; - hitsize = 10f; - turretrotatespeed = rotatespeed = 0.08f; - length = 7f; - mass = 7f; - } - - @Override - public void behavior(Enemy enemy){ - if(enemy.distanceTo(world.getCore().worldx(), - world.getCore().worldy()) <= 90f){ - - if(Timers.get(this, "spawn", spawnTime) && enemy.spawned < maxSpawn){ - enemy.tr.trns(enemy.angle, 20f); - - Enemy s = new Enemy(EnemyTypes.fast); - s.lane = enemy.lane; - s.tier = enemy.tier; - s.spawner = enemy; - s.set(enemy.x + enemy.tr.x, enemy.y + enemy.tr.y); - s.add(); - - Effects.effect(Fx.spawn, enemy); - enemy.spawned ++; - } - - } - } - - - public void onShoot(Enemy enemy, BulletType type, float rotation){ - Effects.effect(Fx.largeCannonShot, enemy.x + enemy.tr.x, enemy.y + enemy.tr.y, enemy.angle); - Effects.shake(3f, 3f, enemy); - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/HealerType.java b/core/src/io/anuke/mindustry/entities/enemies/types/HealerType.java deleted file mode 100644 index 938f33c27c..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/HealerType.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.math.MathUtils; -import io.anuke.mindustry.entities.Bullet; -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; -import io.anuke.mindustry.graphics.Fx; -import io.anuke.mindustry.graphics.Shaders; -import io.anuke.ucore.core.Effects; -import io.anuke.ucore.core.Graphics; -import io.anuke.ucore.core.Timers; -import io.anuke.ucore.entities.Entities; -import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.graphics.Hue; -import io.anuke.ucore.graphics.Shapes; - -import static io.anuke.mindustry.Vars.enemyGroup; - -public class HealerType extends EnemyType { - - public HealerType() { - super("healerenemy"); - speed = 0.25f; - reload = 10; - health = 200; - bullet = BulletType.shot; - range = 40f; - alwaysRotate = false; - targetCore = false; - stopNearCore = true; - targetClient = true; - mass = 1.1f; - } - - - @Override - public void behavior(Enemy enemy){ - - if(enemy.idletime > 60f*3){ //explode after 3 seconds of stillness - explode(enemy); - Effects.effect(Fx.shellexplosion, enemy); - Effects.effect(Fx.shellsmoke, enemy); - } - } - - @Override - public void updateTargeting(Enemy enemy, boolean nearCore){ - if(enemy.timer.get(timerTarget, 15)){ - enemy.target = Entities.getClosest(enemyGroup, - enemy.x, enemy.y, range, e -> e instanceof Enemy && e != enemy && ((Enemy)e).healthfrac() < 1f); - } - - if(enemy.target != null){ - updateShooting(enemy); - } - } - - - @Override - public void updateShooting(Enemy enemy){ - Enemy target = (Enemy)enemy.target; - - if(target.health < target.maxhealth && enemy.timer.get(timerReload, reload)){ - target.health ++; - enemy.idletime = 0; - } - } - - @Override - public void drawOver(Enemy enemy){ - Enemy target = (Enemy)enemy.target; - - if(target == null) return; - - enemy.tr.trns(enemy.angleTo(target), 5f); - - Shaders.outline.color.set(Color.CLEAR); - Shaders.outline.apply(); - - if(target.health < target.maxhealth){ - Draw.color(Hue.rgb(138, 244, 138, (MathUtils.sin(Timers.time()) + 1f) / 13f)); - Draw.alpha(0.9f); - Shapes.laser("laser", "laserend", enemy.x + enemy.tr.x, enemy.y + enemy.tr.y, target.x - enemy.tr.x/1.5f, target.y - enemy.tr.y/1.5f); - Draw.color(); - } - - Graphics.flush(); - } - - void explode(Enemy enemy){ - Bullet b = new Bullet(BulletType.blast, enemy, enemy.x, enemy.y, 0).add(); - b.damage = BulletType.blast.damage + (enemy.tier-1) * 30; - enemy.damage(999); - enemy.remove(); - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/MortarType.java b/core/src/io/anuke/mindustry/entities/enemies/types/MortarType.java deleted file mode 100644 index ad1ac1bfbc..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/MortarType.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class MortarType extends EnemyType { - - public MortarType() { - super("mortarenemy"); - - health = 200; - speed = 0.25f; - reload = 100f; - bullet = BulletType.shell; - turretrotatespeed = 0.15f; - rotatespeed = 0.05f; - range = 120f; - mass = 1.2f; - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/RapidType.java b/core/src/io/anuke/mindustry/entities/enemies/types/RapidType.java deleted file mode 100644 index ed2621d74c..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/RapidType.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class RapidType extends EnemyType { - - public RapidType() { - super("rapidenemy"); - - reload = 8; - bullet = BulletType.purple; - rotatespeed = 0.08f; - health = 260; - speed = 0.33f; - hitsize = 8f; - mass = 3f; - range = 70; - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/StandardType.java b/core/src/io/anuke/mindustry/entities/enemies/types/StandardType.java deleted file mode 100644 index 112155beeb..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/StandardType.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.enemies.EnemyType; - -public class StandardType extends EnemyType { - - public StandardType(){ - super("standardenemy"); - } -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/TankType.java b/core/src/io/anuke/mindustry/entities/enemies/types/TankType.java deleted file mode 100644 index 64a827c1b2..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/TankType.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; -import io.anuke.ucore.util.Angles; - -public class TankType extends EnemyType { - - public TankType() { - super("tankenemy"); - - health = 350; - speed = 0.24f; - reload = 90f; - rotatespeed = 0.06f; - bullet = BulletType.small; - length = 3f; - mass = 1.4f; - length = 8f; - } - - @Override - public void shoot(Enemy enemy){ - super.shoot(enemy); - - Angles.shotgun(3, 8f, enemy.angle, f -> enemy.shoot(bullet, f)); - } - -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/TargetType.java b/core/src/io/anuke/mindustry/entities/enemies/types/TargetType.java deleted file mode 100644 index 822e9d5823..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/TargetType.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import com.badlogic.gdx.graphics.Color; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; -import io.anuke.mindustry.entities.enemies.EnemyTypes; -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 static io.anuke.mindustry.Vars.control; - -public class TargetType extends EnemyType { - - public TargetType(){ - super("targetenemy"); - - speed = 0f; - health = 40; - shootsound = null; - } - - @Override - public void move(Enemy enemy){ - - } - - @Override - public void shoot(Enemy enemy){ - //do nothing - } - - @Override - public void removed(Enemy enemy){ - //don't call enemy death since this is only a target - } - - @Override - public void draw(Enemy enemy){ - super.draw(enemy); - - Draw.color(Color.YELLOW); - - if(control.tutorial().showTarget()){ - Lines.spikes(enemy.x, enemy.y, 11f + Mathf.sin(Timers.time(), 7f, 1f), 4f, 8, Timers.time()); - } - - Draw.color(); - } - - @Override - public void onDeath(Enemy enemy, boolean force){ - super.onDeath(enemy, force); - Timers.run(100f, ()->{ - new Enemy(EnemyTypes.target).set(enemy.x, enemy.y).add(); - }); - } - - @Override - public boolean isCalculating(Enemy enemy){ - return false; - } -} diff --git a/core/src/io/anuke/mindustry/entities/enemies/types/TitanType.java b/core/src/io/anuke/mindustry/entities/enemies/types/TitanType.java deleted file mode 100644 index c8e2786b94..0000000000 --- a/core/src/io/anuke/mindustry/entities/enemies/types/TitanType.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.anuke.mindustry.entities.enemies.types; - -import io.anuke.mindustry.entities.BulletType; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; -import io.anuke.ucore.core.Timers; -import io.anuke.ucore.util.Angles; -import io.anuke.ucore.util.Mathf; - -public class TitanType extends EnemyType { - - public TitanType() { - super("titanenemy"); - - speed = 0.26f; - reload = 30; - health = 430; - range = 60f; - bullet = BulletType.small; - hitsize = 7f; - mass = 4f; - } - - @Override - public void updateShooting(Enemy enemy){ - Timers.get(enemy, "salvo", 240); - - if(Timers.getTime(enemy, "salvo") < 60){ - if(Timers.get(enemy, "salvoShoot", 6)){ - enemy.shoot(BulletType.flameshot, Mathf.range(20f)); - } - } - - if(Timers.get(enemy, "shotgun", 80)){ - Angles.shotgun(5, 10f, 0f, f->{ - enemy.shoot(BulletType.smallSlow, f); - }); - } - - if(Timers.get(enemy, "circle", 200)){ - Angles.circle(8, f->{ - enemy.shoot(BulletType.smallSlow, f); - }); - } - } - -} diff --git a/core/src/io/anuke/mindustry/game/EnemySpawn.java b/core/src/io/anuke/mindustry/game/EnemySpawn.java index eff8e10a44..358112fe18 100644 --- a/core/src/io/anuke/mindustry/game/EnemySpawn.java +++ b/core/src/io/anuke/mindustry/game/EnemySpawn.java @@ -1,13 +1,13 @@ package io.anuke.mindustry.game; -import io.anuke.mindustry.entities.enemies.EnemyType; +import io.anuke.mindustry.entities.enemies.UnitType; import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.state; public class EnemySpawn{ /**The enemy type spawned*/ - public final EnemyType type; + public final UnitType type; /**When this spawns should end*/ protected int before = Integer.MAX_VALUE; /**When this spawns should start*/ @@ -27,7 +27,7 @@ public class EnemySpawn{ /**Amount of enemies spawned initially, with no scaling*/ protected int amount = 1; - public EnemySpawn(EnemyType type){ + public EnemySpawn(UnitType type){ this.type = type; } @@ -41,6 +41,6 @@ public class EnemySpawn{ } public int tier(int wave, int lane){ - return Mathf.clamp(tier + (wave-after)/tierscale, 1, EnemyType.maxtier); + return Mathf.clamp(tier + (wave-after)/tierscale, 1, UnitType.maxtier); } } diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index c900741b7e..beb0e5456d 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.game; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; @@ -41,7 +41,7 @@ public class EventType { } public interface EnemyDeathEvent extends Event{ - void handle(Enemy enemy); + void handle(BaseUnit enemy); } public interface BlockDestroyEvent extends Event{ diff --git a/core/src/io/anuke/mindustry/game/Team.java b/core/src/io/anuke/mindustry/game/Team.java new file mode 100644 index 0000000000..dbe4a0c78f --- /dev/null +++ b/core/src/io/anuke/mindustry/game/Team.java @@ -0,0 +1,15 @@ +package io.anuke.mindustry.game; + +import com.badlogic.gdx.graphics.Color; + +public enum Team { + none(Color.GRAY), + blue(Color.BLUE), + red(Color.RED); + + public final Color color; + + Team(Color color){ + this.color = color; + } +} diff --git a/core/src/io/anuke/mindustry/game/WaveCreator.java b/core/src/io/anuke/mindustry/game/WaveCreator.java index b44fcbf98e..79b2f7cd9d 100644 --- a/core/src/io/anuke/mindustry/game/WaveCreator.java +++ b/core/src/io/anuke/mindustry/game/WaveCreator.java @@ -1,130 +1,12 @@ package io.anuke.mindustry.game; import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.entities.enemies.EnemyTypes; public class WaveCreator{ public static Array getSpawns(){ - - return Array.with( - new EnemySpawn(EnemyTypes.standard){{ - scaling = 1; - before = 3; - }}, - - new EnemySpawn(EnemyTypes.fast){{ - scaling = 1; - after = 3; - spacing = 5; - amount = 3; - tierscaleback = 0; - }}, - - new EnemySpawn(EnemyTypes.blast){{ - after = 4; - amount = 2; - spacing = 5; - scaling = 2; - tierscaleback = 1; - }}, - - new EnemySpawn(EnemyTypes.tank){{ - after = 5; - spacing = 5; - scaling = 2; - amount = 2; - }}, - - new EnemySpawn(EnemyTypes.rapid){{ - after = 7; - spacing = 5; - scaling = 2; - amount = 3; - }}, - - new EnemySpawn(EnemyTypes.healer){{ - after = 5; - spacing = 5; - scaling = 1; - amount = 1; - }}, - - new EnemySpawn(EnemyTypes.standard){{ - scaling = 3; - after = 8; - spacing = 4; - tier = 2; - }}, - - new EnemySpawn(EnemyTypes.titan){{ - after = 6; - amount = 2; - spacing = 5; - scaling = 3; - }}, - - new EnemySpawn(EnemyTypes.flamer){{ - after = 12; - amount = 2; - spacing = 5; - scaling = 3; - }}, - - new EnemySpawn(EnemyTypes.emp){{ - after = 15; - amount = 1; - spacing = 5; - scaling = 2; - }}, - - new EnemySpawn(EnemyTypes.blast){{ - after = 4 + 5 + 5; - amount = 3; - spacing = 5; - scaling = 2; - tierscaleback = 0; - }}, - //boss wave - new EnemySpawn(EnemyTypes.fortress){{ - after = 16; - amount = 1; - spacing = 5; - scaling = 1; - }}, - - new EnemySpawn(EnemyTypes.titan){{ - after = 16; - amount = 1; - spacing = 5; - scaling = 3; - tierscaleback = 0; - }}, - - new EnemySpawn(EnemyTypes.healer){{ - after = 16; - spacing = 5; - scaling = 2; - amount = 2; - }}, - //end boss wave - - //enchanced boss wave - new EnemySpawn(EnemyTypes.mortar){{ - after = 16 + 5; - amount = 1; - spacing = 5; - scaling = 3; - }}, - - new EnemySpawn(EnemyTypes.emp){{ - after = 16 + 5; - amount = 1; - spacing = 5; - scaling = 3; - }} - //end enchanced boss wave - ); + //TODO + return null; } public static void testWaves(int from, int to){ diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index e5d04817f1..dd141b35d0 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -5,7 +5,6 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.game.SpawnPoint; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Layer; @@ -86,10 +85,7 @@ public class BlockRenderer{ } if(!(block instanceof StaticBlock)){ - if(block == Blocks.air){ - if(!state.is(State.paused)) tile.floor().update(tile); - }else{ - + if(block != Blocks.air){ if(!expanded){ addRequest(tile, Layer.block); } diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index 3e9258e98e..d84bba7608 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -3,8 +3,8 @@ package io.anuke.mindustry.io.versions; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IntMap; import com.badlogic.gdx.utils.TimeUtils; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyType; +import io.anuke.mindustry.entities.enemies.BaseUnit; +import io.anuke.mindustry.entities.enemies.UnitType; import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.io.SaveFileVersion; @@ -120,7 +120,7 @@ public class Save16 extends SaveFileVersion { int enemies = stream.readInt(); - Array enemiesToUpdate = new Array<>(); + Array enemiesToUpdate = new Array<>(); for(int i = 0; i < enemies; i ++){ byte type = stream.readByte(); @@ -131,7 +131,7 @@ public class Save16 extends SaveFileVersion { int health = stream.readShort(); try{ - Enemy enemy = new Enemy(EnemyType.getByID(type)); + BaseUnit enemy = new BaseUnit(UnitType.getByID(type)); enemy.lane = lane; enemy.health = health; enemy.x = x; @@ -158,7 +158,7 @@ public class Save16 extends SaveFileVersion { world.loadMap(world.maps().getMap(mapid), seed); if(!headless) renderer.clearTiles(); - for(Enemy enemy : enemiesToUpdate){ + for(BaseUnit enemy : enemiesToUpdate){ enemy.node = -2; } @@ -278,12 +278,12 @@ public class Save16 extends SaveFileVersion { //--ENEMIES-- - EntityContainer enemies = enemyGroup.all(); + EntityContainer enemies = enemyGroup.all(); stream.writeInt(enemies.size()); //enemy amount for(int i = 0; i < enemies.size(); i ++){ - Enemy enemy = enemies.get(i); + BaseUnit enemy = enemies.get(i); stream.writeByte(enemy.type.id); //type stream.writeByte(enemy.lane); //lane stream.writeFloat(enemy.x); //x diff --git a/core/src/io/anuke/mindustry/net/NetEvents.java b/core/src/io/anuke/mindustry/net/NetEvents.java index d378c69133..d618aa9d0b 100644 --- a/core/src/io/anuke/mindustry/net/NetEvents.java +++ b/core/src/io/anuke/mindustry/net/NetEvents.java @@ -4,7 +4,7 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.*; import io.anuke.mindustry.resource.Weapon; @@ -40,7 +40,7 @@ public class NetEvents { Net.send(packet, SendMode.udp); } - public static void handleEnemyDeath(Enemy enemy){ + public static void handleEnemyDeath(BaseUnit enemy){ EnemyDeathPacket packet = new EnemyDeathPacket(); packet.id = enemy.id; Net.send(packet, SendMode.tcp); diff --git a/core/src/io/anuke/mindustry/net/ServerDebug.java b/core/src/io/anuke/mindustry/net/ServerDebug.java index a34b05e7c1..6623d602fc 100644 --- a/core/src/io/anuke/mindustry/net/ServerDebug.java +++ b/core/src/io/anuke/mindustry/net/ServerDebug.java @@ -34,8 +34,8 @@ public class ServerDebug { build.append(player.clientid); build.append(" / player '"); build.append(player.name); - build.append(" android: "); - build.append(player.isAndroid); + build.append(" mech: "); + build.append(player.mech); build.append("'\n"); for(Class type : map.orderedKeys()){ diff --git a/core/src/io/anuke/mindustry/resource/Mech.java b/core/src/io/anuke/mindustry/resource/Mech.java index 57a9bf4800..44726ba3af 100644 --- a/core/src/io/anuke/mindustry/resource/Mech.java +++ b/core/src/io/anuke/mindustry/resource/Mech.java @@ -3,9 +3,14 @@ package io.anuke.mindustry.resource; public class Mech extends Upgrade{ public static final Mech - standard = new Mech("standard"); + standard = new Mech("standard", false), + standardShip = new Mech("standard-ship", true); - public Mech(String name){ + public boolean flying; + public float mass = 1f; + + public Mech(String name, boolean flying){ super(name); + this.flying = flying; } } diff --git a/core/src/io/anuke/mindustry/resource/Upgrade.java b/core/src/io/anuke/mindustry/resource/Upgrade.java index 423528a483..d8ed2b421c 100644 --- a/core/src/io/anuke/mindustry/resource/Upgrade.java +++ b/core/src/io/anuke/mindustry/resource/Upgrade.java @@ -23,8 +23,8 @@ public abstract class Upgrade { return Bundles.get("upgrade." + name + ".name"); } - public static Upgrade getByID(byte id){ - return upgrades.get(id); + public static T getByID(byte id){ + return (T)upgrades.get(id); } public static Array getAllUpgrades() { diff --git a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java index a141e5d591..e8c9c49048 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java @@ -3,8 +3,8 @@ package io.anuke.mindustry.ui.fragments; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; import io.anuke.mindustry.entities.Player; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyTypes; +import io.anuke.mindustry.entities.enemies.BaseUnit; +import io.anuke.mindustry.entities.enemies.UnitTypes; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Timers; import io.anuke.ucore.scene.builders.button; @@ -67,7 +67,7 @@ public class DebugFragment implements Fragment { }); row(); new button("spawn", () -> { - new Enemy(EnemyTypes.healer).set(player.x, player.y).add(); + new BaseUnit(UnitTypes.healer).set(player.x, player.y).add(); }); row(); }}.end(); @@ -163,8 +163,8 @@ public class DebugFragment implements Fragment { result.append(", "); result.append(player.y); result.append("\n"); - result.append(" android: "); - result.append(player.isAndroid); + result.append(" mech: "); + result.append(player.mech); result.append("\n"); result.append(" local: "); result.append(player.isLocal); diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index b5d0e96f01..78e1fa7813 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.reflect.ClassReflection; import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.game.Team; import io.anuke.mindustry.world.blocks.Blocks; import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; @@ -25,6 +26,7 @@ public class Tile{ private byte rotation; private byte dump; private byte extra; + private byte team; /**The coordinates of the core tile this is linked to, in the form of two bytes packed into one. * This is relative to the block it is linked to; negate coords to find the link.*/ public byte link = 0; @@ -125,6 +127,15 @@ public class Tile{ public Block block(){ return Block.getByID(getWallID()); } + + //TODO save team + public Team getTeam(){ + return Team.values()[team]; + } + + public void setTeam(Team team){ + this.team = (byte)team.ordinal(); + } /**Returns the breaktime of the block, or the breaktime of the linked block, if this tile is linked.*/ public float getBreakTime(){ diff --git a/core/src/io/anuke/mindustry/world/WorldGenerator.java b/core/src/io/anuke/mindustry/world/WorldGenerator.java index 96ad8acc58..d46fd62c0f 100644 --- a/core/src/io/anuke/mindustry/world/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/world/WorldGenerator.java @@ -5,8 +5,8 @@ import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.entities.enemies.EnemyTypes; +import io.anuke.mindustry.entities.enemies.BaseUnit; +import io.anuke.mindustry.entities.enemies.UnitTypes; import io.anuke.mindustry.game.SpawnPoint; import io.anuke.mindustry.world.ColorMapper.BlockPair; import io.anuke.mindustry.world.blocks.Blocks; @@ -77,7 +77,7 @@ public class WorldGenerator { } if(color == Hue.rgb(Color.PURPLE)){ - if(!Vars.android) new Enemy(EnemyTypes.target).set(x * tilesize, y * tilesize).add(); + if(!Vars.android) new BaseUnit(UnitTypes.target).set(x * tilesize, y * tilesize).add(); floor = Blocks.stone; } diff --git a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java index 3be7eb6b48..6edac8b261 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/world/blocks/ProductionBlocks.java @@ -180,7 +180,7 @@ public class ProductionBlocks{ { resource = Blocks.uranium; result = Item.uranium; - drillTime = 540; + drillTime = 600; } }, diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java index fb75fbd9b2..96aaabffd6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/LaserTurret.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.world.blocks.types.defense; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.MathUtils; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.world.Layer; import io.anuke.mindustry.world.Tile; @@ -32,7 +32,7 @@ public class LaserTurret extends PowerTurret{ @Override public void shoot(Tile tile){ TurretEntity entity = tile.entity(); - Enemy enemy = entity.target; + BaseUnit enemy = entity.target; if(Angles.angleDist(entity.rotation, Angles.angle(tile.drawx(), tile.drawy(), enemy.x, enemy.y)) < cone){ enemy.damage(damage); @@ -43,7 +43,7 @@ public class LaserTurret extends PowerTurret{ @Override public void drawLayer2(Tile tile){ TurretEntity entity = tile.entity(); - Enemy enemy = entity.target; + BaseUnit enemy = entity.target; if(enemy != null && Angles.angleDist(entity.rotation, Angles.angle(tile.drawx(), tile.drawy(), enemy.x, enemy.y)) <= cone){ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java b/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java index f3aeb74173..a92073eda8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java @@ -4,7 +4,7 @@ import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.Bullet; import io.anuke.mindustry.entities.BulletType; import io.anuke.mindustry.entities.TileEntity; -import io.anuke.mindustry.entities.enemies.Enemy; +import io.anuke.mindustry.entities.enemies.BaseUnit; import io.anuke.mindustry.graphics.Fx; import io.anuke.mindustry.resource.Item; import io.anuke.mindustry.world.*; @@ -131,8 +131,8 @@ public class Turret extends Block{ if(hasAmmo(tile) || (debug && infiniteAmmo)){ if(entity.timer.get(timerTarget, targetInterval)){ - entity.target = (Enemy)Entities.getClosest(enemyGroup, - tile.worldx(), tile.worldy(), range, e-> e instanceof Enemy && !((Enemy)e).isDead()); + entity.target = (BaseUnit)Entities.getClosest(enemyGroup, + tile.worldx(), tile.worldy(), range, e-> e instanceof BaseUnit && !((BaseUnit)e).isDead()); } if(entity.target != null){ @@ -240,7 +240,7 @@ public class Turret extends Block{ public TileEntity blockTarget; public int ammo; public float rotation = 90; - public Enemy target; + public BaseUnit target; @Override public void write(DataOutputStream stream) throws IOException{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Centrifuge.java b/core/src/io/anuke/mindustry/world/blocks/types/production/Centrifuge.java index 79afb99b3a..a787c268ee 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Centrifuge.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/production/Centrifuge.java @@ -3,6 +3,8 @@ package io.anuke.mindustry.world.blocks.types.production; import io.anuke.mindustry.world.Tile; public class Centrifuge extends LiquidCrafter { + protected float powerUsed = 0.1f; + protected float timeUsed = 360f; public Centrifuge(String name) { super(name);