diff --git a/.classpath b/.classpath index 7b9447b..344bafb 100755 --- a/.classpath +++ b/.classpath @@ -41,6 +41,6 @@ - + diff --git a/src/projectzombie/display/DisplayRender.java b/src/projectzombie/display/DisplayRender.java index a4d309c..f0ceda6 100755 --- a/src/projectzombie/display/DisplayRender.java +++ b/src/projectzombie/display/DisplayRender.java @@ -49,9 +49,6 @@ public class DisplayRender Matrix4 rotated = Matrix4.rotate(-camera.angle, 0, 1, 0); Matrix4 billboard = Matrix4.multiply(Matrix4.rotate(-45, 1, 0, 0), rotated); - // Process all the light sources - //DynamicLighting.update(); - Main.window.environmentRenderer.use(); GL33.glUniformMatrix4fv(Main.window.glsl_billboard, true, billboard.getArray()); GL33.glUniformMatrix4fv(Main.window.glsl_projection, true, projection.getArray()); diff --git a/src/projectzombie/display/DisplayRenderUI.java b/src/projectzombie/display/DisplayRenderUI.java index 547b5a1..21663bb 100755 --- a/src/projectzombie/display/DisplayRenderUI.java +++ b/src/projectzombie/display/DisplayRenderUI.java @@ -89,7 +89,7 @@ public class DisplayRenderUI model_health_f.render(); double temperature = MathHelpers.smoothStep(Main.player.getTemperature()); - double hydration = MathHelpers.smoothStep(1 - Main.player.getHydration()); + double hydration = MathHelpers.smoothStep(1 - Main.player.getHydration()) * 0.75; GL33.glUniform2f(Main.window.glsl_tex_cut, 0, 0); diff --git a/src/projectzombie/entity/EntityTnt.java b/src/projectzombie/entity/EntityTnt.java index f7f31d9..f8d6b92 100755 --- a/src/projectzombie/entity/EntityTnt.java +++ b/src/projectzombie/entity/EntityTnt.java @@ -5,7 +5,7 @@ import bdf.types.BdfObject; import gl_engine.MathHelpers; import gl_engine.vec.Vec2d; import gl_engine.vec.Vec3d; -import projectzombie.entity.particle.ParticleSpark; +import projectzombie.entity.particle.ParticleSmokeTrail; import projectzombie.init.Models; import projectzombie.model.Model; import projectzombie.world.chunk.Chunk; @@ -17,17 +17,17 @@ public class EntityTnt extends Entity implements EntityHoldsEntities protected int explode_time; private int explode_radius; private double explode_damage; - private ParticleSpark[] smoke_particles; + private ParticleSmokeTrail smoke_particles; @Override public Entity[] getEntities() { - return smoke_particles; + return new Entity[] {smoke_particles}; } public EntityTnt(BdfObject bdf) { super(bdf); - this.smoke_particles = new ParticleSpark[50]; + this.smoke_particles = new ParticleSmokeTrail(this, 1); } @Override @@ -59,7 +59,7 @@ public class EntityTnt extends Entity implements EntityHoldsEntities velocity = velocity.add(new Vec3d(v.x, v.y, 0.01)); this.explode_radius = explode_radius; this.explode_damage = explode_damage; - this.smoke_particles = new ParticleSpark[100]; + this.smoke_particles = new ParticleSmokeTrail(this, 1); // Set to 2.5 seconds this.explode_time = 250; @@ -74,25 +74,13 @@ public class EntityTnt extends Entity implements EntityHoldsEntities public void tick(Chunk chunk, Layer layer) { super.tick(chunk, layer); - int dead_particle = 0; - int dead_particle_count = 0; - - for(int i=0;i 32) { + count = 0; + } this.hasGravity = false; @@ -65,8 +90,6 @@ public class ParticleBreak extends EntityParticle implements IModel for(int i=0;i 0.75) { + dead += 1; + } + } + + protected void onAllDead() { + if(getPos().squareDistance(Main.player.getPos()) > 32) { + kill(); + } + } + + protected boolean isStill(Break particle) { + return particle.pos.y < 0; + } + + protected void onStill(Break particle) { + particle.moving = false; + particle.pos.y = still_ypos; + still += 1; + } + @Override public void tick(Chunk chunk, Layer layer) { super.tick(chunk, layer); + if(isDead()) { + return; + } + time -= 1; if(dead == particles.length - 1) { - kill(); + onAllDead(); return; } - if(time < 0 && still == particles.length) { - if(rand.nextDouble() > 0.75) { - dead += 1; - } + if(still == particles.length) { + onAllStill(); return; } - for(int i=0;i= particles.length) { + dead = particles.length - 1; + kill(); + } + } + } + + public void stopParticles() { + generating_particles = false; + } + + public boolean noMoreParticles() { + return dead == particles.length - 1; + } + +} diff --git a/src/projectzombie/entity/particle/ParticleSpark.java b/src/projectzombie/entity/particle/ParticleSpark.java deleted file mode 100755 index 6716b67..0000000 --- a/src/projectzombie/entity/particle/ParticleSpark.java +++ /dev/null @@ -1,45 +0,0 @@ -package projectzombie.entity.particle; - -import java.util.Random; - -import gl_engine.vec.Vec3d; -import projectzombie.entity.EntityParticle; -import projectzombie.init.Models; -import projectzombie.model.Model; -import projectzombie.world.chunk.Chunk; -import projectzombie.world.layer.Layer; - -public class ParticleSpark extends EntityParticle -{ - private int time; - - private static final Random rand = new Random(); - - public ParticleSpark(Vec3d pos) { - super(pos, new Vec3d( - rand.nextDouble() * 0.02 - 0.01, - rand.nextDouble() * 0.02 - 0.01, - rand.nextDouble() * 0.02)); - - time = 100; - } - - @Override - public void tick(Chunk chunk, Layer layer) { - super.tick(chunk, layer); - - // Reduce the time - time -= 1; - - // Kill if at the end of life - if(time <= 0 || DISABLED) { - kill(); - } - } - - @Override - public Model getModel() { - return Models.PARTICLE_SMOKE_TRAIL; - } - -} diff --git a/src/projectzombie/entity/player/EntityPlayer.java b/src/projectzombie/entity/player/EntityPlayer.java index d1386f7..16db5c6 100755 --- a/src/projectzombie/entity/player/EntityPlayer.java +++ b/src/projectzombie/entity/player/EntityPlayer.java @@ -110,6 +110,7 @@ public class EntityPlayer extends Entity implements EntityAlive, EntityInventory inventory.addItem(new ItemStack(Items.SPAWN_DUMMY, 999, (short)0)); inventory.addItem(new ItemStack(Items.SPAWN_ZOMBIE, 999, (short)0)); inventory.addItem(new ItemStack(Items.LANTERN, 999, (short)0)); + inventory.addItem(new ItemStack(Items.FLARE, 999, (short)0)); } @Override @@ -135,6 +136,10 @@ public class EntityPlayer extends Entity implements EntityAlive, EntityInventory { chunk = layer.getChunk(getPos().xz()); + temperature = 0.5; + health = health_max; + hydration = 1; + if(chunk != null && chunk.c_pos != null && (last_chunk == null || !chunk.c_pos.equal(last_chunk))) { last_chunk = chunk.c_pos; DisplayLighting.setDirty(); @@ -188,7 +193,7 @@ public class EntityPlayer extends Entity implements EntityAlive, EntityInventory chunk.getLightLevel(getPos().xz().toInt()) * 0.6) - temperature; temperature += temp_diff / 1000; - hydration -= MathHelpers.smoothStep(Math.abs(temperature - 0.4) + 0.1) / 1000; + hydration -= MathHelpers.smoothStep(Math.abs(temperature - 0.4) + 0.1) / 20000; if(temperature < 0.3) { health -= 0.3 - temperature; diff --git a/src/projectzombie/init/Models.java b/src/projectzombie/init/Models.java index 475a471..532e97a 100755 --- a/src/projectzombie/init/Models.java +++ b/src/projectzombie/init/Models.java @@ -51,9 +51,7 @@ public class Models public static final Model ENTITY_GRAPPLING_HOOK = new ModelVertical(Resources.ATLAS.get("/entity/grappling_hook.png")); public static final Model PARTICLE_BLOOD = new ModelVertical(Resources.ATLAS.get("/particle/blood.png"), new Vec2d(1, 1)); - public static final Model PARTICLE_LAVA = new ModelVertical(Resources.ATLAS.get("/particle/lava.png"), new Vec2d(0.1, 0.1)); - public static final Model PARTICLE_WATER = new ModelVertical(Resources.ATLAS.get("/particle/water.png"), new Vec2d(0.1, 0.1)); - public static final Model PARTICLE_SMOKE_TRAIL = new ModelVertical(Resources.ATLAS.get("/particle/smoke_trail.png"), new Vec2d(0.1, 0.1)); + public static final Model PARTICLE_SMOKE_TRAIL = new ModelVertical(Resources.ATLAS.get("/particle/smoke_trail.png"), new Vec2d(1, 1)); public static final Model PARTICLE_BULLET = new ModelVertical(Resources.ATLAS.get("/particle/bullet.png"), new Vec2d(0.1, 0.1)); public static final ModelRandom PARTICLE_SMOKE_RANDOM = new ModelRandom( diff --git a/src/projectzombie/mainloop/MainloopEventHandler.java b/src/projectzombie/mainloop/MainloopEventHandler.java index df27447..070511c 100755 --- a/src/projectzombie/mainloop/MainloopEventHandler.java +++ b/src/projectzombie/mainloop/MainloopEventHandler.java @@ -31,6 +31,11 @@ public class MainloopEventHandler implements IMainloopEvent, IMainloopTask @Override public void onLate() { mspf += 1; + + // Dont let the fps go past 1 frame every 10 seconds + if(mspf > 10000) { + mspf = 10000; + } } @Override diff --git a/src/projectzombie/tiles/TileLava.java b/src/projectzombie/tiles/TileLava.java index e89ea98..cc80a08 100755 --- a/src/projectzombie/tiles/TileLava.java +++ b/src/projectzombie/tiles/TileLava.java @@ -49,8 +49,10 @@ public class TileLava extends Tile public void tickRandomly(Layer layer, Chunk chunk, TileState state, Vec2i pos) { super.tickRandomly(layer, chunk, state, pos); - chunk.spawnEntity(new ParticleLava(new Vec3d( - pos.x + rand.nextDouble(), 0, pos.y + rand.nextDouble()), new Vec3d(0, 0, 0))); + if(rand.nextDouble() > 0.98) { + chunk.spawnEntity(new ParticleLava(new Vec3d( + pos.x + rand.nextDouble(), 0, pos.y + rand.nextDouble()), new Vec3d(0, 0, 0))); + } } } diff --git a/src/projectzombie/util/math/random/NoiseGenerator.java b/src/projectzombie/util/math/random/NoiseGenerator.java new file mode 100644 index 0000000..188d438 --- /dev/null +++ b/src/projectzombie/util/math/random/NoiseGenerator.java @@ -0,0 +1,7 @@ +package projectzombie.util.math.random; + +public interface NoiseGenerator +{ + public double eval(double x, double y); + public double eval(double x, double y, double z); +} diff --git a/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java b/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java new file mode 100644 index 0000000..1fcd798 --- /dev/null +++ b/src/projectzombie/util/math/random/NoiseGeneratorSimplex.java @@ -0,0 +1,20 @@ +package projectzombie.util.math.random; + +public class NoiseGeneratorSimplex implements NoiseGenerator +{ + private OpenSimplexNoise simplex; + + public NoiseGeneratorSimplex(long seed) { + simplex = new OpenSimplexNoise(seed); + } + + @Override + public double eval(double x, double y) { + return simplex.eval(x, y); + } + + @Override + public double eval(double x, double y, double z) { + return simplex.eval(x, y, z); + } +} diff --git a/src/projectzombie/world/layer/Layer.java b/src/projectzombie/world/layer/Layer.java index 09c2c49..ff0b906 100755 --- a/src/projectzombie/world/layer/Layer.java +++ b/src/projectzombie/world/layer/Layer.java @@ -18,6 +18,7 @@ import projectzombie.init.LayerGenerators; import projectzombie.util.math.TileState; import projectzombie.util.math.map.Map2D; import projectzombie.util.math.map.Map2DElement; +import projectzombie.util.math.random.NoiseGenerator; import projectzombie.util.math.random.OpenSimplexNoise; import projectzombie.world.chunk.Chunk; import projectzombie.world.layer.layergen.LayerGen; @@ -26,7 +27,7 @@ public class Layer implements IBdfClassManager { public Map2D chunks; private Map2D dirty_chunks; - public OpenSimplexNoise[] noise_gens; + public NoiseGenerator[] noise_gens; public LayerGen layergen; private Random rand; public long lseed; diff --git a/src/projectzombie/world/layer/layergen/LayerGen.java b/src/projectzombie/world/layer/layergen/LayerGen.java index d9ce483..c03786c 100755 --- a/src/projectzombie/world/layer/layergen/LayerGen.java +++ b/src/projectzombie/world/layer/layergen/LayerGen.java @@ -4,6 +4,7 @@ import java.util.Random; import gl_engine.vec.Vec2d; import gl_engine.vec.Vec2i; +import gl_engine.vec.Vec3d; import projectzombie.util.math.ColorRange; import projectzombie.util.math.TileState; import projectzombie.util.math.map.IMap2D; @@ -15,6 +16,10 @@ public abstract class LayerGen implements IMap2D public int id; public boolean destroyOnLeave = false; + public Vec3d getWind(Layer layer, Vec2d pos) { + return new Vec3d(0, 0, 0); + } + public abstract void generateChunk(Chunk chunk, Layer layer, Random rand, Vec2i pos); public abstract double getTemperatureStatic(Layer layer, Vec2d pos); public abstract double getTemperatureDynamic(Layer layer, Vec2d pos); diff --git a/src/projectzombie/world/layer/layergen/LayerGenCaves.java b/src/projectzombie/world/layer/layergen/LayerGenCaves.java index c041d71..4f2f2ea 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenCaves.java +++ b/src/projectzombie/world/layer/layergen/LayerGenCaves.java @@ -12,6 +12,8 @@ import projectzombie.entity.EntityZombie; import projectzombie.init.Tiles; import projectzombie.util.math.ColorRange; import projectzombie.util.math.TileState; +import projectzombie.util.math.random.NoiseGenerator; +import projectzombie.util.math.random.NoiseGeneratorSimplex; import projectzombie.util.math.random.OpenSimplexNoise; import projectzombie.util.math.random.RandomHelpers; import projectzombie.world.chunk.Chunk; @@ -24,7 +26,7 @@ public class LayerGenCaves extends LayerGen public double getTemperatureStatic(Layer layer, Vec2d pos) { // Get the noise generator - OpenSimplexNoise terrain_noise = layer.noise_gens[0]; + NoiseGenerator terrain_noise = layer.noise_gens[0]; return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 0.6); } @@ -37,7 +39,7 @@ public class LayerGenCaves extends LayerGen public double getHumidity(Layer layer, Vec2d pos) { // Get the noise generator - OpenSimplexNoise terrain_noise = layer.noise_gens[1]; + NoiseGenerator terrain_noise = layer.noise_gens[1]; return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0.3, 0.8); } @@ -47,9 +49,9 @@ public class LayerGenCaves extends LayerGen Random rand = new Random(layer.seed); - layer.noise_gens = new OpenSimplexNoise[] { - new OpenSimplexNoise(rand.nextLong()), - new OpenSimplexNoise(rand.nextLong()) + layer.noise_gens = new NoiseGenerator[] { + new NoiseGeneratorSimplex(rand.nextLong()), + new NoiseGeneratorSimplex(rand.nextLong()) }; } diff --git a/src/projectzombie/world/layer/layergen/LayerGenEarth.java b/src/projectzombie/world/layer/layergen/LayerGenEarth.java index 630a532..d243b2b 100755 --- a/src/projectzombie/world/layer/layergen/LayerGenEarth.java +++ b/src/projectzombie/world/layer/layergen/LayerGenEarth.java @@ -13,6 +13,8 @@ import projectzombie.init.Tiles; import projectzombie.time.GameTimer; import projectzombie.util.math.ColorRange; import projectzombie.util.math.TileState; +import projectzombie.util.math.random.NoiseGenerator; +import projectzombie.util.math.random.NoiseGeneratorSimplex; import projectzombie.util.math.random.OpenSimplexNoise; import projectzombie.util.math.random.RandomHelpers; import projectzombie.world.chunk.Chunk; @@ -20,12 +22,19 @@ import projectzombie.world.layer.Layer; public class LayerGenEarth extends LayerGen { + @Override + public Vec3d getWind(Layer layer, Vec2d pos) { + double t = GameTimer.getTime() / 1000.0; + return new Vec3d( + layer.noise_gens[2].eval(pos.x / 100, pos.y / 100, t) * 0.02, 0, + layer.noise_gens[3].eval(pos.x / 100, pos.y / 100, t) * 0.02); + } @Override public double getTemperatureStatic(Layer layer, Vec2d pos) { // Get the noise generator - OpenSimplexNoise terrain_noise = layer.noise_gens[0]; + NoiseGenerator terrain_noise = layer.noise_gens[0]; return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 0.8); } @@ -34,7 +43,7 @@ public class LayerGenEarth extends LayerGen { // Get the noise generator double light = (MathHelpers.sin(GameTimer.getTime() / 7200.0 - MathHelpers.PI / 4) + 1) * 0.2; - OpenSimplexNoise terrain_noise = layer.noise_gens[0]; + NoiseGenerator terrain_noise = layer.noise_gens[0]; return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 0.6 + light); } @@ -42,7 +51,7 @@ public class LayerGenEarth extends LayerGen public double getHumidity(Layer layer, Vec2d pos) { // Get the noise generator - OpenSimplexNoise terrain_noise = layer.noise_gens[1]; + NoiseGenerator terrain_noise = layer.noise_gens[1]; return MathHelpers.map(terrain_noise.eval(pos.x/64.0, pos.y/64.0), -1, 1, 0, 1); } @@ -52,9 +61,13 @@ public class LayerGenEarth extends LayerGen Random rand = new Random(layer.seed); - layer.noise_gens = new OpenSimplexNoise[] { - new OpenSimplexNoise(rand.nextLong()), - new OpenSimplexNoise(rand.nextLong()) + layer.noise_gens = new NoiseGenerator[] + { + new NoiseGeneratorSimplex(rand.nextLong()), + new NoiseGeneratorSimplex(rand.nextLong()), + + new NoiseGeneratorSimplex(rand.nextLong()), + new NoiseGeneratorSimplex(rand.nextLong()), }; } @@ -69,7 +82,7 @@ public class LayerGenEarth extends LayerGen RandomHelpers.randrange(rand, Chunk.CHUNK_SIZE.my)); // Get the noise generator - OpenSimplexNoise noise_terrain = layer.noise_gens[0]; + NoiseGenerator noise_terrain = layer.noise_gens[0]; // Loop over the layer dimensions and create land for(int x=0;x> 4, 2) == 1 ? billboard : (mod(type, 2) == 1 ? rotated : mat4(1))) * + vec4 pos = vec4(aPos, 1) * (mod(type >> 3, 2) == 1 ? billboard : (mod(type, 2) == 1 ? rotated : mat4(1))) * translate(aChunkOffset) * model; gl_Position = pos * projection; diff --git a/src/resources/texture/particle/smoke_trail.png b/src/resources/texture/particle/smoke_trail.png index 6ed7527..10d4ff6 100644 Binary files a/src/resources/texture/particle/smoke_trail.png and b/src/resources/texture/particle/smoke_trail.png differ